luckysheet.umd.js.map 9.2 MB
Newer Older
1 2 3 4 5 6 7
{
  "version": 3,
  "sources": ["../src/controllers/luckysheetConfigsetting.js", "../src/store/index.js", "../src/global/validate.js", "../src/utils/math.js", "../src/config.js", "../src/locale/en.js", "../src/locale/zh.js", "../src/locale/es.js", "../src/locale/zh_tw.js", "../src/locale/locale.js", "../src/controllers/toolbar.js", "../src/controllers/constant.js", "../src/methods/get.js", "../src/methods/set.js", "../src/global/browser.js", "../node_modules/pako/lib/utils/common.js", "../node_modules/pako/lib/zlib/trees.js", "../node_modules/pako/lib/zlib/adler32.js", "../node_modules/pako/lib/zlib/crc32.js", "../node_modules/pako/lib/zlib/messages.js", "../node_modules/pako/lib/zlib/deflate.js", "../node_modules/pako/lib/utils/strings.js", "../node_modules/pako/lib/zlib/zstream.js", "../node_modules/pako/lib/deflate.js", "../node_modules/pako/lib/zlib/inffast.js", "../node_modules/pako/lib/zlib/inftrees.js", "../node_modules/pako/lib/zlib/inflate.js", "../node_modules/pako/lib/zlib/constants.js", "../node_modules/pako/lib/zlib/gzheader.js", "../node_modules/pako/lib/inflate.js", "../node_modules/pako/index.js", "../src/global/loading.js", "../src/global/editor.js", "../src/global/dynamicArray.js", "../src/global/cursorPos.js", "../src/controllers/inlineString.js", "../src/global/getdata.js", "../src/controllers/sheetSearch.js", "../src/global/location.js", "../src/global/getRowlen.js", "../src/global/rhchInit.js", "../node_modules/dayjs/dayjs.min.js", "../src/global/datecontroll.js", "../node_modules/numeral/numeral.js", "../src/global/format.js", "../src/global/setdata.js", "../src/global/count.js", "../src/controllers/sheetMove.js", "../src/controllers/alternateformat.js", "../src/global/json.js", "../src/controllers/filter.js", "../src/controllers/imageCtrl.js", "../src/controllers/dataVerificationCtrl.js", "../src/global/extend.js", "../src/global/createsheet.js", "../src/global/method.js", "../src/controllers/postil.js", "../src/global/border.js", "../src/controllers/dropCell.js", "../src/controllers/freezen.js", "../src/controllers/resize.js", "../src/controllers/protection.js", "../src/global/sort.js", "../src/global/array.js", "../src/global/analysis.js", "../src/controllers/pivotTable.js", "../src/controllers/sparkline.js", "../src/global/draw.js", "../src/controllers/hyperlinkCtrl.js", "../src/global/refresh.js", "../src/controllers/imageUpdateCtrl.js", "../src/controllers/server.js", "../src/global/tooltip.js", "../src/controllers/conditionformat.js", "../src/controllers/selection.js", "../src/global/cleargridelement.js", "../src/global/createdom.js", "../src/utils/chartUtil.js", "../src/global/func_methods.js", "../src/function/matrix_methods.js", "../src/function/func.js", "../src/expendPlugins/chart/plugin.js", "../src/controllers/zoom.js", "../src/controllers/sheetmanage.js", "../src/global/formula.js", "../src/controllers/controlHistory.js", "../node_modules/flatpickr/dist/esm/types/options.js", "../node_modules/flatpickr/dist/esm/l10n/default.js", "../node_modules/flatpickr/dist/esm/utils/index.js", "../node_modules/flatpickr/dist/esm/utils/dom.js", "../node_modules/flatpickr/dist/esm/utils/formatting.js", "../node_modules/flatpickr/dist/esm/utils/dates.js", "../node_modules/flatpickr/dist/esm/utils/polyfills.js", "../node_modules/flatpickr/dist/esm/index.js", "../src/controllers/cellDatePickerCtrl.js", "../src/controllers/updateCell.js", "../src/global/api.js", "../src/controllers/select.js", "../src/controllers/moreFormat.js", "../src/controllers/searchReplace.js", "../src/controllers/locationCell.js", "../src/controllers/ifFormulaGenerator.js", "../src/controllers/insertFormula.js", "../src/controllers/menuButton.js", "../src/utils/util.js", "../src/controllers/mobile.js", "../src/controllers/splitColumn.js", "../src/controllers/cellFormat.js", "../src/global/scroll.js", "../src/controllers/handler.js", "../src/controllers/matrixOperation.js", "../src/controllers/sheetBar.js", "../src/controllers/formulaBar.js", "../src/controllers/rowColumnOperation.js", "../src/controllers/keyboard.js", "../src/controllers/orderBy.js", "../src/expendPlugins/print/plugin.js", "../src/controllers/expendPlugins.js", "../src/function/functionImplementation.js", "../src/function/functionlist.js", "../src/controllers/print.js", "../node_modules/flatpickr/dist/l10n/zh.js", "../src/controllers/listener.js", "../src/core.js", "../src/utils/polyfill.js", "../src/index.js"],
  "sourcesContent": ["const luckysheetConfigsetting = {\r\n    autoFormatw: false,\r\n    accuracy: undefined,\r\n    total: 0,\r\n\r\n    allowCopy: true,\r\n    showtoolbar: true,\r\n    showinfobar: true,\r\n    showsheetbar: true,\r\n    showstatisticBar: true,\r\n    pointEdit: false,\r\n    pointEditUpdate: null,\r\n    pointEditZoom: 1,\r\n\r\n    userInfo: false,\r\n    userMenuItem: [],\r\n    myFolderUrl: null,\r\n    functionButton: null,\r\n\r\n    showConfigWindowResize: true,\r\n    enableAddRow: true,\r\n    addRowCount: 100,\r\n    enableAddBackTop: true,\r\n    enablePage: true,\r\n    pageInfo: null,\r\n\r\n\r\n    editMode: false,\r\n    beforeCreateDom: null,\r\n    workbookCreateBefore: null,\r\n    workbookCreateAfter: null,\r\n    remoteFunction: null,\r\n    fireMousedown: null,\r\n    plugins:[],\r\n    forceCalculation:false,//\u5F3A\u5236\u5237\u65B0\u516C\u5F0F\uFF0C\u516C\u5F0F\u8F83\u591A\u4F1A\u6709\u6027\u80FD\u95EE\u9898\uFF0C\u614E\u7528\r\n\r\n    defaultColWidth:73,\r\n    defaultRowHeight:19,\r\n\r\n    defaultTextColor: '#000',\r\n    defaultCellColor: '#fff',\r\n}\r\n\r\nexport default luckysheetConfigsetting;\r\n", "const Store = {\r\n    container: null, \r\n    loadingObj:{},\r\n    luckysheetfile: null, \r\n    defaultcolumnNum: 60, \r\n    defaultrowNum: 84, \r\n    fullscreenmode: true,\r\n    devicePixelRatio: 1,\r\n\r\n    currentSheetIndex: 0,\r\n    calculateSheetIndex: 0,\r\n\tflowdata: [],\r\n    config: {},\r\n\r\n    visibledatarow: [],\r\n    visibledatacolumn: [],\r\n    ch_width: 0,\r\n    rh_height: 0,\r\n\r\n    cellmainWidth: 0,\r\n    cellmainHeight: 0,\r\n    toolbarHeight: 0,\r\n    infobarHeight: 0,\r\n    calculatebarHeight: 0,\r\n    rowHeaderWidth: 46,\r\n    columnHeaderHeight: 20,\r\n    cellMainSrollBarSize: 12,\r\n    sheetBarHeight: 31,\r\n    statisticBarHeight: 23,\r\n    luckysheetTableContentHW: [0, 0], \r\n\r\n    defaultcollen: 73,\r\n    defaultrowlen: 19,\r\n\r\n    jfcountfuncTimeout: null, \r\n    jfautoscrollTimeout: null,\r\n\r\n    luckysheet_select_status: false,\r\n    luckysheet_select_save: [{ \"row\": [0, 0], \"column\": [0, 0] }],\r\n    luckysheet_selection_range: [],\r\n\r\n    luckysheet_copy_save: {}, //\u590D\u5236\u7C98\u8D34\r\n    luckysheet_paste_iscut: false,\r\n\r\n    filterchage: true, //\u7B5B\u9009\r\n    luckysheet_filter_save: { \"row\": [], \"column\": [] },\r\n\r\n    luckysheet_sheet_move_status: false,\r\n    luckysheet_sheet_move_data: [],\r\n    luckysheet_scroll_status: false,\r\n\r\n    luckysheetisrefreshdetail: true,\r\n    luckysheetisrefreshtheme: true,\r\n    luckysheetcurrentisPivotTable: false,\r\n\r\n    luckysheet_rows_selected_status: false,  //\u884C\u5217\u6807\u9898\u76F8\u5173\u53C2\r\n    luckysheet_cols_selected_status: false,  \r\n    luckysheet_rows_change_size: false,\r\n    luckysheet_rows_change_size_start: [],\r\n    luckysheet_cols_change_size: false,\r\n    luckysheet_cols_change_size_start: [],\r\n    luckysheet_cols_dbclick_timeout: null,\r\n    luckysheet_cols_dbclick_times: 0,\r\n\r\n    luckysheetCellUpdate: [],\r\n    \r\n    luckysheet_shiftpositon: null,\r\n\r\n    iscopyself: true,\r\n\r\n    orderbyindex: 0, //\u6392\u5E8F\u4E0B\u6807\r\n\r\n    luckysheet_model_move_state: false, //\u6A21\u6001\u6846\u62D6\u52A8\r\n    luckysheet_model_xy: [0, 0],\r\n    luckysheet_model_move_obj: null,\r\n\r\n    luckysheet_cell_selected_move: false,  //\u9009\u533A\u62D6\u52A8\u66FF\u6362\r\n    luckysheet_cell_selected_move_index: [],\r\n\r\n    luckysheet_cell_selected_extend: false,  //\u9009\u533A\u4E0B\u62C9\r\n    luckysheet_cell_selected_extend_index: [],\r\n    luckysheet_cell_selected_extend_time: null,\r\n\r\n    clearjfundo: true,\r\n    jfundo: [],\r\n    jfredo: [],\r\n    lang: 'en', //language\r\n    createChart: '',\r\n    highlightChart: '',\r\n    zIndex: 15,\r\n    chartparam: {\r\n        luckysheetCurrentChart: null, //current chart_id\r\n        luckysheetCurrentChartActive: false,\r\n        luckysheetCurrentChartMove: null, // Debounce state\r\n        luckysheetCurrentChartMoveTimeout: null,//\u62D6\u52A8\u56FE\u8868\u6846\u7684\u8282\u6D41\u5B9A\u65F6\u5668\r\n        luckysheetCurrentChartMoveObj: null, //chart DOM object\r\n        luckysheetCurrentChartMoveXy: null, //\u4E0A\u4E00\u6B21\u64CD\u4F5C\u7ED3\u675F\u7684\u56FE\u8868\u4FE1\u606F\uFF0Cx,y: chart\u6846\u4F4D\u7F6E\uFF0CscrollLeft1,scrollTop1: \u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n        luckysheetCurrentChartMoveWinH: null, //\u5DE6\u53F3\u6EDA\u52A8\u6761\u6ED1\u52A8\u8DDD\u79BB\r\n        luckysheetCurrentChartMoveWinW: null, //\u4E0A\u4E0B\u6EDA\u52A8\u6761\u6ED1\u52A8\u8DDD\u79BB\r\n        luckysheetCurrentChartResize: null,\r\n        luckysheetCurrentChartResizeObj: null,\r\n        luckysheetCurrentChartResizeXy: null,\r\n        luckysheetCurrentChartResizeWinH: null,\r\n        luckysheetCurrentChartResizeWinW: null,\r\n        luckysheetInsertChartTosheetChange: true, // \u6B63\u5728\u6267\u884C\u64A4\u9500\r\n        luckysheetCurrentChartZIndexRank : 100,\r\n        luckysheet_chart_redo_click:false, //\u64A4\u9500\u91CD\u505A\u65F6\u6807\u8BC6\r\n        luckysheetCurrentChartMaxState: false, //\u56FE\u8868\u5168\u5C4F\u72B6\u6001\r\n        jfrefreshchartall: '',\r\n        changeChartCellData: '',\r\n        renderChart: '',\r\n        getChartJson: ''\r\n    },\r\n    functionList:null, //function list explanation\r\n    luckysheet_function:null,\r\n    chart_selection: {},\r\n    currentChart: '',\r\n    scrollRefreshSwitch:true,\r\n\r\n    measureTextCache:{},\r\n    measureTextCellInfoCache:{},\r\n    measureTextCacheTimeOut:null,\r\n    cellOverflowMapCache:{},\r\n\r\n    zoomRatio:1,\r\n\r\n    visibledatacolumn_unique:null,\r\n    visibledatarow_unique:null,\r\n\r\n    showGridLines:true,\r\n\r\n    toobarObject: {}, //toolbar constant\r\n    inlineStringEditCache:null,\r\n    inlineStringEditRange:null,\r\n\r\n    fontList:[],\r\n    defaultFontSize: 10,\r\n\r\n    currentSheetView:\"viewNormal\",\r\n\r\n    // cooperative editing\r\n    cooperativeEdit:{\r\n        usernameTimeout:{\r\n\r\n        },\r\n        changeCollaborationSize:[], //\u6539\u53D8\u884C\u9AD8\u6216\u8005\u5217\u5BBD\u65F6\uFF0C\u534F\u540C\u63D0\u793A\u6846\u9700\u8981\u8DDF\u968F\u6539\u53D8\u6240\u9700\u6570\u636E\r\n        allDataColumnlen:[],//\u5217\u5BBD\u53D1\u751F\u8FC7\u6539\u53D8\u7684\u5217\r\n        merge_range:{},//\u5408\u5E76\u65F6\u5355\u5143\u683C\u4FE1\u606F\r\n        checkoutData:[],//\u5207\u6362\u8868\u683C\u9875\u65F6\u6240\u9700\u6570\u636E\r\n    },\r\n\r\n    // Resources that currently need to be loaded asynchronously, especially plugins. 'Core' marks the core rendering process.\r\n    asyncLoad:['core'],\r\n    // \u9ED8\u8BA4\u5355\u5143\u683C\r\n    defaultCell: {\r\n        bg: null,\r\n        bl: 0,\r\n        ct: {fa: \"General\", t: \"n\"},\r\n        fc: \"rgb(51, 51, 51)\",\r\n        ff: 0,\r\n        fs: 11,\r\n        ht: 1,\r\n        it: 0,\r\n        vt: 1,\r\n        m: '',\r\n        v: ''\r\n    }\r\n\r\n}\r\n\r\nexport default Store;", "import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport Store from '../store';\r\n\r\nexport const error = {\r\n    v: \"#VALUE!\",    //\u9519\u8BEF\u7684\u53C2\u6570\u6216\u8FD0\u7B97\u7B26\r\n    n: \"#NAME?\",     //\u516C\u5F0F\u540D\u79F0\u9519\u8BEF\r\n    na: \"#N/A\",      //\u51FD\u6570\u6216\u516C\u5F0F\u4E2D\u6CA1\u6709\u53EF\u7528\u6570\u503C\r\n    r: \"#REF!\",      //\u5220\u9664\u4E86\u7531\u5176\u4ED6\u516C\u5F0F\u5F15\u7528\u7684\u5355\u5143\u683C\r\n    d: \"#DIV/0!\",    //\u9664\u6570\u662F0\u6216\u7A7A\u5355\u5143\u683C\r\n    nm: \"#NUM!\",     //\u5F53\u516C\u5F0F\u6216\u51FD\u6570\u4E2D\u67D0\u4E2A\u6570\u5B57\u6709\u95EE\u9898\u65F6\r\n    nl: \"#NULL!\",    //\u4EA4\u53C9\u8FD0\u7B97\u7B26\uFF08\u7A7A\u683C\uFF09\u4F7F\u7528\u4E0D\u6B63\u786E\r\n    sp: \"#SPILL!\"    //\u6570\u7EC4\u8303\u56F4\u6709\u5176\u5B83\u503C\r\n}\r\n\r\n//\u662F\u5426\u662F\u7A7A\u503C\r\nfunction isRealNull(val) {\r\n    if(val == null || val.toString().replace(/\\s/g, \"\") == \"\"){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n//\u662F\u5426\u662F\u7EAF\u6570\u5B57\r\nfunction isRealNum(val) {\r\n    if(val == null || val.toString().replace(/\\s/g, \"\") === \"\"){\r\n        return false;\r\n    }\r\n\r\n    if(typeof val == \"boolean\"){\r\n        return false;\r\n    }\r\n\r\n    if(!isNaN(val)){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n//\u662F\u5426\u662F\u9519\u8BEF\u7C7B\u578B\r\nfunction valueIsError(value) {\r\n    let isError = false;\r\n\r\n    for(let x in error){\r\n        if(value == error[x]){\r\n            isError = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return isError;\r\n}\r\n\r\n//\u662F\u5426\u6709\u4E2D\u6587\r\nfunction hasChinaword(s) {\r\n    let patrn = /[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]/gi;\r\n    \r\n    if (!patrn.exec(s)) {\r\n        return false;\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n\r\n//\u662F\u5426\u4E3A\u975E\u7F16\u8F91\u6A21\u5F0F\r\nfunction isEditMode() {\r\n    if(luckysheetConfigsetting.editMode){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n//\u8303\u56F4\u662F\u5426\u53EA\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\r\nfunction hasPartMC(cfg, r1, r2, c1, c2) {\r\n    let hasPartMC = false;\r\n\r\n    for(let x in Store.config[\"merge\"]){\r\n        let mc = cfg[\"merge\"][x];\r\n\r\n        if(r1 < mc.r){\r\n            if(r2 >= mc.r && r2 < (mc.r + mc.rs - 1)){\r\n                if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 >= mc.r && r2 == (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 > mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 > (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else if(r1 == mc.r){\r\n            if(r2 < (mc.r + mc.rs - 1)){\r\n                if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 >= (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else if(r1 <= (mc.r + mc.rs - 1)){\r\n            if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n            else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n            else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return hasPartMC;\r\n}\r\n\r\n//\u83B7\u53D6\u5355\u4E2A\u5B57\u7B26\u7684\u5B57\u8282\u6570\r\nfunction checkWordByteLength(value) {\r\n    return Math.ceil(value.charCodeAt().toString(2).length / 8);\r\n }\r\n \r\n\r\nexport {\r\n    isRealNull,\r\n    isRealNum,\r\n    valueIsError,\r\n    hasChinaword,\r\n    isEditMode,\r\n    hasPartMC,\r\n    checkWordByteLength\r\n}", "import { isRealNum } from '../global/validate';\r\n\r\n/*\r\n * \u5224\u65ADobj\u662F\u5426\u4E3A\u4E00\u4E2A\u6574\u6570\r\n */\r\nfunction isInteger(obj) {\r\n    return Math.floor(obj) === obj;\r\n}\r\n\r\n/*\r\n * \u5C06\u4E00\u4E2A\u6D6E\u70B9\u6570\u8F6C\u6210\u6574\u6570\uFF0C\u8FD4\u56DE\u6574\u6570\u548C\u500D\u6570\u3002\u5982 3.14 >> 314\uFF0C\u500D\u6570\u662F 100\r\n * @param floatNum {number} \u5C0F\u6570\r\n * @return {object}\r\n *   {times:100, num: 314}\r\n */\r\nfunction toInteger(floatNum) {\r\n    var ret = { times: 1, num: 0 };\r\n\r\n    if (isInteger(floatNum)) {\r\n        ret.num = floatNum;\r\n        return ret;\r\n    }\r\n\r\n    var strfi = floatNum + '';\r\n    var dotPos = strfi.indexOf('.');\r\n    var len = strfi.substr(dotPos + 1).length;\r\n    var times = Math.pow(10, len);\r\n    var intNum = parseInt(floatNum * times + 0.5, 10);\r\n\r\n    ret.times = times;\r\n    ret.num = intNum;\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * \u6838\u5FC3\u65B9\u6CD5\uFF0C\u5B9E\u73B0\u52A0\u51CF\u4E58\u9664\u8FD0\u7B97\uFF0C\u786E\u4FDD\u4E0D\u4E22\u5931\u7CBE\u5EA6\r\n * \u601D\u8DEF\uFF1A\u628A\u5C0F\u6570\u653E\u5927\u4E3A\u6574\u6570\uFF08\u4E58\uFF09\uFF0C\u8FDB\u884C\u7B97\u672F\u8FD0\u7B97\uFF0C\u518D\u7F29\u5C0F\u4E3A\u5C0F\u6570\uFF08\u9664\uFF09\r\n *\r\n * @param a {number} \u8FD0\u7B97\u65701\r\n * @param b {number} \u8FD0\u7B97\u65702\r\n * @param digits {number} \u7CBE\u5EA6\uFF0C\u4FDD\u7559\u7684\u5C0F\u6570\u70B9\u6570\uFF0C\u6BD4\u5982 2, \u5373\u4FDD\u7559\u4E3A\u4E24\u4F4D\u5C0F\u6570\r\n * @param op {string} \u8FD0\u7B97\u7C7B\u578B\uFF0C\u6709\u52A0\u51CF\u4E58\u9664\uFF08add/subtract/multiply/divide\uFF09\r\n *\r\n */\r\nfunction operation(a, b, op) {\r\n    var o1 = toInteger(a);\r\n    var o2 = toInteger(b);\r\n    var n1 = o1.num;\r\n    var n2 = o2.num;\r\n    var t1 = o1.times;\r\n    var t2 = o2.times;\r\n    var max = t1 > t2 ? t1 : t2;\r\n    var result = null;\r\n\r\n    switch (op) {\r\n        case 'add':\r\n            if (t1 === t2) { // \u4E24\u4E2A\u5C0F\u6570\u4F4D\u6570\u76F8\u540C\r\n                result = n1 + n2;\r\n            }\r\n            else if (t1 > t2) { // o1 \u5C0F\u6570\u4F4D \u5927\u4E8E o2\r\n                result = n1 + n2 * (t1 / t2);\r\n            }\r\n            else { // o1 \u5C0F\u6570\u4F4D \u5C0F\u4E8E o2\r\n                result = n1 * (t2 / t1) + n2;\r\n            }\r\n\r\n            return result / max;\r\n        case 'subtract':\r\n            if (t1 === t2) {\r\n                result = n1 - n2;\r\n            }\r\n            else if (t1 > t2) {\r\n                result = n1 - n2 * (t1 / t2);\r\n            }\r\n            else {\r\n                result = n1 * (t2 / t1) - n2;\r\n            }\r\n\r\n            return result / max;\r\n        case 'multiply':\r\n            result = (n1 * n2) / (t1 * t2);\r\n\r\n            return result;\r\n        case 'divide':\r\n            return result = function () {\r\n                var r1 = n1 / n2;\r\n                var r2 = t2 / t1;\r\n                return operation(r1, r2, 'multiply');\r\n            }();\r\n    }\r\n}\r\n/**\r\n * \u505A\u5C0F\u6570\u70B9\u7684\u56DB\u820D\u4E94\u5165\u8BA1\u7B97\r\n * @param {*} num\r\n * @param {*} precision\r\n */\r\nfunction fixed(num, precision) {\r\n    if (!precision) {\r\n        precision = 2;\r\n    }\r\n    if (!isRealNum(num)) return num;\r\n    let s = num.toFixed(precision);\r\n    let index = s.indexOf('.');\r\n    let prefix = s.substring(0, index);\r\n    let suffix = s.substring(index + 1, s.length);\r\n    if (suffix) {\r\n        for (let i = suffix.length - 1; i != 0; i--) {\r\n            //\u6700\u672B\u4F4D\u4E0D\u4E3A0\uFF0C\u76F4\u63A5break;\r\n            if (suffix.charAt(i) != '0' && i == suffix.length - 1) {\r\n                break;\r\n            } else {\r\n                suffix = suffix.substring(0, i);\r\n            }\r\n        }\r\n    }\r\n    return Number(prefix + '.' + suffix);\r\n}\r\n\r\n\r\n/**\r\n * Calculation +-/* Solve the problem of js accuracy\r\n */\r\nNumber.prototype.add = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('\u8BF7\u8F93\u5165\u6570\u5B57\u6216\u8005\u6570\u5B57\u5B57\u7B26\u4E32\uFF5E');\r\n    };\r\n    return operation(this, number, 'add');\r\n};\r\nNumber.prototype.subtract = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('\u8BF7\u8F93\u5165\u6570\u5B57\u6216\u8005\u6570\u5B57\u5B57\u7B26\u4E32\uFF5E');\r\n    }\r\n    return operation(this, number, 'subtract');\r\n};\r\nNumber.prototype.multiply = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('\u8BF7\u8F93\u5165\u6570\u5B57\u6216\u8005\u6570\u5B57\u5B57\u7B26\u4E32\uFF5E');\r\n    }\r\n    return operation(this, number, 'multiply');\r\n};\r\nNumber.prototype.divide = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('\u8BF7\u8F93\u5165\u6570\u5B57\u6216\u8005\u6570\u5B57\u5B57\u7B26\u4E32\uFF5E');\r\n    }\r\n    return operation(this, number, 'divide');\r\n};\r\nNumber.prototype.tofixed = function (value) {\r\n    let  precision = parseFloat(value);\r\n    if (typeof precision !== 'number' || Number.isNaN(precision)) {\r\n        throw new Error('\u8BF7\u8F93\u5165\u6570\u5B57\u6216\u8005\u6570\u5B57\u5B57\u7B26\u4E32\uFF5E');\r\n    }\r\n    return fixed(this, precision);\r\n};", "/**\r\n * The default luckysheet config object.\r\n */\r\nexport default {\r\n    container: \"luckysheet\", //\u5BB9\u5668\u7684ID\r\n    loading:{}, //\u81EA\u5B9A\u4E49loading\r\n    column: 60, //\u7A7A\u8868\u683C\u9ED8\u8BA4\u7684\u5217\u6570\u91CF\r\n    row: 84, //\u7A7A\u8868\u683C\u9ED8\u8BA4\u7684\u884C\u6570\u636E\u91CF\r\n    allowCopy: true, //\u662F\u5426\u5141\u8BB8\u62F7\u8D1D\r\n    showtoolbar: true, //\u662F\u5426\u7B2C\u4E8C\u5217\u663E\u793A\u5DE5\u5177\u680F\r\n    showinfobar: true, //\u662F\u5426\u663E\u793A\u9876\u90E8\u540D\u79F0\u680F\r\n    showsheetbar: true, //\u662F\u5426\u663E\u793A\u5E95\u90E8\u8868\u683C\u540D\u79F0\u533A\u57DF\r\n    showstatisticBar: true, //\u662F\u5426\u663E\u793A\u5E95\u90E8\u8BA1\u6570\u680F\r\n    pointEdit: false, //\u662F\u5426\u662F\u7F16\u8F91\u5668\u63D2\u5165\u8868\u683C\u6A21\u5F0F\r\n    pointEditUpdate: null, //\u7F16\u8F91\u5668\u8868\u683C\u66F4\u65B0\u51FD\u6570\r\n    pointEditZoom: 1, //\u7F16\u8F91\u5668\u8868\u683C\u7F16\u8F91\u65F6\u7F29\u653E\u6BD4\u4F8B\r\n    // menu: \"undo|redo|freezenrow|freezencolumn|download|share|chart|pivot\",\r\n    data: [{ \"name\": \"Sheet1\", color: \"\", \"status\": \"1\", \"order\": \"0\", \"data\": [], \"config\": {}, \"index\":0 }, { \"name\": \"Sheet2\", color: \"\", \"status\": \"0\", \"order\": \"1\", \"data\": [], \"config\": {}, \"index\":1  }, { \"name\": \"Sheet3\", color: \"\", \"status\": \"0\", \"order\": \"2\", \"data\": [], \"config\": {}, \"index\":2  }], //\u5BA2\u6237\u7AEFsheet\u6570\u636E[shee1, sheet2, sheet3]\r\n    title: \"Luckysheet Demo\", //\u8868\u683C\u7684\u540D\u79F0\r\n    userInfo:false,// \u53F3\u4E0A\u89D2\u7684\u7528\u6237\u4FE1\u606F\u5C55\u793A\u6837\u5F0F\uFF0C\u652F\u6301 1. boolean\u7C7B\u578B\uFF1Afalse:\u4E0D\u5C55\u793A\uFF0Cture:\u5C55\u793A\u9ED8\u8BA4 '<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> rabbit' \uFF0C2. HTML\u6A21\u677F\u5B57\u7B26\u4E32\u6216\u8005\u666E\u901A\u5B57\u7B26\u4E32\uFF0C\u5982\uFF1A'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky'\u6216\u8005'\u7528\u6237\u540D'\uFF0C 3. \u5BF9\u8C61\u683C\u5F0F\uFF0C\u8BBE\u7F6E userImage\uFF1A\u7528\u6237\u5934\u50CF\u5730\u5740 \u548C userName\uFF1A\u7528\u6237\u540D 4. \u4E0D\u8BBE\u7F6E\u6216\u8005\u8BBE\u7F6Eundefined\u540C\u8BBE\u7F6Efalse\r\n    userMenuItem: [{url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-folder\" aria-hidden=\"true\"></i>', \"name\":\"\u6211\u7684\u8868\u683C\"}, {url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-sign-out\" aria-hidden=\"true\"></i>', \"name\":\"\u9000\u51FA\u767B\u9646\"}], //\u70B9\u51FB\u53F3\u4E0A\u89D2\u7684\u7528\u6237\u4FE1\u606F\u5F39\u51FA\u7684\u83DC\u5355\r\n    myFolderUrl: \"www.baidu.com\", //\u5DE6\u4E0A\u89D2<\u8FD4\u56DE\u6309\u94AE\u7684\u94FE\u63A5\r\n    config: {}, //\u8868\u683C\u884C\u9AD8\u3001\u5217\u5BBD\u3001\u5408\u5E76\u5355\u5143\u683C\u3001\u516C\u5F0F\u7B49\u8BBE\u7F6E\r\n    fullscreenmode: true, //\u662F\u5426\u5168\u5C4F\u6A21\u5F0F\uFF0C\u975E\u5168\u5C4F\u6A21\u5F0F\u4E0B\uFF0C\u6807\u8BB0\u6846\u4E0D\u4F1A\u5F3A\u5236\u9009\u4E2D\u3002\r\n    devicePixelRatio: window.devicePixelRatio, //\u8BBE\u5907\u6BD4\u4F8B\uFF0C\u6BD4\u4F8B\u8D8A\u5927\u8868\u683C\u5206\u6807\u7387\u8D8A\u9AD8\r\n    allowEdit: true, //\u662F\u5426\u5141\u8BB8\u524D\u53F0\u7F16\u8F91\r\n    loadUrl: \"\", // \u914D\u7F6EloadUrl\u7684\u5730\u5740\uFF0Cluckysheet\u4F1A\u901A\u8FC7ajax\u8BF7\u6C42\u8868\u683C\u6570\u636E\uFF0C\u9ED8\u8BA4\u8F7D\u5165status\u4E3A1\u7684sheet\u6570\u636E\u4E2D\u7684\u6240\u6709data\uFF0C\u5176\u4F59\u7684sheet\u8F7D\u5165\u9664data\u5B57\u6BB5\u5916\u7684\u6240\u6709\u5B57\u6BB5\r\n    loadSheetUrl: \"\", //\u914D\u7F6EloadSheetUrl\u7684\u5730\u5740\uFF0C\u53C2\u6570\u4E3AgridKey\uFF08\u8868\u683C\u4E3B\u952E\uFF09 \u548C index\uFF08sheet\u4E3B\u952E\u5408\u96C6\uFF0C\u683C\u5F0F\u4E3A[1,2,3]\uFF09\uFF0C\u8FD4\u56DE\u7684\u6570\u636E\u4E3Asheet\u7684data\u5B57\u6BB5\u6570\u636E\u96C6\u5408\r\n    gridKey: \"\", // \u8868\u683C\u552F\u4E00\u6807\u8BC6\u7B26\r\n    updateUrl: \"\", //\u8868\u683C\u6570\u636E\u7684\u66F4\u65B0\u5730\u5740\r\n    updateImageUrl: \"\", //\u7F29\u7565\u56FE\u7684\u66F4\u65B0\u5730\u5740\r\n    allowUpdate: false, //\u662F\u5426\u5141\u8BB8\u7F16\u8F91\u540E\u7684\u540E\u53F0\u66F4\u65B0\r\n    functionButton: \"\", //\u53F3\u4E0A\u89D2\u529F\u80FD\u6309\u94AE\uFF0C\u4F8B\u5982'<button id=\"\" class=\"btn btn-primary\" style=\"padding:3px 6px;font-size: 12px;margin-right: 10px;\">\u4E0B\u8F7D</button>    <button id=\"\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">\u5206\u4EAB</button>    <button id=\"luckysheet-share-btn-title\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">\u79C0\u6570\u636E</button>'\r\n    showConfigWindowResize: true, //\u56FE\u8868\u548C\u6570\u636E\u900F\u89C6\u8868\u7684\u914D\u7F6E\u4F1A\u5728\u53F3\u4FA7\u5F39\u51FA\uFF0C\u8BBE\u7F6E\u5F39\u51FA\u540E\u8868\u683C\u662F\u5426\u4F1A\u81EA\u52A8\u7F29\u8FDB\r\n    enableAddRow: true,//\u5141\u8BB8\u6DFB\u52A0\u884C\r\n    enableAddBackTop: true,//\u5141\u8BB8\u56DE\u5230\u9876\u90E8\r\n    // enablePage: false,//\u5141\u8BB8\u52A0\u8F7D\u4E0B\u4E00\u9875\r\n    autoFormatw: false,  //\u81EA\u52A8\u683C\u5F0F\u5316\u8D85\u8FC74\u4F4D\u6570\u7684\u6570\u5B57\u4E3A \u4EBF\u4E07\u683C\u5F0F \u4F8B\uFF1Atrue or \"true\" or \"TRUE\"\r\n    accuracy: undefined,  //\u8BBE\u7F6E\u4F20\u8F93\u6765\u7684\u6570\u503C\u7684\u7CBE\u786E\u4F4D\u6570\uFF0C\u5C0F\u6570\u70B9\u540En\u4F4D \u4F20\u53C2\u6570\u4E3A\u6570\u5B57\u6216\u6570\u5B57\u5B57\u7B26\u4E32\uFF0C\u4F8B\uFF1A \"0\" \u6216 0\r\n    pageInfo:{\r\n        'queryExps':'',\r\n        'reportId':'',\r\n        'fields':'',\r\n        'mobile':'',\r\n        'frezon':'',\r\n        'currentPage':'',\r\n        \"totalPage\":10,\r\n        \"pageUrl\":\"\",\r\n    },\r\n    editMode: false, //\u662F\u5426\u4E3A\u7F16\u8F91\u6A21\u5F0F\r\n    beforeCreateDom: null,//\u8868\u683C\u521B\u5EFA\u4E4B\u524D\u7684\u65B9\u6CD5\r\n    fireMousedown: null, //\u5355\u5143\u683C\u6570\u636E\u4E0B\u94BB\r\n    lang: 'en', //language\r\n    plugins: [], //plugins, e.g. ['chart']\r\n    forceCalculation:false,//\u5F3A\u5236\u5237\u65B0\u516C\u5F0F\uFF0C\u516C\u5F0F\u8F83\u591A\u4F1A\u6709\u6027\u80FD\u95EE\u9898\uFF0C\u614E\u7528\r\n    rowHeaderWidth: 46,\r\n    columnHeaderHeight: 20,\r\n    defaultColWidth:73,\r\n    defaultRowHeight:19,\r\n    defaultFontSize:10,\r\n    limitSheetNameLength:true,    //\u662F\u5426\u9650\u5236\u5DE5\u4F5C\u8868\u540D\u7684\u957F\u5EA6\r\n    defaultSheetNameMaxLength:31,  //\u9ED8\u8BA4\u5DE5\u4F5C\u8868\u540D\u79F0\u7684\u6700\u5927\u957F\u5EA6\r\n    sheetFormulaBar:true, //\u662F\u5426\u663E\u793A\u516C\u5F0F\u680F\r\n    showtoolbarConfig:{}, //\u81EA\u5B9A\u4E49\u5DE5\u5177\u680F\r\n    showsheetbarConfig:{}, //\u81EA\u5B9A\u4E49\u5E95\u90E8sheet\u9875\r\n    showstatisticBarConfig:{}, //\u81EA\u5B9A\u4E49\u8BA1\u6570\u680F\r\n    cellRightClickConfig:{}, //\u81EA\u5B9A\u4E49\u5355\u5143\u683C\u53F3\u952E\u83DC\u5355\r\n    sheetRightClickConfig:{}, //\u81EA\u5B9A\u4E49\u5E95\u90E8sheet\u9875\u53F3\u51FB\u83DC\u5355\r\n    imageUpdateMethodConfig:{}, //\u81EA\u5B9A\u4E49\u56FE\u7247\u540C\u6B65\u65B9\u5F0F\r\n}", "export default {\r\n    functionlist:[{\r\n        \"n\": \"SUMIF\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a conditional sum across a range.\",\r\n        \"a\": \"A conditional sum across a range.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range which is tested against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sum_range\",\r\n            \"detail\": \"The range to be summed, if different from `range`.\",\r\n            \"example\": \"B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TAN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the tangent of an angle provided in radians.\",\r\n        \"a\": \"Tangent of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the tangent of, in radians.\",\r\n            \"example\": \"45*PI()/180\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TANH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic tangent of any real number.\",\r\n        \"a\": \"Hyperbolic tangent of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic tangent of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CEILING\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest integer multiple of specified significance `factor`.\",\r\n        \"a\": \"Rounds number up to nearest multiple of a factor.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round up to the nearest integer multiple of `factor`.\",\r\n            \"example\": \"23.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATAN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse tangent of a value, in radians.\",\r\n        \"a\": \"Inverse tangent of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse tangent.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ASINH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic sine of a number.\",\r\n        \"a\": \"Inverse hyperbolic sine of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic sine.\",\r\n            \"example\": \"0.9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ABS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the absolute value of a number.\",\r\n        \"a\": \"Absolute value of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number of which to return the absolute value.\",\r\n            \"example\": \"-2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACOS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse cosine of a value, in radians.\",\r\n        \"a\": \"Inverse cosine of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACOSH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic cosine of a number.\",\r\n        \"a\": \"Inverse hyperbolic cosine of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MULTINOMIAL\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the factorial of the sum of values divided by the product of the values' factorials.\",\r\n        \"a\": \"Multinomial distribution function.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATANH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic tangent of a number.\",\r\n        \"a\": \"Inverse hyperbolic tangent of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.\",\r\n            \"example\": \"0.9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATAN2\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.\",\r\n        \"a\": \"Arctangent of a value.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"y\",\r\n            \"detail\": \"The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTBLANK\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of empty values in a list of values and ranges.\",\r\n        \"a\": \"Number of empty values.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range in which to count the number of blanks.\",\r\n            \"example\": \"A2:C100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COSH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic cosine of any real number.\",\r\n        \"a\": \"Hyperbolic cosine of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic cosine of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INT\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number down to the nearest integer that is less than or equal to it.\",\r\n        \"a\": \"Rounds number down to nearest integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round down to the nearest integer.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISEVEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Checks whether the provided value is even.\",\r\n        \"a\": \"Whether the provided value is even.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as even.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISODD\",\r\n        \"t\": 0,\r\n        \"d\": \"Checks whether the provided value is odd.\",\r\n        \"a\": \"Whether the provided value is odd.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as odd.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LCM\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the least common multiple of one or more integers.\",\r\n        \"a\": \"Least common multiple of one or more integers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range whose factors to consider in a calculation to find the least common multiple.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges whose factors to consider to find the least common multiple.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number, base e (Euler's number).\",\r\n        \"a\": \"The logarithm of a number, base e (euler's number).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm, base e.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOG\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number with respect to a base.\",\r\n        \"a\": \"The logarithm of a number with respect to a base.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm.\",\r\n            \"example\": \"128\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"base\",\r\n            \"detail\": \"The base to use for calculation of the logarithm.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOG10\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number, base 10.\",\r\n        \"a\": \"The logarithm of a number, base 10.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm, base 10.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MOD\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the result of the modulo operator, the remainder after a division operation.\",\r\n        \"a\": \"Modulo (remainder) operator.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided to find the remainder.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MROUND\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds one number to the nearest integer multiple of another.\",\r\n        \"a\": \"Rounds a number to the nearest integer multiple.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number to round to the nearest integer multiple of another.\",\r\n            \"example\": \"21\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ODD\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest odd integer.\",\r\n        \"a\": \"Rounds a number up to the nearest odd integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to the next greatest odd number.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMSQ\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of the squares of a series of numbers and/or cells.\",\r\n        \"a\": \"Sum of squares.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first number or range whose squares to add together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional numbers or ranges whose squares to add to the square(s) of `value1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMBIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects.\",\r\n        \"a\": \"Number of combinations from a set of objects.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"n\",\r\n            \"detail\": \"The size of the pool of objects to choose from.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"k\",\r\n            \"detail\": \"The number of objects to choose.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUM\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of a series of numbers and/or cells.\",\r\n        \"a\": \"Sum of a series of numbers and/or cells.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first number or range to add together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional numbers or ranges to add to `value1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUBTOTAL\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a subtotal for a vertical range of cells using a specified aggregation function.\",\r\n        \"a\": \"Subtotal for a range using a specific function.\",\r\n        \"m\": [2, 256],\r\n        \"p\": [{\r\n            \"name\": \"function_code\",\r\n            \"detail\": \"The function to use in subtotal aggregation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"range1\",\r\n            \"detail\": \"The first range over which to calculate a subtotal.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"range2\",\r\n            \"detail\": \"Additional ranges over which to calculate subtotals.\",\r\n            \"example\": \"B2:B8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ASIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse sine of a value, in radians.\",\r\n        \"a\": \"Inverse sine of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTIF\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a conditional count across a range.\",\r\n        \"a\": \"A conditional count across a range.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range that is tested against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RADIANS\",\r\n        \"t\": 0,\r\n        \"d\": \"Converts an angle value in degrees to radians.\",\r\n        \"a\": \"Converts an angle value in degrees to radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to convert from degrees to radians.\",\r\n            \"example\": \"180\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RAND\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a random number between 0 inclusive and 1 exclusive.\",\r\n        \"a\": \"A random number between 0 inclusive and 1 exclusive.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"COUNTUNIQUE\",\r\n        \"t\": 0,\r\n        \"d\": \"Counts the number of unique values in a list of specified values and ranges.\",\r\n        \"a\": \"Counts number of unique values in a range.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider for uniqueness.\",\r\n            \"example\": \"A1:C100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider for uniqueness.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEGREES\",\r\n        \"t\": 0,\r\n        \"d\": \"Converts an angle value in radians to degrees.\",\r\n        \"a\": \"Converts an angle value in radians to degrees.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to convert from radians to degrees.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ERFC\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the complementary Gauss error function of a value.\",\r\n        \"a\": \"Complementary gauss error function of a value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"z\",\r\n            \"detail\": \"The number for which to calculate the complementary Gauss error function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EVEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest even integer.\",\r\n        \"a\": \"Rounds a number up to the nearest even integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to the next greatest even number.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXP\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns Euler's number, e (~2.718) raised to a power.\",\r\n        \"a\": \"Euler's number, e (~2.718) raised to a power.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"exponent\",\r\n            \"detail\": \"The exponent to raise e to.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FACT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the factorial of a number.\",\r\n        \"a\": \"Factorial of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number or reference to a number whose factorial will be calculated and returned.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FACTDOUBLE\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the \\\"double factorial\\\" of a number.\",\r\n        \"a\": \"\\\"double factorial\\\" of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number or reference to a number whose double factorial will be calculated and returned.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PI\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the value of Pi to 14 decimal places.\",\r\n        \"a\": \"The number pi.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"FLOOR\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number down to the nearest integer multiple of specified significance `factor`.\",\r\n        \"a\": \"Rounds number down to nearest multiple of a factor.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round down to the nearest integer multiple of `factor`.\",\r\n            \"example\": \"23.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GCD\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the greatest common divisor of one or more integers.\",\r\n        \"a\": \"Greatest common divisor of one or more integers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range whose factors to consider in a calculation to find the greatest common divisor.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges whose factors to consider to find the greatest common divisor.\",\r\n            \"example\": \"96\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANDBETWEEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a uniformly random integer between two values, inclusive.\",\r\n        \"a\": \"Random integer between two values, inclusive.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"low\",\r\n            \"detail\": \"The low end of the random range.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"high\",\r\n            \"detail\": \"The high end of the random range.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUND\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places according to standard rules.\",\r\n        \"a\": \"Rounds a number according to standard rules.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUNDDOWN\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.\",\r\n        \"a\": \"Rounds down a number.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places, always rounding down.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUNDUP\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.\",\r\n        \"a\": \"Rounds up a number.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places, always rounding up.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SERIESSUM\",\r\n        \"t\": 0,\r\n        \"d\": \"Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a\",\r\n        \"a\": \"Sum of a power series.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The initial power to which to raise `x` in the power series.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"m\",\r\n            \"detail\": \"The additive increment by which to increase `x`.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"a\",\r\n            \"detail\": \"The array or range containing the coefficients of the power series.\",\r\n            \"example\": \"{FACT(0)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SIGN\",\r\n        \"t\": 0,\r\n        \"d\": \"Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.\",\r\n        \"a\": \"Sign of a provided number (+/-/0).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose sign will be evaluated.\",\r\n            \"example\": \"-42\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sine of an angle provided in radians.\",\r\n        \"a\": \"Sine of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the sine of, in radians.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SINH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic sine of any real number.\",\r\n        \"a\": \"Hyperbolic sine of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic sine of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SQRT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the positive square root of a positive number.\",\r\n        \"a\": \"Positive square root of a positive number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number for which to calculate the positive square root.\",\r\n            \"example\": \"9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SQRTPI\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the positive square root of the product of Pi and the given positive number.\",\r\n        \"a\": \"Square root of the product of pi and number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number which will be multiplied by Pi and have the product's square root returned\",\r\n            \"example\": \"9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GAMMALN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the logarithm of a specified Gamma function, base e (Euler's number).\",\r\n        \"a\": \"Logarithm of gamma function.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the cosine of an angle provided in radians.\",\r\n        \"a\": \"Cosine of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the cosine of, in radians.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRUNC\",\r\n        \"t\": 0,\r\n        \"d\": \"Truncates a number to a certain number of significant digits by omitting less significant digits.\",\r\n        \"a\": \"Truncates a number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be truncated.\",\r\n            \"example\": \"3.141592654\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of significant digits to the right of the decimal point to retain.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUOTIENT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns one number divided by another.\",\r\n        \"a\": \"One number divided by another.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"POWER\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a number raised to a power.\",\r\n        \"a\": \"A number raised to a power.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"base\",\r\n            \"detail\": \"The number to raise to the `exponent` power.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"exponent\",\r\n            \"detail\": \"The exponent to raise `base` to.\",\r\n            \"example\": \"0.5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMIFS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of a range depending on multiple criteria.\",\r\n        \"a\": \"Sums a range depending on multiple criteria.\",\r\n        \"m\": [3, 257],\r\n        \"p\": [{\r\n            \"name\": \"sum_range\",\r\n            \"detail\": \"The range to sum.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against criterion1.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to criteria_range1.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" C1:C10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTIFS\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the count of a range depending on multiple criteria.\",\r\n        \"a\": \"Count values depending on multiple criteria.\",\r\n        \"m\": [2, 256],\r\n        \"p\": [{\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against `criterion1`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range1`.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRODUCT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the result of multiplying a series of numbers together.\",\r\n        \"a\": \"Result of multiplying a series of numbers together.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first number or range to calculate for the product.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"More numbers or ranges to calculate for the product.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HARMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the harmonic mean of a dataset.\",\r\n        \"a\": \"The harmonic mean of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HYPGEOMDIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.\",\r\n        \"a\": \"Hypergeometric distribution probability.\",\r\n        \"m\": [5, 5],\r\n        \"p\": [{\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The desired number of successes.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_draws\",\r\n            \"detail\": \"The number of permitted draws.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"successes_in_pop\",\r\n            \"detail\": \"The total number of successes in the population.\",\r\n            \"example\": \"20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"pop_size\",\r\n            \"detail\": \"The total size of the population\",\r\n            \"example\": \"40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\\n\\nif FALSE(), it returns the probability density function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INTERCEPT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).\",\r\n        \"a\": \"Y-intercept of line derived via linear regression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"KURT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the kurtosis of a dataset, which describes the shape, and in particular the \\\"peakedness\\\" of that dataset.\",\r\n        \"a\": \"Kurtosis of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LARGE\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the nth largest element from a data set, where n is user-defined.\",\r\n        \"a\": \"Nth largest element from a data set.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The rank from largest to smallest of the element to return.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STDEVA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard deviation based on a sample, setting text to the value `0`.\",\r\n        \"a\": \"Standard deviation of sample (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STDEVP\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard deviation based on an entire population.\",\r\n        \"a\": \"Standard deviation of an entire population.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GEOMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the geometric mean of a dataset.\",\r\n        \"a\": \"The geometric mean of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANK_EQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.\",\r\n        \"a\": \"Top rank of a specified value in a dataset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose rank will be determined.\",\r\n            \"example\": \"A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANK_AVG\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.\",\r\n        \"a\": \"Average rank of a specified value in a dataset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose rank will be determined.\",\r\n            \"example\": \"A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTRANK_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.\",\r\n        \"a\": \"Percentage rank (percentile) from 0 to 1 exclusive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose percentage rank will be determined.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTRANK_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.\",\r\n        \"a\": \"Percentage rank (percentile) from 0 to 1 inclusive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose percentage rank will be determined.\",\r\n            \"example\": \" A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FORECAST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the expected y-value for a specified x based on a linear regression of a dataset.\",\r\n        \"a\": \"Expected y-value based of linear regression.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The value on the x-axis to forecast.\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FISHERINV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the inverse Fisher transformation of a specified value.\",\r\n        \"a\": \"Inverse fisher transformation of a specified value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse Fisher transformation.\",\r\n            \"example\": \"0.962\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FISHER\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the Fisher transformation of a specified value.\",\r\n        \"a\": \"Fisher transformation of a specified value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the Fisher transformation.\",\r\n            \"example\": \"0.962\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MODE_SNGL\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the most commonly occurring value in a dataset.\",\r\n        \"a\": \"Most commonly occurring value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating mode.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating mode.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEIBULL_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.\",\r\n        \"a\": \"Weibull distribution function.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the Weibull distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"shape\",\r\n            \"detail\": \"The shape parameter of the Weibull distribution function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"scale\",\r\n            \"detail\": \"The scale parameter of the Weibull distribution function.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the cumulative distribution function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNT\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of numeric values in a dataset.\",\r\n        \"a\": \"The number of numeric values in dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when counting.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when counting.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of values in a dataset.\",\r\n        \"a\": \"The number of values in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when counting.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when counting.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVEDEV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the average of the magnitudes of deviations of data from a dataset's mean.\",\r\n        \"a\": \"Average magnitude of deviations from mean.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGE\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the numerical average value in a dataset, ignoring text.\",\r\n        \"a\": \"Numerical average value in a dataset, ignoring text.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the average value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the average value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the numerical average value in a dataset.\",\r\n        \"a\": \"Numerical average value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the average value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the average value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BINOM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.\",\r\n        \"a\": \"Binomial distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The number of successes for which to calculate the probability in `num_trials` trials.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_trials\",\r\n            \"detail\": \"The number of independent trials.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.005\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the binomial cumulative distribution.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BINOM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.\",\r\n        \"a\": \"Inverse cumulative binomial distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"num_trials\",\r\n            \"detail\": \"The number of independent trials.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.005\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"target_prob\",\r\n            \"detail\": \"The desired threshold probability.\",\r\n            \"example\": \"0.8\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONFIDENCE_NORM\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the width of half the confidence interval for a normal distribution.\",\r\n        \"a\": \"Confidence interval for a normal distribution.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"alpha\",\r\n            \"detail\": \"One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.\",\r\n            \"example\": \"0.05\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation of the population.\",\r\n            \"example\": \"1.6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"pop_size\",\r\n            \"detail\": \"The size of the population.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CORREL\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COVARIANCE_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the covariance of a dataset.\",\r\n        \"a\": \"The covariance of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COVARIANCE_S\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the sample covariance of a dataset.\",\r\n        \"a\": \"The sample covariance of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEVSQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the sum of squares of deviations based on a sample.\",\r\n        \"a\": \"The sum of squares of deviations based on a sample.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXPON_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the exponential distribution function with a specified lambda at a specified value.\",\r\n        \"a\": \"Exponential distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the exponential distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"lambda\",\r\n            \"detail\": \"The lambda to specify the exponential distribution function.\",\r\n            \"example\": \"0.5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the exponential cumulative distribution.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEIF\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the average of a range depending on criteria.\",\r\n        \"a\": \"Average of values depending on criteria.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"criteria_range\",\r\n            \"detail\": \"The range to check against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"average_range\",\r\n            \"detail\": \"The range to average. If not included, `criteria_range` is used for the average instead.\",\r\n            \"example\": \"B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEIFS\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the average of a range depending on multiple criteria.\",\r\n        \"a\": \"Average of values depending on multiple criteria.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"average_range\",\r\n            \"detail\": \"The range to average.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against `criterion1`.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range1`.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" C1:C10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERMUT\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.\",\r\n        \"a\": \"Number of permutations from a number of objects.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"n\",\r\n            \"detail\": \"The size of the pool of objects to choose from.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"k\",\r\n            \"detail\": \"The number of objects to choose.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRIMMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.\",\r\n        \"a\": \"Mean of a dataset excluding high/low ends.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"exclude_proportion\",\r\n            \"detail\": \"The proportion of the dataset to exclude, from the extremities of the set.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTILE_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n        \"a\": \"Value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"percentile\",\r\n            \"detail\": \"The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.\",\r\n            \"example\": \"0.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTILE_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value at a given percentile of a dataset.\",\r\n        \"a\": \"Value at a given percentile of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"percentile\",\r\n            \"detail\": \"The percentile whose value within `data` will be calculated and returned.`\",\r\n            \"example\": \"0.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PEARSON\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_S_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse standard normal distribution function for a specified value.\",\r\n        \"a\": \"Inverse standard normal distribution function.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse standard normal distribution function.\",\r\n            \"example\": \"0.75\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_S_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the standard normal cumulative distribution function for a specified value.\",\r\n        \"a\": \"Standard normal cumulative distribution function.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the standard normal cumulative distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.\",\r\n        \"a\": \"Inverse normal distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse normal distribution function.\",\r\n            \"example\": \"0.75\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the normal distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the normal distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.\",\r\n        \"a\": \"Normal distribution function.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the normal distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the normal distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the normal distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the normal cumulative distribution function rather than the distribution function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NEGBINOM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.\",\r\n        \"a\": \"Negative binomial distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"num_failures\",\r\n            \"detail\": \"The number of failures to model.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The number of successes to model.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the minimum numeric value in a dataset.\",\r\n        \"a\": \"Minimum numeric value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the minimum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MIN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the minimum value in a numeric dataset.\",\r\n        \"a\": \"Minimum value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the minimum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MEDIAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the median value in a numeric dataset.\",\r\n        \"a\": \"Median value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the median value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the median value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MAXA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the maximum numeric value in a dataset.\",\r\n        \"a\": \"Maximum numeric value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the maximum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MAX\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the maximum value in a numeric dataset.\",\r\n        \"a\": \"Maximum value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the maximum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGNORM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n        \"a\": \"Inverse log-normal cumulative distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"0.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGNORM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n        \"a\": \"Log-normal cumulative distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the log-normal cumulative distribution function.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"Z_TEST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the one-tailed p-value of a Z-test with standard distribution.\",\r\n        \"a\": \"One-tailed p-value of a z-test.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The test statistic to use in the Z-test.\",\r\n            \"example\": \"B2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROB\",\r\n        \"t\": 1,\r\n        \"d\": \"Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.\",\r\n        \"a\": \"Probability values lie in a range.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A3:A6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"probabilities\",\r\n            \"detail\": \"Array or range containing probabilities corresponding to `data`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"low_limit\",\r\n            \"detail\": \"The lower bound on the value range for which to calculate the probability.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"high_limit\",\r\n            \"detail\": \"The upper bound on the value range for which to calculate the probability.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUARTILE_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.\",\r\n        \"a\": \"Value nearest to a specific quartile of a dataset exclusive of 0 and 4.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"quartile_number\",\r\n            \"detail\": \"Which quartile to return.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUARTILE_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a value nearest to a specified quartile of a dataset.\",\r\n        \"a\": \"Value nearest to a specific quartile of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"quartile_number\",\r\n            \"detail\": \"Which quartile value to return.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"POISSON_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.\",\r\n        \"a\": \"Poisson distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the Poisson distribution function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the Poisson distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the Poisson cumulative distribution function rather than the distribution function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RSQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Square of the correlation coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the left tail probability for a Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The left-tailed Student's t-distribution\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST_2T\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability for two tailed Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The two tailed Student's t-distribution\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST_RT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the right tail probability for a Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The right-tailed Student's t-distribution\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the negative inverse of the one-tailed TDIST function.\",\r\n        \"a\": \"T.INV\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"probability\",\r\n            \"detail\": \"The probability associated with the two-tailed t-distribution.\",\r\n            \"example\": \"0.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_INV_2T\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the inverse of the two-tailed TDIST function.\",\r\n        \"a\": \"T.INV.2T\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"probability\",\r\n            \"detail\": \"The probability associated with the two-tailed t-distribution.\",\r\n            \"example\": \"0.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_TEST\",\r\n        \"t\": 1,\r\n        \"d\": \"t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.\",\r\n        \"a\": \"Returns the probability associated with t-test.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"range1\",\r\n            \"detail\": \"The first sample of data or group of cells to consider for the t-test.\",\r\n            \"example\": \"A1:A4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"range2\",\r\n            \"detail\": \"The second sample of data or group of cells to consider for the t-test.\",\r\n            \"example\": \"B1:B4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"tails\",\r\n            \"detail\": \"Specifies the number of distribution tails.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"Specifies the type of t-test.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"F_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n        \"a\": \"F probability distribution (left-tailed).\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n            \"example\": \"15.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom1\",\r\n            \"detail\": \"The numerator of the number of degrees of freedom.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom2\",\r\n            \"detail\": \"The denominator of the number of degrees of freedom.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Logical value that determines the form of the function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"F_DIST_RT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n        \"a\": \"F probability distribution.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n            \"example\": \"15.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom1\",\r\n            \"detail\": \"The numerator of the number of degrees of freedom.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom2\",\r\n            \"detail\": \"The denominator of the number of degrees of freedom.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VAR_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on an entire population.\",\r\n        \"a\": \"Variance of entire population.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VAR_S\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on a sample.\",\r\n        \"a\": \"Variance.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VARA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on a sample, setting text to the value `0`.\",\r\n        \"a\": \"Variance of sample (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VARPA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on an entire population, setting text to the value `0`.\",\r\n        \"a\": \"Variance of entire population (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STEYX\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard error of the predicted y-value for each x in the regression of a dataset.\",\r\n        \"a\": \"Standard error of predicted y-values in regression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STANDARDIZE\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.\",\r\n        \"a\": \"Normalized equivalent of a random variable.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value of the random variable to normalize.\",\r\n            \"example\": \"96\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean of the distribution.\",\r\n            \"example\": \"80\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation of the distribution.\",\r\n            \"example\": \"6.7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SMALL\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the nth smallest element from a data set, where n is user-defined.\",\r\n        \"a\": \"Nth smallest element in a data set.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The rank from smallest to largest of the element to return.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SLOPE\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the slope of the line resulting from linear regression of a dataset.\",\r\n        \"a\": \"Slope of line from linear regression of data.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SKEW\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.\",\r\n        \"a\": \"Skewness of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SKEW_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.\",\r\n        \"a\": \"Skewness of a population's dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VLOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.\",\r\n        \"a\": \"Vertical lookup.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.\",\r\n            \"example\": \"A2:B26\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"index\",\r\n            \"detail\": \"The column index of the value to be returned, where the first column in `range` is numbered 1.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_sorted\",\r\n            \"detail\": \"Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HLOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.\",\r\n        \"a\": \"Horizontal lookup\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.\",\r\n            \"example\": \"A2:Z6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"index\",\r\n            \"detail\": \"The row index of the value to be returned, where the first row in `range` is numbered 1.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_sorted\",\r\n            \"detail\": \"Indicates whether the row to be searched (the first row of the specified range) is sorted.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.\",\r\n        \"a\": \"Look up a value.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for in the row or column. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"search_range|search_result_array\",\r\n            \"detail\": \"One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"result_range\",\r\n            \"detail\": \"The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.\",\r\n            \"example\": \"B1:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ADDRESS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a cell reference as a string.\",\r\n        \"a\": \"Cell reference as a string.\",\r\n        \"m\": [2, 5],\r\n        \"p\": [{\r\n            \"name\": \"row\",\r\n            \"detail\": \"The row number of the cell reference\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"column\",\r\n            \"detail\": \"The column number (not name) of the cell reference. `A` is column number `1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"absolute_relative_mode\",\r\n            \"detail\": \"An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"use_a1_notation\",\r\n            \"detail\": \"A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sheet\",\r\n            \"detail\": \"Text indicating the name of the sheet into which the address points.\",\r\n            \"example\": \"\\\"Sheet2\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INDIRECT\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a cell reference specified by a string.\",\r\n        \"a\": \"A cell reference specified by a string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference_as_string\",\r\n            \"detail\": \"A cell reference, written as a string with surrounding quotation marks.\",\r\n            \"example\": \"\\\"Sheet2!\\\"&B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"is_A1_notation\",\r\n            \"detail\": \"Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROW\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the row number of a specified cell.\",\r\n        \"a\": \"Row number of a specified cell.\",\r\n        \"m\": [0, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The cell whose row number will be returned.\",\r\n            \"example\": \"A9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROWS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the number of rows in a specified array or range.\",\r\n        \"a\": \"Number of rows in a specified array or range.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range whose row count will be returned.\",\r\n            \"example\": \"A9:A62\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMN\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the column number of a specified cell, with `A=1`.\",\r\n        \"a\": \"Column number of a specified cell.\",\r\n        \"m\": [0, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The cell whose column number will be returned. Column `A` corresponds to `1`.\",\r\n            \"example\": \"A9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMNS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the number of columns in a specified array or range.\",\r\n        \"a\": \"Number of columns in a specified array or range.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range whose column count will be returned.\",\r\n            \"example\": \"A9:W62\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OFFSET\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a range reference shifted a specified number of rows and columns from a starting cell reference.\",\r\n        \"a\": \"A range reference offset relative to a cell.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The starting point from which to count the offset rows and columns.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"offset_rows\",\r\n            \"detail\": \"The number of rows to offset by.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"offset_columns\",\r\n            \"detail\": \"The number of columns to offset by.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"height\",\r\n            \"detail\": \"The height of the range to return starting at the offset target.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"width\",\r\n            \"detail\": \"The width of the range to return starting at the offset target.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MATCH\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the relative position of an item in a range that matches a specified value.\",\r\n        \"a\": \"Position of item in range that matches value.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"\\\"Sunday\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The one-dimensional array to be searched.\",\r\n            \"example\": \"A2:A9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"search_type\",\r\n            \"detail\": \"The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INDEX\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the content of a cell, specified by row and column offset.\",\r\n        \"a\": \"Content of cell specified by row and column offset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The array of cells to be offset into.\",\r\n            \"example\": \"A1:C20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"row\",\r\n            \"detail\": \"The number of offset rows.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"column\",\r\n            \"detail\": \"The number of offset columns.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GETPIVOTDATA\",\r\n        \"t\": 2,\r\n        \"d\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n        \"a\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n        \"m\": [2, 254],\r\n        \"p\": [{\r\n            \"name\": \"value_name\",\r\n            \"detail\": \"The name of the value in the pivot table for which you want to get data.\",\r\n            \"example\": \"\\\"SUM of number of units\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"any_pivot_table_cell\",\r\n            \"detail\": \"Any reference to a cell in the desired pivot table (top corner recommended).\",\r\n            \"example\": \"'Pivot table'!A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"original_column\",\r\n            \"detail\": \"The name of the column in the original data set (not the pivot table).\",\r\n            \"example\": \"\\\"division\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"pivot_item\",\r\n            \"detail\": \"The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.\",\r\n            \"example\": \"\\\"east\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CHOOSE\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns an element from a list of choices based on index.\",\r\n        \"a\": \"An element from a list of choices based on index.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"index\",\r\n            \"detail\": \"Which choice (of the up to 30 provided) to return.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"choice1\",\r\n            \"detail\": \"A potential value to return. Required. May be a reference to a cell or an individual value.\",\r\n            \"example\": \"\\\"A\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"choice2\",\r\n            \"detail\": \"Additional values among which to choose.\",\r\n            \"example\": \"\\\"B\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HYPERLINK\",\r\n        \"t\": 2,\r\n        \"d\": \"Creates a hyperlink inside a cell.\",\r\n        \"a\": \"Creates a hyperlink inside a cell.\",\r\n        \"p\": [{\r\n            \"name\": \"url\",\r\n            \"detail\": \"The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.\",\r\n            \"example\": \"\\\"http://www.luckysheet.com/\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"link_label\",\r\n            \"detail\": \"The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.\",\r\n            \"example\": \"\\\"luckysheet\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TIME\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided hour, minute, and second into a time.\",\r\n        \"a\": \"Converts hour/minute/second into a time.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"hour\",\r\n            \"detail\": \"The hour component of the time.\",\r\n            \"example\": \"11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"minute\",\r\n            \"detail\": \"The minute component of the time.\",\r\n            \"example\": \"40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"second\",\r\n            \"detail\": \"The second component of the time.\",\r\n            \"example\": \"59\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TIMEVALUE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the fraction of a 24-hour day the time represents.\",\r\n        \"a\": \"Converts a time string into its serial number representation.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time_string\",\r\n            \"detail\": \"The string that holds the time representation.\",\r\n            \"example\": \"\\\"2:15 PM\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EOMONTH\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a date on the last day of a month that falls a specified number of months before or after another date.\",\r\n        \"a\": \"Last day of a month before or after a date.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to calculate the result.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"months\",\r\n            \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to consider.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EDATE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a date a specified number of months before or after another date.\",\r\n        \"a\": \"Date a number of months before/after another date.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to calculate the result.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"months\",\r\n            \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to calculate.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SECOND\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the second component of a specific time, in numeric format.\",\r\n        \"a\": \"Second component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the second component\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINUTE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the minute component of a specific time, in numeric format.\",\r\n        \"a\": \"Minute component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the minute component.\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HOUR\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the hour component of a specific time, in numeric format.\",\r\n        \"a\": \"Hour component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the hour component.\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOW\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the current date and time as a date value.\",\r\n        \"a\": \"Current date and time as a date value.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"NETWORKDAYS\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of net working days between two provided days.\",\r\n        \"a\": \"Net working days between two provided days.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the date serial numbers to consider holidays.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NETWORKDAYS_INTL\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of net working days between two provided days excluding specified weekend days and holidays.\",\r\n        \"a\": \"Net working days between two dates (specifying weekends).\",\r\n        \"m\": [2, 4],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"weekend\",\r\n            \"detail\": \"A number or string representing which days of the week are considered weekends.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider as holidays.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISOWEEKNUM\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the ISO week of the year where the provided date falls.\",\r\n        \"a\": \"ISO week number of the year.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEEKNUM\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the week of the year where the provided date falls.\",\r\n        \"a\": \"Week number of the year.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"A number representing the day that a week starts on. Sunday = 1.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEEKDAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the day of the week of the date provided.\",\r\n        \"a\": \"Day of the week of the date provided (as number).\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the day of the month that a specific date falls on, in numeric format.\",\r\n        \"a\": \"Day of the month that a specific date falls on.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the day.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAYS\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of days between two dates.\",\r\n        \"a\": \"Number of days between two dates.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end of the date range.\",\r\n            \"example\": \"2011-3-15\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start of the date range.\",\r\n            \"example\": \"2011-2-1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAYS360\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the difference between two days based on the 360 day year used in some financial interest calculations.\",\r\n        \"a\": \"Days between two dates on a 360-day year.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"method\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATE\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided year, month, and day into a date.\",\r\n        \"a\": \"Converts year/month/day into a date.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"year\",\r\n            \"detail\": \"The year component of the date.\",\r\n            \"example\": \"1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"month\",\r\n            \"detail\": \"The month component of the date.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day\",\r\n            \"detail\": \"The day component of the date.\",\r\n            \"example\": \"20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATEVALUE\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided date string in a known format to a date value.\",\r\n        \"a\": \"Converts a date string to a date value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date_string\",\r\n            \"detail\": \"The string representing the date.\",\r\n            \"example\": \"\\\"1969-7-20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATEDIF\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the number of days, months, or years between two dates.\",\r\n        \"a\": \"Date Difference.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"A string abbreviation for unit of time. For example, \\\"M\\\" for month. Accepted values are \\\"Y\\\",\\\"M\\\",\\\"D\\\",\\\"MD\\\",\\\"YM\\\",\\\"YD\\\".\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WORKDAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the date after a number of working days from a specified start date.\",\r\n        \"a\": \"Number of working days from start date.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to begin counting.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"num_days\",\r\n            \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider holidays.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WORKDAY_INTL\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the date after a specified number of workdays excluding specified weekend days and holidays.\",\r\n        \"a\": \"Date after a number of workdays (specifying weekends).\",\r\n        \"m\": [2, 4],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to begin counting.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"num_days\",\r\n            \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"weekend\",\r\n            \"detail\": \"A number or string representing which days of the week are considered weekends.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider holidays.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YEAR\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the year specified by a given date.\",\r\n        \"a\": \"Year specified by a given date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the year.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YEARFRAC\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of years, including fractional years, between two dates using a specified day count convention.\",\r\n        \"a\": \"Exact number of years between two dates.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TODAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the current date as a date value.\",\r\n        \"a\": \"Current date as a date value.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"MONTH\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the month of the year a specific date falls in, in numeric format.\",\r\n        \"a\": \"Month of the year a specific date falls in.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the month.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EFFECT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.\",\r\n        \"a\": \"Annual effective interest rate.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"nominal_rate\",\r\n            \"detail\": \"The nominal interest rate per year.\",\r\n            \"example\": \"0.99\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"periods_per_year\",\r\n            \"detail\": \"The number of compounding periods per year.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLAR\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number into the currency specific to your spreadsheet locale.\",\r\n        \"a\": \"Formats a number as currency specific to your spreadsheet locale.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The value to be formatted.\",\r\n            \"example\": \"1.2351\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_places\",\r\n            \"detail\": \"The number of decimal places to display.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLARDE\",\r\n        \"t\": 8,\r\n        \"d\": \"Converts a price quotation given as a decimal fraction into a decimal value.\",\r\n        \"a\": \"Converts a decimal fraction to decimal value.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"fractional_price\",\r\n            \"detail\": \"The price quotation given using fractional decimal conventions.\",\r\n            \"example\": \"100.10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n            \"example\": \"32\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLARFR\",\r\n        \"t\": 8,\r\n        \"d\": \"Converts a price quotation given as a decimal value into a decimal fraction.\",\r\n        \"a\": \"Converts a decimal value to decimal fraction.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_price\",\r\n            \"detail\": \"The price quotation given as a decimal value.\",\r\n            \"example\": \"100.125\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n            \"example\": \"32\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DB\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.\",\r\n        \"a\": \"Depreciation via declining balance method.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"month\",\r\n            \"detail\": \"The number of months in the first year of depreciation.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DDB\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the double-declining balance method.\",\r\n        \"a\": \"Depreciation via double-declining balance method.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The factor by which depreciation decreases.\",\r\n            \"example\": \"2.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RATE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.\",\r\n        \"a\": \"Interest rate of an annuity investment.\",\r\n        \"m\": [3, 6],\r\n        \"p\": [{\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_per_period\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"-100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"400\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the interest rate will be.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CUMPRINC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Cumulative principal paid over a set of periods.\",\r\n        \"m\": [6, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"first_period\",\r\n            \"detail\": \"The number of the payment period to begin the cumulative calculation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"last_period\",\r\n            \"detail\": \"The number of the payment period to end the cumulative calculation.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPNUM\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.\",\r\n        \"a\": \"Number of coupons between settlement and maturity.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"02\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SYD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the sum of years digits method.\",\r\n        \"a\": \"Depreciation via sum of years digits method.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLEQ\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.\",\r\n        \"a\": \"Equivalent rate of return for a Treasury bill.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the bill at time of purchase.\",\r\n            \"example\": \"2)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLYIELD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the yield of a US Treasury Bill based on price.\",\r\n        \"a\": \"The yield of a us treasury bill based on price.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLPRICE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a US Treasury Bill based on discount rate.\",\r\n        \"a\": \"Price of US treasury bill.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the bill at time of purchase.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Present value of an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"D2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACCRINT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the accrued interest of a security that has periodic payments.\",\r\n        \"a\": \"Accrued interest of security with periodic payments.\",\r\n        \"m\": [6, 8],\r\n        \"p\": [{\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"first_payment\",\r\n            \"detail\": \"The first date interest will be paid.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"10000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"calc_method\",\r\n            \"detail\": \"[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \\n\\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \\n\\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACCRINTM\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the accrued interest of a security that pays interest at maturity.\",\r\n        \"a\": \"Accrued interest of security paying at maturity.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity date of the security.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"1000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYBS\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days from the first coupon, or interest payment, until settlement.\",\r\n        \"a\": \"Number of days from first coupon to settlement.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYS\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.\",\r\n        \"a\": \"Days in coupon period containing settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYSNC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days from the settlement date until the next coupon, or interest payment.\",\r\n        \"a\": \"Days from settlement until next coupon.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPNCD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates next coupon, or interest payment, date after the settlement date.\",\r\n        \"a\": \"Next coupon date after the settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"01)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"DATE(2019\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPPCD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates last coupon, or interest payment, date before the settlement date.\",\r\n        \"a\": \"Last coupon date before settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"01)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"DATE(2019\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Future value of an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"400\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FVSCHEDULE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the future value of some principal based on a specified series of potentially varying interest rates.\",\r\n        \"a\": \"Future value of principal from series of rates.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"principal\",\r\n            \"detail\": \"The amount of initial capital or value to compound against.\",\r\n            \"example\": \"10000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"rate_schedule\",\r\n            \"detail\": \"A series of interest rates to compound against the `principal`.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YIELD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.\",\r\n        \"a\": \"Annual yield of a security paying periodic interest.\",\r\n        \"m\": [6, 7],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.057\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YIELDDISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual yield of a discount (non-interest-bearing) security, based on price.\",\r\n        \"a\": \"Annual yield of a discount security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOMINAL\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.\",\r\n        \"a\": \"Annual nominal interest rate.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"effective_rate\",\r\n            \"detail\": \"The effective interest rate per year.\",\r\n            \"example\": \"0.85\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"periods_per_year\",\r\n            \"detail\": \"The number of compounding periods per year.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"XIRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.\",\r\n        \"a\": \"Internal rate of return given non-periodic cashflows.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"B2:B25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"cashflow_dates\",\r\n            \"detail\": \"An array or range with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n            \"example\": \"C2:C25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the internal rate of return will be.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MIRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.\",\r\n        \"a\": \"Modified internal rate of return.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"A2:A25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"financing_rate\",\r\n            \"detail\": \"The interest rate paid on funds invested.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"reinvestment_return_rate\",\r\n            \"detail\": \"The return (as a percentage) earned on reinvestment of income received from the investment.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the internal rate of return on an investment based on a series of periodic cash flows.\",\r\n        \"a\": \"Internal rate of return given periodic cashflows.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"A2:A25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the internal rate of return will be.\",\r\n            \"example\": \"200\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NPV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n        \"a\": \"The net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the investment over one period.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cashflow1\",\r\n            \"detail\": \"The first future cash flow.\",\r\n            \"example\": \"200\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"cashflow2\",\r\n            \"detail\": \"Additional future cash flows.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"XNPV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.\",\r\n        \"a\": \"Net present value given non-periodic cashflows.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the investment over one period.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"A range of cells containing the income or payments associated with the investment.\",\r\n            \"example\": \"B2:B25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"cashflow_dates\",\r\n            \"detail\": \"A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n            \"example\": \"C2:C25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CUMIPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Cumulative interest paid over a set of periods.\",\r\n        \"m\": [6, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"first_period\",\r\n            \"detail\": \"The number of the payment period to begin the cumulative calculation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"last_period\",\r\n            \"detail\": \"The number of the payment period to end the cumulative calculation.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Periodic payment for an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \" 100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"D2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Payment on interest for an investment.\",\r\n        \"m\": [4, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The amortization period, in terms of number of periods.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"80000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"E2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Payment on the principal of an investment.\",\r\n        \"m\": [4, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The amortization period, in terms of number of periods.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"3*12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INTRATE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.\",\r\n        \"a\": \"Calculates effective interest rate.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"buy_date\",\r\n            \"detail\": \"The date of purchase of the investment.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sell_date\",\r\n            \"detail\": \"The date of sale of the investment.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"buy_price\",\r\n            \"detail\": \"The price at which the investment was purchased.\",\r\n            \"example\": \"100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sell_price\",\r\n            \"detail\": \"The price at which the investment was sold.\",\r\n            \"example\": \"101200\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n        \"a\": \"Price of a security paying periodic interest.\",\r\n        \"m\": [6, 7],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.057\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.065\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICEDISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a discount (non-interest-bearing) security, based on expected yield.\",\r\n        \"a\": \"Price of a discount security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the security at time of purchase.\",\r\n            \"example\": \"0.0525\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICEMAT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a security paying interest at maturity, based on expected yield.\",\r\n        \"a\": \"Price of security paying interest at maturity.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.061\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.061\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RECEIVED\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.\",\r\n        \"a\": \"Amount received at maturity for a security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"investment\",\r\n            \"detail\": \"The amount invested (irrespective of face value of each security).\",\r\n            \"example\": \"10000000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the security invested in.\",\r\n            \"example\": \"0.0575\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the discount rate of a security based on price.\",\r\n        \"a\": \"The discount rate of a security based on price.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"97.975\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NPER\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Number of payment periods for an investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount of each payment made.\",\r\n            \"example\": \"500\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"40000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SLN\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for one period using the straight-line method.\",\r\n        \"a\": \"Depreciation of asset using the straight-line method.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"300000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"75000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DURATION\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.\",\r\n        \"a\": \"Number of periods for an investment to reach a value.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MDURATION\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n        \"a\": \"Modified Macaulay duration.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to decimal format.\",\r\n        \"a\": \"Converts a signed binary number to decimal format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to signed hexadecimal format.\",\r\n        \"a\": \"Converts a binary number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to signed hexademical, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to signed octal format.\",\r\n        \"a\": \"Converts a binary number to octal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed binary format.\",\r\n        \"a\": \"Converts a decimal number to signed binary format.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed hexadecimal format.\",\r\n        \"a\": \"Converts a decimal number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed hexadecimal, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed octal format.\",\r\n        \"a\": \"Converts a decimal number to signed octal format.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to signed binary format.\",\r\n        \"a\": \"Converts a hexadecimal number to binary.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to decimal format.\",\r\n        \"a\": \"Converts a hexadecimal number to decimal.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to signed octal format.\",\r\n        \"a\": \"Converts a hexadecimal number to octal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to signed binary format.\",\r\n        \"a\": \"Converts an octal number to binary.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to decimal format.\",\r\n        \"a\": \"Converts a signed octal number to decimal format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to signed hexadecimal format.\",\r\n        \"a\": \"Converts an octal number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMPLEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Creates a complex number given real and imaginary coefficients.\",\r\n        \"a\": \"Creates a complex number.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"real_part\",\r\n            \"detail\": \"The real coefficient.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"imaginary_part\",\r\n            \"detail\": \"The imaginary coefficient.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"suffix\",\r\n            \"detail\": \"The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.\",\r\n            \"example\": \"\\\"j\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangestring\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMREAL\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the real coefficient of a complex number.\",\r\n        \"a\": \"The real coefficient of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"complex_number\",\r\n            \"detail\": \"The complex number, in the a+bi or a+bj format.\",\r\n            \"example\": \"\\\"4+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMAGINARY\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the imaginary coefficient of a complex number.\",\r\n        \"a\": \"The imaginary coefficient of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"complex_number\",\r\n            \"detail\": \"The complex number, in the a+bi or a+bj format.\",\r\n            \"example\": \"\\\"4+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMCONJUGATE\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the complex conjugate of a number.\",\r\n        \"a\": \"The complex conjugate of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The complex number to calculate the conjugate for.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMABS\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns absolute value (or modulus) of a complex number.\",\r\n        \"a\": \"The absolute value of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The complex number to calculate the absolute value of.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DELTA\",\r\n        \"t\": 9,\r\n        \"d\": \"Compare two numeric values, returning 1 if they're equal.\",\r\n        \"a\": \"Compare two numeric values.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"number1\",\r\n            \"detail\": \"The first number to compare.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number2\",\r\n            \"detail\": \"The second number to compare.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMSUM\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the sum of a series of complex numbers.\",\r\n        \"a\": \"Sum of a series of complex numbers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first complex number or range to add together.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional complex numbers or ranges to add to `value1`.\",\r\n            \"example\": \"\\\"5-3i\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMSUB\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the difference between two complex numbers.\",\r\n        \"a\": \"The difference between two complex numbers.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"first_number\",\r\n            \"detail\": \"The complex number to subtract second_number from.\",\r\n            \"example\": \"\\\"6+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"second_number\",\r\n            \"detail\": \"The complex number to subtract from first_number.\",\r\n            \"example\": \"\\\"2+3i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMPRODUCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the result of multiplying a series of complex numbers together.\",\r\n        \"a\": \"Result of multiplying a series of complex numbers together.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first number or range to calculate for the product.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"Additional complex numbers or ranges to calculate for the product.\",\r\n            \"example\": \"\\\"5-3i\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMDIV\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns one complex number divided by another.\",\r\n        \"a\": \"One complex number divided by another.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The complex number to be divided.\",\r\n            \"example\": \"\\\"11+16i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The complex number to divide by.\",\r\n            \"example\": \"\\\"3+2i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOT\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.\",\r\n        \"a\": \"Returns opposite of provided logical value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression\",\r\n            \"detail\": \"An expression or reference to a cell holding an expression that represents some logical value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRUE\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the logical value `TRUE`.\",\r\n        \"a\": \"Logical value `true`.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"FALSE\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the logical value `FALSE`.\",\r\n        \"a\": \"Logical value `false`.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"AND\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.\",\r\n        \"a\": \"Logical `and` operator.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression1\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"logical_expression2\",\r\n            \"detail\": \"More expressions that represent logical values.\",\r\n            \"example\": \"A3 = \\\"bar\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IFERROR\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.\",\r\n        \"a\": \"Value if it is not an error, otherwise 2nd argument.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to return if `value` itself is not an error.\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_error\",\r\n            \"detail\": \"The value the function returns if `value` is an error.\",\r\n            \"example\": \"\\\"Error in cell A1\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IF\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.\",\r\n        \"a\": \"Returns value depending on logical expression.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_true\",\r\n            \"detail\": \"The value the function returns if `logical_expression` is `TRUE`.\",\r\n            \"example\": \"\\\"A2 is foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_false\",\r\n            \"detail\": \"The value the function returns if `logical_expression` is `FALSE`.\",\r\n            \"example\": \"\\\"A2 was false\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OR\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.\",\r\n        \"a\": \"Logical `or` operator.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression1\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"logical_expression2\",\r\n            \"detail\": \"More expressions that evaluate to logical values.\",\r\n            \"example\": \" A3 = \\\"bar\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.\",\r\n        \"a\": \"Not equal.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to test against `value1` for inequality.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EQ\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.\",\r\n        \"a\": \"Equal.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to test against `value1` for equality.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.\",\r\n        \"a\": \"Strictly greater than.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being greater than `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GTE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.\",\r\n        \"a\": \"Greater than or equal to.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being greater than or equal to `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.\",\r\n        \"a\": \"Less than.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being less than `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LTE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.\",\r\n        \"a\": \"Less than or equal to.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being less than or equal to `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ADD\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the sum of two numbers. Equivalent to the `+` operator.\",\r\n        \"a\": \"Sum of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first addend.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second addend.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINUS\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the difference of two numbers. Equivalent to the `-` operator.\",\r\n        \"a\": \"Difference of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The minuend, or number to be subtracted from.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The subtrahend, or number to subtract from `value1`.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MULTIPLY\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the product of two numbers. Equivalent to the `*` operator.\",\r\n        \"a\": \"Product of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first multiplicand.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"The second multiplicand.\",\r\n            \"example\": \"B2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DIVIDE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns one number divided by another. Equivalent to the `/` operator.\",\r\n        \"a\": \"One number divided by another\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONCAT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the concatenation of two values. Equivalent to the `&` operator.\",\r\n        \"a\": \"Concatenation of two values\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to which `value2` will be appended.\",\r\n            \"example\": \"\\\"de\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to append to `value1`.\",\r\n            \"example\": \"\\\"mystify\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UNARY_PERCENT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.\",\r\n        \"a\": \"Value interpreted as a percentage.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"percentage\",\r\n            \"detail\": \"The value to interpret as a percentage.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONCATENATE\",\r\n        \"t\": 12,\r\n        \"d\": \"Appends strings to one another.\",\r\n        \"a\": \"Appends strings to one another.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"string1\",\r\n            \"detail\": \"The initial string.\",\r\n            \"example\": \"\\\"Super\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"string2\",\r\n            \"detail\": \"More strings to append in sequence.\",\r\n            \"example\": \"\\\"calla\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CODE\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the numeric Unicode map value of the first character in the string provided.\",\r\n        \"a\": \"Numeric unicode map value of character.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string whose first character's Unicode map value will be returned.\",\r\n            \"example\": \"\\\"a\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CHAR\",\r\n        \"t\": 12,\r\n        \"d\": \"Convert a number into a character according to the current Unicode table.\",\r\n        \"a\": \"Gets character associated with number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"table_number\",\r\n            \"detail\": \"The number of the character to look up from the current Unicode table in decimal format.\",\r\n            \"example\": \"97\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ARABIC\",\r\n        \"t\": 12,\r\n        \"d\": \"Computes the value of a Roman numeral.\",\r\n        \"a\": \"Computes the value of a roman numeral.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"roman_numeral\",\r\n            \"detail\": \"The Roman numeral to format, whose value must be between 1 and 3999, inclusive.\",\r\n            \"example\": \"\\\"XIV\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROMAN\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number in Roman numerals.\",\r\n        \"a\": \"Formats a number in Roman numerals.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number to format, between 1 and 3999, inclusive.\",\r\n            \"example\": \"499\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXEXTRACT\",\r\n        \"t\": 12,\r\n        \"d\": \"Extracts matching substrings according to a regular expression.\",\r\n        \"a\": \"Extracts matching substrings with regular expression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The input text.\",\r\n            \"example\": \"\\\"Needle in a haystack\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The first part of `text` that matches this expression will be returned.\",\r\n            \"example\": \"\\\".e{2}dle\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXMATCH\",\r\n        \"t\": 12,\r\n        \"d\": \"Whether a piece of text matches a regular expression.\",\r\n        \"a\": \"Whether a piece of text matches regular expression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text to be tested against the regular expression.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The regular expression to test the text against.\",\r\n            \"example\": \"\\\"S.r\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXREPLACE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces part of a text string with a different text string using regular expressions.\",\r\n        \"a\": \"Replaces text with regular expressions.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text, a part of which will be replaced.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The regular expression.  All matching instances in `text` will be replaced.\",\r\n            \"example\": \"\\\"S.*d\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"replacement\",\r\n            \"detail\": \"The text which will be inserted into the original text.\",\r\n            \"example\": \"\\\"Bed\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns string arguments as text, or the empty string if the value is not text.\",\r\n        \"a\": \"String arguments as text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument to be converted to text.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FIXED\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number with a fixed number of decimal places.\",\r\n        \"a\": \"Formats number with fixed number of decimal places.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number to format.\",\r\n            \"example\": \"3.141592653\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_places\",\r\n            \"detail\": \"The number of decimal places to display in the result.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"suppress_separator\",\r\n            \"detail\": \"Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FIND\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.\",\r\n        \"a\": \"First position of string found in text, case-sensitive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"n\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FINDB\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text counting each double-character as 2.\",\r\n        \"a\": \"Position at which a string is first found within text (binary).\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"new\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"\\\"new year\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"JOIN\",\r\n        \"t\": 12,\r\n        \"d\": \"Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.\",\r\n        \"a\": \"Concatenates elements of arrays with delimiter.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"delimiter\",\r\n            \"detail\": \"The character or string to place between each concatenated value.\",\r\n            \"example\": \"\\\" and-a \\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_or_array1\",\r\n            \"detail\": \"The value or values to be appended using `delimiter`.\",\r\n            \"example\": \"{1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_or_array2\",\r\n            \"detail\": \"More values to be appended using `delimiter`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LEFT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a substring from the beginning of a specified string.\",\r\n        \"a\": \"Substring from beginning of specified string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string from which the left portion will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_characters\",\r\n            \"detail\": \"The number of characters to return from the left side of `string`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RIGHT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a substring from the end of a specified string.\",\r\n        \"a\": \"A substring from the end of a specified string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string from which the right portion will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_characters\",\r\n            \"detail\": \"The number of characters to return from the right side of `string`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MID\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a segment of a string.\",\r\n        \"a\": \"A segment of a string.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string to extract a segment from.\",\r\n            \"example\": \"\\\"get this\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"extract_length\",\r\n            \"detail\": \"The length of the segment to extract.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LEN\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the length of a string.\",\r\n        \"a\": \"Length of a string.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string whose length will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LENB\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the length of a string in bytes.\",\r\n        \"a\": \"Length of a string in bytes.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string whose length will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOWER\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a specified string to lowercase.\",\r\n        \"a\": \"Converts a specified string to lowercase.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string to convert to lowercase.\",\r\n            \"example\": \"\\\"LOREM IPSUM\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UPPER\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a specified string to uppercase.\",\r\n        \"a\": \"Converts a specified string to uppercase.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string to convert to uppercase.\",\r\n            \"example\": \"\\\"lorem ipsum\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXACT\",\r\n        \"t\": 12,\r\n        \"d\": \"Tests whether two strings are identical.\",\r\n        \"a\": \"Tests whether two strings are identical.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"string1\",\r\n            \"detail\": \"The first string to compare\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"string2\",\r\n            \"detail\": \"The second string to compare\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REPLACE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces part of a text string with a different text string.\",\r\n        \"a\": \"Replaces part of a text string with different text.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text, a part of which will be replaced.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"position\",\r\n            \"detail\": \"The position where the replacement will begin (starting from 1).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"length\",\r\n            \"detail\": \"The number of characters in the text to be replaced.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_text\",\r\n            \"detail\": \"The text which will be inserted into the original text.\",\r\n            \"example\": \"\\\"Bed\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REPT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns specified text repeated a number of times.\",\r\n        \"a\": \"Specified text repeated a number of times.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text_to_repeat\",\r\n            \"detail\": \"The character or string to repeat.\",\r\n            \"example\": \"\\\"ha\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_repetitions\",\r\n            \"detail\": \"The number of times `text_to_repeat` should appear in the value returned.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEARCH\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.\",\r\n        \"a\": \"First position of string found in text, ignoring case.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"n\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUBSTITUTE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces existing text with new text in a string.\",\r\n        \"a\": \"Replaces existing text with new text in a string.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text within which to search and replace.\",\r\n            \"example\": \"\\\"search for it\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to search for within `text_to_search`.\",\r\n            \"example\": \"\\\"search for\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"replace_with\",\r\n            \"detail\": \"The string that will replace `search_for`.\",\r\n            \"example\": \"\\\"Google\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"occurrence_number\",\r\n            \"detail\": \"The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CLEAN\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the text with the non-printable ASCII characters removed.\",\r\n        \"a\": \"Removes non-printable characters from a piece of text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text whose non-printable characters are to be removed.\",\r\n            \"example\": \"\\\"AF\\\"&CHAR(31)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TEXT\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a number into text according to a specified format.\",\r\n        \"a\": \"Formats a number into text.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number, date, or time to format.\",\r\n            \"example\": \"1.23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"format\",\r\n            \"detail\": \"The pattern by which to format the number, enclosed in quotation marks.\",\r\n            \"example\": \"\\\"$0.00\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRIM\",\r\n        \"t\": 12,\r\n        \"d\": \"Removes leading, trailing, and repeated spaces in text.\",\r\n        \"a\": \"Removes space characters.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text or reference to a cell containing text to be trimmed.\",\r\n            \"example\": \"\\\" lorem ipsum\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VALUE\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a string in any of the date, time or number formats that Google Sheets understands into a number.\",\r\n        \"a\": \"Converts a date/time/number string into a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string containing the value to be converted.\",\r\n            \"example\": \"\\\"123\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROPER\",\r\n        \"t\": 12,\r\n        \"d\": \"Capitalizes each word in a specified string.\",\r\n        \"a\": \"Capitalizes each word in a specified string.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text_to_capitalize\",\r\n            \"detail\": \"The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.\",\r\n            \"example\": \"\\\"united states\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONVERT\",\r\n        \"t\": 13,\r\n        \"d\": \"Converts a numeric value to a different unit of measure.\",\r\n        \"a\": \"Unit conversion for numbers.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The numeric value in `start_unit` to convert to `end_unit`.\",\r\n            \"example\": \"5.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"start_unit\",\r\n            \"detail\": \"The starting unit, the unit currently assigned to `value`.\",\r\n            \"example\": \"\\\"g\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_unit\",\r\n            \"detail\": \"The unit of measure into which to convert the argument, `value`.\",\r\n            \"example\": \"\\\"kg\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMX2MY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the differences of the squares of values in two arrays.\",\r\n        \"a\": \"Sum of the differences of squares.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMX2PY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the sums of the squares of values in two arrays.\",\r\n        \"a\": \"Sum of the sums of squares.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMXMY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the squares of differences of values in two arrays.\",\r\n        \"a\": \"Sum of the squares of differences.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRANSPOSE\",\r\n        \"t\": 14,\r\n        \"d\": \"Transposes the rows and columns of an array or range of cells.\",\r\n        \"a\": \"Transposes the rows and columns of an array.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"array_or_range\",\r\n            \"detail\": \"The array or range whose rows and columns will be swapped.\",\r\n            \"example\": \"{1,2}\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TREND\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.\",\r\n        \"a\": \"Fits points to linear trend derived via least-squares.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_data_x\",\r\n            \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\",\r\n            \"example\": \"A11:A13\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FREQUENCY\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the frequency distribution of a one-column array into specified classes.\",\r\n        \"a\": \"The frequency distribution of array.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the values to be counted.\",\r\n            \"example\": \"A2:A40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"classes\",\r\n            \"detail\": \"The array or range containing the set of classes.\",\r\n            \"example\": \"B2:B5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GROWTH\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.\",\r\n        \"a\": \"Fits points to exponential growth trend.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_data_x\",\r\n            \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\",\r\n            \"example\": \"A11:A13\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LINEST\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.\",\r\n        \"a\": \"Best-fit linear trend via least-squares.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"calculate_b\",\r\n            \"detail\": \"Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"verbose\",\r\n            \"detail\": \"A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGEST\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.\",\r\n        \"a\": \"Best-fit exponential growth curve.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"verbose\",\r\n            \"detail\": \"A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MDETERM\",\r\n        \"t\": 14,\r\n        \"d\": \"Returns the matrix determinant of a square matrix specified as an array or range.\",\r\n        \"a\": \"Matrix determinant of a square matrix.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"square_matrix\",\r\n            \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.\",\r\n            \"example\": \"A1:D4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINVERSE\",\r\n        \"t\": 14,\r\n        \"d\": \"Returns the multiplicative inverse of a square matrix specified as an array or range.\",\r\n        \"a\": \"Multiplicative inverse of square matrix.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"square_matrix\",\r\n            \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.\",\r\n            \"example\": \"A1:D4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MMULT\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the matrix product of two matrices specified as arrays or ranges.\",\r\n        \"a\": \"The matrix product of two matrices.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"matrix1\",\r\n            \"detail\": \"The first matrix in the matrix multiplication operation, represented as an array or range.\",\r\n            \"example\": \"A1:B3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"matrix2\",\r\n            \"detail\": \"The second matrix in the matrix multiplication operation, represented as an array or range.\",\r\n            \"example\": \"C1:F2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMPRODUCT\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.\",\r\n        \"a\": \"Sum of products of elements in two arrays.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"array1\",\r\n            \"detail\": \"The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.\",\r\n            \"example\": \"A2:C5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array2\",\r\n            \"detail\": \"The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.\",\r\n            \"example\": \"D2:F5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISFORMULA\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a formula.\",\r\n        \"a\": \"Whether a value is a formula.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell\",\r\n            \"detail\": \"The cell to be verified as containing a formula.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CELL\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the requested information about the specified cell.\",\r\n        \"a\": \"Gets information about a cell.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"info_type\",\r\n            \"detail\": \"The type of information requested (see article for available types)\",\r\n            \"example\": \"\\\"type\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The reference to the cell.\",\r\n            \"example\": \"C2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NA\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the \\\"value not available\\\" error, `#N/A`.\",\r\n        \"a\": \"The `#N/A` error.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"ERROR_TYPE\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns a number corresponding to the error value in a different cell.\",\r\n        \"a\": \"Error value of cell (as number).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The cell to find the error number for although you can also provide the error value directly.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISBLANK\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether the referenced cell is empty.\",\r\n        \"a\": \"Whether the referenced cell is empty.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Reference to the cell that will be checked for emptiness.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISERR\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is an error other than `#N/A`.\",\r\n        \"a\": \"Whether a value is an error other than `#n/a`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as an error type other than `#N/A`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISERROR\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is an error.\",\r\n        \"a\": \"Whether a value is an error.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as an error type.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISLOGICAL\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is `TRUE` or `FALSE`.\",\r\n        \"a\": \"Whether a value is `true` or `false`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a logical `TRUE` or `FALSE`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNA\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is the error `#N/A`.\",\r\n        \"a\": \"Whether a value is the error `#n/a`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be compared with the error value `#N/A`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNONTEXT\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is non-textual.\",\r\n        \"a\": \"Whether a value is non-textual.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be checked.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNUMBER\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a number.\",\r\n        \"a\": \"Whether a value is a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a number.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISREF\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a valid cell reference.\",\r\n        \"a\": \"Whether a value is a valid cell reference.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a cell reference.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISTEXT\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is text.\",\r\n        \"a\": \"Whether a value is text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as text.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TYPE\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns a number associated with the type of data passed into the function.\",\r\n        \"a\": \"Get the type of a value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose type is to be determined.\",\r\n            \"example\": \"C4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"N\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.\",\r\n        \"a\": \"Argument provided as a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument to be converted to a number.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_DATE\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a date.\",\r\n        \"a\": \"Converts a provided number to a date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a date.\",\r\n            \"example\": \"25405\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_PURE_NUMBER\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.\",\r\n        \"a\": \"Converts any numeric value to a pure number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a pure number.\",\r\n            \"example\": \"50%\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_TEXT\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided numeric value to a text value.\",\r\n        \"a\": \"Converts a provided numeric value to a text value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to text.\",\r\n            \"example\": \"24\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_DOLLARS\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a dollar value.\",\r\n        \"a\": \"Converts a provided number to a dollar value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a dollar value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_PERCENT\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a percentage.\",\r\n        \"a\": \"Converts a provided number to a percentage.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a percentage.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DGET\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns a single value from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Single value from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DMAX\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the maximum value selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Maximum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DMIN\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the minimum value selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Minimum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAVERAGE\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Average of a set of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DCOUNT\",\r\n        \"t\": 17,\r\n        \"d\": \"Counts numeric values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Counts values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DCOUNTA\",\r\n        \"t\": 17,\r\n        \"d\": \"Counts values, including text, selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Counts values and text from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DPRODUCT\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the product of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Product of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSTDEV\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Standard deviation of population sample from table.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSTDEVP\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Standard deviation of entire population from table.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSUM\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the sum of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Sum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DVAR\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Variance of population sample from table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DVARP\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Variance of a population from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AGE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the age based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get age based on ID number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"A1\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Deadline\",\r\n            \"example\": \"\\\"2017-10-01\\\"\",\r\n            \"detail\": \"The deadline or range of age calculation. The default is the current day.\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedatetime\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEX_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate gender based on Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get gender based on ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIRTHDAY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the birthday based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the birthday based on the ID number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Birthday format\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900\u5E741\u67081\u65E5]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROVINCE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the province of birthplace based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CITY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the city of birthplace based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STAR_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the constellation based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the constellation based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ANIMAL_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the zodiac according to the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISIDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Verify that the format of the ID card is correct. Support 15 or 18\",\r\n        \"a\": \"Verify the correctness of the ID card format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_CUTWORD\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Text segmentation. Split a series of words into a series of individual words\",\r\n        \"a\": \"Chinese text segmentation.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Word segmentation mode\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"The default is 0[precision mode], 1[full mode], 2[search engine mode].\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_TFIDF\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text\",\r\n        \"a\": \"tf-idf keyword recognition.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Number of keywords\",\r\n            \"example\": \"20\",\r\n            \"detail\": \"The number of keywords returned by the algorithm, the default is 20\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"Corpus\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_TEXTRANK\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Use TextRank algorithm to extract keywords. Identify keywords from a series of text\",\r\n        \"a\": \"TextRank keyword recognition.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Number of keywords\",\r\n            \"example\": \"20\",\r\n            \"detail\": \"The number of keywords returned by the algorithm, the default is 20\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"Corpus\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_CLOSE\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock closing price of A shares.\",\r\n        \"a\": \"Returns the closing price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_OPEN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the opening price of stock.\",\r\n        \"a\": \"Return the opening price of a shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_MAX\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the highest price of stock.\",\r\n        \"a\": \"Return the highest price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_MIN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the lowest price of stock.\",\r\n        \"a\": \"Returns the lowest price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_VOLUMN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock trading volume of A shares.\",\r\n        \"a\": \"Returns the corresponding stock trading volume of A shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_AMOUNT\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock turnover of A shares.\",\r\n        \"a\": \"Returns the corresponding stock turnover of A shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISDATE\",\r\n        \"t\": \"6\",\r\n        \"d\": \"Returns whether a value is a date.\",\r\n        \"a\": \"Whether a value is a date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"example\": \"\\\"1990-01-01\\\"\",\r\n            \"detail\": \"The value to be verified as a date.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LINESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell to describe the continuous trend of data\",\r\n        \"a\": \"Generate sparklines line chart\",\r\n        \"m\": [1, 8],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line thickness\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Line thickness of the line graph, the default is 1px\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line\",\r\n            \"example\": \"avg\",\r\n            \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Maximum mark\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Minimum mark\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"Identify the minimum value of the line graph, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Mark size\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The maximum and minimum mark size settings, the default is 1.5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AREASPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data\",\r\n        \"a\": \"Generate sparklines area chart\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Fill color\",\r\n            \"example\": \"#CCF3F4\",\r\n            \"detail\": \"Form an area chart, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line thickness\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Line thickness of the line graph, the default is 1px\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line\",\r\n            \"example\": \"avg\",\r\n            \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data\",\r\n        \"a\": \"Generate sparklines vertical histogram\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STACKCOLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n        \"a\": \"Generate sparklines cumulative vertical histogram\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Stack by column\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the size of discrete data\",\r\n        \"a\": \"Generate sparklines horizontal bar graph\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STACKBARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n        \"a\": \"Generate sparklines cumulative horizontal bar graph\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Stack by column\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DISCRETESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the trend of discrete data\",\r\n        \"a\": \"Generate sparklines discrete graph\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Segmentation threshold\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Above threshold color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Below threshold color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRISTATESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.\",\r\n        \"a\": \"Generate sparklines three-state graph\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Zero value bar color\",\r\n            \"example\": \"#999\",\r\n            \"detail\": \"Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PIESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data\",\r\n        \"a\": \"Generate sparklines pie chart\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Rotation angle\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"The rotation angle of the pie chart, the default is 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"border\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Pie chart border size, default is none 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Border color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"The border color of the pie chart, the default is #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BOXSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set\",\r\n        \"a\": \"Generate sparklines box plot\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Outlier ratio\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Target value\",\r\n            \"example\": \"10\",\r\n            \"detail\": \"The target value setting on the box plot, the default is false and does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Point size\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The radius of the target point and outlier is set, the default is 1.5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BULLETSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the task achievement rate\",\r\n        \"a\": \"Generating sparklines bullets\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"Target\",\r\n            \"example\": \"10\",\r\n            \"detail\": \"The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"achieved\",\r\n            \"example\": \"8\",\r\n            \"detail\": \"Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Contrast\",\r\n            \"example\": \"12\",\r\n            \"detail\": \"Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMPOSESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram\",\r\n        \"a\": \"Combine sparklines graphs into one cell\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"config\",\r\n            \"example\": \"PIESPLINES(A1:A20)\",\r\n            \"detail\": \"Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SORT\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Sorts the rows of a given array or range by the values in one or more columns.\",\r\n        \"a\": \"Sorts rows of range by specified column.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to be sorted.\",\r\n            \"example\": \"A2:A17\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sort_column\",\r\n            \"detail\": \"The index of the column in `range` or a range outside of `range` containing the values by which to sort.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.\",\r\n            \"example\": \"-1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sort_column2\",\r\n            \"detail\": \"Additional columns.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FILTER\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.\",\r\n        \"a\": \"Filters a range based off provided conditions.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to be filtered.\",\r\n            \"example\": \"A5:D20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"condition1\",\r\n            \"detail\": \"A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"condition2\",\r\n            \"detail\": \"Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.\",\r\n            \"example\": \"\\\"\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UNIQUE\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.\",\r\n        \"a\": \"Unique rows in the provided source range.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to filter by unique entries.\",\r\n            \"example\": \"A2:B26\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"by_col\",\r\n            \"detail\": \"[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"occurs_once\",\r\n            \"detail\": \"[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANDARRAY\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.\",\r\n        \"a\": \"Returns a grid of random numbers.\",\r\n        \"m\": [0, 2],\r\n        \"p\": [{\r\n            \"name\": \"rows\",\r\n            \"detail\": \"The number of rows to populate with a random number.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"columns\",\r\n            \"detail\": \"The number of columns to populate with a random number.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEQUENCE\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a grid of sequential numbers starting at a specified start value and  increasing by a specified step size. By default, the sequence starts at and  increases by 1.\",\r\n        \"a\": \"Returns a grid of sequential numbers.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"rows\",\r\n            \"detail\": \"The number of rows in the function's resulting grid.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"columns\",\r\n            \"detail\": \"The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"start\",\r\n            \"detail\": \"The number, at which to start the sequence. If omitted, the sequence will start at 1.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"step\",\r\n            \"detail\": \"The amount each value in the sequence will differ by. If omitted, each value will differ by 1.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    {\r\n        \"n\": \"EVALUATE\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Evaluate a formula or expression expressed in words and return the result\",\r\n        \"a\": \"Evaluate according to literal formula or expression.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"expression\",\r\n            \"example\": '\"A1+5*2^2\"',\r\n            \"detail\": \"Formula or expression\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    {\r\n        \"n\": \"REMOTE\",\r\n        \"t\": \"5\",\r\n        \"d\": \"Calls a function on a remote server\",\r\n        \"a\": \"Calls a function on a remote back end server/API.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"remote_expression\",\r\n            \"example\": 'SUM(A1:A10000000)',\r\n            \"detail\": \"Formula\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"string\"\r\n        }]\r\n    },\r\n    ],\r\n    toolbar: {\r\n        undo: 'Undo',\r\n        redo: 'Redo',\r\n        paintFormat: 'Paint format',\r\n        currencyFormat: 'Format as currency',\r\n        percentageFormat: 'Format as percent',\r\n        numberDecrease: 'Decrease decimal places',\r\n        numberIncrease: 'Increase decimal places',\r\n        moreFormats:'More formats',\r\n        font: 'Font',\r\n        fontSize: 'Font size',\r\n        bold: 'Bold (Ctrl+B)',\r\n        italic : 'Italic (Ctrl+I)',\r\n        strikethrough: 'Strikethrough (Alt+Shift+5)',\r\n        underline: 'Underline',\r\n        textColor: 'Text color',\r\n        chooseColor: 'choose color',\r\n        resetColor: 'Reset',\r\n        customColor: 'CUSTOM',\r\n        alternatingColors: 'Alternating colors',\r\n        confirmColor: 'OK',\r\n        cancelColor: 'Cancel',\r\n        collapse: 'Collapse',\r\n        fillColor: 'Fill color',\r\n        border: 'Border',\r\n        borderStyle: 'Border style',\r\n        mergeCell: 'Merge cells',\r\n        chooseMergeType: 'Choose merge type',\r\n        horizontalAlign: 'Horizontal align',\r\n        verticalAlign: 'Vertical align',\r\n        alignment: 'Alignment',\r\n        textWrap: 'Text wrap',\r\n        textWrapMode: 'Text wrap mode',\r\n        textRotate: 'Text rotate',\r\n        textRotateMode: 'Text rotate mode',\r\n        freezeTopRow: 'Freeze top row',\r\n        sortAndFilter: 'Sort and filter',\r\n        findAndReplace: 'Find and replace',\r\n        sum: 'SUM',\r\n        autoSum: 'Auto SUM',\r\n        moreFunction: 'More functions',\r\n        conditionalFormat: 'Conditional format',\r\n        postil: 'Comment',\r\n        pivotTable: 'Pivot Table',\r\n        chart: 'Chart',\r\n        screenshot: 'Screenshot',\r\n        splitColumn: 'Split text',\r\n        insertImage: 'Insert image',\r\n        insertLink: 'Insert link',\r\n        dataVerification: 'Data verification',\r\n        protection:\"Protect the sheet\",\r\n\r\n        clearText:\"Clear color\",\r\n        noColorSelectedText:\"No color is selected\",\r\n\r\n        toolMore:\"More\",\r\n        toolLess:\"Less\",\r\n        toolClose:\"Close\",\r\n        toolMoreTip:\"More features\",\r\n        moreOptions:\"More options\",\r\n\r\n        cellFormat:\"Cell format config\",\r\n        print:\"Print\",\r\n    },\r\n    alternatingColors:{\r\n        applyRange: 'Apply to range',\r\n        selectRange: 'Select a data range',\r\n        header: 'Header',\r\n        footer: 'Footer',\r\n\r\n        errorInfo:\"Cannot perform this operation on multiple selection areas, please select a single area and try again\",\r\n        textTitle:\"Format style\",\r\n        custom:\"CUSTOM\",\r\n        close:\"close\",\r\n        selectionTextColor:\"Click to select text color\",\r\n        selectionCellColor:\"Click to select cell color\",\r\n        removeColor:\"Remove alternating colors\",\r\n        colorShow:\"color\",\r\n        currentColor:\"Current\",\r\n\r\n        tipSelectRange:\"Please select the range of alternating colors\",\r\n        errorNoRange:\"No range is selected\",\r\n        errorExistColors:\"Alternating colors already exist and cannot be edited\",\r\n    },\r\n    button: {\r\n        confirm: 'OK',\r\n        cancel: 'Cancel',\r\n        close:\"Close\",\r\n        update:\"Update\",\r\n        delete:\"Delete\",\r\n        insert:\"Insert\",\r\n        prevPage: \"Previous\",\r\n        nextPage: \"Next\",\r\n        total: \"total:\"\r\n    },\r\n    paint:{\r\n        start: 'Paint format start',\r\n        end: 'ESC',\r\n\r\n        tipSelectRange:\"Please select the range to be copied\",\r\n        tipNotMulti:\"Cannot perform this operation on multiple selection ranges\",\r\n    },\r\n    format:{\r\n        moreCurrency: 'More currency formats',\r\n        moreDateTime: 'More date and time formats',\r\n        moreNumber: 'More number formats',\r\n\r\n        titleCurrency: 'Currency formats',\r\n        decimalPlaces: 'Decimal places',\r\n        titleDateTime: 'Date and time formats',\r\n        titleNumber: 'Number formats'\r\n    },\r\n    info:{\r\n        detailUpdate: 'New opened',\r\n        detailSave: 'Local cache restored',\r\n        row: '',\r\n        column: '',\r\n        loading:\"Loading...\",\r\n\r\n        copy:\"Copy\",\r\n        return:\"Exit\",\r\n        rename:\"Rename\",\r\n        tips:\"WorkBook rename\",\r\n        noName:\"Untitled spreadsheet\",\r\n        wait:\"waiting for update\",\r\n\r\n        add:\"Add\",\r\n        addLast:\"more rows at bottom\",\r\n        backTop:\"Back to the top\",\r\n        pageInfo:'Total ${total}\uFF0C${totalPage} page\uFF0Ccurrent ${currentPage}',\r\n        nextPage:\"Next\",\r\n\r\n        tipInputNumber:\"Please enter the number\",\r\n        tipInputNumberLimit:\"The increase range is limited to 1-100\",\r\n\r\n        tipRowHeightLimit:\"Row height must be between 0 ~ 545\",\r\n        tipColumnWidthLimit:\"The column width must be between 0 ~ 2038\",\r\n        pageInfoFull:'Total ${total}\uFF0C${totalPage} page\uFF0CAll data displayed',\r\n    },\r\n    currencyDetail:{\r\n        RMB:'RMB',\r\n        USdollar:'US dollar',\r\n        EUR:'EUR',\r\n        GBP:'GBP',\r\n        HK:'HK',\r\n        JPY:'JPY',\r\n        AlbanianLek:'Albanian Lek',\r\n        AlgerianDinar:'Algerian Dinar',\r\n        Afghani:'Afghani',\r\n        ArgentinePeso:'Argentine Peso',\r\n        UnitedArabEmiratesDirham:'United Arab Emirates Dirham',\r\n        ArubanFlorin:'Aruban Florin',\r\n        OmaniRial:'Omani Rial',\r\n        Azerbaijanimanat:'Azerbaijani manat',\r\n        EgyptianPound:'Egyptian Pound',\r\n        EthiopianBirr:'Ethiopian Birr',\r\n        AngolaKwanza:'Angola Kwanza',\r\n        AustralianDollar:'Australian Dollar',\r\n        Patacas:'Patacas',\r\n        BarbadosDollar:'Barbados Dollar',\r\n        PapuaNewGuineaKina:'Papua New Guinea Kina',\r\n        BahamianDollar:'Bahamian Dollar',\r\n        PakistanRupee:'Pakistan Rupee',\r\n        ParaguayanGuarani:'Paraguayan Guarani',\r\n        BahrainiDinar:'Bahraini Dinar',\r\n        PanamanianBalboa:'Panamanian Balboa',\r\n        Brazilianreal:'Brazilian real',\r\n        Belarusianruble:'Belarusian ruble',\r\n        BermudianDollar:'Bermudian Dollar',\r\n        BulgarianLev:'Bulgarian Lev',\r\n        IcelandKrona:'Iceland Krona',\r\n        BosniaHerzegovinaConvertibleMark:'Bosnia-Herzegovina Convertible Mark',\r\n        PolishZloty:'Polish Zloty',\r\n        Boliviano:'Boliviano',\r\n        BelizeDollar:'Belize Dollar',\r\n        BotswanaPula:'Botswana Pula',\r\n        NotDannuzhamu:'Not Dannuzhamu',\r\n        BurundiFranc:'Burundi Franc',\r\n        NorthKoreanWon:'North Korean Won',\r\n        DanishKrone:'Danish Krone',\r\n        EastCaribbeanDollar:'East Caribbean Dollar',\r\n        DominicaPeso:'Dominica Peso',\r\n        RussianRuble:'Russian Ruble',\r\n        EritreanNakfa:'Eritrean Nakfa',\r\n        CFAfranc:'CFA franc',\r\n        PhilippinePeso:'Philippine Peso',\r\n        FijiDollar:'Fiji Dollar',\r\n        CapeVerdeEscudo:'Cape Verde Escudo',\r\n        FalklandIslandsPound:'Falkland Islands Pound',\r\n        GambianDalasi:'Gambian Dalasi',\r\n        Congolesefranc:'Congolese franc',\r\n        ColombianPeso:'Colombian Peso',\r\n        CostaRicanColon:'Costa Rican Colon',\r\n        CubanPeso:'Cuban Peso',\r\n        Cubanconvertiblepeso:'Cuban convertible peso',\r\n        GuyanaDollar:'Guyana Dollar',\r\n        KazakhstanTenge:'Kazakhstan Tenge',\r\n        Haitiangourde:'Haitian gourde',\r\n        won:'won',\r\n        NetherlandsAntillesGuilder:'Netherlands Antilles Guilder',\r\n        Honduraslempiras:'Honduras lempiras',\r\n        DjiboutiFranc:'Djibouti Franc',\r\n        KyrgyzstanSom:'Kyrgyzstan Som',\r\n        GuineaFranc:'Guinea Franc',\r\n        CanadianDollar:'Canadian Dollar',\r\n        GhanaianCedi:'Ghanaian Cedi',\r\n        Cambodianriel:'Cambodian riel',\r\n        CzechKoruna:'Czech Koruna',\r\n        ZimbabweDollar:'Zimbabwe Dollar',\r\n        QatariRiyal:'Qatari Riyal',\r\n        CaymanIslandsDollar:'Cayman Islands Dollar',\r\n        Comorianfranc:'Comorian franc',\r\n        KuwaitiDinar:'Kuwaiti Dinar',\r\n        CroatianKuna:'Croatian Kuna',\r\n        KenyanShilling:'Kenyan Shilling',\r\n        LesothoLoti:'Lesotho Loti',\r\n        LaoKip:'Lao Kip',\r\n        LebanesePound:'Lebanese Pound',\r\n        Lithuanianlitas:'Lithuanian litas',\r\n        LibyanDinar:'Libyan Dinar',\r\n        LiberianDollar:'Liberian Dollar',\r\n        RwandaFranc:'Rwanda Franc',\r\n        RomanianLeu:'Romanian Leu',\r\n        MalagasyAriary:'Malagasy Ariary',\r\n        MaldivianRufiyaa:'Maldivian Rufiyaa',\r\n        MalawiKwacha:'Malawi Kwacha',\r\n        MalaysianRinggit:'Malaysian Ringgit',\r\n        MacedoniawearingDinar:'Macedonia wearing Dinar',\r\n        MauritiusRupee:'Mauritius Rupee',\r\n        MauritanianOuguiya:'Mauritanian Ouguiya',\r\n        MongolianTugrik:'Mongolian Tugrik',\r\n        BangladeshiTaka:'Bangladeshi Taka',\r\n        PeruvianNuevoSol:'Peruvian Nuevo Sol',\r\n        MyanmarKyat:'Myanmar Kyat',\r\n        MoldovanLeu:'Moldovan Leu',\r\n        MoroccanDirham:'Moroccan Dirham',\r\n        MozambiqueMetical:'Mozambique Metical',\r\n        MexicanPeso:'Mexican Peso',\r\n        NamibianDollar:'Namibian Dollar',\r\n        SouthAfricanRand:'South African Rand',\r\n        SouthSudanesePound:'South Sudanese Pound',\r\n        NicaraguaCordoba:'Nicaragua Cordoba',\r\n        NepaleseRupee:'Nepalese Rupee',\r\n        NigerianNaira:'Nigerian Naira',\r\n        NorwegianKrone:'Norwegian Krone',\r\n        GeorgianLari:'Georgian Lari',\r\n        RMBOffshore:'RMB (Offshore)',\r\n        SwedishKrona:'Swedish Krona',\r\n        SwissFranc:'Swiss Franc',\r\n        SerbianDinar:'Serbian Dinar',\r\n        SierraLeone:'Sierra Leone',\r\n        SeychellesRupee:'Seychelles Rupee',\r\n        SaudiRiyal:'Saudi Riyal',\r\n        SaoTomeDobra:'Sao Tome Dobra',\r\n        SaintHelenapound:'Saint Helena pound',\r\n        SriLankaRupee:'Sri Lanka Rupee',\r\n        SwazilandLilangeni:'Swaziland Lilangeni',\r\n        SudanesePound:'Sudanese Pound',\r\n        Surinamesedollar:'Surinamese dollar',\r\n        SolomonIslandsDollar:'Solomon Islands Dollar',\r\n        SomaliShilling:'Somali Shilling',\r\n        TajikistanSomoni:'Tajikistan Somoni',\r\n        PacificFranc:'Pacific Franc',\r\n        ThaiBaht:'Thai Baht',\r\n        TanzanianShilling:'Tanzanian Shilling',\r\n        TonganPaanga:\"Tongan Pa'anga\",\r\n        TrinidadandTobagoDollar:'Trinidad and Tobago Dollar',\r\n        TunisianDinar:'Tunisian Dinar',\r\n        TurkishLira:'Turkish Lira',\r\n        VanuatuVatu:'Vanuatu Vatu',\r\n        GuatemalanQuetzal:'Guatemalan Quetzal',\r\n        CommissionBolivar:'Commission Bolivar',\r\n        BruneiDollar:'Brunei Dollar',\r\n        UgandanShilling:'Ugandan Shilling',\r\n        UkrainianHryvnia:'Ukrainian Hryvnia',\r\n        UruguayanPeso:'Uruguayan Peso',\r\n        Uzbekistansom:'Uzbekistan som',\r\n        WesternSamoaTala:'Western Samoa Tala',\r\n        SingaporeDollar:'Singapore Dollar',\r\n        NT:'NT',\r\n        NewZealandDollar:'New Zealand Dollar',\r\n        HungarianForint:'Hungarian Forint',\r\n        SyrianPound:'Syrian Pound',\r\n        JamaicanDollar:'Jamaican Dollar',\r\n        ArmenianDram:'Armenian Dram',\r\n        YemeniRial:'Yemeni Rial',\r\n        IraqiDinar:'Iraqi Dinar',\r\n        IranianRial:'Iranian Rial',\r\n        NewIsraeliShekel:'New Israeli Shekel',\r\n        IndianRupee:'Indian Rupee',\r\n        IndonesianRupiah:'Indonesian Rupiah',\r\n        JordanianDinar:'Jordanian Dinar',\r\n        VND:'VND',\r\n        ZambianKwacha:'Zambian Kwacha',\r\n        GibraltarPound:'Gibraltar Pound',\r\n        ChileanPeso:'Chilean Peso',\r\n        CFAFrancBEAC:'CFA Franc BEAC'\r\n    },\r\n    defaultFmt:[\r\n        { \"text\": 'Automatic', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": 'Plain text', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Number', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": 'Percent', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": 'Scientific', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Accounting', \"value\": \"\u00A5(0.00)\", \"example\": \"\u00A5(1200.09)\" },\r\n\r\n\r\n        { \"text\": 'Currency', \"value\": \"\u00A50.00\", \"example\": \"\u00A51200.09\" },\r\n\r\n\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Date', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": 'Time', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": 'Time 24H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": 'Date time', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": 'Date time 24 H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Custom formats', \"value\": \"fmtOtherSelf\", \"example\": \"more\" }\r\n    ],\r\n    dateFmtList:[\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"PM 01:30\",\r\n            \"value\": 'AM/PM hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30\",\r\n            \"value\": 'AM/PM h:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30:30\",\r\n            \"value\": 'AM/PM h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 PM 01:30\",\r\n            \"value\": \"MM-dd AM/PM hh:mm\"\r\n        }\r\n    ],\r\n    fontFamily:{\r\n        MicrosoftYaHei:\"YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\",\"Arial\",\"Tahoma\",\"Verdana\"],\r\n    fontjson: {\"times new roman\":0,\"arial\":1,\"tahoma\":2,\"verdana\":3},\r\n    border:{\r\n        borderTop:'borderTop',\r\n        borderBottom:'borderBottom',\r\n        borderLeft:'borderLeft',\r\n        borderRight:'borderRight',\r\n        borderNone:'borderNone',\r\n        borderAll:'borderAll',\r\n        borderOutside:'borderOutside',\r\n        borderInside:'borderInside',\r\n        borderHorizontal:'borderHorizontal',\r\n        borderVertical:'borderVertical',\r\n        borderColor:'borderColor',\r\n        borderSize:'borderSize',\r\n    },\r\n    merge:{\r\n        mergeAll:\"Merge all\",\r\n        mergeV:\"Vertically\",\r\n        mergeH:\"Horizontally\",\r\n        mergeCancel:\"Unmerge\",\r\n        overlappingError:\"Cannot merge overlapping areas\",\r\n        partiallyError:\"Cannot perform this operation on partially merged cells\",\r\n    },\r\n    align:{\r\n        left:\"left\",\r\n        center:\"center\",\r\n        right:\"right\",\r\n\r\n        top:\"Top\",\r\n        middle:\"Middle\",\r\n        bottom:\"Bottom\",\r\n    },\r\n    textWrap:{\r\n        \"overflow\":\"Overflow\",\r\n        \"wrap\":\"Wrap\",\r\n        \"clip\":\"Clip\",\r\n    },\r\n    rotation:{\r\n        \"none\":\"None\",\r\n        \"angleup\":\"Tilt Up\",\r\n        \"angledown\":\"Tilt Down\",\r\n        \"vertical\":\"Stack Vertically\",\r\n        \"rotationUp\":\"Rotate Up\",\r\n        \"rotationDown\":\"Rotate Down\"\r\n    },\r\n    freezen:{\r\n        default:\"Freeze\",\r\n        freezenRow:\"First Row\",\r\n        freezenColumn:\"First Column\",\r\n        freezenRC:\"Both\",\r\n        freezenRowRange:\"Freezen row range\",\r\n        freezenColumnRange:\"Freezen column range\",\r\n        freezenRCRange:\"Freezen both range\",\r\n        freezenCancel:\"Cancel\",\r\n\r\n        noSeletionError:\"No Range to be selected\",\r\n    },\r\n    sort:{\r\n        \"asc\":\"Ascending \",\r\n        \"desc\":\"Descending \",\r\n        \"custom\":\"Custom sort\",\r\n\r\n        \"hasTitle\":\"Data has a header row\",\r\n        \"sortBy\":\"Sort by\",\r\n        \"addOthers\":\"Add another sort column\",\r\n        \"close\":\"close\",\r\n        \"confirm\":\"sort\",\r\n\r\n        \"columnOperation\":\"Column\",\r\n        \"secondaryTitle\":\"then by\",\r\n\r\n        \"sortTitle\":\"Sort range\",\r\n\r\n        \"sortRangeTitle\":\"Sort range from\",\r\n        \"sortRangeTitleTo\":\"to\",\r\n\r\n\r\n        \"noRangeError\":\"Cannot perform this operation on multiple selection areas, please select a single range and try again\",\r\n        \"mergeError\":\"There are merged cells in the selection, this operation cannot be performed!\",\r\n\r\n    },\r\n    filter:{\r\n       filter:\"create filter\",\r\n\r\n       sortByAsc:\"Sort A-Z\",\r\n       sortByDesc:\"Sort Z-A\",\r\n       filterByColor:\"Filter by color\",\r\n       filterByCondition:\"Filter by condition\",\r\n       filterByValues:\"Filter by values\",\r\n\r\n       filiterInputNone:\"None\",\r\n\r\n       filiterInputTip:\"Enter filter value\",\r\n       filiterRangeStartTip:\"Value for formula\",\r\n       filiterRangeEndTip:\"Value for formula\",\r\n\r\n       filterValueByAllBtn:\"Check all\",\r\n       filterValueByClearBtn:\"Clear\",\r\n       filterValueByInverseBtn:\"Inverse\",\r\n       filterValueByTip:\"filter By Values\",\r\n       filterConform:\"Confirm\",\r\n       filterCancel:\"Cancel\",\r\n       clearFilter:\"Clear filter\",\r\n\r\n       conditionNone:\"None\",\r\n        conditionCellIsNull:\"Is empty\",\r\n        conditionCellNotNull:\"Is not empty\",\r\n        conditionCellTextContain:\"Text contains\",\r\n        conditionCellTextNotContain:\"Text does not contain\",\r\n        conditionCellTextStart:\"Text starts with\",\r\n        conditionCellTextEnd:\"Text ends with\",\r\n        conditionCellTextEqual:\"Text is exactly\",\r\n        conditionCellDateEqual:\"Date is\",\r\n        conditionCellDateBefore:\"Date is before\",\r\n        conditionCellDateAfter:\"Date is after\",\r\n        conditionCellGreater:\"Greater than\",\r\n        conditionCellGreaterEqual:\"Greater than or equal to\",\r\n        conditionCellLess:\"Less than\",\r\n        conditionCellLessEqual:\"Less than or equal to\",\r\n        conditionCellEqual:\"Is equal to\",\r\n        conditionCellNotEqual:\"Is not equal to\",\r\n        conditionCellBetween:\"Is between\",\r\n        conditionCellNotBetween:\"Is not between\",\r\n\r\n        filiterMoreDataTip:\"Big amount of data! please wait\",\r\n        filiterMonthText:\"Month\",\r\n        filiterYearText:\"Year\",\r\n        filiterByColorTip:\"Filter by cell color\",\r\n        filiterByTextColorTip:\"Filter by font color\",\r\n        filterContainerOneColorTip:\"This column contains only one color\",\r\n        filterDateFormatTip:\"Date format\",\r\n\r\n        valueBlank:\"(Null)\",\r\n        mergeError:\"There are merged cells in the filter selection, this operation cannot be performed!\",\r\n    },\r\n    rightclick: {\r\n        copy: 'Copy',\r\n        copyAs: 'Copy as',\r\n        paste: 'Paste',\r\n        insert: 'Insert',\r\n        delete: 'Delete',\r\n        deleteCell: 'Delete cell',\r\n        deleteSelected: 'Delete selected ',\r\n        hide: 'Hide',\r\n        hideSelected: 'Hide selected ',\r\n        showHide: 'Show hidden ',\r\n        to: 'Towards',\r\n        left: 'Left',\r\n        right: 'Right',\r\n        top: 'Top',\r\n        bottom: 'Bottom',\r\n        moveLeft: 'Move left',\r\n        moveUp: 'Move up',\r\n        add: 'Add',\r\n        row: 'Row',\r\n        column: 'Column',\r\n        width: 'Width',\r\n        height: 'Height',\r\n        number: 'Number',\r\n        confirm: 'Confirm',\r\n        orderAZ: 'A-Z order',\r\n        orderZA: 'Z-A order',\r\n        clearContent: 'Clear content',\r\n        matrix: 'Matrix operation',\r\n        sortSelection: 'Sort',\r\n        filterSelection: 'Filter',\r\n        chartGeneration: 'Create chart',\r\n        firstLineTitle: 'first line title',\r\n        untitled: 'untitled',\r\n        array1: 'One-dimensional array',\r\n        array2: 'Two-dimensional array',\r\n        array3: 'Multidimensional Arrays',\r\n        diagonal: 'Diagonal',\r\n        antiDiagonal: 'Anti-diagonal',\r\n        diagonalOffset: 'Diagonal offset',\r\n        offset: 'Offset',\r\n        boolean: 'Boolean',\r\n        flip: 'Flip',\r\n        upAndDown: 'Up and down',\r\n        leftAndRight: 'Left and right',\r\n        clockwise: 'Clockwise',\r\n        counterclockwise: 'Counterclockwise',\r\n        transpose: 'Transpose',\r\n        matrixCalculation: 'Matrix calculation',\r\n        plus: 'Plus',\r\n        minus: 'Minus',\r\n        multiply: 'Multiply',\r\n        divided: 'Divided',\r\n        power: 'Power',\r\n        root: 'Root',\r\n        log: 'Log',\r\n        delete0: 'Delete 0 values at both ends',\r\n        removeDuplicate: 'Remove duplicate values',\r\n        byRow: 'By row',\r\n        byCol: 'By column',\r\n        generateNewMatrix: 'Generate new matrix',\r\n\r\n    },\r\n    comment:{\r\n        \"insert\":\"Insert\",\r\n        \"edit\":\"Edit\",\r\n        \"delete\":\"Delete\",\r\n        \"showOne\":\"Show/Hide\",\r\n        \"showAll\":\"Show/Hide All\"\r\n    },\r\n    screenshot:{\r\n        screenshotTipNoSelection:\"Please select the scope of the screenshot\",\r\n        screenshotTipTitle:\"Warning\uFF01\",\r\n        screenshotTipHasMerge:\"This operation cannot be performed on merged cells\",\r\n        screenshotTipHasMulti:\"This operation cannot be performed on multiple selection regions\",\r\n        screenshotTipSuccess:\"Successful\",\r\n        screenshotImageName:\"Screenshot\",\r\n\r\n        downLoadClose:\"Close\",\r\n        downLoadCopy:\"Copy to clipboard\",\r\n        downLoadBtn:\"Download\",\r\n        browserNotTip:\"not supported by IE browser!\",\r\n        rightclickTip:\"Please right-click \\\"copy\\\" on the picture\",\r\n        successTip:\"Successfully (if pasting fails, please right-click on the image to \\\"copy image\\\")\",\r\n    },\r\n    splitText:{\r\n        splitDelimiters:\"Delimiters\",\r\n        splitOther:\"Other\",\r\n        splitContinueSymbol:\"Consecutive separators are treated as a single\",\r\n        splitDataPreview:\"Preview\",\r\n        splitTextTitle:\"Split text\",\r\n        splitConfirmToExe:\"There is already data here, do you want to replace it?\",\r\n\r\n        tipNoMulti:\"Cannot perform this operation on multiple selection areas, please select a single area and try again\",\r\n        tipNoMultiColumn:\"Only one column of data can be converted at a time. The selected area can have multiple rows but not multiple columns. Please try again after selecting a single column range\",\r\n    },\r\n    imageText:{\r\n        imageSetting: 'Image setting',\r\n        close: 'Close',\r\n        conventional: 'Conventional',\r\n        moveCell1: 'Move and resize cells',\r\n        moveCell2: 'Move and do not resize the cell',\r\n        moveCell3: 'Do not move and resize the cell',\r\n        fixedPos: 'Fixed position',\r\n        border: 'Border',\r\n        width: 'Width',\r\n        radius: 'Radius',\r\n        style: 'Style',\r\n        solid: 'Solid',\r\n        dashed: 'Dashed',\r\n        dotted: 'Dotted',\r\n        double: 'Double',\r\n        color: 'Color',\r\n    },\r\n    punctuation:{\r\n        \"tab\":\"Tab\",\r\n        \"semicolon\":\"semicolon\",\r\n        \"comma\":\"comma\",\r\n        \"space\":\"space\",\r\n\r\n    },\r\n    findAndReplace:{\r\n        find:\"Find\",\r\n        replace:\"Replace\",\r\n        goto:\"Go to\",\r\n        location:\"Location\",\r\n        formula:\"Formula\",\r\n        date:\"Date\",\r\n        number:\"Number\",\r\n        string:\"String\",\r\n        error:\"Error\",\r\n        condition:\"Condition\",\r\n        rowSpan:\"Row span\",\r\n        columnSpan:\"Column span\",\r\n        locationExample:\"Location\",\r\n        lessTwoRowTip:\"Please select at least two rows\",\r\n        lessTwoColumnTip:\"Please select at least two columns\",\r\n\r\n        findTextbox:\"Find Content\",\r\n        replaceTextbox:\"Replace Content\",\r\n\r\n        regexTextbox:\"Regular Expression\",\r\n        wholeTextbox:\"Whole word\",\r\n        distinguishTextbox:\"Case sensitive\",\r\n\r\n        allReplaceBtn:\"Replace All\",\r\n        replaceBtn:\"Replace\",\r\n        allFindBtn:\"Find All\",\r\n        findBtn:\"Find next\",\r\n\r\n        noFindTip:\"The content was not found\",\r\n        modeTip:\"This operation is not available in this mode\",\r\n\r\n        searchTargetSheet:\"Sheet\",\r\n        searchTargetCell:\"Cell\",\r\n        searchTargetValue:\"Value\",\r\n\r\n        searchInputTip:\"Please enter the search content\",\r\n\r\n        noReplceTip:\"There is nothing to replace\",\r\n        noMatchTip:\"No match found\",\r\n\r\n        successTip:\"${xlength} items found\",\r\n\r\n        locationConstant:\"Constant\",\r\n        locationFormula:\"Formula\",\r\n        locationDate:\"Date\",\r\n        locationDigital:\"Number\",\r\n        locationString:\"String\",\r\n        locationBool:\"Logical\",\r\n        locationError:\"Error\",\r\n        locationNull:\"Null\",\r\n        locationCondition:\"Conditional format\",\r\n        locationRowSpan:\"Row span\",\r\n        locationColumnSpan:\"Column span\",\r\n\r\n        locationTiplessTwoRow:\"Please select at least two rows\",\r\n        locationTiplessTwoColumn:\"Please select at least two columns\",\r\n        locationTipNotFindCell:\"Cell not found\"\r\n\r\n    },\r\n    sheetconfig: {\r\n        delete: 'Delete',\r\n        copy: 'Copy',\r\n        rename: 'Rename',\r\n        changeColor: 'Change color',\r\n        hide: 'Hide',\r\n        unhide: 'Unhide',\r\n        moveLeft: 'Move left',\r\n        moveRight: 'Move right',\r\n        resetColor: 'Reset color',\r\n        cancelText: 'Cancel',\r\n        chooseText: 'Confirm color',\r\n\r\n        tipNameRepeat:\"The name of the tab page cannot be repeated! Please revise\",\r\n        noMoreSheet:\"The workbook contains at least one visual worksheet. To delete the selected worksheet, please insert a new worksheet or show a hidden worksheet.\",\r\n        confirmDelete:\"Are you sure to delete\",\r\n        redoDelete:\"Can be undo by Ctrl+Z\",\r\n        noHide:\"Can't hide, at least keep one sheet tag\",\r\n        chartEditNoOpt:\"This operation is not allowed in chart editing mode!\",\r\n        sheetNameSpecCharError:\"The name cannot contain:[ ] : \\ ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError:\"Sheet name cannot be empty\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: 'Conditionformat-GreaterThan',\r\n        conditionformat_greaterThan_title: 'Format cells greater than',\r\n        conditionformat_lessThan: 'Conditionformat-LessThan',\r\n        conditionformat_lessThan_title: 'Format cells smaller than',\r\n        conditionformat_betweenness: 'Conditionformat-Betweenness',\r\n        conditionformat_betweenness_title: 'Format cells with values between',\r\n        conditionformat_equal: 'Conditionformat-Equal',\r\n        conditionformat_equal_title: 'Format cells equal to',\r\n        conditionformat_textContains: 'Conditionformat-TextContains',\r\n        conditionformat_textContains_title: 'Format cells containing the following text',\r\n        conditionformat_occurrenceDate: 'Conditionformat-OccurrenceDate',\r\n        conditionformat_occurrenceDate_title: 'Format cells containing the following dates',\r\n        conditionformat_duplicateValue: 'Conditionformat-DuplicateValue',\r\n        conditionformat_duplicateValue_title: 'Format cells containing the following types of values',\r\n        conditionformat_top10: 'Conditionformat-Top10',\r\n        conditionformat_top10_percent: 'Conditionformat-Top10%',\r\n        conditionformat_top10_title: 'Format the cells with the highest value',\r\n        conditionformat_last10: 'Conditionformat-Last10',\r\n        conditionformat_last10_percent: 'Conditionformat-Last10%',\r\n        conditionformat_last10_title: 'Format the cells with the smallest value',\r\n        conditionformat_AboveAverage: 'Conditionformat-AboveAverage',\r\n        conditionformat_AboveAverage_title: 'Format cells above average',\r\n        conditionformat_SubAverage: 'Conditionformat-SubAverage',\r\n        conditionformat_SubAverage_title: 'Format cells below average',\r\n        rule: 'Rule',\r\n        newRule: 'New rule',\r\n        editRule: 'Edit rule',\r\n        deleteRule: 'Delete rule',\r\n        deleteCellRule: 'Delete cell rule',\r\n        deleteSheetRule: 'Delete sheet rule',\r\n        manageRules: 'Management rules',\r\n        showRules: 'Show its formatting rules',\r\n        highlightCellRules: 'Highlight cell rules',\r\n        itemSelectionRules: 'Item selection rules',\r\n        conditionformatManageRules: 'Conditional Formatting Rule Manager',\r\n        format: 'Format',\r\n        setFormat: 'Set format',\r\n        setAs: 'Set as',\r\n        setAsByArea: 'For the selected area, set to',\r\n        applyRange: 'Apply range',\r\n        selectRange: 'Select application range',\r\n        selectRange_percent: 'Percentage of selected range',\r\n        selectRange_average: 'Average value of selected range',\r\n        selectRange_value: 'Value in the selected range',\r\n        pleaseSelectRange: 'Please select application range',\r\n        selectDataRange: 'Select data range',\r\n        selectCell: 'select cell',\r\n        pleaseSelectCell: 'Please select cell',\r\n        pleaseSelectADate: 'Please select a date',\r\n        pleaseEnterInteger: 'Please enter an integer between 1 and 1000',\r\n        onlySingleCell: 'Only a single cell can be referenced',\r\n        conditionValueCanOnly: 'The condition value can only be a number or a single cell',\r\n        ruleTypeItem1: 'Format all cells based on their respective values',\r\n        ruleTypeItem2: 'Only format cells that contain',\r\n        ruleTypeItem2_title: 'Only for cells that meet the following conditions',\r\n        ruleTypeItem3: 'Format only the top or bottom numbers',\r\n        ruleTypeItem3_title: 'Is the value in the following ranking',\r\n        ruleTypeItem4: 'Format only values above or below the average',\r\n        ruleTypeItem4_title: 'Is a value that satisfies the following conditions',\r\n        ruleTypeItem5: 'Format only unique or repeated values',\r\n        ruleTypeItem6: 'Use formulas to determine which cells to format',\r\n        formula: 'Formula',\r\n        textColor: 'Text color',\r\n        cellColor: 'Cell color',\r\n        confirm: 'Confirm',\r\n        confirmColor: 'Confirm color',\r\n        cancel: 'Cancel',\r\n        close: 'Close',\r\n        clearColorSelect: 'Clear color select',\r\n        sheet: 'Sheet',\r\n        currentSheet: 'Current Sheet',\r\n        dataBar: 'data bar',\r\n        dataBarColor: 'data bar color',\r\n        gradientDataBar_1: 'Blue-white gradient data bar',\r\n        gradientDataBar_2: 'Green-white gradient data bar',\r\n        gradientDataBar_3: 'Red-white gradient data bar',\r\n        gradientDataBar_4: 'Orange-white gradient stripes',\r\n        gradientDataBar_5: 'Light blue-white gradient stripes',\r\n        gradientDataBar_6: 'Purple-white gradient data bar',\r\n        solidColorDataBar_1: 'Blue data bar',\r\n        solidColorDataBar_2: 'Green data bar',\r\n        solidColorDataBar_3: 'Red data bar',\r\n        solidColorDataBar_4: 'Orange data bar',\r\n        solidColorDataBar_5: 'Light blue data bar',\r\n        solidColorDataBar_6: 'Purple data bar',\r\n        colorGradation: 'color gradation',\r\n        colorGradation_1: 'Green-yellow-red color gradation',\r\n        colorGradation_2: 'Red-yellow-green color gradation',\r\n        colorGradation_3: 'Green-white-red color gradation',\r\n        colorGradation_4: 'Red-white-green color gradation',\r\n        colorGradation_5: 'Blue-white-red color gradation',\r\n        colorGradation_6: 'Red-white-blue color gradation',\r\n        colorGradation_7: 'White-red color gradation',\r\n        colorGradation_8: 'Red-white color gradation',\r\n        colorGradation_9: 'Green-white color gradation',\r\n        colorGradation_10: 'White-green color gradation',\r\n        colorGradation_11: 'Green-yellow color gradation',\r\n        colorGradation_12: 'Yellow-green color gradation',\r\n        icons: 'icons',\r\n        pleaseSelectIcon: 'Please click to select a group of icons:',\r\n        cellValue: 'Cell value',\r\n        specificText: 'Specific text',\r\n        occurrence: 'Date',\r\n        greaterThan: 'Greater than',\r\n        lessThan: 'Less than',\r\n        between: 'Between',\r\n        equal: 'Equal',\r\n        in: 'In',\r\n        between2: '',\r\n        contain: 'Contain',\r\n        textContains: 'Text contains',\r\n        duplicateValue: 'Duplicate value',\r\n        uniqueValue: 'Unique value',\r\n        top: 'Top',\r\n        top10: 'Top 10',\r\n        top10_percent: 'Top 10%',\r\n        last: 'Last',\r\n        last10: 'Last 10',\r\n        last10_percent: 'Last 10%',\r\n        oneself: '',\r\n        above: 'Above',\r\n        aboveAverage: 'Above average',\r\n        below: 'Below',\r\n        belowAverage: 'Below average',\r\n        all: 'All',\r\n        yesterday: 'YTD',\r\n        today: 'Today',\r\n        tomorrow: 'Tomorrow',\r\n        lastWeek: 'Last week',\r\n        thisWeek: 'This week',\r\n        lastMonth: 'Last month',\r\n        thisMonth: 'This month',\r\n        lastYear: 'Last year',\r\n        thisYear: 'This year',\r\n        last7days: 'Last 7 days',\r\n        last30days: 'Last 30 days',\r\n        next7days: 'Next 7 days',\r\n        next30days: 'Next 30 days',\r\n        next60days: 'Next 60 days',\r\n        chooseRuleType: 'Choose rule type',\r\n        editRuleDescription: 'Edit rule description',\r\n        newFormatRule: 'New format rule',\r\n        editFormatRule: 'Edit format rule',\r\n        formatStyle: 'Style',\r\n        fillType: 'Fill',\r\n        color: 'Color',\r\n        twocolor: 'Two-color',\r\n        tricolor: 'Tricolor',\r\n        multicolor: 'Multi color',\r\n        grayColor: 'Gray color',\r\n        gradient: 'Gradient',\r\n        solid: 'Solid',\r\n        maxValue: 'Max value',\r\n        medianValue: 'Median value',\r\n        minValue: 'Min value',\r\n        direction: 'Direction',\r\n        threeWayArrow: 'Three-way arrow',\r\n        fourWayArrow: 'Four-way arrow',\r\n        fiveWayArrow: 'Five-way arrow',\r\n        threeTriangles: 'Three triangles',\r\n        shape: 'Shape',\r\n        threeColorTrafficLight: 'Three-color traffic light',\r\n        fourColorTrafficLight: 'Four-color traffic light',\r\n        threeSigns: 'Three signs',\r\n        greenRedBlackGradient: 'Green-red-black gradient',\r\n        rimless: 'Rimless',\r\n        bordered: 'Bordered',\r\n        mark: 'Mark',\r\n        threeSymbols: 'Three symbols',\r\n        tricolorFlag: 'Tricolor flag',\r\n        circled: 'Circled',\r\n        noCircle: 'No circle',\r\n        grade: 'Grade',\r\n        grade4: '4 Grade',\r\n        grade5: '5 Grade',\r\n        threeStars: '3 Stars',\r\n        fiveQuadrantDiagram: 'Five-quadrant diagram',\r\n        fiveBoxes: '5 Boxes',\r\n    },\r\n    insertLink: {\r\n        linkText: \"Text\",\r\n        linkType: \"Link type\",\r\n        external: \"External link\",\r\n        internal: \"Internal link\",\r\n        linkAddress: \"Link address\",\r\n        linkSheet: \"Worksheet\",\r\n        linkCell: \"Cell reference\",\r\n        linkTooltip: \"Tooltip\",\r\n        placeholder1: \"Please enter the web link address\",\r\n        placeholder2: \"Please enter the cell to be quoted, example A1\",\r\n        placeholder3: \"Please enter the prompt content\",\r\n        tooltipInfo1: \"Please enter a valid link\",\r\n        tooltipInfo2: \"Please enter the correct cell reference\",\r\n    },\r\n    dataVerification: {\r\n        cellRange: 'Cell range',\r\n        selectCellRange: 'Click to select a cell range',\r\n        selectCellRange2: 'Please select a range of cells',\r\n        verificationCondition: 'Verification condition',\r\n        allowMultiSelect: \"Allow multiple selection\",\r\n        dropdown: 'drop-down list',\r\n        checkbox: 'Checkbox',\r\n        number: 'Number',\r\n        number_integer: 'Number-integer',\r\n        number_decimal: 'Number-decimal',\r\n        text_content: 'Text-content',\r\n        text_length: 'Text-length',\r\n        date: 'Date',\r\n        validity: 'Effectiveness',\r\n        placeholder1: 'Please enter the options, separated by commas, such as 1,2,3,4,5',\r\n        placeholder2: 'Please enter content',\r\n        placeholder3: 'Numeric value, such as 10',\r\n        placeholder4: 'Please enter the specified text',\r\n        placeholder5: 'Please enter the prompt displayed when the cell is selected',\r\n        selected: 'Selected',\r\n        notSelected: 'Not selected',\r\n        between: 'Between',\r\n        notBetween: 'Not between',\r\n        equal: 'Equal',\r\n        notEqualTo: 'Not equal to',\r\n        moreThanThe: 'More than the',\r\n        lessThan: 'Less than',\r\n        greaterOrEqualTo: 'Greater or equal to',\r\n        lessThanOrEqualTo: 'Less than or equal to',\r\n        include: 'Include',\r\n        exclude: 'Exclude',\r\n        earlierThan: 'Earlier than',\r\n        noEarlierThan: 'No earlier than',\r\n        laterThan: 'Later than',\r\n        noLaterThan: 'No later than',\r\n        identificationNumber: 'Identification number',\r\n        phoneNumber: 'Phone number',\r\n        remote: 'Automatic remote acquisition option',\r\n        prohibitInput: 'Prohibit input when input data is invalid',\r\n        hintShow: 'Show prompt when the cell is selected',\r\n        deleteVerification: 'Delete verification',\r\n        tooltipInfo1: 'The drop-down list option cannot be empty',\r\n        tooltipInfo2: 'Checkbox content cannot be empty',\r\n        tooltipInfo3: 'The value entered is not a numeric type',\r\n        tooltipInfo4: 'The value 2 cannot be less than the value 1',\r\n        tooltipInfo5: 'The text content cannot be empty',\r\n        tooltipInfo6: 'The value entered is not a date type',\r\n        tooltipInfo7: 'Date 2 cannot be less than date 1',\r\n        textlengthInteger: 'Text length must be an integer greater than or equal to 0',\r\n    },\r\n    formula:{\r\n        sum:\"Sum\",\r\n        average:\"Average\",\r\n        count:\"Count\",\r\n        max:\"Max\",\r\n        min:\"Min\",\r\n        ifGenerate:\"If formula generator\",\r\n        find:\"Learn more\",\r\n\r\n        tipNotBelongToIf:\"This cell function does not belong to the if formula!\",\r\n        tipSelectCell:\"Please select the cell to insert the function\",\r\n\r\n        ifGenCompareValueTitle:\"Comparison value\",\r\n        ifGenSelectCellTitle:\"Click to select cell\",\r\n        ifGenRangeTitle:\"Range\",\r\n        ifGenRangeTo:\"to\",\r\n        ifGenRangeEvaluate:\"Range evaluate\",\r\n        ifGenSelectRangeTitle:\"Click to select range\",\r\n        ifGenCutWay:\"Partition way\",\r\n        ifGenCutSame:\"Same Partition value\",\r\n        ifGenCutNpiece:\"Partition by N\",\r\n        ifGenCutCustom:\"Custom\",\r\n        ifGenCutConfirm:\"Confirm\",\r\n\r\n        ifGenTipSelectCell:\"Select cells\",\r\n        ifGenTipSelectCellPlace:\"Please select cells\",\r\n\r\n        ifGenTipSelectRange:\"Select range\",\r\n        ifGenTipSelectRangePlace:\"Please select range\",\r\n\r\n        ifGenTipNotNullValue:\"The comparison value cannot be empty!\",\r\n        ifGenTipLableTitile:\"Label\",\r\n        ifGenTipRangeNotforNull:\"The range cannot be empty!\",\r\n        ifGenTipCutValueNotforNull:\"The partition value cannot be empty!\",\r\n        ifGenTipNotGenCondition:\"No conditions are available for generation!\",\r\n    },\r\n    formulaMore:{\r\n        valueTitle:\"Value\",\r\n        tipSelectDataRange:\"Select data range\",\r\n        tipDataRangeTile:\"Data range\",\r\n        findFunctionTitle:\"Search function\",\r\n        tipInputFunctionName:\"Function name or brief description of function\",\r\n\r\n        \"Array\":\"Array\",\r\n        \"Database\":\"Database\",\r\n        \"Date\":\"Date\",\r\n        \"Engineering\":\"Engineering\",\r\n        \"Filter\":\"Filter\",\r\n        \"Financial\":\"Financial\",\r\n        \"luckysheet\":\"Luckysheet\",\r\n        \"other\":\"Other\",\r\n        \"Logical\":\"Logical\",\r\n        \"Lookup\":\"Lookup\",\r\n        \"Math\":\"Math\",\r\n        \"Operator\":\"Operator\",\r\n        \"Parser\":\"Parser\",\r\n        \"Statistical\":\"Statistical\",\r\n        \"Text\":\"Text\",\r\n        \"dataMining\":\"Data Mining\",\r\n\r\n        \"selectFunctionTitle\":\"Select a function\",\r\n        \"calculationResult\":\"Result\",\r\n\r\n        tipSuccessText:\"Success\",\r\n        tipParamErrorText:\"Parameter type error\",\r\n\r\n        \"helpClose\":\"Close\",\r\n        \"helpCollapse\":\"Collapse\",\r\n        \"helpExample\":\"Example\",\r\n        \"helpAbstract\":\"Abstract\",\r\n\r\n        \"execfunctionError\":'Error in the formula',\r\n        \"execfunctionSelfError\":'The formula cannot refer to its own cell',\r\n        \"execfunctionSelfErrorResult\":'The formula cannot refer to its own cell, which will lead to inaccurate calculation results',\r\n\r\n        \"allowRepeatText\":\"Repeat\",\r\n        \"allowOptionText\":\"Option\",\r\n\r\n        \"selectCategory\":\"Or select a category\",\r\n    },\r\n    drag:{\r\n        noMerge:\"Cannot perform this operation on merged cells\",\r\n        affectPivot:\"This change cannot be made to the selected cell because it will affect the pivot table!\",\r\n        noMulti:\"Cannot perform this operation on multiple selection areas, please select a single area\",\r\n        noPaste:\"Unable to paste this content here, please select a cell in the paste area and try to paste again\",\r\n        noPartMerge:\"Cannot perform this operation on partially merged cells\",\r\n\r\n        inputCorrect:\"Please enter the correct value\",\r\n        notLessOne:\"The number of rows and columns cannot be less than 1\",\r\n        offsetColumnLessZero:\"The offset column cannot be negative!\",\r\n\r\n        pasteMustKeybordAlert:\"\u5728\u8868\u683C\u4E2D\u8FDB\u884C\u590D\u5236\u7C98\u8D34: Ctrl + C \u8FDB\u884C\u590D\u5236, Ctrl + V \u8FDB\u884C\u7C98\u8D34, Ctrl + X \u8FDB\u884C\u526A\u5207\",\r\n        pasteMustKeybordAlertHTMLTitle:\"\u5728\u8868\u683C\u4E2D\u8FDB\u884C\u590D\u5236\u7C98\u8D34\",\r\n        pasteMustKeybordAlertHTML:\"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;\u8FDB\u884C\u590D\u5236<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;\u8FDB\u884C\u7C98\u8D34<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;\u8FDB\u884C\u526A\u5207\",\r\n    },\r\n    pivotTable:{\r\n        title:\"Pivot Table\",\r\n        closePannel:\"Close\",\r\n        editRange:\"Range\",\r\n        tipPivotFieldSelected:\"Select the fields\",\r\n        tipClearSelectedField:\"Clear all fields\",\r\n        btnClearSelectedField:\"Clear\",\r\n        btnFilter:\"Filter\",\r\n        titleRow:\"Row\",\r\n        titleColumn:\"Column\",\r\n        titleValue:\"Value\",\r\n        tipShowColumn:\"Statistics fields are displayed as columns\",\r\n        tipShowRow:\"Statistics fields are displayed as rows\",\r\n\r\n        titleSelectionDataRange:\"Select range\",\r\n        titleDataRange:\"Data range\",\r\n\r\n        valueSum:\"SUM\",\r\n\r\n        valueStatisticsSUM:\"Sum\",\r\n        valueStatisticsCOUNT:\"Count\",\r\n        valueStatisticsCOUNTA:\"Count A\",\r\n        valueStatisticsCOUNTUNIQUE:\"Count Unique\",\r\n        valueStatisticsAVERAGE:\"Average\",\r\n        valueStatisticsMAX:\"Max\",\r\n        valueStatisticsMIN:\"Min\",\r\n        valueStatisticsMEDIAN:\"Median\",\r\n        valueStatisticsPRODUCT:\"Product\",\r\n        valueStatisticsSTDEV:\"Stdev\",\r\n\r\n        valueStatisticsSTDEVP:\"Stdevp\",\r\n        valueStatisticslet:\"Var\",\r\n        valueStatisticsVARP:\"VarP\",\r\n\r\n        errorNotAllowEdit:\"This operation is prohibited in non-editing mode!\",\r\n        errorNotAllowMulti:\"Cannot perform this operation on multiple selection areas, please select a single range and try again\",\r\n        errorSelectRange:\"Please select the range of the new pivot table\",\r\n        errorIsDamage:\"The source data of this pivot table is corrupted!\",\r\n        errorNotAllowPivotData:\"Cannot select pivot table as source data!\",\r\n        errorSelectionRange:\"Selection failed, wrong input range!\",\r\n        errorIncreaseRange:\"Please expand the selected range!\",\r\n\r\n        titleAddColumn:\"Add column to pivot table\",\r\n        titleMoveColumn:\"Move the column to the white box below\",\r\n        titleClearColumnFilter:\"Clear the filter for this column\",\r\n        titleFilterColumn:\"Filter\",\r\n\r\n        titleSort:\"Sort\",\r\n        titleNoSort:\"No sort\",\r\n        titleSortAsc:\"ASC\",\r\n        titleSortDesc:\"DESC\",\r\n        titleSortBy:\"Sort by\",\r\n        titleShowSum:\"Show total\",\r\n        titleStasticTrue:\"Yes\",\r\n        titleStasticFalse:\"No\",\r\n    },\r\n    dropCell:{\r\n        copyCell:\"Copy\",\r\n        sequence:\"Sequence\",\r\n        onlyFormat:\"Only format\",\r\n        noFormat:\"Not format\",\r\n        day:\"Day\",\r\n        workDay:\"Work Day\",\r\n        month:\"Month\",\r\n        year:\"Year\",\r\n        chineseNumber:\"Chinese numbers\",\r\n    },\r\n    imageCtrl:{\r\n        borderTile:\"Image border color\",\r\n        borderCur:\"Color\",\r\n    },\r\n    protection:{\r\n        protectiontTitle:\"Protection\",\r\n        enterPassword:\"Enter a password (optional)\",\r\n        enterHintTitle:\"Prompt when editing is prohibited (optional)\",\r\n        enterHint:\"The cell or chart you are trying to change is in a protected worksheet. If you want to change it, please unprotect the worksheet. You may need to enter a password\",\r\n        swichProtectionTip:\"Protect the sheet and contents of locked cells\",\r\n        authorityTitle:\"Allow users of this sheet to:\",\r\n        selectLockedCells:\"Select locked cells\",\r\n        selectunLockedCells:\"Select unlocked cells\",\r\n        formatCells:\"Format cells\",\r\n        formatColumns:\"Format columns\",\r\n        formatRows:\"Format rows\",\r\n        insertColumns:\"Insert columns\",\r\n        insertRows:\"Insert rows\",\r\n        insertHyperlinks:\"Insert hyperlinks\",\r\n        deleteColumns:\"Delete columns\",\r\n        deleteRows:\"Delete rows\",\r\n        sort:\"Sort\",\r\n        filter:\"Filter\",\r\n        usePivotTablereports:\"Use Pivot Table reports\",\r\n        editObjects:\"Edit objects\",\r\n        editScenarios:\"Edit scenarios\",\r\n\r\n        allowRangeTitle:\"Allow users of range to:\",\r\n        allowRangeAdd:\"New...\",\r\n\r\n        allowRangeAddTitle:\"Title\",\r\n        allowRangeAddSqrf:\"Reference\",\r\n        selectCellRange: 'Click to select a cell range',\r\n        selectCellRangeHolder:\"Cell range\",\r\n        allowRangeAddTitlePassword:\"Password\",\r\n        allowRangeAddTitleHint:\"Prompt\",\r\n        allowRangeAddTitleHintTitle:\"Prompt when a password is set (optional)\",\r\n        allowRangeAddtitleDefault:\"Input range name\",\r\n\r\n        rangeItemDblclick:\"Double click to edit\",\r\n        rangeItemHasPassword:\"Has password\",\r\n\r\n        rangeItemErrorTitleNull:\"Title is null\",\r\n        rangeItemErrorRangeNull:\"Reference is null\",\r\n        rangeItemErrorRange:\"Reference is error\",\r\n\r\n        validationTitle:\"Password validation\",\r\n        validationTips:\"Need to enter a password to unlock the protection of the worksheet\",\r\n        validationInputHint:\"Enter a password\",\r\n\r\n        checkPasswordNullalert:\"Password is required!\",\r\n        checkPasswordWrongalert:\"Incorrect password, please try again!\",\r\n\r\n        checkPasswordSucceedalert:\"Unlock Succeed!\",\r\n        defaultRangeHintText:\"The cell is being password protected.\",\r\n        defaultSheetHintText:\"The cell or chart is in a protected worksheet. To make changes, please unprotect the worksheet. You may need to enter a password\",\r\n    },\r\n    cellFormat:{\r\n        cellFormatTitle:\"Format cells\",\r\n        protection:\"Protection\",\r\n        locked:\"Locked\",\r\n        hidden:\"Hidden\",\r\n        protectionTips:\"To lock cells or hide formulas, protect the worksheet. On the toolbar, Click Protect Sheet Button\",\r\n        tipsPart:\"Partial checked\",\r\n        tipsAll:\"All checked\",\r\n\r\n        selectionIsNullAlert:\"Selection is required!\",\r\n        sheetDataIsNullAlert:\"error, Data is none!\",\r\n\r\n    },\r\n    print:{\r\n        normalBtn:\"Normal\",\r\n        layoutBtn:\"Page Layout\",\r\n        pageBtn:\"Page\u2002break\u2002preview\",\r\n\r\n        menuItemPrint:\"Print (Ctrl+P)\",\r\n        menuItemAreas:\"Print areas\",\r\n        menuItemRows:\"Print title rows\",\r\n        menuItemColumns:\"Print title columns\",\r\n    },\r\n    edit:{\r\n        typing:\"typing\",\r\n    },\r\n    websocket:{\r\n        success: 'WebSocket connection success',\r\n        refresh: 'An error occurred in the WebSocket connection, please refresh the page!',\r\n        wait: 'An error occurred in the WebSocket connection, please be patient!',\r\n        close: 'WebSocket connection closed',\r\n        contact: 'Server communication error occurred, please refresh the page and try again, if not, please contact the administrator!',\r\n        support: 'The current browser does not support WebSocket',\r\n    }\r\n  };\r\n", "export default {\r\n    functionlist:[{\r\n        'n': 'SUMIF',\r\n        't': 0,\r\n        'd': '\u5BF9\u8303\u56F4\u4E2D\u7B26\u5408\u6307\u5B9A\u6761\u4EF6\u7684\u503C\u6C42\u548C\u3002',\r\n        'a': '\u5BF9\u8303\u56F4\u4E2D\u7B26\u5408\u6307\u5B9A\u6761\u4EF6\u7684\u503C\u6C42\u548C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': '\u8303\u56F4',\r\n            'detail': '\u8981\u6839\u636E\u6761\u4EF6\u8FDB\u884C\u68C0\u6D4B\u7684\u8303\u56F4\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6761\u4EF6',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E\u8303\u56F4\u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002\\n\\n\u5982\u679C\u8303\u56F4\u5305\u542B\u7684\u662F\u8981\u68C0\u6D4B\u7684\u6587\u672C\uFF0C\u5219\u6761\u4EF6\u5FC5\u987B\u4E3A\u5B57\u7B26\u4E32\u3002\u6761\u4EF6\u53EF\u4EE5\u5305\u542B\u901A\u914D\u7B26\uFF0C\u5305\u62EC\u7528\u4E8E\u5339\u914D\u5355\u4E2A\u5B57\u7B26\u7684?\u6216\u7528\u4E8E\u5339\u914D\u96F6\u4E2A\u6216\u8FDE\u7EED\u591A\u4E2A\u5B57\u7B26\u7684*\u3002\u8981\u5339\u914D\u95EE\u53F7\u661F\u53F7\u672C\u8EAB\uFF0C\u8BF7\u5728\u8BE5\u5B57\u7B26\u524D\u9762\u52A0\u4E0A\u6CE2\u6D6A\u53F7(~)\u524D\u7F00\uFF08\u5373~?\u548C~*\uFF09\u3002\u5B57\u7B26\u4E32\u6761\u4EF6\u5FC5\u987B\u7528\u5F15\u53F7\u62EC\u8D77\u6765\u3002\u51FD\u6570\u4F1A\u68C0\u67E5\u8303\u56F4\u4E2D\u7684\u6BCF\u4E2A\u5355\u5143\u683C\u4E0E\u6761\u4EF6\u662F\u5426\u76F8\u7B49\u6216\u5339\u914D\uFF08\u5982\u679C\u4F7F\u7528\u4E86\u901A\u914D\u7B26\uFF09\u3002\\n\\n\u5982\u679C\u8303\u56F4\u5305\u542B\u7684\u662F\u8981\u68C0\u6D4B\u7684\u6570\u5B57\uFF0C\u5219\u6761\u4EF6\u53EF\u4EE5\u662F\u5B57\u7B26\u4E32\u4E5F\u53EF\u4EE5\u662F\u6570\u5B57\u3002\u5982\u679C\u7ED9\u5B9A\u7684\u6761\u4EF6\u662F\u4E00\u4E2A\u6570\u5B57\uFF0C\u5219\u68C0\u67E5\u8303\u56F4\u4E2D\u7684\u6BCF\u4E2A\u5355\u5143\u683C\u662F\u5426\u7B49\u4E8E\u6761\u4EF6\u3002\u53E6\u5916\uFF0C\u6761\u4EF6\u4E5F\u53EF\u80FD\u662F\u5305\u542B\u6570\u5B57\u7684\u5B57\u7B26\u4E32\uFF08\u4E5F\u5C06\u5BF9\u5176\u8FDB\u884C\u76F8\u7B49\u68C0\u6D4B\uFF09\uFF0C\u6216\u8005\u5E26\u6709\u4EE5\u4E0B\u524D\u7F00\u7684\u6570\u5B57\uFF1A=\uFF08\u68C0\u67E5\u662F\u5426\u76F8\u7B49\uFF09\u3001>\uFF08\u68C0\u67E5\u8303\u56F4\u5355\u5143\u683C\u7684\u503C\u662F\u5426\u5927\u4E8E\u6761\u4EF6\u503C\uFF09\u6216<\uFF08\u68C0\u67E5\u8303\u56F4\u5355\u5143\u683C\u7684\u503C\u662F\u5426\u5C0F\u4E8E\u6761\u4EF6\u503C\uFF09',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u6C42\u548C\u8303\u56F4',\r\n            'detail': '\u8981\u6C42\u548C\u7684\u8303\u56F4\uFF08\u5982\u679C\u4E0E\u8303\u56F4\u4E0D\u540C\uFF09\u3002',\r\n            'example': 'B1:B10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'TAN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5DF2\u77E5\u89D2\u5EA6\u7684\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5DF2\u77E5\u89D2\u5EA6\u7684\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u89D2\u5EA6',\r\n            'detail': '\u8981\u6C42\u5176\u6B63\u5207\u503C\u7684\u89D2\u5EA6\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': '45*PI()/180',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TANH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CC\u66F2\u6B63\u5207\u503C\u7684\u5B9E\u6570\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CEILING',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u6307\u5B9A\u56E0\u6570\u7684\u500D\u6570\u3002',\r\n        'a': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u6307\u5B9A\u56E0\u6570\u7684\u500D\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5411\u4E0A\u820D\u5165\u7684\u6570\u503C\u3002',\r\n            'example': '23.25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u56E0\u6570',\r\n            'detail': '\u8981\u5C06\u503C\u820D\u5165\u5230\u6B64\u6570\u7684\u6574\u6570\u500D\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ATAN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u6B63\u5207\u503C\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u6B63\u5207\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u6B63\u5207\u503C\u7684\u6570\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ASINH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u53CC\u66F2\u6B63\u5F26\u503C\u7684\u6570\u503C\u3002',\r\n            'example': '0.9',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ABS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u7EDD\u5BF9\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u7EDD\u5BF9\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u7EDD\u5BF9\u503C\u7684\u6570\u3002',\r\n            'example': '-2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACOS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u4F59\u5F26\u503C\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u4F59\u5F26\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u4F59\u5F26\u503C\u7684\u6570\u503C\u3002\u5FC5\u987B\u4ECB\u4E8E-1\u548C1\u4E4B\u95F4\uFF0C\u5305\u62EC\u4E24\u7AEF\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACOSH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u53CC\u66F2\u4F59\u5F26\u503C\u7684\u6570\u503C\u3002\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E1\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MULTINOMIAL',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u53C2\u6570\u548C\u7684\u9636\u4E58\u9664\u4EE5\u5404\u53C2\u6570\u9636\u4E58\u7684\u4E58\u79EF\u540E\u5F97\u5230\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u53C2\u6570\u548C\u7684\u9636\u4E58\u9664\u4EE5\u5404\u53C2\u6570\u9636\u4E58\u7684\u4E58\u79EF\u540E\u5F97\u5230\u7684\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7684\u7B2C\u4E00\u9879\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ATANH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u53CC\u66F2\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u53CC\u66F2\u6B63\u5207\u503C\u7684\u6570\u503C\u3002\u5FC5\u987B\u4ECB\u4E8E-1\u548C1\u4E4B\u95F4\uFF08\u4E0D\u5305\u62EC-1\u548C1\uFF09\u3002',\r\n            'example': '0.9',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ATAN2',\r\n        't': 0,\r\n        'd': '\u4EE5\u5F27\u5EA6\u4E3A\u5355\u4F4D\u8FD4\u56DE x \u8F74\u4E0E\u4ECE\u539F\u70B9 (0,0) \u5230\u6307\u5B9A\u5750\u6807\u70B9 (`x`,`y`) \u4E4B\u95F4\u8FDE\u7EBF\u7684\u5939\u89D2\u3002',\r\n        'a': '\u4EE5\u5F27\u5EA6\u4E3A\u5355\u4F4D\u8FD4\u56DE x \u8F74\u4E0E\u4ECE\u539F\u70B9 (0,0) \u5230\u6307\u5B9A\u5750\u6807\u70B9 (`x`,`y`) \u4E4B\u95F4\u8FDE\u7EBF\u7684\u5939\u89D2\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u4E0Ex\u8F74\u5939\u89D2\u5927\u5C0F\u7684\u7EBF\u6BB5\u7684\u7EC8\u70B9x\u5750\u6807\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'y',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u4E0Ex\u8F74\u5939\u89D2\u5927\u5C0F\u7684\u7EBF\u6BB5\u7684\u7EC8\u70B9y\u5750\u6807\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTBLANK',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u8303\u56F4\u5185\u7684\u7A7A\u5355\u5143\u683C\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u8303\u56F4\u5185\u7684\u7A7A\u5355\u5143\u683C\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u8303\u56F4',\r\n            'detail': '\u8981\u7EDF\u8BA1\u7A7A\u767D\u5355\u5143\u683C\u6570\u91CF\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:C100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'COSH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CC\u66F2\u4F59\u5F26\u503C\u7684\u5B9E\u6570\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INT',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u5411\u4E0B\u53D6\u6574\u4E3A\u5C0F\u4E8E\u6216\u7B49\u4E8E\u8BE5\u6570\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6570\u3002',\r\n        'a': '\u5C06\u6570\u503C\u5411\u4E0B\u53D6\u6574\u4E3A\u5C0F\u4E8E\u6216\u7B49\u4E8E\u8BE5\u6570\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5411\u4E0B\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u6574\u6570\u7684\u6570\u503C\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ISEVEN',\r\n        't': 0,\r\n        'd': '\u68C0\u67E5\u6240\u63D0\u4F9B\u7684\u6570\u503C\u662F\u5426\u4E3A\u5076\u6570\u3002',\r\n        'a': '\u68C0\u67E5\u6240\u63D0\u4F9B\u7684\u6570\u503C\u662F\u5426\u4E3A\u5076\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u5076\u6570\u7684\u6570\u503C\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u5076\u6570\u6216\u6307\u5411\u5305\u542B\u5076\u6570\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CISEVEN\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ISODD',\r\n        't': 0,\r\n        'd': '\u68C0\u67E5\u6240\u63D0\u4F9B\u7684\u6570\u503C\u662F\u5426\u4E3A\u5947\u6570\u3002',\r\n        'a': '\u68C0\u67E5\u6240\u63D0\u4F9B\u7684\u6570\u503C\u662F\u5426\u4E3A\u5947\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u5947\u6570\u7684\u6570\u503C\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u5947\u6570\u6216\u6307\u5411\u5305\u542B\u5947\u6570\u7684\u5355\u5143\u683C\uFF0CISODD\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LCM',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u6216\u591A\u4E2A\u6574\u6570\u7684\u6700\u5C0F\u516C\u500D\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u6216\u591A\u4E2A\u6574\u6570\u7684\u6700\u5C0F\u516C\u500D\u6570\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8981\u5728\u6C42\u6700\u5C0F\u516C\u500D\u6570\u6570\u7684\u8BA1\u7B97\u4E2D\u68C0\u67E5\u5176\u56E0\u6570\u7684\u7B2C\u4E00\u9879\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u6C42\u6700\u5C0F\u516C\u500D\u6570\u65F6\u8981\u8003\u8651\u5176\u56E0\u6570\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '3',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u4EE5 e\uFF08\u6B27\u62C9\u6570\uFF09\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u4EE5 e\uFF08\u6B27\u62C9\u6570\uFF09\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u4EE5 e \u4E3A\u5E95\u6570\u8BA1\u7B97\u5176\u5BF9\u6570\u7684\u503C\u3002\\n\\n\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOG',\r\n        't': 0,\r\n        'd': '\u6839\u636E\u6307\u5B9A\u5E95\u6570\u8FD4\u56DE\u6570\u5B57\u7684\u5BF9\u6570\u3002',\r\n        'a': '\u6839\u636E\u6307\u5B9A\u5E95\u6570\u8FD4\u56DE\u6570\u5B57\u7684\u5BF9\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u60F3\u8981\u8BA1\u7B97\u5176\u5BF9\u6570\u7684\u6B63\u5B9E\u6570\u3002',\r\n            'example': '128',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u5E95\u6570',\r\n            'detail': '[\u53EF\u9009] - \u5BF9\u6570\u7684\u5E95\u6570\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOG10',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u4EE510\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u4EE510\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u4EE510\u4E3A\u5E95\u7684\u5BF9\u6570\u7684\u6570\u503C\u3002\\n\\n\u503C\u5FC5\u987B\u4E3A\u6B63\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MOD',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E24\u6570\u76F8\u9664\u7684\u4F59\u6570, \u7ED3\u679C\u7684\u7B26\u53F7\u4E0E\u9664\u6570\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u6570\u76F8\u9664\u7684\u4F59\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u88AB\u9664\u6570',\r\n            'detail': '\u8981\u5C06\u5176\u76F8\u9664\u4EE5\u5F97\u5230\u4F59\u6570\u7684\u6570\u503C\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u9664\u6570',\r\n            'detail': '\u7528\u4E8E\u9664\u5176\u4ED6\u6570\u7684\u6570\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MROUND',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u53D6\u6574\u4E3A\u53E6\u4E00\u6574\u6570\u6700\u63A5\u8FD1\u7684\u6574\u6570\u500D\u3002',\r\n        'a': '\u5C06\u6570\u503C\u53D6\u6574\u4E3A\u53E6\u4E00\u6574\u6570\u6700\u63A5\u8FD1\u7684\u6574\u6570\u500D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u53D6\u6574\u4E3A\u53E6\u4E00\u6574\u6570\u6700\u63A5\u8FD1\u7684\u6574\u6570\u500D\u7684\u6570\u503C\u3002',\r\n            'example': '21',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u56E0\u6570',\r\n            'detail': '\u503C\u5C06\u53D6\u6B64\u56E0\u6570\u7684\u6574\u6570\u500D\u3002',\r\n            'example': '14',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ODD',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u5947\u6574\u6570\u3002',\r\n        'a': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u5947\u6574\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5411\u4E0A\u53D6\u6574\u7684\u6570\u503C\uFF0C\u53D6\u6574\u503C\u4E3A\u5927\u4E8E\u6B64\u503C\u7684\u6700\u63A5\u8FD1\u7684\u5947\u6570\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u8D1F\u6570\uFF0C\u5219\u5C06\u5176\u53D6\u6574\u4E3A\u7EDD\u5BF9\u503C\u5927\u4E8E\u8BE5\u503C\u7684\u76F8\u90BB\u8D1F\u5947\u6570\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMSQ',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u7EC4\u6570\u503C\u548C/\u6216\u5355\u5143\u683C\u7684\u5E73\u65B9\u603B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7EC4\u6570\u503C\u548C/\u6216\u5355\u5143\u683C\u7684\u5E73\u65B9\u603B\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8981\u5C06\u5176\u5E73\u65B9\u76F8\u52A0\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u8981\u5C06\u5176\u5E73\u65B9\u4E0E\u503C1\u7684\u5E73\u65B9\u76F8\u52A0\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COMBIN',\r\n        't': 0,\r\n        'd': '\u7ED9\u5B9A\u96C6\u5408\u4E2D\u7684\u5BF9\u8C61\u603B\u6570\u548C\u8981\u9009\u62E9\u7684\u5BF9\u8C61\u6570\u91CF\uFF0C\u8FD4\u56DE\u5171\u6709\u591A\u5C11\u79CD\u4E0D\u540C\u9009\u62E9\u65B9\u5F0F\u3002',\r\n        'a': '\u7ED9\u5B9A\u96C6\u5408\u4E2D\u7684\u5BF9\u8C61\u603B\u6570\u548C\u8981\u9009\u62E9\u7684\u5BF9\u8C61\u6570\u91CF',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'n',\r\n            'detail': '\u8981\u4ECE\u4E2D\u8FDB\u884C\u9009\u62E9\u7684\u5BF9\u8C61\u96C6\u5408\u7684\u5927\u5C0F\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'k',\r\n            'detail': '\u8981\u9009\u62E9\u7684\u5BF9\u8C61\u6570\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUM',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u7EC4\u6570\u503C\u548C/\u6216\u5355\u5143\u683C\u7684\u603B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7EC4\u6570\u503C\u548C/\u6216\u5355\u5143\u683C\u7684\u603B\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8981\u76F8\u52A0\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u8981\u76F8\u52A0\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'SUBTOTAL',\r\n        't': 0,\r\n        'd': '\u4F7F\u7528\u6307\u5B9A\u7684\u6C47\u603B\u51FD\u6570\uFF0C\u8FD4\u56DE\u4E00\u7CFB\u5217\u7EB5\u5411\u5355\u5143\u683C\u7684\u5206\u7C7B\u6C47\u603B\u3002',\r\n        'a': '\u4F7F\u7528\u6307\u5B9A\u7684\u6C47\u603B\u51FD\u6570',\r\n        'm': [2, 256],\r\n        'p': [{\r\n            'name': '\u51FD\u6570\u4EE3\u7801',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u5206\u7C7B\u6C47\u603B\u7684\u51FD\u6570\u3002\\n\\n1\u4EE3\u8868AVERAGE\\n\\n2\u4EE3\u8868COUNT\\n\\n3\u4EE3\u8868COUNTA\\n\\n4\u4EE3\u8868MAX\\n\\n5\u4EE3\u8868MIN\\n\\n6\u4EE3\u8868PRODUCT\\n\\n7\u4EE3\u8868STDEV\\n\\n8\u4EE3\u8868STDEVP\\n\\n9\u4EE3\u8868SUM\\n\\n10\u4EE3\u8868VAR\\n\\n11\u4EE3\u8868VARP\\n\\n\u901A\u8FC7\u5728\u8FD9\u4E9B2\u4F4D\u4EE3\u7801\u524D\u9644\u52A010\uFF08\u5BF9\u4E8E1\u4F4D\u4EE3\u7801\uFF09\u62161\uFF08\u5BF9\u4E8E2\u4F4D\u4EE3\u7801\uFF09\uFF0C\u53EF\u4EE5\u5C06\u9690\u85CF\u503C\u5FFD\u7565\u3002\u4F8B\u5982\uFF0C102\u4EE3\u8868\u5FFD\u7565\u9690\u85CF\u5355\u5143\u683C\u7684COUNT\uFF0C\u800C110\u5219\u4EE3\u8868\u5FFD\u7565\u9690\u85CF\u503C\u7684VAR\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u8303\u56F41',\r\n            'detail': '\u8981\u8BA1\u7B97\u5206\u7C7B\u6C47\u603B\u7684\u7B2C\u4E00\u4E2A\u8303\u56F4\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u8303\u56F42',\r\n            'detail': '[\u53EF\u9009] - \u8981\u8BA1\u7B97\u5206\u7C7B\u6C47\u603B\u7684\u5176\u4ED6\u8303\u56F4\u3002',\r\n            'example': 'B2:B8',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'ASIN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u6B63\u5F26\u503C\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u53CD\u6B63\u5F26\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CD\u6B63\u5F26\u503C\u7684\u6570\u503C\u3002\u5FC5\u987B\u4ECB\u4E8E-1\u548C1\u4E4B\u95F4\uFF0C\u5305\u62EC\u4E24\u7AEF\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTIF',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8303\u56F4\u5185\u6EE1\u8DB3\u67D0\u4E2A\u6761\u4EF6\u7684\u5355\u5143\u683C\u7684\u6570\u91CF\u3002',\r\n        'a': '\u8FD4\u56DE\u8303\u56F4\u5185\u6EE1\u8DB3\u67D0\u4E2A\u6761\u4EF6\u7684\u5355\u5143\u683C\u7684\u6570\u91CF\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u8303\u56F4',\r\n            'detail': '\u8981\u6839\u636E\u6761\u4EF6\u8FDB\u884C\u68C0\u6D4B\u7684\u8303\u56F4\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6761\u4EF6',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E\u8303\u56F4\u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002\\n\\n\u5982\u679C\u8303\u56F4\u5305\u542B\u7684\u662F\u8981\u68C0\u6D4B\u7684\u6587\u672C\uFF0C\u5219\u6761\u4EF6\u5FC5\u987B\u4E3A\u5B57\u7B26\u4E32\u3002\u6761\u4EF6\u53EF\u4EE5\u5305\u542B\u901A\u914D\u7B26\uFF0C\u5305\u62EC\u7528\u4E8E\u5339\u914D\u5355\u4E2A\u5B57\u7B26\u7684?\u6216\u7528\u4E8E\u5339\u914D\u96F6\u4E2A\u6216\u8FDE\u7EED\u591A\u4E2A\u5B57\u7B26\u7684*\u3002\u8981\u5339\u914D\u95EE\u53F7\u661F\u53F7\u672C\u8EAB\uFF0C\u8BF7\u5728\u8BE5\u5B57\u7B26\u524D\u9762\u52A0\u4E0A\u6CE2\u6D6A\u53F7(~)\u524D\u7F00\uFF08\u5373~?\u548C~*\uFF09\u3002\u5B57\u7B26\u4E32\u6761\u4EF6\u5FC5\u987B\u7528\u5F15\u53F7\u62EC\u8D77\u6765\u3002\u51FD\u6570\u4F1A\u68C0\u67E5\u8303\u56F4\u4E2D\u7684\u6BCF\u4E2A\u5355\u5143\u683C\u4E0E\u6761\u4EF6\u662F\u5426\u76F8\u7B49\u6216\u5339\u914D\uFF08\u5982\u679C\u4F7F\u7528\u4E86\u901A\u914D\u7B26\uFF09\u3002\\n\\n\u5982\u679C\u8303\u56F4\u5305\u542B\u7684\u662F\u8981\u68C0\u6D4B\u7684\u6570\u5B57\uFF0C\u5219\u6761\u4EF6\u53EF\u4EE5\u662F\u5B57\u7B26\u4E32\u4E5F\u53EF\u4EE5\u662F\u6570\u5B57\u3002\u5982\u679C\u7ED9\u5B9A\u7684\u6761\u4EF6\u662F\u4E00\u4E2A\u6570\u5B57\uFF0C\u5219\u68C0\u67E5\u8303\u56F4\u4E2D\u7684\u6BCF\u4E2A\u5355\u5143\u683C\u662F\u5426\u7B49\u4E8E\u6761\u4EF6\u3002\u53E6\u5916\uFF0C\u6761\u4EF6\u4E5F\u53EF\u80FD\u662F\u5305\u542B\u6570\u5B57\u7684\u5B57\u7B26\u4E32\uFF08\u4E5F\u5C06\u5BF9\u5176\u8FDB\u884C\u76F8\u7B49\u68C0\u6D4B\uFF09\uFF0C\u6216\u8005\u5E26\u6709\u4EE5\u4E0B\u524D\u7F00\u7684\u6570\u5B57\uFF1A=\u3001>\u3001>=\u3001<\u6216<=\uFF0C\u8FD9\u4E9B\u6761\u4EF6\u5C06\u5206\u522B\u7528\u4E8E\u68C0\u67E5\u8303\u56F4\u4E2D\u7684\u5355\u5143\u683C\u662F\u5426\u7B49\u4E8E\u3001\u5927\u4E8E\u3001\u5927\u4E8E\u7B49\u4E8E\u3001\u5C0F\u4E8E\u3001\u5C0F\u4E8E\u7B49\u4E8E\u6761\u4EF6\u503C\u3002',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RADIANS',\r\n        't': 0,\r\n        'd': '\u5C06\u4EE5\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F6C\u6362\u4E3A\u5F27\u5EA6\u3002',\r\n        'a': '\u5C06\u4EE5\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F6C\u6362\u4E3A\u5F27\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u89D2\u5EA6',\r\n            'detail': '\u8981\u4ECE\u5EA6\u8F6C\u6362\u4E3A\u5F27\u5EA6\u7684\u89D2\u5EA6\u3002',\r\n            'example': '180',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RAND',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF08\u5305\u62EC0\u4F46\u4E0D\u5305\u62EC1\uFF09\u7684\u968F\u673A\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF08\u5305\u62EC0\u4F46\u4E0D\u5305\u62EC1\uFF09\u7684\u968F\u673A\u6570\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'COUNTUNIQUE',\r\n        't': 0,\r\n        'd': '\u8BA1\u7B97\u4E00\u5217\u6307\u5B9A\u503C\u548C\u8303\u56F4\u4E2D\u4E0D\u91CD\u590D\u6570\u503C\u7684\u4E2A\u6570\u3002',\r\n        'a': '\u8BA1\u7B97\u4E00\u5217\u6307\u5B9A\u503C\u548C\u8303\u56F4\u4E2D\u4E0D\u91CD\u590D\u6570\u503C\u7684\u4E2A\u6570\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8981\u68C0\u67E5\u5176\u662F\u5426\u552F\u4E00\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A1:C100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u8981\u68C0\u67E5\u662F\u5426\u552F\u4E00\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DEGREES',\r\n        't': 0,\r\n        'd': '\u5C06\u4EE5\u5F27\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F6C\u6362\u4E3A\u5EA6\u3002',\r\n        'a': '\u5C06\u4EE5\u5F27\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F6C\u6362\u4E3A\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u89D2\u5EA6',\r\n            'detail': '\u8981\u4ECE\u5F27\u5EA6\u8F6C\u6362\u4E3A\u5EA6\u7684\u89D2\u5EA6\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ERFC',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u4E92\u8865\u9AD8\u65AF\u8BEF\u5DEE\u51FD\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u4E92\u8865\u9AD8\u65AF\u8BEF\u5DEE\u51FD\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'z',\r\n            'detail': '\u8981\u4E3A\u5176\u8BA1\u7B97\u4E92\u8865\u9AD8\u65AF\u8BEF\u5DEE\u51FD\u6570\u7684\u6570\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EVEN',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u5076\u6574\u6570\u3002',\r\n        'a': '\u5C06\u6570\u503C\u5411\u4E0A\u53D6\u6574\u4E3A\u6700\u63A5\u8FD1\u7684\u5076\u6574\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5411\u4E0A\u53D6\u6574\u7684\u6570\u503C\uFF0C\u53D6\u6574\u503C\u4E3A\u5927\u4E8E\u6B64\u503C\u7684\u6700\u63A5\u8FD1\u7684\u5076\u6570\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u8D1F\u6570\uFF0C\u5219\u5C06\u5176\u53D6\u6574\u4E3A\u7EDD\u5BF9\u503C\u5927\u4E8E\u8BE5\u503C\u7684\u76F8\u90BB\u8D1F\u5076\u6570\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EXP',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6B27\u62C9\u6570 e (~2.718) \u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'a': '\u8FD4\u56DE\u6B27\u62C9\u6570 e (~2.718) \u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u6307\u6570',\r\n            'detail': '\u6307\u5B9Ae\u7684\u81EA\u4E58\u5E42\u6B21\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FACT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u9636\u4E58\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u9636\u4E58\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5E76\u8FD4\u56DE\u5176\u9636\u4E58\u7684\u6570\u5B57\u6216\u5BF9\u6570\u5B57\uFF08\u6240\u5728\u5355\u5143\u683C\uFF09\u7684\u5F15\u7528\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FACTDOUBLE',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u201C\u53CC\u9636\u4E58\u201D\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u201C\u53CC\u9636\u4E58\u201D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5E76\u8FD4\u56DE\u5176\u53CC\u9636\u4E58\u7684\u6570\u5B57\u6216\u5BF9\u6570\u5B57\uFF08\u6240\u5728\u5355\u5143\u683C\uFF09\u7684\u5F15\u7528\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PI',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5E26\u670914\u4F4D\u5C0F\u6570\u7684 PI \u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5E26\u670914\u4F4D\u5C0F\u6570\u7684 PI \u503C\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'FLOOR',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u503C\u5411\u4E0B\u53D6\u6574\u4E3A\u6307\u5B9A\u56E0\u6570\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6570\u500D\u3002',\r\n        'a': '\u5C06\u6570\u503C\u5411\u4E0B\u53D6\u6574\u4E3A\u6307\u5B9A\u56E0\u6570\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6570\u500D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5411\u4E0B\u820D\u5165\u4E3A\u56E0\u6570\u7684\u6700\u63A5\u8FD1\u6574\u6570\u500D\u7684\u6570\u503C\u3002',\r\n            'example': '23.25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u56E0\u6570',\r\n            'detail': '\u8981\u5C06\u503C\u820D\u5165\u5230\u6B64\u6570\u7684\u6574\u6570\u500D\u3002\\n\\n\u56E0\u6570\u4E0D\u5F97\u4E3A0\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GCD',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u6216\u591A\u4E2A\u6574\u6570\u7684\u6700\u5927\u516C\u7EA6\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u6216\u591A\u4E2A\u6574\u6570\u7684\u6700\u5927\u516C\u7EA6\u6570\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8981\u5728\u67E5\u627E\u6700\u5927\u516C\u7EA6\u6570\u7684\u8BA1\u7B97\u4E2D\u68C0\u67E5\u5176\u56E0\u6570\u7684\u7B2C\u4E00\u9879\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u6C42\u6700\u5927\u516C\u7EA6\u6570\u65F6\u8981\u8003\u8651\u5176\u56E0\u6570\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '96',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANDBETWEEN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4ECB\u4E8E\u4E24\u4E2A\u6574\u6570\u4E4B\u95F4\uFF08\u5305\u62EC\u8FD9\u4E24\u4E2A\u6574\u6570\uFF09\u7684\u968F\u673A\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4ECB\u4E8E\u4E24\u4E2A\u6574\u6570\u4E4B\u95F4\uFF08\u5305\u62EC\u8FD9\u4E24\u4E2A\u6574\u6570\uFF09\u7684\u968F\u673A\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u4E0B\u754C',\r\n            'detail': '\u968F\u673A\u503C\u8303\u56F4\u7684\u4E0B\u754C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4E0A\u754C',\r\n            'detail': '\u968F\u673A\u503C\u8303\u56F4\u7684\u4E0A\u754C\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUND',\r\n        't': 0,\r\n        'd': '\u5C06\u6570\u5B57\u56DB\u820D\u4E94\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6570\u3002',\r\n        'a': '\u5C06\u6570\u5B57\u56DB\u820D\u4E94\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u56DB\u820D\u4E94\u5165\u7684\u6570\u5B57\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4F4D\u6570',\r\n            'detail': '\u8981\u8FDB\u884C\u56DB\u820D\u4E94\u5165\u8FD0\u7B97\u7684\u4F4D\u6570\u3002\\n\\n\u4F4D\u6570\u53EF\u4EE5\u53D6\u8D1F\u503C\uFF0C\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u4F1A\u5C06\u503C\u7684\u5C0F\u6570\u70B9\u5DE6\u4FA7\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUNDDOWN',\r\n        't': 0,\r\n        'd': '\u671D\u7740\u96F6\u7684\u65B9\u5411\u5C06\u6570\u5B57\u8FDB\u884C\u5411\u4E0B\u820D\u5165\u3002',\r\n        'a': '\u671D\u7740\u96F6\u7684\u65B9\u5411\u5C06\u6570\u5B57\u8FDB\u884C\u5411\u4E0B\u820D\u5165\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u9700\u8981\u5411\u4E0B\u820D\u5165\u7684\u4EFB\u610F\u5B9E\u6570\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4F4D\u6570',\r\n            'detail': '\u8981\u901A\u8FC7\u820D\u5165\u8FBE\u5230\u7684\u5C0F\u6570\u4F4D\u6570\u3002\\n\\n\u4F4D\u6570\u53EF\u4EE5\u53D6\u8D1F\u503C\uFF0C\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u4F1A\u5C06\u503C\u7684\u5C0F\u6570\u70B9\u5DE6\u4FA7\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUNDUP',\r\n        't': 0,\r\n        'd': '\u671D\u7740\u8FDC\u79BB 0\uFF08\u96F6\uFF09\u7684\u65B9\u5411\u5C06\u6570\u5B57\u8FDB\u884C\u5411\u4E0A\u820D\u5165\u3002',\r\n        'a': '\u671D\u7740\u8FDC\u79BB 0\uFF08\u96F6\uFF09\u7684\u65B9\u5411\u5C06\u6570\u5B57\u8FDB\u884C\u5411\u4E0A\u820D\u5165\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5C06\u5176\u820D\u5165\u4E3A\u4F4D\u6570\u4F4D\u6570\u5B57\u7684\u503C\uFF0C\u59CB\u7EC8\u5411\u4E0A\u820D\u5165\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4F4D\u6570',\r\n            'detail': '\u8981\u901A\u8FC7\u820D\u5165\u8FBE\u5230\u7684\u5C0F\u6570\u4F4D\u6570\u3002\\n\\n\u4F4D\u6570\u53EF\u4EE5\u53D6\u8D1F\u503C\uFF0C\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u4F1A\u5C06\u503C\u7684\u5C0F\u6570\u70B9\u5DE6\u4FA7\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SERIESSUM',\r\n        't': 0,\r\n        'd': '\u7ED9\u5B9A\u53C2\u6570 x\u3001n\u3001m \u548C a\uFF0C\u8FD4\u56DE\u5E42\u7EA7\u6570\u7684\u548C a1xn + a2x(n+m) + ... + aix(n+(i-1)m)\uFF0C\u5176\u4E2D i \u4E3A\u8303\u56F4 a \u4E2D\u7684\u9879\u6570\u3002',\r\n        'a': '\u7ED9\u5B9A\u53C2\u6570 x\u3001n\u3001m \u548C a',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u5E42\u7EA7\u6570\u7684\u8F93\u5165\u503C\u3002\u968F\u76F8\u5E94\u7684\u8FD1\u4F3C\u7C7B\u578B\u800C\u53D8\uFF0C\u6709\u53EF\u80FD\u4E3A\u89D2\u5EA6\u3001\u6307\u6570\u6216\u5176\u4ED6\u4E00\u4E9B\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'n',\r\n            'detail': '\u5728\u5E42\u7EA7\u6570\u4E2Dx\u7684\u521D\u59CB\u81EA\u4E58\u5E42\u6B21\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'm',\r\n            'detail': 'x\u7684\u5E42\u6B21\u4E2D\u7684\u9644\u52A0\u589E\u91CF\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'a',\r\n            'detail': '\u5305\u542B\u5E42\u7EA7\u6570\u7CFB\u6570\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': '{FACT(0)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SIGN',\r\n        't': 0,\r\n        'd': '\u7ED9\u5B9A\u8F93\u5165\u6570\u503C\uFF0C\u5982\u679C\u4E3A\u8D1F\u8FD4\u56DE-1\uFF1B\u5982\u679C\u4E3A\u6B63\u8FD4\u56DE1\uFF1B\u5982\u679C\u4E3A\u96F6\u5219\u8FD4\u56DE0\u3002',\r\n        'a': '\u7ED9\u5B9A\u8F93\u5165\u6570\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u7B26\u53F7\u7684\u6570\u503C\u3002',\r\n            'example': '-42',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SIN',\r\n        't': 0,\r\n        'd': '\u7ED9\u5B9A\u89D2\u5EA6\uFF08\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09\uFF0C\u8FD4\u56DE\u5176\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u7ED9\u5B9A\u89D2\u5EA6\uFF08\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u89D2\u5EA6',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u6B63\u5F26\u503C\u7684\u89D2\u5EA6\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SINH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u5B9E\u6570\u7684\u53CC\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u53CC\u66F2\u6B63\u5F26\u503C\u7684\u5B9E\u6570\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SQRT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u6B63\u6570\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u6B63\u6570\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u6B63\u5E73\u65B9\u6839\u7684\u6570\u503C\u3002\\n\\n\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF1B\u5982\u679C\u4E3A\u8D1F\uFF0CSQRT \u5C06\u8FD4\u56DE #NUM! \u9519\u8BEF\u3002',\r\n            'example': '9',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SQRTPI',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE PI \u4E0E\u7ED9\u5B9A\u6B63\u6570\u4E58\u79EF\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'a': '\u8FD4\u56DE PI \u4E0E\u7ED9\u5B9A\u6B63\u6570\u4E58\u79EF\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u5C06\u5176\u4E0E PI \u76F8\u4E58\u5E76\u8FD4\u56DE\u8BE5\u4E58\u79EF\u7684\u5E73\u65B9\u6839\u7684\u6570\u503C\\n\\n\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF1B\u5982\u679C\u4E3A\u8D1F\u6570\uFF0CSQRTPI \u5C06\u8FD4\u56DE #NUM! \u9519\u8BEF\u3002',\r\n            'example': '9',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GAMMALN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u4F3D\u739B\u51FD\u6570\u7684\u4EE5 e\uFF08\u6B27\u62C9\u6570\uFF09\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u4F3D\u739B\u51FD\u6570\u7684\u4EE5 e\uFF08\u6B27\u62C9\u6570\uFF09\u4E3A\u5E95\u7684\u5BF9\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u4F3D\u739B\u51FD\u6570\u7684\u8F93\u5165\u503C\u3002\u8FD4\u56DE\u7684\u5C06\u662F\u4F3D\u739B (\u503C) \u7684\u81EA\u7136\u5BF9\u6570\u3002\\n\\n\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u89D2\u5EA6\u7684\u4F59\u5F26\u503C\uFF08\u89D2\u5EA6\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u89D2\u5EA6\u7684\u4F59\u5F26\u503C\uFF08\u89D2\u5EA6\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u89D2\u5EA6',\r\n            'detail': '\u8981\u53D6\u5176\u4F59\u5F26\u503C\u7684\u89D2\u5EA6\uFF0C\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TRUNC',\r\n        't': 0,\r\n        'd': '\u622A\u9664\u6307\u5B9A\u6709\u6548\u4F4D\u4E4B\u5916\u7684\u90E8\u5206\uFF0C\u53D6\u6570\u636E\u7684\u6307\u5B9A\u6709\u6548\u4F4D\u3002',\r\n        'a': '\u622A\u9664\u6307\u5B9A\u6709\u6548\u4F4D\u4E4B\u5916\u7684\u90E8\u5206',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': '\u503C',\r\n            'detail': '\u8981\u622A\u53D6\u7684\u6570\u636E\u3002',\r\n            'example': '3.141592654',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4F4D\u6570',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u5C0F\u6570\u70B9\u53F3\u4FA7\u8981\u4FDD\u7559\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u4F4D\u6570\u5927\u4E8E\u503C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5C06\u201C\u503C\u201D\u539F\u6837\u8FD4\u56DE\u3002\\n\\n\u4F4D\u6570\u53EF\u4EE5\u53D6\u8D1F\u503C\uFF0C\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u4F1A\u5C06\u5C0F\u6570\u70B9\u5DE6\u4FA7\u6307\u5B9A\u4F4D\u6570\u7684\u503C\u66F4\u6539\u4E3A\u96F6\u3002\u5C0F\u6570\u70B9\u53F3\u4FA7\u7684\u6240\u6709\u4F4D\u6570\u90FD\u4F1A\u88AB\u820D\u5F03\u3002\u5982\u679C\u503C\u7684\u6240\u6709\u4F4D\u90FD\u88AB\u66F4\u6539\u4E3A\u96F6\uFF0C\u5219TRUNC\u4F1A\u8FD4\u56DE0\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUOTIENT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4EE5\u4E00\u4E2A\u6570\u9664\u4EE5\u53E6\u4E00\u4E2A\u6570\u6240\u5F97\u7684\u7ED3\u679C\uFF0C\u4E0D\u5305\u542B\u4F59\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5\u4E00\u4E2A\u6570\u9664\u4EE5\u53E6\u4E00\u4E2A\u6570\u6240\u5F97\u7684\u7ED3\u679C',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u88AB\u9664\u6570',\r\n            'detail': '\u8981\u88AB\u9664\u7684\u6570\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u9664\u6570',\r\n            'detail': '\u7528\u4E8E\u9664\u5176\u4ED6\u6570\u7684\u6570\u503C\u3002\\n\\n\u9664\u6570\u4E0D\u5F97\u4E3A0\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'POWER',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u5E95\u6570',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u6307\u6570\u6B21\u5E42\u7684\u6570\u503C\u3002\\n\\n\u5982\u679C\u5E95\u6570\u4E3A\u8D1F\uFF0C\u5219\u6307\u6570\u5FC5\u987B\u4E3A\u6574\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6307\u6570',\r\n            'detail': '\u6307\u5B9A\u5E95\u6570\u7684\u81EA\u4E58\u5E42\u6B21\u503C\u3002',\r\n            'example': '0.5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMIFS',\r\n        't': 0,\r\n        'd': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u4E4B\u548C\u3002',\r\n        'a': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u4E4B\u548C\u3002',\r\n        'm': [3, 257],\r\n        'p': [{\r\n            'name': '\u6C42\u548C\u8303\u56F4',\r\n            'detail': '\u8981\u5BF9\u5176\u6C42\u548C\u7684\u8303\u56F4\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6761\u4EF6\u8303\u56F41',\r\n            'detail': '\u8981\u5728\u54EA\u4E2A\u8303\u56F4\u5185\u68C0\u67E5\u6761\u4EF61\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6761\u4EF61',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E\u6761\u4EF6\u8303\u56F41\u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u6761\u4EF6\u8303\u56F42, \u6761\u4EF62...',\r\n            'detail': '[ \u53EF\u9009 ] - \u8981\u68C0\u67E5\u7684\u5176\u4ED6\u8303\u56F4\u548C\u6761\u4EF6\u3002',\r\n            'example': ' C1:C10',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTIFS',\r\n        't': 1,\r\n        'd': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u4E2D\u7684\u5355\u5143\u683C\u6570\u91CF\u3002',\r\n        'a': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u4E2D\u7684\u5355\u5143\u683C\u6570\u91CF\u3002',\r\n        'm': [2, 256],\r\n        'p': [{\r\n            'name': '\u6761\u4EF6\u8303\u56F41',\r\n            'detail': '\u8981\u5728\u54EA\u4E2A\u8303\u56F4\u5185\u68C0\u67E5\u6761\u4EF61\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6761\u4EF61',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E\u6761\u4EF6\u8303\u56F41\u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u6761\u4EF6\u8303\u56F42, \u6761\u4EF62...',\r\n            'detail': '[ \u53EF\u9009 ] - \u8981\u68C0\u67E5\u7684\u5176\u4ED6\u8303\u56F4\u548C\u6761\u4EF6\uFF0C\u53EF\u91CD\u590D\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PRODUCT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5C06\u4E00\u7EC4\u6570\u76F8\u4E58\u6240\u5F97\u7684\u7ED3\u679C\u3002',\r\n        'a': '\u8FD4\u56DE\u5C06\u4E00\u7EC4\u6570\u76F8\u4E58\u6240\u5F97\u7684\u7ED3\u679C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u4E58\u65701',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u4E58\u79EF\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u4E58\u65702 ... \u4E58\u657030',\r\n            'detail': '[\u53EF\u9009] - \u8981\u76F8\u4E58\u7684\u5176\u4ED6\u6570\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HARMEAN',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u8C03\u548C\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u8C03\u548C\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HYPGEOMDIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8D85\u51E0\u4F55\u5206\u5E03\u3002 \u5982\u679C\u5DF2\u77E5\u6837\u672C\u91CF\u3001\u603B\u4F53\u6210\u529F\u6B21\u6570\u548C\u603B\u4F53\u5927\u5C0F\uFF0C\u5219 HYPGEOM.DIST \u8FD4\u56DE\u6837\u672C\u53D6\u5F97\u5DF2\u77E5\u6210\u529F\u6B21\u6570\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u8D85\u51E0\u4F55\u5206\u5E03\u3002',\r\n        'm': [5, 5],\r\n        'p': [{\r\n            'name': 'Sample_s',\r\n            'detail': '\u6837\u672C\u4E2D\u6210\u529F\u7684\u6B21\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'Number_sample',\r\n            'detail': '\u6837\u672C\u91CF\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'Population_s',\r\n            'detail': '\u603B\u4F53\u4E2D\u6210\u529F\u7684\u6B21\u6570\u3002',\r\n            'example': '20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'Number_pop',\r\n            'detail': '\u603B\u4F53\u5927\u5C0F\u3002',\r\n            'example': '40',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C cumulative \u4E3A TRUE()\uFF0C\u5219 HYPGEOM.DIST \u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'INTERCEPT',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52\u65B9\u7A0B\u76F4\u7EBF\u4E0E Y \u8F74\u7684\u76F8\u4EA4\u70B9 (x=0) \u7684 y \u503C\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52\u65B9\u7A0B\u76F4\u7EBF\u4E0E Y \u8F74\u7684\u76F8\u4EA4\u70B9 (x=0) \u7684 y \u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'KURT',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u5CED\u5EA6\uFF0C\u8BE5\u6307\u6807\u6307\u793A\u6570\u636E\u96C6\uFF08\u5206\u5E03\uFF09\u7684\u5F62\u6001\uFF0C\u5C24\u5176\u662F\u8BE5\u5F62\u6001\u7684\u9661\u5CED\u7A0B\u5EA6\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u5CED\u5EA6',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6570\u636E\u96C6\u4E2D\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LARGE',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7B2C n \u4E2A\u6700\u5927\u5143\u7D20\uFF0Cn \u7531\u7528\u6237\u6307\u5B9A\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7B2C n \u4E2A\u6700\u5927\u5143\u7D20',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'n',\r\n            'detail': '\u8981\u8FD4\u56DE\u7684\u5143\u7D20\u7684\u6392\u884C\u4F4D\u7F6E\uFF08\u4ECE\u5927\u5230\u5C0F\u987A\u5E8F\uFF09\u3002\\n\\n\u4F8B\u5982\uFF0C\u5C06n\u8BBE\u4E3A4\u5C06\u4F7FLARGE\u8FD4\u56DE\u6570\u636E\u4E2D\u6392\u540D\u7B2C4\u7684\u6700\u5927\u5143\u7D20\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STDEVA',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u6807\u51C6\u504F\u5DEE\uFF0C\u5C06\u6587\u672C\u53D6\u503C\u4E3A0\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u6807\u51C6\u504F\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2,\u2026',\r\n            'detail': '[\u53EF\u9009] - \u6837\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STDEVP',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6570\u636E\u96C6\u4E2D\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GEOMEAN',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u51E0\u4F55\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u51E0\u4F55\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANK_EQ',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6570\u636E\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6570\u636E\u96C6\u4E2D\u5B58\u5728\u591A\u9879\uFF0C\u5219\u8FD4\u56DE\u5176\u4E2D\u7684\u6700\u9AD8\u6392\u540D\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6570\u636E\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6570\u636E\u96C6\u4E2D\u5B58\u5728\u591A\u9879\uFF0C\u5219\u8FD4\u56DE\u5176\u4E2D\u7684\u6700\u9AD8\u6392\u540D\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u6392\u540D\u7684\u503C\u3002',\r\n            'example': 'A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'ref',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'order',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u6309\u964D\u5E8F (FALSE()) ] - \u8981\u6309\u5347\u5E8F\u8FD8\u662F\u6309\u964D\u5E8F\u8003\u8651\u201Cdata\u201D\u4E2D\u7684\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANK_AVG',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6570\u636E\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6570\u636E\u96C6\u4E2D\u5B58\u5728\u591A\u9879\uFF0C\u5219\u8FD4\u56DE\u8FD9\u4E9B\u9879\u6392\u540D\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6570\u636E\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6570\u636E\u96C6\u4E2D\u5B58\u5728\u591A\u9879\uFF0C\u5219\u8FD4\u56DE\u8FD9\u4E9B\u9879\u6392\u540D\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u6392\u540D\u7684\u503C\u3002',\r\n            'example': 'A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'ref',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'order',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u6309\u964D\u5E8F (FALSE()) ] - \u8981\u6309\u5347\u5E8F\u8FD8\u662F\u6309\u964D\u5E8F\u8003\u8651\u201Cdata\u201D\u4E2D\u7684\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTRANK_EXC',\r\n        't': 1,\r\n        'd': '\u4EE5\u767E\u5206\u6570\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7ED9\u5B9A\u6570\u636E\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF0C\u4E0D\u5305\u62EC\u4E24\u7AEF\u503C\uFF09\u3002',\r\n        'a': '\u4EE5\u767E\u5206\u6570\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7ED9\u5B9A\u6570\u636E\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF0C\u4E0D\u5305\u62EC\u4E24\u7AEF\u503C\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'data',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'x',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'significance',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 3] - \u8981\u5728\u8BA1\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTRANK_INC',\r\n        't': 1,\r\n        'd': '\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7ED9\u5B9A\u6570\u636E\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF0C\u5305\u62EC\u4E24\u7AEF\u503C\uFF09\u3002',\r\n        'a': '\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7ED9\u5B9A\u6570\u636E\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF0C\u5305\u62EC\u4E24\u7AEF\u503C\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'data',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'x',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\u3002',\r\n            'example': ' A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'significance',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 3] - \u8981\u5728\u8BA1\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FORECAST',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52\uFF0C\u8BA1\u7B97\u6307\u5B9A x \u7684\u9884\u671F y \u503C\u3002',\r\n        'a': '\u57FA\u4E8E\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': 'x\u8F74\u4E0A\u7528\u4E8E\u9884\u6D4B\u7684\u503C\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FISHERINV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6570\u503C\u7684 Fisher \u9006\u53D8\u6362\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6570\u503C\u7684 Fisher \u9006\u53D8\u6362\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'y',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176Fisher\u9006\u53D8\u6362\u7684\u6570\u503C\u3002',\r\n            'example': '0.962',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FISHER',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6570\u503C\u7684 Fisher \u53D8\u6362\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6570\u503C\u7684 Fisher \u53D8\u6362\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176Fisher\u53D8\u6362\u7684\u6570\u503C\u3002',\r\n            'example': '0.962',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MODE_SNGL',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u51FA\u73B0\u6B21\u6570\u6700\u591A\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u51FA\u73B0\u6B21\u6570\u6700\u591A\u7684\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u6A21\u5F0F\u65F6\u8981\u68C0\u67E5\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u6A21\u5F0F\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'WEIBULL_DIST',\r\n        't': 1,\r\n        'd': '\u7ED9\u5B9A\u5F62\u72B6\u548C\u5C3A\u5EA6\uFF0C\u8FD4\u56DE\u97E6\u4F2F\u5206\u5E03\u51FD\u6570\uFF08\u6216\u97E6\u4F2F\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF09\u7684\u503C\u3002',\r\n        'a': '\u7ED9\u5B9A\u5F62\u72B6\u548C\u5C3A\u5EA6',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': 'WEIBULL \u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'alpha',\r\n            'detail': 'Weibull \u5206\u5E03\u51FD\u6570\u7684\u5F62\u72B6\u53C2\u6570\u3002\\n\\nalpha \u503C\u5FC5\u987B\u5927\u4E8E 0\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'beta',\r\n            'detail': 'Weibull \u5206\u5E03\u51FD\u6570\u7684\u5C3A\u5EA6\u53C2\u6570\u3002\\n\\nbeta \u503C\u5FC5\u987B\u5927\u4E8E 0\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': 'TRUE() \u8868\u793A\u4F7F\u7528\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF0CFALSE() \u5219\u8868\u793A\u4F7F\u7528\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u6570\u503C\u7684\u4E2A\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u6570\u503C\u7684\u4E2A\u6570\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u6570\u65F6\u8981\u68C0\u67E5\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u6570\u65F6\u8981\u68C0\u67E5\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u503C\u7684\u6570\u91CF\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u503C\u7684\u6570\u91CF\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u6570\u65F6\u8981\u68C0\u67E5\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u6570\u65F6\u8981\u68C0\u67E5\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVEDEV',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u4E0E\u6570\u636E\u96C6\u5747\u503C\u4E4B\u95F4\u7684\u504F\u5DEE\u5927\u5C0F\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u4E0E\u6570\u636E\u96C6\u5747\u503C\u4E4B\u95F4\u7684\u504F\u5DEE\u5927\u5C0F\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6837\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGE',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C\uFF0C\u5BF9\u6587\u672C\u5FFD\u7565\u4E0D\u8BA1\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u7528\u5230\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u7528\u5230\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BINOM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u4E00\u5143\u4E8C\u9879\u5F0F\u5206\u5E03\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u5143\u4E8C\u9879\u5F0F\u5206\u5E03\u7684\u6982\u7387\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'number_s',\r\n            'detail': '\u8BD5\u9A8C\u7684\u6210\u529F\u6B21\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'trials',\r\n            'detail': '\u72EC\u7ACB\u68C0\u9A8C\u7684\u6B21\u6570\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'probability_s',\r\n            'detail': '\u4EFB\u4E00\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.005',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u662F\u5426\u4F7F\u7528\u4E8C\u9879\u5F0F\u7D2F\u79EF\u5206\u5E03\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BINOM_INV',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u7D2F\u79EF\u4E8C\u9879\u5F0F\u5206\u5E03\u5927\u4E8E\u6216\u7B49\u4E8E\u6307\u5B9A\u6761\u4EF6\u7684\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8BA1\u7B97\u7D2F\u79EF\u4E8C\u9879\u5F0F\u5206\u5E03\u5927\u4E8E\u6216\u7B49\u4E8E\u6307\u5B9A\u6761\u4EF6\u7684\u6700\u5C0F\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'trials',\r\n            'detail': '\u8D1D\u52AA\u5229\u8BD5\u9A8C\u6B21\u6570\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'probability_s',\r\n            'detail': '\u4EFB\u4E00\u6B21\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.005',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'alpha',\r\n            'detail': '\u671F\u671B\u7684\u4E34\u754C\u6982\u7387\u3002',\r\n            'example': '0.8',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONFIDENCE_NORM',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6B63\u6001\u5206\u5E03\u7684\u7F6E\u4FE1\u533A\u95F4\u7684\u4E00\u534A\u5BBD\u5EA6\u3002',\r\n        'a': '\u8BA1\u7B97\u6B63\u6001\u5206\u5E03\u7684\u7F6E\u4FE1\u533A\u95F4\u7684\u4E00\u534A\u5BBD\u5EA6\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'alpha',\r\n            'detail': '\u7528\u6765\u8BA1\u7B97\u7F6E\u4FE1\u6C34\u5E73\u7684\u663E\u8457\u6027\u6C34\u5E73\u3002\\n\\n\u7F6E\u4FE1\u6C34\u5E73\u7B49\u4E8E 100*(1 - alpha)%\uFF0C\u4EA6\u5373\uFF0C\u5982\u679C alpha \u4E3A 0.05\uFF0C\u5219\u7F6E\u4FE1\u6C34\u5E73\u4E3A 95%\u3002',\r\n            'example': '0.05',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': '\u6570\u636E\u533A\u57DF\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\u3002',\r\n            'example': '1.6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'size',\r\n            'detail': '\u6837\u672C\u603B\u91CF\u7684\u5927\u5C0F\u3002',\r\n            'example': '250',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CORREL',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u7ED9\u5B9A\u6570\u636E\u96C6\u7684\u76AE\u5C14\u900A\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r\u3002',\r\n        'a': '\u8BA1\u7B97\u7ED9\u5B9A\u6570\u636E\u96C6\u7684\u76AE\u5C14\u900A\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COVARIANCE_P',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u603B\u4F53\u534F\u65B9\u5DEE\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u603B\u4F53\u534F\u65B9\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COVARIANCE_S',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u6837\u672C\u534F\u65B9\u5DEE\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u636E\u96C6\u7684\u6837\u672C\u534F\u65B9\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEVSQ',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u5176\u504F\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u5176\u504F\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6837\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EXPON_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5E26\u6709\u6307\u5B9A Lambda \u548C\u6307\u5B9A\u503C\u7684\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5E26\u6709\u6307\u5B9A Lambda \u548C\u6307\u5B9A\u503C\u7684\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'lambda',\r\n            'detail': '\u7528\u4E8E\u6307\u5B9A\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684 lambda \u503C\u3002',\r\n            'example': '0.5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u662F\u5426\u4F7F\u7528\u6307\u6570\u7D2F\u79EF\u5206\u5E03\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEIF',\r\n        't': 1,\r\n        'd': '\u6839\u636E\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u6839\u636E\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'criteria_range',\r\n            'detail': '\u8981\u5BF9\u5176\u68C0\u67E5 criterion \u7684\u8303\u56F4\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criterion',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E criteria_range \u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002\\n\\n\u7B49\u4E8E\uFF1A\"\u6587\u672C\" \u6216 1 \u6216 \"=\u6587\u672C\" \u6216 \"=1\"\\n\\n\u5927\u4E8E\uFF1A\">1\"\\n\\n\u5927\u4E8E\u7B49\u4E8E\uFF1A\">=1\"\\n\\n\u5C0F\u4E8E\uFF1A\"<1\"\\n\\n\u5C0F\u4E8E\u7B49\u4E8E\uFF1A\"<=1\"\\n\\n\u4E0D\u7B49\u4E8E\uFF1A\"<>1\"\u6216\"<>\u6587\u672C\"',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'average_range',\r\n            'detail': '[\u53EF\u9009] - \u8981\u8BA1\u7B97\u5E73\u5747\u503C\u7684\u8303\u56F4\u3002\u5982\u679C\u672A\u63D0\u4F9B\u6B64\u53C2\u6570\uFF0C\u5219\u6539\u7528 criteria_range \u6765\u8BA1\u7B97\u5E73\u5747\u503C\u3002',\r\n            'example': 'B1:B10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEIFS',\r\n        't': 1,\r\n        'd': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u6839\u636E\u591A\u9879\u6761\u4EF6\u8FD4\u56DE\u8303\u56F4\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name': 'average_range',\r\n            'detail': '\u8981\u8BA1\u7B97\u5E73\u5747\u503C\u7684\u8303\u56F4\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria_range1',\r\n            'detail': '\u8981\u5BF9\u5176\u68C0\u67E5 criterion1 \u7684\u8303\u56F4\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criterion1',\r\n            'detail': '\u8981\u5E94\u7528\u4E8E criteria_range1 \u7684\u6A21\u5F0F\u6216\u6D4B\u8BD5\u6761\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria_range2, criterion2, ...',\r\n            'detail': '[\u53EF\u9009] - \u8981\u68C0\u67E5\u7684\u5176\u4ED6\u8303\u56F4\u548C\u6761\u4EF6\u3002',\r\n            'example': ' C1:C10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PERMUT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u53EF\u4ECE\u6570\u5B57\u5BF9\u8C61\u4E2D\u9009\u62E9\u7684\u7ED9\u5B9A\u6570\u76EE\u5BF9\u8C61\u7684\u6392\u5217\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u53EF\u4ECE\u6570\u5B57\u5BF9\u8C61\u4E2D\u9009\u62E9\u7684\u7ED9\u5B9A\u6570\u76EE\u5BF9\u8C61\u7684\u6392\u5217\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8868\u793A\u5BF9\u8C61\u4E2A\u6570\u7684\u6574\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'number_chosen',\r\n            'detail': '\u8868\u793A\u6BCF\u4E2A\u6392\u5217\u4E2D\u5BF9\u8C61\u4E2A\u6570\u7684\u6574\u6570\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TRIMMEAN',\r\n        't': 1,\r\n        'd': '\u5728\u6392\u9664\u6570\u636E\u96C6\u9AD8\u4F4E\u4E24\u7AEF\u7684\u90E8\u5206\u6570\u636E\u4E4B\u540E\u8BA1\u7B97\u6240\u5F97\u7684\u5747\u503C\u3002',\r\n        'a': '\u5728\u6392\u9664\u6570\u636E\u96C6\u9AD8\u4F4E\u4E24\u7AEF\u7684\u90E8\u5206\u6570\u636E\u4E4B\u540E\u8BA1\u7B97\u6240\u5F97\u7684\u5747\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E',\r\n            'detail': '\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': '\u6392\u9664\u6BD4\u4F8B',\r\n            'detail': '\u8981\u4ECE\u6570\u636E\u96C6\u7684\u6781\u503C\u90E8\u5206\u6392\u9664\u7684\u6570\u636E\u5360\u6570\u636E\u96C6\u7684\u6BD4\u4F8B\u3002\\n\\n\u6392\u9664\u6BD4\u4F8B\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E0\u4E14\u5C0F\u4E8E1\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTILE_EXC',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u7EC4\u7684 K \u767E\u5206\u70B9\u503C\uFF0CK \u4ECB\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF0C\u4E0D\u542B 0 \u4E0E 1\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u7EC4\u7684 K \u767E\u5206\u70B9\u503C\uFF0CK \u4ECB\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF0C\u4E0D\u542B 0 \u4E0E 1\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u5B9A\u4E49\u76F8\u5BF9\u4F4D\u7F6E\u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'k',\r\n            'detail': '0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF0C\u4E0D\u5305\u542B 0 \u548C 1\u3002',\r\n            'example': '0.25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTILE_INC',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u7EC4\u7684 K \u767E\u5206\u70B9\u503C\uFF0CK \u4ECB\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF0C\u5305\u542B 0 \u4E0E 1\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u7EC4\u7684 K \u767E\u5206\u70B9\u503C\uFF0CK \u4ECB\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF0C\u5305\u542B 0 \u4E0E 1\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u5B9A\u4E49\u76F8\u5BF9\u4F4D\u7F6E\u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'k',\r\n            'detail': '0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF0C\u5305\u542B 0 \u548C 1\u3002',\r\n            'example': '0.25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PEARSON',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u76AE\u5C14\u751F(Pearson)\u4E58\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r\u3002',\r\n        'a': '\u8FD4\u56DE\u76AE\u5C14\u751F(Pearson)\u4E58\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_S_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6807\u51C6\u6B63\u6001\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002 \u8BE5\u5206\u5E03\u7684\u5E73\u5747\u503C\u4E3A 0\uFF0C\u6807\u51C6\u504F\u5DEE\u4E3A 1\u3002',\r\n        'a': '\u8FD4\u56DE\u6807\u51C6\u6B63\u6001\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002 \u8BE5\u5206\u5E03\u7684\u5E73\u5747\u503C\u4E3A 0\uFF0C\u6807\u51C6\u504F\u5DEE\u4E3A 1\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'probability',\r\n            'detail': '\u5BF9\u5E94\u4E8E\u6B63\u6001\u5206\u5E03\u7684\u6982\u7387\u3002',\r\n            'example': '0.75',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_S_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6807\u51C6\u6B63\u6001\u5206\u5E03\u51FD\u6570\uFF08\u8BE5\u5206\u5E03\u7684\u5E73\u5747\u503C\u4E3A 0\uFF0C\u6807\u51C6\u504F\u5DEE\u4E3A 1\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u6807\u51C6\u6B63\u6001\u5206\u5E03\u51FD\u6570\uFF08\u8BE5\u5206\u5E03\u7684\u5E73\u5747\u503C\u4E3A 0\uFF0C\u6807\u51C6\u504F\u5DEE\u4E3A 1\uFF09\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'z',\r\n            'detail': '\u9700\u8981\u8BA1\u7B97\u5176\u5206\u5E03\u7684\u6570\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\u7684\u6B63\u6001\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\u7684\u6B63\u6001\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'probability',\r\n            'detail': '\u5BF9\u5E94\u4E8E\u6B63\u6001\u5206\u5E03\u7684\u6982\u7387\u3002',\r\n            'example': '0.75',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': '\u5206\u5E03\u7684\u7B97\u672F\u5E73\u5747\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': '\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\u7684\u6B63\u6001\u5206\u5E03\u51FD\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\u7684\u6B63\u6001\u5206\u5E03\u51FD\u6570\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u9700\u8981\u8BA1\u7B97\u5176\u5206\u5E03\u7684\u6570\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': '\u5206\u5E03\u7684\u7B97\u672F\u5E73\u5747\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': '\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NEGBINOM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8D1F\u4E8C\u9879\u5F0F\u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u8D1F\u4E8C\u9879\u5F0F\u5206\u5E03\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'number_f',\r\n            'detail': '\u8981\u6A21\u62DF\u7684\u5931\u8D25\u6B21\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'number_s',\r\n            'detail': '\u8981\u6A21\u62DF\u7684\u6210\u529F\u6B21\u6570\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'probability_s',\r\n            'detail': '\u4EFB\u4E00\u6B21\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'MINA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5C0F\u6570\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5C0F\u6570\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u6700\u5C0F\u503C\u65F6\u6240\u7528\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u6700\u5C0F\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MIN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5C0F\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u6700\u5C0F\u503C\u65F6\u6240\u7528\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u6700\u5C0F\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MEDIAN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u4E2D\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u4E2D\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u503C\u65F6\u6240\u7528\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u4E2D\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MAXA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5927\u6570\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5927\u6570\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u6700\u5927\u503C\u65F6\u6240\u7528\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u6700\u5927\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MAX',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5927\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u6570\u636E\u96C6\u4E2D\u7684\u6700\u5927\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u8BA1\u7B97\u6700\u5927\u503C\u65F6\u6240\u7528\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2',\r\n            'detail': '[\u53EF\u9009] - \u5728\u8BA1\u7B97\u6700\u5927\u503C\u65F6\u8981\u8003\u8651\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOGNORM_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE x \u7684\u5BF9\u6570\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002',\r\n        'a': '\u8FD4\u56DE x \u7684\u5BF9\u6570\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u7684\u53CD\u51FD\u6570\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'probability',\r\n            'detail': '\u4E0E\u5BF9\u6570\u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\uFF0C\u4ECB\u4E8E 0 \u4E0E 1 \u4E4B\u95F4\uFF08\u4E0D\u542B 0 \u4E0E 1\uFF09\u3002',\r\n            'example': '0.4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': 'ln(x) \u7684\u5E73\u5747\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': 'ln(x) \u7684\u6807\u51C6\u504F\u5DEE\uFF0C\u6B63\u6570\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOGNORM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE x \u7684\u5BF9\u6570\u5206\u5E03\u51FD\u6570\u3002',\r\n        'a': '\u8FD4\u56DE x \u7684\u5BF9\u6570\u5206\u5E03\u51FD\u6570\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u7528\u6765\u8BA1\u7B97\u51FD\u6570\u7684\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': 'ln(x) \u7684\u5E73\u5747\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': 'ln(x) \u7684\u6807\u51C6\u504F\u5DEE\uFF0C\u6B63\u6570\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'Z_TEST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE z \u68C0\u9A8C\u7684\u5355\u5C3E P \u503C\u3002',\r\n        'a': '\u8FD4\u56DE z \u68C0\u9A8C\u7684\u5355\u5C3E P \u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u7528\u6765\u68C0\u9A8C x \u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'x',\r\n            'detail': '\u8981\u6D4B\u8BD5\u7684\u503C\u3002',\r\n            'example': 'B2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'sigma',\r\n            'detail': '[\u53EF\u9009] - \u603B\u4F53\uFF08\u5DF2\u77E5\uFF09\u6807\u51C6\u504F\u5DEE\u3002 \u5982\u679C\u7701\u7565\uFF0C\u5219\u4F7F\u7528\u6837\u672C\u6807\u51C6\u504F\u5DEE\u3002',\r\n            'example': '3',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PROB',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u533A\u57DF\u4E2D\u7684\u6570\u503C\u843D\u5728\u6307\u5B9A\u533A\u95F4\u5185\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u533A\u57DF\u4E2D\u7684\u6570\u503C\u843D\u5728\u6307\u5B9A\u533A\u95F4\u5185\u7684\u6982\u7387\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'x_range',\r\n            'detail': '\u5177\u6709\u5404\u81EA\u76F8\u5E94\u6982\u7387\u503C\u7684 x \u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'A3:A6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'prob_range',\r\n            'detail': '\u4E0E x_range \u4E2D\u7684\u503C\u76F8\u5173\u8054\u7684\u4E00\u7EC4\u6982\u7387\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'lower_limit',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u6982\u7387\u7684\u6570\u503C\u4E0B\u754C\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'upper_limit',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A\u4E0B\u754C] - \u8981\u8BA1\u7B97\u5176\u6982\u7387\u7684\u53EF\u9009\u6570\u503C\u4E0A\u754C\u3002\\n\\n\u5982\u679C\u7701\u7565\u4E0A\u754C\uFF0CPROB\u5219\u8BA1\u7B97\u968F\u673A\u9009\u53D6\u76F8\u5E94\u503C\u7684\u6B21\u6570\u6070\u597D\u7B49\u4E8E\u4E0B\u754C\u7684\u6982\u7387\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUARTILE_EXC',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF08\u4E0D\u5305\u62EC 0 \u548C 1\uFF09\u7684\u767E\u5206\u70B9\u503C\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u56DB\u5206\u4F4D\u6570\u3002',\r\n        'a': '\u57FA\u4E8E 0 \u5230 1 \u4E4B\u95F4\uFF08\u4E0D\u5305\u62EC 0 \u548C 1\uFF09\u7684\u767E\u5206\u70B9\u503C\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u56DB\u5206\u4F4D\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6570\u503C\u7684\u6570\u7EC4\u6216\u6570\u5B57\u578B\u5355\u5143\u683C\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'quart',\r\n            'detail': '\u8981\u8FD4\u56DE\u7B2C\u51E0\u4E2A\u56DB\u5206\u4F4D\u503C\u3002\\n\\n1\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u9760\u8FD1\u7B2C\u4E00\u4E2A\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0825%\u6807\u8BB0\uFF09\u3002\\n\\n2\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u63A5\u8FD1\u4E2D\u503C\u7684\u503C\uFF0850%\u6807\u8BB0\uFF09\u3002\\n\\n3\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u63A5\u8FD1\u7B2C\u4E09\u4E2A\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0875%\u6807\u8BB0\uFF09\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUARTILE_INC',\r\n        't': 1,\r\n        'd': '\u6839\u636E 0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF08\u5305\u542B 0 \u548C 1\uFF09\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u56DB\u5206\u4F4D\u6570\u3002',\r\n        'a': '\u6839\u636E 0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF08\u5305\u542B 0 \u548C 1\uFF09\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u56DB\u5206\u4F4D\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6570\u503C\u7684\u6570\u7EC4\u6216\u6570\u5B57\u578B\u5355\u5143\u683C\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'quart',\r\n            'detail': '\u8981\u8FD4\u56DE\u7B2C\u51E0\u4E2A\u56DB\u5206\u4F4D\u503C\u3002\\n\\n0\u8FD4\u56DE\u6570\u636E\u4E2D\u7684\u6700\u5C0F\u503C\uFF080%\u6807\u8BB0\uFF09\u3002\\n\\n1\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u9760\u8FD1\u7B2C\u4E00\u4E2A\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0825%\u6807\u8BB0\uFF09\u3002\\n\\n2\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u63A5\u8FD1\u4E2D\u503C\u7684\u503C\uFF0850%\u6807\u8BB0\uFF09\u3002\\n\\n3\u8FD4\u56DE\u6570\u636E\u4E2D\u6700\u63A5\u8FD1\u7B2C\u4E09\u4E2A\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0875%\u6807\u8BB0\uFF09\u3002\\n\\n4\u8FD4\u56DE\u6570\u636E\u4E2D\u7684\u6700\u5927\u503C\uFF08100%\u6807\u8BB0\uFF09\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'POISSON_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6CCA\u677E\u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u6CCA\u677E\u5206\u5E03\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u4E8B\u4EF6\u6570\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': '\u671F\u671B\u503C\u3002\u975E\u8D1F\u6570',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u4E00\u903B\u8F91\u503C\uFF0C\u786E\u5B9A\u6240\u8FD4\u56DE\u7684\u6982\u7387\u5206\u5E03\u7684\u5F62\u5F0F\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u8FD4\u56DE\u53D1\u751F\u7684\u968F\u673A\u4E8B\u4EF6\u6570\u5728\u96F6\uFF08\u542B\u96F6\uFF09\u548C x\uFF08\u542B x\uFF09\u4E4B\u95F4\u7684\u7D2F\u79EF\u6CCA\u677E\u6982\u7387\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u53D1\u751F\u7684\u4E8B\u4EF6\u6570\u6B63\u597D\u662F x \u7684\u6CCA\u677E\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RSQ',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u76AE\u5C14\u751F(Pearson)\u4E58\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r \u7684\u5E73\u65B9\u3002',\r\n        'a': '\u8FD4\u56DE\u76AE\u5C14\u751F(Pearson)\u4E58\u79EF\u77E9\u76F8\u5173\u7CFB\u6570 r \u7684\u5E73\u65B9\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B66\u751F\u7684\u5DE6\u5C3E t \u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u5B66\u751F\u7684\u5DE6\u5C3E t \u5206\u5E03\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': 'T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom',\r\n            'detail': '\u81EA\u7531\u5EA6\u6570\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'tails',\r\n            'detail': '\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\\n\\n\u5982\u679C cumulative \u4E3A TRUE()\uFF0C\u5219 HYPGEOM.DIST \u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\uFF1B\\n\\n\u5982\u679C\u4E3A FALSE()\uFF0C\u5219\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST_2T',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B66\u751F\u7684\u53CC\u5C3E t \u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u5B66\u751F\u7684\u53CC\u5C3E t \u5206\u5E03\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': 'T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom',\r\n            'detail': '\u81EA\u7531\u5EA6\u6570\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST_RT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B66\u751F\u7684\u53F3\u5C3E t \u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u5B66\u751F\u7684\u53F3\u5C3E t \u5206\u5E03\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': 'T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom',\r\n            'detail': '\u81EA\u7531\u5EA6\u6570\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B66\u751F\u7684 t \u5206\u5E03\u7684\u5DE6\u5C3E\u53CD\u51FD\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u5B66\u751F\u7684 t \u5206\u5E03\u7684\u5DE6\u5C3E\u53CD\u51FD\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'probability',\r\n            'detail': '\u4E0E\u5B66\u751F\u7684 t \u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\u3002\\n\\n\u5FC5\u987B\u5927\u4E8E 0 \u4E14\u5C0F\u4E8E 1\u3002',\r\n            'example': '0.35',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'deg_freedom',\r\n            'detail': '\u81EA\u7531\u5EA6\u6570\u503C\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u53C2\u6570\u4E0D\u662F\u6574\u6570\uFF0C\u5C06\u622A\u53D6\u5176\u6574\u6570\u90E8\u5206\u3002\\n\\n\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_INV_2T',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B66\u751F t \u5206\u5E03\u7684\u53CC\u5C3E\u53CD\u51FD\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u5B66\u751F t \u5206\u5E03\u7684\u53CC\u5C3E\u53CD\u51FD\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'probability',\r\n            'detail': '\u4E0E\u5B66\u751F\u7684 t \u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\u3002\\n\\n\u5FC5\u987B\u5927\u4E8E 0 \u4E14\u5C0F\u4E8E1\u3002',\r\n            'example': '0.35',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'deg_freedom',\r\n            'detail': '\u81EA\u7531\u5EA6\u6570\u503C\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u53C2\u6570\u4E0D\u662F\u6574\u6570\uFF0C\u5C06\u622A\u53D6\u5176\u6574\u6570\u90E8\u5206\u3002\\n\\n\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_TEST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u4E0Et-\u68C0\u9A8C\u76F8\u5173\u7684\u6982\u7387\u3002\u7528\u4E8E\u5224\u65AD\u4E24\u4E2A\u6837\u672C\u662F\u5426\u53EF\u80FD\u662F\u51FA\u81EA\u5E73\u5747\u503C\u76F8\u540C\u7684\u4E24\u4E2A\u6837\u672C\u603B\u4F53\u3002',\r\n        'a': '\u8FD4\u56DE\u4E0Et-\u68C0\u9A8C\u76F8\u5173\u7684\u6982\u7387\u3002\u7528\u4E8E\u5224\u65AD\u4E24\u4E2A\u6837\u672C\u662F\u5426\u53EF\u80FD\u662F\u51FA\u81EA\u5E73\u5747\u503C\u76F8\u540C\u7684\u4E24\u4E2A\u6837\u672C\u603B\u4F53\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'array1',\r\n            'detail': '\u5C06\u7528\u4E8E t \u68C0\u9A8C\u7684\u7B2C\u4E00\u4E2A\u6570\u636E\u6837\u672C\u6216\u7B2C\u4E00\u7EC4\u5355\u5143\u683C\u3002',\r\n            'example': 'A1:A4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array2',\r\n            'detail': '\u5C06\u7528\u4E8E t \u68C0\u9A8C\u7684\u7B2C\u4E8C\u4E2A\u6570\u636E\u6837\u672C\u6216\u7B2C\u4E8C\u7EC4\u5355\u5143\u683C\u3002',\r\n            'example': 'B1:B4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'tails',\r\n            'detail': '\u6307\u5B9A\u5206\u5E03\u7684\u5C3E\u6570\u3002\\n\\n\u5982\u679C\u4E3A 1\uFF1A\u4F7F\u7528\u5355\u5C3E\u5206\u5E03\u3002\\n\\n\u5982\u679C\u4E3A 2\uFF1A\u4F7F\u7528\u53CC\u5C3E\u5206\u5E03\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '\u6307\u5B9A t \u68C0\u9A8C\u7684\u7C7B\u578B\u3002\\n\\n\u5982\u679C\u4E3A 1\uFF1A\u6267\u884C\u914D\u5BF9\u68C0\u9A8C\u3002\\n\\n\u5982\u679C\u4E3A 2\uFF1A\u6267\u884C\u53CC\u6837\u672C\u7B49\u65B9\u5DEE\uFF08\u540C\u65B9\u5DEE\uFF09\u68C0\u9A8C\u3002\\n\\n\u5982\u679C\u4E3A3\uFF1A\u6267\u884C\u53CC\u6837\u672C\u4E0D\u7B49\u65B9\u5DEE\uFF08\u5F02\u65B9\u5DEE\uFF09\u68C0\u9A8C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'F_DIST',\r\n        't': 1,\r\n        'd': '\u7ED9\u5B9A\u8F93\u5165\u503C x\uFF0C\u8BA1\u7B97\u4E24\u4E2A\u6570\u636E\u96C6\u7684\u5DE6\u5C3E F \u6982\u7387\u5206\u5E03\uFF08\u5DEE\u5F02\u7A0B\u5EA6\uFF09\u3002\u6B64\u5206\u5E03\u4E5F\u79F0\u4E3A Fisher-Snedecor \u5206\u5E03\u6216 Snedecor F \u5206\u5E03\u3002',\r\n        'a': '\u7ED9\u5B9A\u8F93\u5165\u503C x',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u7528\u6765\u8BA1\u7B97\u51FD\u6570\u7684\u503C\u3002',\r\n            'example': '15.35',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom1',\r\n            'detail': '\u5206\u5B50\u81EA\u7531\u5EA6\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom2',\r\n            'detail': '\u5206\u6BCD\u81EA\u7531\u5EA6\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cumulative',\r\n            'detail': '\u7528\u4E8E\u786E\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\u3002\u9ED8\u8BA4\u503C\u4E3A FALSE\u3002\\n\\n\u5982\u679C\u4E3A TRUE()\uFF1AF.DIST \u5C06\u8FD4\u56DE\u7D2F\u79EF\u5206\u5E03\u51FD\u6570\u503C\u3002\\n\\n\u5982\u679C\u4E3A FALSE()\uFF1AF.DIST \u5C06\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6570\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'F_DIST_RT',\r\n        't': 1,\r\n        'd': '\u7ED9\u5B9A\u8F93\u5165x\uFF0C\u8BA1\u7B97\u4E24\u4E2A\u6570\u636E\u96C6\u7684\u53F3\u5C3EF\u6982\u7387\u5206\u5E03\uFF08\u5DEE\u5F02\u7A0B\u5EA6\uFF09\u3002 \u6B64\u5206\u5E03\u4E5F\u79F0\u4E3AFisher-Snedecor\u5206\u5E03\u6216Snedecor F\u5206\u5E03\u3002',\r\n        'a': '\u7ED9\u5B9A\u8F93\u5165x',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u7528\u6765\u8BA1\u7B97\u51FD\u6570\u7684\u503C\u3002',\r\n            'example': '15.35',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom1',\r\n            'detail': '\u5206\u5B50\u81EA\u7531\u5EA6\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'degrees_freedom2',\r\n            'detail': '\u5206\u6BCD\u81EA\u7531\u5EA6\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VAR_P',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u65B9\u5DEE\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u65B9\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6570\u636E\u96C6\u4E2D\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, \u2026',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VAR_S',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, \u2026',\r\n            'detail': '[\u53EF\u9009] - \u6837\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VARA',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE\uFF0C\u5C06\u6587\u672C\u53D6\u503C\u4E3A0\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6837\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VARPA',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u65B9\u5DEE\uFF0C\u5C06\u6587\u672C\u53D6\u503C\u4E3A0\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u65B9\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6837\u672C\u4E2D\u7684\u7B2C\u4E00\u9879\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STEYX',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u901A\u8FC7\u7EBF\u6027\u56DE\u5F52\u6CD5\u9884\u6D4B\u6BCF\u4E2A x \u7684 y \u503C\u65F6\u6240\u4EA7\u751F\u7684\u6807\u51C6\u8BEF\u5DEE\u3002',\r\n        'a': '\u8FD4\u56DE\u901A\u8FC7\u7EBF\u6027\u56DE\u5F52\u6CD5\u9884\u6D4B\u6BCF\u4E2A x \u7684 y \u503C\u65F6\u6240\u4EA7\u751F\u7684\u6807\u51C6\u8BEF\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STANDARDIZE',\r\n        't': 1,\r\n        'd': '\u7ED9\u5B9A\u5206\u5E03\u7684\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\uFF0C\u8BA1\u7B97\u4E00\u4E2A\u968F\u673A\u53D8\u91CF\u6B63\u6001\u5316\u7684\u76F8\u5E94\u503C\u3002',\r\n        'a': '\u7ED9\u5B9A\u5206\u5E03\u7684\u5747\u503C\u548C\u6807\u51C6\u504F\u5DEE\uFF0C\u8BA1\u7B97\u4E00\u4E2A\u968F\u673A\u53D8\u91CF\u6B63\u6001\u5316\u7684\u76F8\u5E94\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'x',\r\n            'detail': '\u8981\u6B63\u6001\u5316\u7684\u968F\u673A\u53D8\u91CF\u503C\u3002',\r\n            'example': '96',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'mean',\r\n            'detail': '\u5206\u5E03\u7684\u5747\u503C\u3002',\r\n            'example': '80',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'standard_dev',\r\n            'detail': '\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\u3002',\r\n            'example': '6.7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SMALL',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u7B2C k \u4E2A\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u636E\u96C6\u4E2D\u7684\u7B2C k \u4E2A\u6700\u5C0F\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u9700\u8981\u627E\u5230\u7B2C k \u4E2A\u6700\u5C0F\u503C\u7684\u6570\u7EC4\u6216\u6570\u503C\u6570\u636E\u533A\u57DF\u3002',\r\n            'example': 'A2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'k',\r\n            'detail': '\u8981\u8FD4\u56DE\u7684\u6570\u636E\u5728\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\u91CC\u7684\u4F4D\u7F6E\uFF08\u4ECE\u5C0F\u5230\u5927\uFF09\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SLOPE',\r\n        't': 1,\r\n        'd': '\u8BA1\u7B97\u901A\u8FC7\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52\u5F97\u5230\u7684\u76F4\u7EBF\u7684\u659C\u7387\u3002',\r\n        'a': '\u8BA1\u7B97\u901A\u8FC7\u6570\u636E\u96C6\u7684\u7EBF\u6027\u56DE\u5F52\u5F97\u5230\u7684\u76F4\u7EBF\u7684\u659C\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': '\u6570\u636E_y',\r\n            'detail': '\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u6570\u636E_x',\r\n            'detail': '\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SKEW',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5206\u5E03\u7684\u504F\u659C\u5EA6\u3002 \u504F\u659C\u5EA6\u8868\u660E\u5206\u5E03\u76F8\u5BF9\u4E8E\u5E73\u5747\u503C\u7684\u4E0D\u5BF9\u79F0\u7A0B\u5EA6\u3002 \u6B63\u504F\u659C\u5EA6\u8868\u660E\u5206\u5E03\u7684\u4E0D\u5BF9\u79F0\u5C3E\u90E8\u8D8B\u5411\u4E8E\u66F4\u591A\u6B63\u503C\u3002 \u8D1F\u504F\u659C\u5EA6\u8868\u660E\u5206\u5E03\u7684\u4E0D\u5BF9\u79F0\u5C3E\u90E8\u8D8B\u5411\u4E8E\u66F4\u591A\u8D1F\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5206\u5E03\u7684\u504F\u659C\u5EA6\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6570\u636E\u96C6\u4E2D\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'SKEW_P',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u7684\u5206\u5E03\u4E0D\u5BF9\u79F0\u5EA6\uFF1A\u8868\u660E\u5206\u5E03\u76F8\u5BF9\u4E8E\u5E73\u5747\u503C\u7684\u4E0D\u5BF9\u79F0\u7A0B\u5EA6\u3002',\r\n        'a': '\u8FD4\u56DE\u57FA\u4E8E\u6837\u672C\u603B\u4F53\u7684\u5206\u5E03\u4E0D\u5BF9\u79F0\u5EA6\uFF1A\u8868\u660E\u5206\u5E03\u76F8\u5BF9\u4E8E\u5E73\u5747\u503C\u7684\u4E0D\u5BF9\u79F0\u7A0B\u5EA6\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': '\u503C1',\r\n            'detail': '\u6570\u636E\u96C6\u4E2D\u7684\u7B2C\u4E00\u4E2A\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u503C2, ...',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u8303\u56F4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'VLOOKUP',\r\n        't': 2,\r\n        'd': '\u7EB5\u5411\u67E5\u627E\u3002\u5728\u8303\u56F4\u7684\u7B2C\u4E00\u5217\u4E2D\u81EA\u4E0A\u800C\u4E0B\u641C\u7D22\u67D0\u4E2A\u952E\u503C\uFF0C\u5E76\u8FD4\u56DE\u6240\u627E\u5230\u7684\u884C\u4E2D\u6307\u5B9A\u5355\u5143\u683C\u7684\u503C\u3002',\r\n        'a': '\u7EB5\u5411\u67E5\u627E\u3002\u5728\u8303\u56F4\u7684\u7B2C\u4E00\u5217\u4E2D\u81EA\u4E0A\u800C\u4E0B\u641C\u7D22\u67D0\u4E2A\u952E\u503C',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': '\u641C\u7D22\u952E\u503C',\r\n            'detail': '\u8981\u641C\u7D22\u7684\u503C\uFF0C\u5982 42\u3001\"Cats\" \u6216 I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u8303\u56F4',\r\n            'detail': '\u8981\u8FDB\u884C\u641C\u7D22\u7684\u8303\u56F4\u3002VLOOKUP \u5C06\u5728\u8BE5\u8303\u56F4\u7684\u7B2C\u4E00\u5217\u4E2D\u641C\u7D22\u641C\u7D22\u952E\u503C\u4E2D\u6307\u5B9A\u7684\u952E\u503C\u3002',\r\n            'example': 'A2:B26',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u7D22\u5F15',\r\n            'detail': '\u8981\u8FD4\u56DE\u7684\u503C\u7684\u5217\u7D22\u5F15\uFF0C\u8303\u56F4\u4E2D\u7684\u7B2C\u4E00\u5217\u7F16\u53F7\u4E3A 1\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u4E0D\u662F\u4ECB\u4E8E 1 \u548C\u8303\u56F4\u4E2D\u7684\u5217\u6570\u4E4B\u95F4\uFF0C\u5C06\u8FD4\u56DE #VALUE! \u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u5DF2\u6392\u5E8F',\r\n            'detail': '[\u9ED8\u8BA4\u503C\u4E3A TRUE() ] - \u6307\u793A\u8981\u641C\u7D22\u7684\u5217\uFF08\u6307\u5B9A\u8303\u56F4\u7684\u7B2C\u4E00\u5217\uFF09\u662F\u5426\u5DF2\u6392\u5E8F\u3002\u5927\u591A\u6570\u60C5\u51B5\u4E0B\uFF0C\u5EFA\u8BAE\u8BBE\u4E3A FALSE()\u3002\\n\\n\u5EFA\u8BAE\u5C06\u5DF2\u6392\u5E8F\u8BBE\u4E3A FALSE\u3002\u5982\u679C\u8BBE\u4E3A FALSE\uFF0C\u5C06\u8FD4\u56DE\u5B8C\u5168\u5339\u914D\u9879\u3002\u5982\u679C\u5B58\u5728\u591A\u4E2A\u5339\u914D\u503C\uFF0C\u5C06\u8FD4\u56DE\u627E\u5230\u7684\u7B2C\u4E00\u4E2A\u503C\u5BF9\u5E94\u7684\u5355\u5143\u683C\u7684\u5185\u5BB9\uFF0C\u5982\u679C\u627E\u4E0D\u5230\u5339\u914D\u503C\uFF0C\u5219\u8FD4\u56DE #N/A\u3002\\n\\n\u5982\u679C\u5C06\u5DF2\u6392\u5E8F\u8BBE\u4E3A TRUE \u6216\u7701\u7565\uFF0C\u5C06\u8FD4\u56DE\uFF08\u5C0F\u4E8E\u6216\u7B49\u4E8E\u641C\u7D22\u952E\u503C\u7684\uFF09\u6700\u63A5\u8FD1\u7684\u5339\u914D\u9879\u3002\u5982\u679C\u641C\u7D22\u7684\u5217\u4E2D\u6240\u6709\u7684\u503C\u5747\u5927\u4E8E\u641C\u7D22\u952E\u503C\uFF0C\u5219\u8FD4\u56DE #N/A\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HLOOKUP',\r\n        't': 2,\r\n        'd': '\u6A2A\u5411\u67E5\u627E\u3002\u5728\u8303\u56F4\u7684\u7B2C\u4E00\u884C\u4E2D\u641C\u7D22\u67D0\u4E2A\u952E\u503C\uFF0C\u5E76\u8FD4\u56DE\u6240\u627E\u5230\u7684\u5217\u4E2D\u6307\u5B9A\u5355\u5143\u683C\u7684\u503C\u3002',\r\n        'a': '\u6A2A\u5411\u67E5\u627E\u3002\u5728\u8303\u56F4\u7684\u7B2C\u4E00\u884C\u4E2D\u641C\u7D22\u67D0\u4E2A\u952E\u503C',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': '\u641C\u7D22\u952E\u503C',\r\n            'detail': '\u8981\u641C\u7D22\u7684\u503C\u3002\u4F8B\u5982\uFF0C42\u3001\"Cats\"\u6216I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u8303\u56F4',\r\n            'detail': '\u8981\u8FDB\u884C\u641C\u7D22\u7684\u8303\u56F4\u3002\u5C06\u5728\u8BE5\u8303\u56F4\u7684\u7B2C\u4E00\u884C\u4E2D\u641C\u7D22\u5728\u641C\u7D22\u952E\u503C\u4E2D\u6307\u5B9A\u7684\u952E\u503C\u3002',\r\n            'example': 'A2:Z6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u7D22\u5F15',\r\n            'detail': '\u8981\u8FD4\u56DE\u7684\u503C\u7684\u884C\u7D22\u5F15\uFF0C\u8303\u56F4\u4E2D\u7684\u7B2C\u4E00\u884C\u7F16\u53F7\u4E3A1\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u4E0D\u662F\u4ECB\u4E8E1\u548C\u8303\u56F4\u4E2D\u7684\u884C\u6570\u4E4B\u95F4\uFF0C\u5C06\u8FD4\u56DE#VALUE!\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u5DF2\u6392\u5E8F',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u6307\u793A\u8981\u641C\u7D22\u7684\u884C\uFF08\u6307\u5B9A\u8303\u56F4\u7684\u7B2C\u4E00\u884C\uFF09\u662F\u5426\u5DF2\u6392\u5E8F\u3002\\n\\n\u5982\u679C\u5C06\u5DF2\u6392\u5E8F\u8BBE\u4E3ATRUE\u6216\u7701\u7565\uFF0C\u5C06\u8FD4\u56DE\u6700\u63A5\u8FD1\u7684\u5339\u914D\u503C\uFF08\u5C0F\u4E8E\u6216\u7B49\u4E8E\u641C\u7D22\u952E\u503C\uFF09\u3002\u5982\u679C\u5728\u641C\u7D22\u7684\u884C\u4E2D\u6240\u6709\u7684\u503C\u5747\u5927\u4E8E\u641C\u7D22\u952E\u503C\uFF0C\u5219\u8FD4\u56DE#N/A\u3002\\n\\n\u5982\u679C\u5C06\u5DF2\u6392\u5E8F\u8BBE\u4E3ATRUE\u6216\u5C06\u5176\u7701\u7565\uFF0C\u800C\u8303\u56F4\u7684\u9996\u884C\u5E76\u975E\u5904\u4E8E\u5DF2\u6392\u5E8F\u72B6\u6001\uFF0C\u5219\u8FD4\u56DE\u503C\u53EF\u80FD\u4F1A\u662F\u9519\u8BEF\u7684\u3002\\n\\n\u5982\u679C\u5C06\u5DF2\u6392\u5E8F\u8BBE\u4E3AFALSE\uFF0C\u5219\u4EC5\u8FD4\u56DE\u5B8C\u5168\u5339\u914D\u3002\u5982\u679C\u5B58\u5728\u591A\u4E2A\u5339\u914D\u503C\uFF0C\u5C06\u8FD4\u56DE\u4E0E\u627E\u5230\u7684\u7B2C\u4E00\u4E2A\u503C\u5BF9\u5E94\u7684\u5355\u5143\u683C\u7684\u5185\u5BB9\uFF0C\u5982\u679C\u627E\u4E0D\u5230\u5339\u914D\u503C\u5219\u8FD4\u56DE#N/A\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LOOKUP',\r\n        't': 2,\r\n        'd': '\u5728\u884C\u6216\u5217\u4E2D\u67E5\u627E\u76F8\u5E94\u952E\uFF0C\u5E76\u5C06\u76F8\u5E94\u5355\u5143\u683C\u7684\u503C\u8FD4\u56DE\u5230\u4E0E\u641C\u7D22\u884C\u6216\u5217\u6240\u5728\u4F4D\u7F6E\u76F8\u540C\u7684\u7ED3\u679C\u8303\u56F4\u4E2D\u3002',\r\n        'a': '\u5728\u884C\u6216\u5217\u4E2D\u67E5\u627E\u76F8\u5E94\u952E',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': '\u641C\u7D22\u952E\u503C',\r\n            'detail': '\u8981\u5728\u884C\u6216\u5217\u4E2D\u641C\u7D22\u7684\u503C\u3002\u4F8B\u5982\uFF0C42\u3001\"Cats\" \u6216 I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u641C\u7D22\u8303\u56F4 | \u641C\u7D22\u7ED3\u679C\u6570\u7EC4',\r\n            'detail': '\u4F7F\u7528 LOOKUP \u7684\u4E00\u79CD\u65B9\u6CD5\u662F\u7ED9\u5B9A\u5355\u884C\u6216\u5355\u5217\u5F62\u5F0F\u7684\u641C\u7D22\u8303\u56F4\u8FDB\u884C\u641C\u7D22\u67E5\u627E\uFF0C\u8FD9\u79CD\u65B9\u5F0F\u8981\u7528\u5230\u53E6\u4E00\u4E2A\u53C2\u6570\u7ED3\u679C\u8303\u56F4\u3002\u53E6\u4E00\u79CD\u65B9\u5F0F\u662F\u5C06\u8FD9\u4E24\u4E2A\u53C2\u6570\u5408\u5E76\u4E3A\u4E00\u4E2A\u641C\u7D22\u7ED3\u679C\u6570\u7EC4\uFF0C\u5176\u4E2D\u7B2C\u4E00\u884C\u6216\u7B2C\u4E00\u5217\u7528\u4E8E\u641C\u7D22\uFF0C\u5E76\u5C06\u8FD4\u56DE\u503C\u653E\u5728\u8BE5\u6570\u7EC4\u7684\u6700\u540E\u4E00\u884C\u6216\u6700\u540E\u4E00\u5217\u4E2D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u7ED3\u679C\u8303\u56F4',\r\n            'detail': '[ \u53EF\u9009 ] - \u7528\u4E8E\u5B58\u653E\u8FD4\u56DE\u7ED3\u679C\u7684\u8303\u56F4\u3002\u8FD4\u56DE\u503C\u5BF9\u5E94\u4E8E\u5728\u641C\u7D22\u8303\u56F4\u4E2D\u627E\u5230\u641C\u7D22\u952E\u503C\u7684\u4F4D\u7F6E\u3002\u6B64\u8303\u56F4\u5FC5\u987B\u4EC5\u4E3A\u5355\u884C\u6216\u5355\u5217\uFF0C\u800C\u5982\u679C\u60A8\u4F7F\u7528\u7684\u662F\u641C\u7D22\u7ED3\u679C\u6570\u7EC4\u65B9\u5F0F\uFF0C\u5219\u4E0D\u5E94\u63D0\u4F9B\u6B64\u53C2\u6570\u3002',\r\n            'example': 'B1:B100',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ADDRESS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5F62\u5F0F\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5F62\u5F0F\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'm': [2, 5],\r\n        'p': [{\r\n            'name': 'row_num',\r\n            'detail': '\u4E00\u4E2A\u6570\u503C\uFF0C\u6307\u5B9A\u8981\u5728\u5355\u5143\u683C\u5F15\u7528\u4E2D\u4F7F\u7528\u7684\u884C\u53F7\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'column_num',\r\n            'detail': '\u4E00\u4E2A\u6570\u503C\uFF0C\u6307\u5B9A\u8981\u5728\u5355\u5143\u683C\u5F15\u7528\u4E2D\u4F7F\u7528\u7684\u5217\u53F7\uFF08\u800C\u975E\u540D\u79F0\uFF09\u3002A\u5217\u7684\u7F16\u53F7\u4E3A1\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'abs_num',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u4E00\u4E2A\u6570\u503C\uFF0C\u6307\u5B9A\u8981\u8FD4\u56DE\u7684\u5F15\u7528\u7C7B\u578B\u3002\\n\\n1 \u8868\u793A\u884C\u5217\u5747\u91C7\u7528\u7EDD\u5BF9\u503C\uFF08\u4F8B\u5982$A$1\uFF09\uFF1B\\n\\n2 \u8868\u793A\u91C7\u7528\u7EDD\u5BF9\u884C\u53F7\uFF0C\u76F8\u5BF9\u5217\u6807\uFF08\u4F8B\u5982A$1\uFF09\uFF1B\\n\\n3 \u8868\u793A\u91C7\u7528\u76F8\u5BF9\u884C\u53F7\uFF0C\u7EDD\u5BF9\u5217\u6807\uFF08\u4F8B\u5982$A1\uFF09\uFF1B\\n\\n4 \u8868\u793A\u884C\u5217\u5747\u91C7\u7528\u76F8\u5BF9\u503C\uFF08\u4F8B\u5982A1\uFF09\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'A1',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u4E00\u4E2A\u5E03\u5C14\u503C\uFF0C\u6307\u793A\u91C7\u7528A1\u6807\u8BB0\u5F62\u5F0F(TRUE)\u8FD8\u662FR1C1\u6807\u8BB0\u5F62\u5F0F(FALSE)\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'sheet_text',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u7F3A\u7701] - \u7528\u4E8E\u6307\u5B9A\u5730\u5740\u6240\u6307\u5411\u7684\u5DE5\u4F5C\u8868\u540D\u79F0\u3002',\r\n            'example': '\"Sheet2\"',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'INDIRECT',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u4EE5\u5B57\u7B26\u4E32\u6307\u5B9A\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5\u5B57\u7B26\u4E32\u6307\u5B9A\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'ref_text',\r\n            'detail': '\u4EE5\u5E26\u5F15\u53F7\u7684\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n            'example': '\"Sheet2!\"&B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'A1',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u4E00\u4E2A\u5E03\u5C14\u503C\uFF0C\u6307\u793A\u91C7\u7528A1\u6807\u8BB0\u5F62\u5F0F(TRUE)\u8FD8\u662FR1C1\u6807\u8BB0\u5F62\u5F0F(FALSE)\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ROW',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5355\u5143\u683C\u7684\u884C\u53F7',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5355\u5143\u683C\u7684\u884C\u53F7',\r\n        'm': [0, 1],\r\n        'p': [{\r\n            'name': 'reference',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u6B64\u516C\u5F0F\u6240\u5728\u7684\u5355\u5143\u683C] - \u8981\u8FD4\u56DE\u5176\u884C\u53F7\u7684\u5355\u5143\u683C\u3002\\n\\n\u5982\u679C\u5355\u5143\u683C\u5F15\u7528\u6307\u5411\u7684\u8303\u56F4\u5176\u5BBD\u5EA6\u5927\u4E8E\u4E00\u4E2A\u5355\u5143\u683C\uFF0C\u800C\u6B64\u516C\u5F0F\u4E0D\u662F\u7528\u4F5C\u6570\u7EC4\u516C\u5F0F\u7684\uFF0C\u8FD9\u65F6\u4F1A\u4EC5\u8FD4\u56DE\u5355\u5143\u683C\u5F15\u7528\u4E2D\u9996\u884C\u7684\u7F16\u53F7\u503C\u3002',\r\n            'example': 'A9',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ROWS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u884C\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u884C\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u884C\u6570\u7684\u8303\u56F4\u3002',\r\n            'example': 'A9:A62',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COLUMN',\r\n        't': 2,\r\n        'd': '\u6309\u7167 `A=1` \u7684\u89C4\u5219\u8FD4\u56DE\u6307\u5B9A\u5355\u5143\u683C\u7684\u5217\u53F7\u3002',\r\n        'a': '\u6309\u7167 `A=1` \u7684\u89C4\u5219\u8FD4\u56DE\u6307\u5B9A\u5355\u5143\u683C\u7684\u5217\u53F7\u3002',\r\n        'm': [0, 1],\r\n        'p': [{\r\n            'name': 'reference',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u5305\u542B\u6B64\u516C\u5F0F\u7684\u5355\u5143\u683C] - \u8981\u8FD4\u56DE\u5176\u5217\u53F7\u7684\u5355\u5143\u683C\u3002A\u5217\u5BF9\u5E94\u7684\u7F16\u53F7\u4E3A1\u3002\\n\\n\u5982\u679C\u5355\u5143\u683C\u5F15\u7528\u662F\u5BBD\u5EA6\u8D85\u8FC7\u4E00\u4E2A\u5355\u5143\u683C\u7684\u8303\u56F4\uFF0C\u800C\u6B64\u516C\u5F0F\u4E0D\u662F\u4F5C\u4E3A\u6570\u7EC4\u516C\u5F0F\u6765\u4F7F\u7528\u7684\uFF0C\u56E0\u6B64\u5C06\u8FD4\u56DE\u5355\u5143\u683C\u5F15\u7528\u4E2D\u7684\u7B2C\u4E00\u5217\u7684\u4F4D\u7F6E\u3002',\r\n            'example': 'A9',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COLUMNS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u5217\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u5217\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u5217\u6570\u7684\u8303\u56F4\u3002',\r\n            'example': 'A9:W62',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OFFSET',\r\n        't': 2,\r\n        'd': '\u7ED9\u5B9A\u67D0\u8303\u56F4\u7684\u8D77\u59CB\u5355\u5143\u683C\u5F15\u7528\u4EE5\u53CA\u8BE5\u8303\u56F4\u6DB5\u76D6\u7684\u884C\u5217\u6570\u91CF\uFF0C\u8FD4\u56DE\u8BE5\u8303\u56F4\u7684\u5F15\u7528\u3002',\r\n        'a': '\u7ED9\u5B9A\u67D0\u8303\u56F4\u7684\u8D77\u59CB\u5355\u5143\u683C\u5F15\u7528\u4EE5\u53CA\u8BE5\u8303\u56F4\u6DB5\u76D6\u7684\u884C\u5217\u6570\u91CF\uFF0C\u8FD4\u56DE\u8BE5\u8303\u56F4\u7684\u5F15\u7528\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name': 'reference',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u884C\u5217\u504F\u79FB\u91CF\u7684\u8D77\u70B9\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'rows',\r\n            'detail': '\u8981\u504F\u79FB\u7684\u884C\u6570\u3002\\n\\n\u884C\u504F\u79FB\u91CF\u5FC5\u987B\u662F\u6574\u6570\uFF0C\u4F46\u4E5F\u53EF\u4EE5\u662F\u8D1F\u6570\u3002\u5982\u679C\u63D0\u4F9B\u7684\u53C2\u6570\u5E26\u6709\u5C0F\u6570\uFF0C\u5C0F\u6570\u90E8\u5206\u5C06\u88AB\u622A\u53BB\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cols',\r\n            'detail': '\u8981\u504F\u79FB\u7684\u5217\u6570\u3002\\n\\n\u5217\u504F\u79FB\u91CF\u5FC5\u987B\u662F\u6574\u6570\uFF0C\u4F46\u4E5F\u53EF\u4EE5\u662F\u8D1F\u6570\u3002\u5982\u679C\u63D0\u4F9B\u7684\u53C2\u6570\u5E26\u6709\u5C0F\u6570\uFF0C\u5C0F\u6570\u90E8\u5206\u5C06\u88AB\u622A\u53BB\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'height',\r\n            'detail': '[\u53EF\u9009] - \u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u9AD8\u5EA6\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'width',\r\n            'detail': '[\u53EF\u9009] - \u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u5BBD\u5EA6\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MATCH',\r\n        't': 2,\r\n        'd': '\u5728\u5355\u5143\u683C\u4E2D\u641C\u7D22\u6307\u5B9A\u9879\uFF0C\u7136\u540E\u8FD4\u56DE\u8BE5\u9879\u5728\u5355\u5143\u683C\u533A\u57DF\u4E2D\u7684\u76F8\u5BF9\u4F4D\u7F6E\u3002',\r\n        'a': '\u5728\u5355\u5143\u683C\u4E2D\u641C\u7D22\u6307\u5B9A\u9879\uFF0C\u7136\u540E\u8FD4\u56DE\u8BE5\u9879\u5728\u5355\u5143\u683C\u533A\u57DF\u4E2D\u7684\u76F8\u5BF9\u4F4D\u7F6E\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'lookup_value',\r\n            'detail': '\u8981\u5728 lookup_array \u4E2D\u5339\u914D\u7684\u503C\u3002',\r\n            'example': '\"Sunday\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'lookup_array',\r\n            'detail': '\u8981\u641C\u7D22\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\\n\\n\u5982\u679C\u6240\u7528\u7684\u8303\u56F4\u7684\u9AD8\u5EA6\u548C\u5BBD\u5EA6\u5747\u5927\u4E8E1\uFF0CMATCH\u5C06\u8FD4\u56DE#N/A!\u3002',\r\n            'example': 'A2:A9',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'match_type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u8981\u91C7\u7528\u7684\u641C\u7D22\u65B9\u5F0F\u3002\\n\\n1\u4E3A\u9ED8\u8BA4\u7C7B\u578B\uFF0C\u6B64\u65F6MATCH\u4F1A\u5047\u8BBE\u8303\u56F4\u5DF2\u6309\u5347\u5E8F\u6392\u5E8F\uFF0C\u5E76\u8FD4\u56DE\u5C0F\u4E8E\u7B49\u4E8E\u641C\u7D22\u952E\u503C\u7684\u6700\u5927\u503C\u3002\\n\\n0\u8868\u793A\u5B8C\u5168\u5339\u914D\uFF0C\u5728\u8303\u56F4\u672A\u6392\u5E8F\u7684\u60C5\u51B5\u4E0B\u9700\u8981\u4F7F\u7528\u6B64\u65B9\u5F0F\u3002\\n\\n-1\u8BA9MATCH\u5047\u8BBE\u8303\u56F4\u662F\u6309\u964D\u5E8F\u6392\u5E8F\u7684\uFF0C\u5E76\u8FD4\u56DE\u5927\u4E8E\u7B49\u4E8E\u641C\u7D22\u952E\u503C\u7684\u6700\u5C0F\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INDEX',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u8868\u683C\u6216\u4E2D\u7684\u5143\u7D20\u503C\uFF0C\u6B64\u5143\u7D20\u7531\u884C\u53F7\u548C\u5217\u53F7\u7684\u7D22\u5F15\u503C\u7ED9\u5B9A\u3002',\r\n        'a': '\u8FD4\u56DE\u8868\u683C\u6216\u4E2D\u7684\u5143\u7D20\u503C\uFF0C\u6B64\u5143\u7D20\u7531\u884C\u53F7\u548C\u5217\u53F7\u7684\u7D22\u5F15\u503C\u7ED9\u5B9A\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u5355\u5143\u683C\u533A\u57DF\u6216\u6570\u7EC4\u5E38\u91CF\u3002',\r\n            'example': 'A1:C20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'row_num',\r\n            'detail': '\u9009\u62E9\u6570\u7EC4\u4E2D\u7684\u67D0\u884C\uFF0C\u51FD\u6570\u4ECE\u8BE5\u884C\u8FD4\u56DE\u6570\u503C\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'column_num',\r\n            'detail': '\u9009\u62E9\u6570\u7EC4\u4E2D\u7684\u67D0\u5217\uFF0C\u51FD\u6570\u4ECE\u8BE5\u5217\u8FD4\u56DE\u6570\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GETPIVOTDATA',\r\n        't': 2,\r\n        'd': '\u4ECE\u4E0E\u6307\u5B9A\u884C\u548C\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6570\u636E\u900F\u89C6\u8868\u4E2D\u63D0\u53D6\u6C47\u603B\u503C\u3002',\r\n        'a': '\u4ECE\u4E0E\u6307\u5B9A\u884C\u548C\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6570\u636E\u900F\u89C6\u8868\u4E2D\u63D0\u53D6\u6C47\u603B\u503C\u3002',\r\n        'm': [2, 254],\r\n        'p': [{\r\n            'name': 'data_field',\r\n            'detail': '\u60A8\u60F3\u4ECE\u6570\u636E\u900F\u89C6\u8868\u4E2D\u83B7\u53D6\u5176\u6570\u636E\u7684\u503C\u540D\u79F0\u3002\\n\u503C\u540D\u79F0\u5FC5\u987B\u62EC\u5728\u5F15\u53F7\u4E2D\u6216\u662F\u6307\u5411\u5305\u542B\u76F8\u5173\u6587\u672C\u7684\u4EFB\u4F55\u5355\u5143\u683C\u7684\u5F15\u7528\u3002\\n\u5982\u679C\u6709\u591A\u4E2A\u503C\u5B57\u6BB5\uFF0C\u5219\u5FC5\u987B\u4F7F\u7528\u6570\u636E\u900F\u89C6\u8868\u4E2D\u663E\u793A\u7684\u786E\u5207\u540D\u79F0\uFF08\u5982\u201C\u9500\u552E\u603B\u989D\u201D\uFF09\u3002',\r\n            'example': '\"SUM of number of units\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'pivot_table',\r\n            'detail': '\u76EE\u6807\u6570\u636E\u900F\u89C6\u8868\u4E2D\u7684\u4EFB\u4F55\u5355\u5143\u683C\u7684\u5F15\u7528\uFF08\u63A8\u8350\u4F4D\u4E8E\u9876\u89D2\u7684\u5355\u5143\u683C\uFF09\u3002',\r\n            'example': \"'Pivot table'!A1\",\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'field1',\r\n            'detail': '[\u53EF\u9009] - \u6E90\u6570\u636E\u96C6\uFF08\u4E0D\u662F\u6570\u636E\u900F\u89C6\u8868\uFF09\u4E2D\u5217\u7684\u540D\u79F0\u3002',\r\n            'example': '\"division\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'item1',\r\n            'detail': '[\u53EF\u9009] - \u6570\u636E\u900F\u89C6\u8868\u4E2D\u663E\u793A\u7684\u4E0E\u60A8\u8981\u68C0\u7D22\u7684\u5B57\u6BB5\u540D\u79F0 1 \u76F8\u5BF9\u5E94\u7684\u884C\u6216\u5217\u7684\u540D\u79F0\u3002',\r\n            'example': '\"east\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CHOOSE',\r\n        't': 2,\r\n        'd': '\u57FA\u4E8E\u7D22\u5F15\u8FD4\u56DE\u9009\u9879\u5217\u8868\u4E2D\u7684\u5143\u7D20\u3002',\r\n        'a': '\u57FA\u4E8E\u7D22\u5F15\u8FD4\u56DE\u9009\u9879\u5217\u8868\u4E2D\u7684\u5143\u7D20\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name': 'index_num',\r\n            'detail': '\u6307\u5B9A\u8981\u8FD4\u56DE\u54EA\u4E00\u9879\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u4E3A\u96F6\u3001\u8D1F\u503C\u6216\u5927\u4E8E\u63D0\u4F9B\u7684\u9009\u62E9\u6570\u91CF\uFF0C\u5C06\u8FD4\u56DE#VALUE!\u9519\u8BEF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value1',\r\n            'detail': '\u4E00\u9879\u53EF\u80FD\u7684\u8FD4\u56DE\u503C\u3002\u5FC5\u987B\u63D0\u4F9B\u3002\u53EF\u4EE5\u662F\u5355\u5143\u683C\u5F15\u7528\u6216\u5355\u72EC\u7684\u503C\u3002',\r\n            'example': '\"A\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '[\u53EF\u9009] - \u5176\u4ED6\u53EF\u4EE5\u9009\u62E9\u7684\u503C\u3002\u9009\u62E9',\r\n            'example': '\"B\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HYPERLINK',\r\n        't': 2,\r\n        'd': '\u5728\u5355\u5143\u683C\u5185\u521B\u5EFA\u4E00\u4E2A\u8D85\u94FE\u63A5\u3002',\r\n        'a': '\u5728\u5355\u5143\u683C\u5185\u521B\u5EFA\u4E00\u4E2A\u8D85\u94FE\u63A5\u3002',\r\n        'p': [{\r\n            'name': '\u7F51\u5740',\r\n            'detail': '\u4EE5\u5F15\u53F7\u62EC\u4F4F\u7684\u94FE\u63A5\u4F4D\u7F6E\u7684\u5B8C\u6574\u7F51\u5740\uFF0C\u6216\u5BF9\u5305\u542B\u8FD9\u79CD\u7F51\u5740\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3002\\n\\n\u4EC5\u5141\u8BB8\u67D0\u4E9B\u94FE\u63A5\u7C7B\u578B\u3002\u5176\u4E2D\u5305\u62EC\uFF1Ahttp://\u3001https://\u3001mailto:\u3001aim:\u3001ftp://\u3001gopher://\u3001telnet://\u548Cnews://\uFF0C\u660E\u786E\u7981\u7528\u4F7F\u7528\u5176\u4ED6\u534F\u8BAE\u3002\u5982\u679C\u6307\u5B9A\u7684\u662F\u5176\u4ED6\u534F\u8BAE\uFF0C\u5C06\u4F1A\u5728\u5355\u5143\u683C\u4E2D\u663E\u793A\u94FE\u63A5\u6807\u7B7E\uFF0C\u4F46\u8BE5\u6807\u7B7E\u4E0D\u4F1A\u4EE5\u94FE\u63A5\u5F62\u5F0F\u5448\u73B0\u3002\\n\\n\u5982\u679C\u672A\u6307\u5B9A\u534F\u8BAE\uFF0C\u5219\u5047\u8BBE\u4F7F\u7528http://\uFF0C\u5E76\u5C06\u5176\u4F5C\u4E3A\u7F51\u5740\u7684\u524D\u7F00\u3002',\r\n            'example': '\"http://www.google.com/\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u94FE\u63A5\u6807\u7B7E',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u7F51\u5740] - \u8981\u5728\u5355\u5143\u683C\u4E2D\u4F5C\u4E3A\u94FE\u63A5\u663E\u793A\u7684\u6587\u672C\uFF08\u7528\u5F15\u53F7\u62EC\u8D77\u6765\u7684\uFF09\uFF0C\u6216\u8005\u6307\u5411\u5305\u542B\u8FD9\u79CD\u6807\u7B7E\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3002\\n\\n\u5982\u679C\u94FE\u63A5\u6807\u7B7E\u662F\u6307\u5411\u67D0\u4E2A\u7A7A\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5982\u679C\u7F51\u5740\u6709\u6548\uFF0C\u5C31\u5C06\u5176\u4F5C\u4E3A\u94FE\u63A5\u663E\u793A\uFF0C\u5426\u5219\u4F5C\u4E3A\u7EAF\u6587\u672C\u663E\u793A\u3002\\n\\n\u5982\u679C\u94FE\u63A5\u6807\u7B7E\u4E3A\u7A7A\u5B57\u7B26\u4E32\u5E38\u91CF(\"\")\uFF0C\u6240\u5728\u5355\u5143\u683C\u663E\u793A\u7684\u5185\u5BB9\u5C06\u4E3A\u7A7A\u767D\uFF0C\u4F46\u901A\u8FC7\u70B9\u51FB\u8BE5\u5355\u5143\u683C\u6216\u8F6C\u5165\u8BE5\u5355\u5143\u683C\u4ECD\u7136\u53EF\u4EE5\u8BBF\u95EE\u94FE\u63A5\u3002',\r\n            'example': '\"Google\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TIME',\r\n        't': 6,\r\n        'd': '\u5C06\u7ED9\u5B9A\u7684\u5C0F\u65F6\u3001\u5206\u949F\u548C\u79D2\u8F6C\u6362\u4E3A\u65F6\u95F4\u3002',\r\n        'a': '\u5C06\u7ED9\u5B9A\u7684\u5C0F\u65F6\u3001\u5206\u949F\u548C\u79D2\u8F6C\u6362\u4E3A\u65F6\u95F4\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': '\u5C0F\u65F6',\r\n            'detail': '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u95F4\u7684\u6570\u5B57\uFF0C\u4EE3\u8868\u5C0F\u65F6\u3002\\n\\n\u4EFB\u4F55\u5927\u4E8E 23 \u7684\u503C\u90FD\u4F1A\u9664\u4EE5 24\uFF0C\u4F59\u6570\u5C06\u4F5C\u4E3A\u5C0F\u65F6\u503C\u3002',\r\n            'example': '11',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u5206\u949F',\r\n            'detail': '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u95F4\u7684\u6570\u5B57\uFF0C\u4EE3\u8868\u5206\u949F\u3002\\n\\n\u4EFB\u4F55\u5927\u4E8E 59 \u7684\u503C\u5C06\u8F6C\u6362\u4E3A\u5C0F\u65F6\u548C\u5206\u949F\u3002',\r\n            'example': '40',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': '\u79D2',\r\n            'detail': '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u95F4\u7684\u6570\u5B57\uFF0C\u4EE3\u8868\u79D2\u3002\\n\\n\u4EFB\u4F55\u5927\u4E8E 59 \u7684\u503C\u5C06\u8F6C\u6362\u4E3A\u5C0F\u65F6\u3001\u5206\u949F\u548C\u79D2\u3002',\r\n            'example': '59',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TIMEVALUE',\r\n        't': 6,\r\n        'd': '\u6309\u4E00\u592924\u5C0F\u65F6\u8FD4\u56DE\u8BE5\u65F6\u95F4\u7684\u5206\u6570\u8868\u793A\u3002',\r\n        'a': '\u6309\u4E00\u592924\u5C0F\u65F6\u8FD4\u56DE\u8BE5\u65F6\u95F4\u7684\u5206\u6570\u8868\u793A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'time_text',\r\n            'detail': '\u7528\u4E8E\u8868\u793A\u65F6\u95F4\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"2:15 PM\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EOMONTH',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u67D0\u4E2A\u6708\u4EFD\u6700\u540E\u4E00\u5929\u7684\u5E8F\u5217\u53F7\uFF0C\u8BE5\u6708\u4EFD\u5728\u53E6\u4E00\u4E2A\u65E5\u671F\u4E4B\u524D\u6216\u4E4B\u540E\u7684\u6570\u4E2A\u6708\uFF08\u6708\u6570\u7531\u53C2\u6570\u6307\u5B9A\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u4E2A\u6708\u4EFD\u6700\u540E\u4E00\u5929\u7684\u5E8F\u5217\u53F7',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7ED3\u679C\u7684\u53C2\u7167\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'months',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7684\u8D77\u59CB\u65E5\u671F\u4E4B\u524D\uFF08\u8D1F\uFF09\u6216\u4E4B\u540E\uFF08\u6B63\uFF09\u7684\u6708\u6570\u3002\u8FD4\u56DE\u7684\u662F\u8BA1\u7B97\u6240\u5F97\u6708\u4EFD\u7684\u6700\u540E\u90A3\u5929\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EDATE',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u8868\u793A\u67D0\u4E2A\u65E5\u671F\u7684\u5E8F\u5217\u53F7\uFF0C\u8BE5\u65E5\u671F\u5728\u53E6\u4E00\u4E2A\u65E5\u671F\u7684\u6570\u6708\u4E4B\u524D/\u4E4B\u540E\u3002',\r\n        'a': '\u8FD4\u56DE\u8868\u793A\u67D0\u4E2A\u65E5\u671F\u7684\u5E8F\u5217\u53F7',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7ED3\u679C\u7684\u53C2\u7167\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'months',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u7684\u8D77\u59CB\u65E5\u671F\u4E4B\u524D\uFF08\u8D1F\uFF09\u6216\u4E4B\u540E\uFF08\u6B63\uFF09\u7684\u6708\u6570\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SECOND',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u65F6\u95F4\u503C\u7684\u79D2\u6570\u3002 \u79D2\u6570\u662F 0\uFF08\u96F6\uFF09\u5230 59 \u8303\u56F4\u5185\u7684\u6574\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u65F6\u95F4\u503C\u7684\u79D2\u6570\u3002 \u79D2\u6570\u662F 0\uFF08\u96F6\uFF09\u5230 59 \u8303\u56F4\u5185\u7684\u6574\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u65F6\u95F4',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u79D2\u949F\u90E8\u5206\u7684\u65F6\u95F4\u3002\u5FC5\u987B\u4E3A\u4EE5\u4E0B\u503C\u4E4B\u4E00\uFF1A\u6307\u5411\u5305\u542B\u65E5\u671F/\u65F6\u95F4\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u65F6\u95F4\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'MINUTE',\r\n        't': 6,\r\n        'd': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65F6\u95F4\u7684\u5206\u949F\u90E8\u5206\u3002',\r\n        'a': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65F6\u95F4\u7684\u5206\u949F\u90E8\u5206\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u65F6\u95F4',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u5206\u949F\u90E8\u5206\u7684\u65F6\u95F4\u3002\u5FC5\u987B\u4E3A\u4EE5\u4E0B\u503C\u4E4B\u4E00\uFF1A\u6307\u5411\u5305\u542B\u65E5\u671F/\u65F6\u95F4\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u65F6\u95F4\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HOUR',\r\n        't': 6,\r\n        'd': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65F6\u95F4\u7684\u5C0F\u65F6\u90E8\u5206\u3002',\r\n        'a': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65F6\u95F4\u7684\u5C0F\u65F6\u90E8\u5206\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': '\u65F6\u95F4',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u5C0F\u65F6\u90E8\u5206\u7684\u65F6\u95F4\u3002\u5FC5\u987B\u4E3A\u4EE5\u4E0B\u503C\u4E4B\u4E00\uFF1A\u6307\u5411\u5305\u542B\u65E5\u671F/\u65F6\u95F4\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u65F6\u95F4\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NOW',\r\n        't': 6,\r\n        'd': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u5F53\u524D\u65E5\u671F\u548C\u65F6\u95F4\u3002',\r\n        'a': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u5F53\u524D\u65E5\u671F\u548C\u65F6\u95F4\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'NETWORKDAYS',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'end_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u7ED3\u675F\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'holidays',\r\n            'detail': '[\u53EF\u9009] - \u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\u5E8F\u53F7\u3002\\n\\n\u5728\u8282\u5047\u65E5\u6570\u7EC4\u4E2D\u63D0\u4F9B\u7684\u503C\u5FC5\u987B\u662F\u65E5\u671F\u5E8F\u53F7\u503C\uFF08\u4F8B\u5982\u7531N\u6240\u8FD4\u56DE\u7684\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982\u7531DATE\u3001DATEVALUE\u6216TO_DATE\u8FD4\u56DE\u7684\u503C\uFF09\u3002\u7531\u8303\u56F4\u6307\u5B9A\u7684\u503C\u5E94\u8BE5\u662F\u6807\u51C6\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6570\u503C\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NETWORKDAYS_INTL',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u7684\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\uFF08\u6392\u9664\u6307\u5B9A\u7684\u5468\u672B\u548C\u8282\u5047\u65E5\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u7684\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\uFF08\u6392\u9664\u6307\u5B9A\u7684\u5468\u672B\u548C\u8282\u5047\u65E5\uFF09\u3002',\r\n        'm': [2, 4],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'end_date',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u7ED3\u675F\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'weekend',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u7528\u4E8E\u8868\u793A\u54EA\u4E9B\u5929\u4E3A\u5468\u672B\u7684\u6570\u5B57\u6216\u5B57\u7B26\u4E32\u3002\\n\u5B57\u7B26\u4E32\u65B9\u5F0F\uFF1A\u53EF\u4EE5\u4F7F\u7528\u75310\u548C1\u7EC4\u6210\u7684\u5B57\u7B26\u4E32\u6765\u6307\u5B9A\u5468\u672B\uFF0C\u4E32\u4E2D\u7684\u7B2C\u4E00\u4E2A\u6570\u5B57\u5B57\u7B26\u4EE3\u8868\u5468\u4E00\uFF0C\u6700\u540E\u4E00\u4E2A\u5219\u4EE3\u8868\u5468\u65E5\u3002\u96F6\u8868\u793A\u8FD9\u4E00\u5929\u662F\u5DE5\u4F5C\u65E5\uFF0C1\u8868\u793A\u8FD9\u4E00\u5929\u4E3A\u5468\u672B\u3002\u4F8B\u5982\uFF0C\u201C0000011\u201D\u8868\u793A\u5C06\u5468\u516D\u548C\u5468\u65E5\u4F5C\u4E3A\u5468\u672B\u3002\\n\u6570\u5B57\u65B9\u5F0F\uFF1A\u8FD9\u79CD\u65B9\u5F0F\u4E0D\u4F7F\u7528\u4E0A\u8FF0\u5B57\u7B26\u4E32\u5F62\u5F0F\uFF0C\u800C\u662F\u4F7F\u7528\u4E00\u4E2A\u6570\u5B57\u30021 =\u5468\u516D/\u5468\u65E5\u4E3A\u5468\u672B\uFF0C2 =\u5468\u65E5/\u5468\u4E00\u4E3A\u5468\u672B\uFF0C\u4F9D\u6B64\u7C7B\u63A8\u52197 =\u5468\u4E94/\u5468\u516D\u300211 =\u5468\u65E5\u4E3A\u552F\u4E00\u5468\u672B\uFF0C12 =\u5468\u4E00\u4E3A\u552F\u4E00\u5468\u672B\uFF0C\u4F9D\u6B64\u7C7B\u63A8\u521917 =\u5468\u516D\u4E3A\u552F\u4E00\u5468\u672B\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'holidays',\r\n            'detail': '[ \u53EF\u9009 ] - \u8FD9\u662F\u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\u3002\\n\u5728\u8282\u5047\u65E5\u6570\u7EC4\u5185\u63D0\u4F9B\u7684\u503C\u5FC5\u987B\u4E3A\u65E5\u671F\u5E8F\u6570\u503C\uFF08\u4F8B\u5982N\u7684\u8FD4\u56DE\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982DATE\u3001DATEVALUE\u6216TO_DATE\u7684\u8FD4\u56DE\u503C\uFF09\u3002\u7531\u8303\u56F4\u6307\u5B9A\u7684\u503C\u5E94\u8BE5\u662F\u6807\u51C6\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6570\u503C\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISOWEEKNUM',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u65E5\u671F\u5728\u5168\u5E74\u4E2D\u7684 ISO \u5468\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u65E5\u671F\u5728\u5168\u5E74\u4E2D\u7684 ISO \u5468\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'date',\r\n            'detail': '\u7528\u4E8E\u65E5\u671F\u548C\u65F6\u95F4\u8BA1\u7B97\u7684\u65E5\u671F-\u65F6\u95F4\u4EE3\u7801\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WEEKNUM',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u7684\u5468\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u7684\u5468\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'serial_number',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u4F4D\u4E8E\u7B2C\u51E0\u5468\u7684\u65E5\u671F\uFF0C\u5FC5\u987B\u662F\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'return_type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 1 ] - \u4EE3\u8868\u4E00\u5468\u8D77\u59CB\u65E5\u7684\u6570\u5B57\uFF0C\u7CFB\u7EDF\u4E5F\u4F7F\u7528\u8BE5\u6570\u5B57\u6765\u786E\u5B9A\u4E00\u5E74\u7684\u7B2C\u4E00\u5468\uFF081=\u5468\u65E5\uFF0C2=\u5468\u4E00\uFF09\u3002',\r\n            'example': '7',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'WEEKDAY',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u6570\u5B57\uFF0C\u5BF9\u5E94\u4E8E\u7ED9\u5B9A\u65E5\u671F\u6240\u5728\u7684\u661F\u671F\u51E0\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u6570\u5B57\uFF0C\u5BF9\u5E94\u4E8E\u7ED9\u5B9A\u65E5\u671F\u6240\u5728\u7684\u661F\u671F\u51E0\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'serial_number',\r\n            'detail': '\u8981\u4E3A\u5176\u786E\u5B9A\u661F\u671F\u51E0\u7684\u65E5\u671F\u3002\u5FC5\u987B\u662F\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'return_type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 1] - \u4EE5\u6570\u5B57\u6307\u793A\u4F7F\u7528\u54EA\u79CD\u7F16\u53F7\u987A\u5E8F\u6765\u8868\u793A\u661F\u671F\u51E0\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\uFF0C\u6309\u661F\u671F\u65E5 (= 1) \u5F00\u59CB\u8BA1\u7B97\u3002\\n\\n\u5982\u679C\u7C7B\u578B\u4E3A 1\uFF0C\u5219\u661F\u671F\u503C\u5C06\u4ECE\u661F\u671F\u65E5\u5F00\u59CB\u7B97\u8D77\uFF0C\u5E76\u4E14\u661F\u671F\u65E5\u7684\u503C\u4E3A 1\uFF0C\u56E0\u6B64\u661F\u671F\u516D\u7684\u503C\u5C31\u662F 7\u3002\\n\\n\u5982\u679C\u7C7B\u578B\u4E3A 2\uFF0C\u5219\u661F\u671F\u503C\u5C06\u4ECE\u661F\u671F\u4E00\u5F00\u59CB\u7B97\u8D77\uFF0C\u5E76\u4E14\u661F\u671F\u4E00\u7684\u503C\u4E3A 1\uFF0C\u56E0\u6B64\u661F\u671F\u65E5\u7684\u503C\u5C31\u662F 7\u3002\\n\\n\u5982\u679C\u7C7B\u578B\u4E3A 3\uFF0C\u5219\u661F\u671F\u503C\u5C06\u4ECE\u661F\u671F\u4E00\u7B97\u8D77\uFF0C\u5E76\u4E14\u661F\u671F\u4E00\u7684\u503C\u4E3A 0\uFF0C\u56E0\u6B64\u661F\u671F\u65E5\u7684\u503C\u5C31\u662F 6\u3002',\r\n            'example': '7',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DAY',\r\n        't': 6,\r\n        'd': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u6240\u5728\u7684\u5F53\u6708\u51E0\u53F7\u3002',\r\n        'a': '\u4EE5\u6570\u5B57\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u6240\u5728\u7684\u5F53\u6708\u51E0\u53F7\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'serial_number',\r\n            'detail': '\u8981\u4ECE\u4E2D\u63D0\u53D6\u5177\u4F53\u51E0\u53F7\u7684\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DAYS',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'end_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7ED3\u675F\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': '2011-3-15',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u5F00\u59CB\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': '2011-2-1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DAYS360',\r\n        't': 6,\r\n        'd': '\u6309\u7167\u6BCF\u5E74360\u5929\uFF0C\u8FD4\u56DE\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5DEE\uFF08\u7528\u4E8E\u8BA1\u7B97\u5229\u606F\uFF09\u3002',\r\n        'a': '\u6309\u7167\u6BCF\u5E74360\u5929\uFF0C\u8FD4\u56DE\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5DEE\uFF08\u7528\u4E8E\u8BA1\u7B97\u5229\u606F\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u5F00\u59CB\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'end_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7ED3\u675F\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'method',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3AFALSE()] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\nFALSE - \u91C7\u7528\u7F8E\u56FD (NASD) \u65B9\u6CD5\u65F6\uFF0C\u5982\u679C\u8D77\u59CB\u65E5\u671F\u4E3A\u67D0\u6708\u7684\u6700\u540E\u4E00\u5929\uFF0C\u4E3A\u4FBF\u4E8E\u8BA1\u7B97\uFF0C\u4F1A\u5C06\u8D77\u59CB\u65E5\u671F\u7684\u5F53\u6708\u51E0\u53F7\u66F4\u6539\u4E3A30\u3002\u6B64\u5916\uFF0C\u5982\u679C\u7ED3\u675F\u65E5\u671F\u662F\u6240\u5728\u6708\u4EFD\u7684\u6700\u540E\u4E00\u5929\uFF0C\u800C\u4E14\u8D77\u59CB\u65E5\u671F\u5728\u5176\u6240\u5728\u6708\u768430\u53F7\u4E4B\u524D\uFF0C\u5219\u5C06\u7ED3\u675F\u65E5\u671F\u66F4\u6539\u4E3A\u7ED3\u675F\u65E5\u671F\u4E4B\u540E\u90A3\u4E2A\u6708\u7684\u7B2C\u4E00\u5929\uFF0C\u5426\u5219\u5C06\u7ED3\u675F\u65E5\u671F\u66F4\u6539\u4E3A\u8BE5\u6708\u768430\u53F7\u3002\\n\\nTRUE - \u91C7\u7528\u6B27\u6D32\u65B9\u6CD5\u65F6\uFF0C\u4F1A\u5C06\u6240\u6709\u65E5\u671F\u572831\u53F7\u7684\u8D77\u59CB\u65E5\u671F\u6216\u7ED3\u675F\u65E5\u671F\u66F4\u6539\u4E3A\u5F53\u6708\u768430\u53F7\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DATE',\r\n        't': 6,\r\n        'd': '\u5C06\u63D0\u4F9B\u7684\u5E74\u3001\u6708\u3001\u65E5\u8F6C\u6362\u4E3A\u65E5\u671F\u3002',\r\n        'a': '\u5C06\u63D0\u4F9B\u7684\u5E74\u3001\u6708\u3001\u65E5\u8F6C\u6362\u4E3A\u65E5\u671F\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'year',\r\n            'detail': '\u65E5\u671F\u7684\u5E74\u4EFD\u90E8\u5206\uFF0C\u5305\u542B\u4E00\u5230\u56DB\u4F4D\u6570\u5B57\u3002\\n\\n\u4ECB\u4E8E 0\uFF08\u96F6\uFF09\u5230 1899 \u4E4B\u95F4\uFF0C\u4F1A\u5C06\u8BE5\u503C\u4E0E 1900 \u76F8\u52A0\u6765\u8BA1\u7B97\u5E74\u4EFD\uFF1B\\n\\n\u4ECB\u4E8E 1900 \u5230 9999 \u4E4B\u95F4\uFF0C\u5C06\u4F7F\u7528\u8BE5\u6570\u503C\u4F5C\u4E3A\u5E74\u4EFD\uFF1B\\n\\n\u5C0F\u4E8E 0 \u6216\u5927\u4E8E\u7B49\u4E8E 10000\uFF0C\u8FD4\u56DE \u9519\u8BEF\u503C #NUM!\u3002',\r\n            'example': '1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'month',\r\n            'detail': '\u65E5\u671F\u7684\u6708\u4EFD\u90E8\u5206\uFF0C\u4E00\u4E2A\u6B63\u6574\u6570\u6216\u8D1F\u6574\u6570\u3002\\n\\n\u5982\u679C month \u5927\u4E8E 12\uFF0C\u5219 month \u4F1A\u5C06\u8BE5\u6708\u4EFD\u6570\u4E0E\u6307\u5B9A\u5E74\u4E2D\u7684\u7B2C\u4E00\u4E2A\u6708\u76F8\u52A0\u3002\\n\\n\u5982\u679C month \u5C0F\u4E8E 1\uFF0Cmonth \u5219\u4ECE\u6307\u5B9A\u5E74\u4EFD\u7684\u4E00\u6708\u4EFD\u5F00\u59CB\u9012\u51CF\u8BE5\u6708\u4EFD\u6570\uFF0C\u7136\u540E\u518D\u52A0\u4E0A 1 \u4E2A\u6708\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'day',\r\n            'detail': '\u65E5\u671F\u7684\u65E5\u90E8\u5206\uFF0C\u4E00\u4E2A\u6B63\u6574\u6570\u6216\u8D1F\u6574\u6570\u3002\\n\\n\u5982\u679C day \u5927\u4E8E\u6708\u4E2D\u6307\u5B9A\u7684\u5929\u6570\uFF0C\u5219 day \u4F1A\u5C06\u5929\u6570\u4E0E\u8BE5\u6708\u4E2D\u7684\u7B2C\u4E00\u5929\u76F8\u52A0\u3002\\n\\n\u5982\u679C day \u5C0F\u4E8E 1\uFF0C\u5219 day \u4ECE\u6307\u5B9A\u6708\u4EFD\u7684\u7B2C\u4E00\u5929\u5F00\u59CB\u9012\u51CF\u8BE5\u5929\u6570\uFF0C\u7136\u540E\u518D\u52A0\u4E0A 1 \u5929\u3002',\r\n            'example': '20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DATEVALUE',\r\n        't': 6,\r\n        'd': '\u5C06\u63D0\u4F9B\u7684\u65E5\u671F\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u65E5\u671F\u7684\u5E8F\u5217\u53F7\u3002',\r\n        'a': '\u5C06\u63D0\u4F9B\u7684\u65E5\u671F\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u65E5\u671F\u7684\u5E8F\u5217\u53F7\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'date_text',\r\n            'detail': '\u8868\u793A\u65E5\u671F\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"1969-7-20\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DATEDIF',\r\n        't': 6,\r\n        'd': '\u8BA1\u7B97\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\u3001\u6708\u6570\u6216\u5E74\u6570\u3002',\r\n        'a': '\u8BA1\u7B97\u4E24\u4E2A\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\u3001\u6708\u6570\u6216\u5E74\u6570\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': '\u8D77\u59CB\u65E5\u671F',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u5F00\u59CB\u65E5\u671F\u3002\u5FC5\u987B\u662F\u5BF9\u5305\u542BDATE\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DEDATE\u7C7B\u578B\u7684\u51FD\u6570\u6216\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u7ED3\u675F\u65E5\u671F',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7ED3\u675F\u65E5\u671F\u3002\u5FC5\u987B\u662F\u5BF9\u5305\u542BDATE\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DEDATE\u7C7B\u578B\u7684\u51FD\u6570\u6216\u6570\u5B57\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u5355\u4F4D',\r\n            'detail': '\u65F6\u95F4\u5355\u4F4D\u7684\u7F29\u5199\u6587\u5B57\u3002\u4F8B\u5982 \"M\" \u4EE3\u8868\u6708\u3002\u6709\u6548\u503C\u5305\u62EC\uFF1A\"Y\"\u3001\"M\"\u3001\"D\"\u3001\"MD\"\u3001\"YM\" \u548C \"YD\"\u3002\\n\\n\"Y\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u6574\u5E74\u6570\u3002\\n\\n\"M\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u6574\u6708\u6570\u3002\\n\\n\"D\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\u3002\\n\\n\"MD\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\uFF08\u4E0D\u8BA1\u6574\u6708\u6570\uFF09\u3002\\n\\n\"YM\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u6574\u6708\u6570\uFF08\u4E0D\u8BA1\u6574\u5E74\u6570\uFF09\u3002\\n\\n\"YD\"\uFF1A\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\uFF08\u5047\u8BBE\u8D77\u59CB\u65E5\u671F\u548C\u7ED3\u675F\u65E5\u671F\u7684\u95F4\u9694\u4E0D\u8D85\u8FC7\u4E00\u5E74\uFF09\u3002',\r\n            'example': '16)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WORKDAY',\r\n        't': 6,\r\n        'd': '\u6307\u5B9A\u5DE5\u4F5C\u65E5\u5929\u6570\uFF0C\u8BA1\u7B97\u7ED3\u675F\u65E5\u671F\u3002',\r\n        'a': '\u6307\u5B9A\u5DE5\u4F5C\u65E5\u5929\u6570\uFF0C\u8BA1\u7B97\u7ED3\u675F\u65E5\u671F\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u8BA1\u7B97\u7684\u5F00\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'days',\r\n            'detail': 'start_date \u4E4B\u524D\u6216\u4E4B\u540E\u4E0D\u542B\u5468\u672B\u53CA\u8282\u5047\u65E5\u7684\u5929\u6570\u3002\\n\\n\u4E3A\u6B63\u503C\u5C06\u751F\u6210\u672A\u6765\u65E5\u671F\uFF1B\\n\\n\u4E3A\u8D1F\u503C\u751F\u6210\u8FC7\u53BB\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'holidays',\r\n            'detail': '[\u53EF\u9009] - \u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\u5E8F\u53F7\u3002\\n\\n\u5728\u8282\u5047\u65E5\u6570\u7EC4\u4E2D\u63D0\u4F9B\u7684\u503C\u5FC5\u987B\u662F\u65E5\u671F\u5E8F\u53F7\u503C\uFF08\u4F8B\u5982\u7531N\u6240\u8FD4\u56DE\u7684\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982\u7531DATE\u3001DATEVALUE\u6216TO_DATE\u8FD4\u56DE\u7684\u503C\uFF09\u3002\u7531\u8303\u56F4\u6307\u5B9A\u7684\u503C\u5E94\u8BE5\u662F\u6807\u51C6\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6570\u503C\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WORKDAY_INTL',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u7684\u82E5\u5E72\u4E2A\u5DE5\u4F5C\u65E5\u4E4B\u524D\u6216\u4E4B\u540E\u7684\u65E5\u671F\u7684\u5E8F\u5217\u53F7\uFF08\u4F7F\u7528\u81EA\u5B9A\u4E49\u5468\u672B\u53C2\u6570\uFF09\u3002 ',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u7684\u82E5\u5E72\u4E2A\u5DE5\u4F5C\u65E5\u4E4B\u524D\u6216\u4E4B\u540E\u7684\u65E5\u671F\u7684\u5E8F\u5217\u53F7\uFF08\u4F7F\u7528\u81EA\u5B9A\u4E49\u5468\u672B\u53C2\u6570\uFF09\u3002 ',\r\n        'm': [2, 4],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u5F00\u59CB\u65E5\u671F\uFF08\u5C06\u88AB\u622A\u5C3E\u53D6\u6574\uFF09\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'days',\r\n            'detail': 'start_date \u4E4B\u524D\u6216\u4E4B\u540E\u7684\u5DE5\u4F5C\u65E5\u7684\u5929\u6570\u3002\\n\\n\u6B63\u503C\u8868\u793A\u672A\u6765\u65E5\u671F\uFF1B\\n\\n\u8D1F\u503C\u8868\u793A\u8FC7\u53BB\u65E5\u671F\uFF1B\\n\\n\u96F6\u503C\u8868\u793A\u5F00\u59CB\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'weekend',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u7528\u4E8E\u8868\u793A\u54EA\u4E9B\u5929\u4E3A\u5468\u672B\u7684\u6570\u5B57\u6216\u5B57\u7B26\u4E32\u3002\\n\u5B57\u7B26\u4E32\u65B9\u5F0F\uFF1A\u53EF\u4EE5\u4F7F\u7528\u75310\u548C1\u7EC4\u6210\u7684\u5B57\u7B26\u4E32\u6765\u6307\u5B9A\u5468\u672B\uFF0C\u4E32\u4E2D\u7684\u7B2C\u4E00\u4E2A\u6570\u5B57\u5B57\u7B26\u4EE3\u8868\u5468\u4E00\uFF0C\u6700\u540E\u4E00\u4E2A\u5219\u4EE3\u8868\u5468\u65E5\u3002\u96F6\u8868\u793A\u8FD9\u4E00\u5929\u662F\u5DE5\u4F5C\u65E5\uFF0C1\u8868\u793A\u8FD9\u4E00\u5929\u4E3A\u5468\u672B\u3002\u4F8B\u5982\uFF0C\u201C0000011\u201D\u8868\u793A\u5C06\u5468\u516D\u548C\u5468\u65E5\u4F5C\u4E3A\u5468\u672B\u3002\\n\u6570\u5B57\u65B9\u5F0F\uFF1A\u8FD9\u79CD\u65B9\u5F0F\u4E0D\u4F7F\u7528\u4E0A\u8FF0\u5B57\u7B26\u4E32\u5F62\u5F0F\uFF0C\u800C\u662F\u4F7F\u7528\u4E00\u4E2A\u6570\u5B57\u30021 =\u5468\u516D/\u5468\u65E5\u4E3A\u5468\u672B\uFF0C2 =\u5468\u65E5/\u5468\u4E00\u4E3A\u5468\u672B\uFF0C\u4F9D\u6B64\u7C7B\u63A8\u52197 =\u5468\u4E94/\u5468\u516D\u300211 =\u5468\u65E5\u4E3A\u552F\u4E00\u5468\u672B\uFF0C12 =\u5468\u4E00\u4E3A\u552F\u4E00\u5468\u672B\uFF0C\u4F9D\u6B64\u7C7B\u63A8\u521917 =\u5468\u516D\u4E3A\u552F\u4E00\u5468\u672B\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'holidays',\r\n            'detail': '[ \u53EF\u9009 ] - \u8FD9\u662F\u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\u3002\\n\u5728\u8282\u5047\u65E5\u6570\u7EC4\u5185\u63D0\u4F9B\u7684\u503C\u5FC5\u987B\u4E3A\u65E5\u671F\u5E8F\u6570\u503C\uFF08\u4F8B\u5982N\u7684\u8FD4\u56DE\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982DATE\u3001DATEVALUE\u6216TO_DATE\u7684\u8FD4\u56DE\u503C\uFF09\u3002\u7531\u8303\u56F4\u6307\u5B9A\u7684\u503C\u5E94\u8BE5\u662F\u6807\u51C6\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6570\u503C\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'YEAR',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u5BF9\u5E94\u4E8E\u67D0\u4E2A\u65E5\u671F\u7684\u5E74\u4EFD\u3002 Year \u4F5C\u4E3A 1900 - 9999 \u4E4B\u95F4\u7684\u6574\u6570\u8FD4\u56DE\u3002',\r\n        'a': '\u8FD4\u56DE\u5BF9\u5E94\u4E8E\u67D0\u4E2A\u65E5\u671F\u7684\u5E74\u4EFD\u3002 Year \u4F5C\u4E3A 1900 - 9999 \u4E4B\u95F4\u7684\u6574\u6570\u8FD4\u56DE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'serial_number',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u5E74\u4EFD\u7684\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'YEARFRAC',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE start_date \u548C end_date \u4E4B\u95F4\u7684\u5929\u6570\u5360\u5168\u5E74\u5929\u6570\u7684\u767E\u5206\u6BD4\u3002',\r\n        'a': '\u8FD4\u56DE start_date \u548C end_date \u4E4B\u95F4\u7684\u5929\u6570\u5360\u5168\u5E74\u5929\u6570\u7684\u767E\u5206\u6BD4\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'start_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u5F00\u59CB\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'end_date',\r\n            'detail': '\u8BA1\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7ED3\u675F\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u8981\u4F7F\u7528\u7684\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TODAY',\r\n        't': 6,\r\n        'd': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u5F53\u524D\u65E5\u671F\u3002',\r\n        'a': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u5F53\u524D\u65E5\u671F\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'MONTH',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u65E5\u671F\uFF08\u4EE5\u5E8F\u5217\u6570\u8868\u793A\uFF09\u4E2D\u7684\u6708\u4EFD\u3002 \u6708\u4EFD\u662F\u4ECB\u4E8E 1\uFF08\u4E00\u6708\uFF09\u5230 12\uFF08\u5341\u4E8C\u6708\uFF09\u4E4B\u95F4\u7684\u6574\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u65E5\u671F\uFF08\u4EE5\u5E8F\u5217\u6570\u8868\u793A\uFF09\u4E2D\u7684\u6708\u4EFD\u3002 \u6708\u4EFD\u662F\u4ECB\u4E8E 1\uFF08\u4E00\u6708\uFF09\u5230 12\uFF08\u5341\u4E8C\u6708\uFF09\u4E4B\u95F4\u7684\u6574\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'serial_number',\r\n            'detail': '\u8981\u4ECE\u4E2D\u63D0\u53D6\u6708\u4EFD\u7684\u65E5\u671F\u3002\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E00\u79CD\uFF1A\u5BF9\u5305\u542B\u65E5\u671F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u7C7B\u578B\u7684\u51FD\u6570\u6216\u8005\u6570\u5B57\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EFFECT',\r\n        't': 8,\r\n        'd': '\u6839\u636E\u540D\u4E49\u5229\u7387\u53CA\u6BCF\u5E74\u7684\u590D\u5229\u8BA1\u606F\u671F\u6570\u6765\u8BA1\u7B97\u5B9E\u9645\u5E74\u5229\u7387\u3002',\r\n        'a': '\u6839\u636E\u540D\u4E49\u5229\u7387\u53CA\u6BCF\u5E74\u7684\u590D\u5229\u8BA1\u606F\u671F\u6570\u6765\u8BA1\u7B97\u5B9E\u9645\u5E74\u5229\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'nominal_rate',\r\n            'detail': '\u6BCF\u5E74\u7684\u540D\u4E49\u5229\u7387\u3002',\r\n            'example': '0.99',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'npery',\r\n            'detail': '\u6BCF\u5E74\u7684\u590D\u5229\u8BA1\u7B97\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLAR',\r\n        't': 12,\r\n        'd': '\u5C06\u6570\u5B57\u683C\u5F0F\u8BBE\u7F6E\u4E3A\u4E0E\u8BED\u8A00\u533A\u57DF\u76F8\u5BF9\u5E94\u7684\u8D27\u5E01\u683C\u5F0F\u3002',\r\n        'a': '\u5C06\u6570\u5B57\u683C\u5F0F\u8BBE\u7F6E\u4E3A\u4E0E\u8BED\u8A00\u533A\u57DF\u76F8\u5BF9\u5E94\u7684\u8D27\u5E01\u683C\u5F0F\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u503C\u3002',\r\n            'example': '1.2351',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'decimals',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 2] - \u8981\u663E\u793A\u7684\u5C0F\u6570\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8FD9\u662F\u8D1F\u6570\uFF0C\u5219\u5C06\u6570\u5B57\u56DB\u820D\u4E94\u5165\u5230\u5C0F\u6570\u70B9\u5DE6\u4FA7\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLARDE',\r\n        't': 8,\r\n        'd': '\u5C06\u4EE5\u6574\u6570\u90E8\u5206\u548C\u5206\u6570\u90E8\u5206\u8F6C\u6362\u4E3A\u4EE5\u5C0F\u6570\u90E8\u5206\u8868\u793A\u7684\u91D1\u989D\u6570\u5B57',\r\n        'a': '\u5C06\u4EE5\u6574\u6570\u90E8\u5206\u548C\u5206\u6570\u90E8\u5206\u8F6C\u6362\u4E3A\u4EE5\u5C0F\u6570\u90E8\u5206\u8868\u793A\u7684\u91D1\u989D\u6570\u5B57',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'fractional_dollar',\r\n            'detail': '\u4EE5\u6574\u6570\u90E8\u4EFD\u548C\u5206\u6570\u90E8\u5206\u8868\u793A\u7684\u6570\u5B57\uFF0C\u7528\u5C0F\u6570\u70B9\u9694\u5F00\u3002',\r\n            'example': '100.10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fraction',\r\n            'detail': '\u7528\u4F5C\u5206\u6570\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6570\u3002',\r\n            'example': '32',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLARFR',\r\n        't': 8,\r\n        'd': '\u5C06\u5C0F\u6570\u8F6C\u6362\u4E3A\u5206\u6570\u8868\u793A\u7684\u91D1\u989D\u6570\u5B57\u3002',\r\n        'a': '\u5C06\u5C0F\u6570\u8F6C\u6362\u4E3A\u5206\u6570\u8868\u793A\u7684\u91D1\u989D\u6570\u5B57\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'decimal_dollar',\r\n            'detail': '\u5C0F\u6570\u3002',\r\n            'example': '100.125',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fraction',\r\n            'detail': '\u7528\u4F5C\u5206\u6570\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6570\u3002',\r\n            'example': '32',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DB',\r\n        't': 8,\r\n        'd': '\u4F7F\u7528\u56FA\u5B9A\u4F59\u989D\u9012\u51CF\u6CD5\uFF0C\u8FD4\u56DE\u6307\u5B9A\u671F\u95F4\u5185\u67D0\u9879\u56FA\u5B9A\u8D44\u4EA7\u7684\u6298\u65E7\u503C\u3002',\r\n        'a': '\u4F7F\u7528\u56FA\u5B9A\u4F59\u989D\u9012\u51CF\u6CD5\uFF0C\u8FD4\u56DE\u6307\u5B9A\u671F\u95F4\u5185\u67D0\u9879\u56FA\u5B9A\u8D44\u4EA7\u7684\u6298\u65E7\u503C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'cost',\r\n            'detail': '\u8D44\u4EA7\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'salvage',\r\n            'detail': '\u6298\u65E7\u672B\u5C3E\u65F6\u7684\u503C\uFF08\u6709\u65F6\u4E5F\u79F0\u4E3A\u8D44\u4EA7\u6B8B\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'life',\r\n            'detail': '\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\uFF08\u6709\u65F6\u4E5F\u79F0\u4F5C\u8D44\u4EA7\u7684\u4F7F\u7528\u5BFF\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'period',\r\n            'detail': '\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'month',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A12] - \u6298\u65E7\u7B2C\u4E00\u5E74\u4E2D\u7684\u6708\u6570\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DDB',\r\n        't': 8,\r\n        'd': '\u7528\u53CC\u500D\u4F59\u989D\u9012\u51CF\u6CD5\uFF0C\u8FD4\u56DE\u6307\u5B9A\u671F\u95F4\u5185\u67D0\u9879\u56FA\u5B9A\u8D44\u4EA7\u7684\u6298\u65E7\u503C\u3002',\r\n        'a': '\u7528\u53CC\u500D\u4F59\u989D\u9012\u51CF\u6CD5\uFF0C\u8FD4\u56DE\u6307\u5B9A\u671F\u95F4\u5185\u67D0\u9879\u56FA\u5B9A\u8D44\u4EA7\u7684\u6298\u65E7\u503C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'cost',\r\n            'detail': '\u8D44\u4EA7\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'salvage',\r\n            'detail': '\u6298\u65E7\u672B\u5C3E\u65F6\u7684\u503C\uFF08\u6709\u65F6\u4E5F\u79F0\u4E3A\u8D44\u4EA7\u6B8B\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'life',\r\n            'detail': '\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\uFF08\u6709\u65F6\u4E5F\u79F0\u4F5C\u8D44\u4EA7\u7684\u4F7F\u7528\u5BFF\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'period',\r\n            'detail': '\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'factor',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A2] - \u6298\u65E7\u7684\u9012\u51CF\u7CFB\u6570\u3002',\r\n            'example': '2.25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RATE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5E74\u91D1\u6BCF\u671F\u7684\u5229\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5E74\u91D1\u6BCF\u671F\u7684\u5229\u7387\u3002',\r\n        'm': [3, 6],\r\n        'p': [{\r\n            'name': 'nper',\r\n            'detail': '\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pmt',\r\n            'detail': '\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u989D\uFF0C\u5728\u5E74\u91D1\u5468\u671F\u5185\u4E0D\u80FD\u66F4\u6539\u3002',\r\n            'example': '-100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\u5373\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u5F53\u524D\u503C\u7684\u603B\u548C\u3002',\r\n            'example': '400',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'guess',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0.1] - \u9884\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CUMPRINC',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u6295\u8D44\u5728\u591A\u4E2A\u4ED8\u6B3E\u671F\u5185\u7684\u7D2F\u8BA1\u672C\u91D1\u507F\u8FD8\u989D\u3002',\r\n        'a': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u6295\u8D44\u5728\u591A\u4E2A\u4ED8\u6B3E\u671F\u5185\u7684\u7D2F\u8BA1\u672C\u91D1\u507F\u8FD8\u989D\u3002',\r\n        'm': [6, 6],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u603B\u4ED8\u6B3E\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u5E74\u91D1\u7684\u73B0\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'start_period',\r\n            'detail': '\u5F00\u59CB\u7D2F\u8BA1\u8BA1\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u53F7\u3002\\n\\n\u9996\u671F\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'end_period',\r\n            'detail': '\u7ED3\u675F\u7D2F\u8BA1\u8BA1\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u53F7\u3002\\n\\n\u672B\u671F\u5FC5\u987B\u5927\u4E8E\u9996\u671F\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPNUM',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u7ED3\u7B97\u65E5\u548C\u5230\u671F\u65E5\u4E4B\u95F4\u7684\u4ED8\u606F\u6B21\u6570\uFF0C\u5411\u4E0A\u820D\u5165\u5230\u6700\u8FD1\u7684\u6574\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u5728\u7ED3\u7B97\u65E5\u548C\u5230\u671F\u65E5\u4E4B\u95F4\u7684\u4ED8\u606F\u6B21\u6570\uFF0C\u5411\u4E0A\u820D\u5165\u5230\u6700\u8FD1\u7684\u6574\u6570\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002\u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': '02',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SYD',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u6307\u5B9A\u671F\u95F4\u5185\u8D44\u4EA7\u6309\u5E74\u9650\u603B\u548C\u6298\u65E7\u6CD5\u8BA1\u7B97\u7684\u6298\u65E7\u3002',\r\n        'a': '\u8FD4\u56DE\u5728\u6307\u5B9A\u671F\u95F4\u5185\u8D44\u4EA7\u6309\u5E74\u9650\u603B\u548C\u6298\u65E7\u6CD5\u8BA1\u7B97\u7684\u6298\u65E7\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'cost',\r\n            'detail': '\u8D44\u4EA7\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'salvage',\r\n            'detail': '\u6298\u65E7\u672B\u5C3E\u65F6\u7684\u503C\uFF08\u6709\u65F6\u4E5F\u79F0\u4E3A\u8D44\u4EA7\u6B8B\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'life',\r\n            'detail': '\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\uFF08\u6709\u65F6\u4E5F\u79F0\u4F5C\u8D44\u4EA7\u7684\u4F7F\u7528\u5BFF\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'period',\r\n            'detail': '\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLEQ',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u8D34\u73B0\u7387\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u7B49\u6548\u5E74\u5316\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u4E8E\u8D34\u73B0\u7387\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u7B49\u6548\u5E74\u5316\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u503A\u5238\u7684\u7ED3\u7B97\u65E5\u671F\uFF0C\u6B64\u65E5\u671F\u4E3A\u503A\u5238\u53D1\u884C\u540E\u4EA4\u4ED8\u7ED9\u4E70\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u503A\u5238\u7684\u5230\u671F\u6216\u7ED3\u675F\u65E5\u671F\uFF0C\u5C4A\u65F6\u53EF\u5C06\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u4EF7\u503C\u8D4E\u56DE\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'discount',\r\n            'detail': '\u503A\u5238\u8D2D\u4E70\u65F6\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '2)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLYIELD',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u4EF7\u683C\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u4E8E\u4EF7\u683C\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u503A\u5238\u7684\u7ED3\u7B97\u65E5\u671F\uFF0C\u6B64\u65E5\u671F\u4E3A\u503A\u5238\u53D1\u884C\u540E\u4EA4\u4ED8\u7ED9\u4E70\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u503A\u5238\u7684\u5230\u671F\u6216\u7ED3\u675F\u65E5\u671F\uFF0C\u5C4A\u65F6\u53EF\u5C06\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u4EF7\u503C\u8D4E\u56DE\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'pr',\r\n            'detail': '\u503A\u5238\u7684\u8D2D\u4E70\u4EF7\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLPRICE',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u8D34\u73B0\u7387\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u4EF7\u683C\u3002',\r\n        'a': '\u57FA\u4E8E\u8D34\u73B0\u7387\u8BA1\u7B97\u7F8E\u56FD\u653F\u5E9C\u77ED\u671F\u503A\u5238\u7684\u4EF7\u683C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u503A\u5238\u7684\u7ED3\u7B97\u65E5\u671F\uFF0C\u6B64\u65E5\u671F\u4E3A\u503A\u5238\u53D1\u884C\u540E\u4EA4\u4ED8\u7ED9\u4E70\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u503A\u5238\u7684\u5230\u671F\u6216\u7ED3\u675F\u65E5\u671F\uFF0C\u5C4A\u65F6\u53EF\u5C06\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u4EF7\u503C\u8D4E\u56DE\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'discount',\r\n            'detail': '\u503A\u5238\u8D2D\u4E70\u65F6\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PV',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u5E74\u91D1\u6295\u8D44\u7684\u73B0\u503C\u3002',\r\n        'a': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u5E74\u91D1\u6295\u8D44\u7684\u73B0\u503C\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pmt',\r\n            'detail': '\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u989D\uFF0C\u5728\u5E74\u91D1\u5468\u671F\u5185\u4E0D\u80FD\u66F4\u6539\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': 'D2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACCRINT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u8BC1\u5238\u7684\u5E94\u8BA1\u5229\u606F\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u8BC1\u5238\u7684\u5E94\u8BA1\u5229\u606F\u3002',\r\n        'm': [6, 8],\r\n        'p': [{\r\n            'name': 'issue',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u53D1\u884C\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'first_interest',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u9996\u6B21\u8BA1\u606F\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'rate',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'par',\r\n            'detail': '\u8BC1\u5238\u7684\u7968\u9762\u503C\u3002',\r\n            'example': '10000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5\u201D - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'calc_method',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3ATRUE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u6307\u5B9A\u5F53\u7ED3\u7B97\u65E5\u671F\u665A\u4E8E\u9996\u6B21\u8BA1\u606F\u65E5\u671F\u65F6\u7528\u4E8E\u8BA1\u7B97\u603B\u5E94\u8BA1\u5229\u606F\u7684\u65B9\u6CD5\u3002\\n\\n\u5982\u679C\u503C\u4E3A TRUE\uFF0C\u5219\u8FD4\u56DE\u4ECE\u53D1\u884C\u65E5\u5230\u7ED3\u7B97\u65E5\u7684\u603B\u5E94\u8BA1\u5229\u606F\u3002\\n\\n\u5982\u679C\u503C\u4E3A FALSE\uFF0C\u5219\u8FD4\u56DE\u4ECE\u9996\u6B21\u8BA1\u606F\u65E5\u5230\u7ED3\u7B97\u65E5\u7684\u5E94\u8BA1\u5229\u606F\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ACCRINTM',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u5230\u671F\u65E5\u652F\u4ED8\u5229\u606F\u7684\u6709\u4EF7\u8BC1\u5238\u7684\u5E94\u8BA1\u5229\u606F\u3002',\r\n        'a': '\u8FD4\u56DE\u5728\u5230\u671F\u65E5\u652F\u4ED8\u5229\u606F\u7684\u6709\u4EF7\u8BC1\u5238\u7684\u5E94\u8BA1\u5229\u606F\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'issue',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u53D1\u884C\u65E5\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'rate',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'par',\r\n            'detail': '\u8BC1\u5238\u7684\u7968\u9762\u503C\u3002',\r\n            'example': '1000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYBS',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4ECE\u4ED8\u606F\u671F\u5F00\u59CB\u5230\u7ED3\u7B97\u65E5\u7684\u5929\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4ECE\u4ED8\u606F\u671F\u5F00\u59CB\u5230\u7ED3\u7B97\u65E5\u7684\u5929\u6570\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYS',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u7ED3\u7B97\u65E5\u6240\u5728\u7684\u4ED8\u606F\u671F\u7684\u5929\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED3\u7B97\u65E5\u6240\u5728\u7684\u4ED8\u606F\u671F\u7684\u5929\u6570\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYSNC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4ECE\u7ED3\u7B97\u65E5\u5230\u4E0B\u4E00\u7968\u606F\u652F\u4ED8\u65E5\u4E4B\u95F4\u7684\u5929\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4ECE\u7ED3\u7B97\u65E5\u5230\u4E0B\u4E00\u7968\u606F\u652F\u4ED8\u65E5\u4E4B\u95F4\u7684\u5929\u6570\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPNCD',\r\n        't': 8,\r\n        'd': '\u8BA1\u7B97\u7ED3\u7B97\u65E5\u4E4B\u540E\u7684\u4E0B\u4E00\u7968\u606F\u6216\u5229\u606F\u6D3E\u53D1\u65E5\u671F\u3002',\r\n        'a': '\u8BA1\u7B97\u7ED3\u7B97\u65E5\u4E4B\u540E\u7684\u4E0B\u4E00\u7968\u606F\u6216\u5229\u606F\u6D3E\u53D1\u65E5\u671F\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '01)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': 'DATE(2019',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPPCD',\r\n        't': 8,\r\n        'd': '\u8BA1\u7B97\u7ED3\u7B97\u65E5\u4E4B\u524D\u7684\u6700\u540E\u4E00\u4E2A\u7968\u606F\u6216\u5229\u606F\u652F\u4ED8\u65E5\u3002',\r\n        'a': '\u8BA1\u7B97\u7ED3\u7B97\u65E5\u4E4B\u524D\u7684\u6700\u540E\u4E00\u4E2A\u7968\u606F\u6216\u5229\u606F\u652F\u4ED8\u65E5\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '01)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': 'DATE(2019',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FV',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u5E74\u91D1\u6295\u8D44\u7684\u672A\u6765\u4EF7\u503C\u3002',\r\n        'a': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u5E74\u91D1\u6295\u8D44\u7684\u672A\u6765\u4EF7\u503C\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pmt',\r\n            'detail': '\u5404\u671F\u6240\u5E94\u652F\u4ED8\u7684\u91D1\u989D\uFF0C\u5728\u6574\u4E2A\u5E74\u91D1\u671F\u95F4\u4FDD\u6301\u4E0D\u53D8\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0 ] - \u73B0\u503C\uFF0C\u6216\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u7684\u5F53\u524D\u503C\u7684\u7D2F\u79EF\u548C\u3002',\r\n            'example': '400',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0 ] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FVSCHEDULE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5E94\u7528\u4E00\u7CFB\u5217\u590D\u5229\u7387\u8BA1\u7B97\u7684\u521D\u59CB\u672C\u91D1\u7684\u672A\u6765\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5E94\u7528\u4E00\u7CFB\u5217\u590D\u5229\u7387\u8BA1\u7B97\u7684\u521D\u59CB\u672C\u91D1\u7684\u672A\u6765\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'principal',\r\n            'detail': '\u73B0\u503C\u3002',\r\n            'example': '10000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'schedule',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u672C\u91D1\u590D\u5229\u7684\u4E00\u7EC4\u5229\u7387\u3002\\n\\n\u5229\u7387\u8868\u5FC5\u987B\u662F\u8303\u56F4\u6216\u6570\u7EC4\uFF0C\u5176\u4E2D\u5305\u542B\u8981\u7528\u4E8E\u8BA1\u7B97\u590D\u5229\u7684\u4E00\u7EC4\u5229\u7387\u3002\u8FD9\u4E9B\u5229\u7387\u503C\u5E94\u8BE5\u4EE5\u5341\u8FDB\u5236\u5C0F\u6570\u5F62\u5F0F\u8868\u793A\uFF0C\u6216\u8005\u4F7F\u7528UNARY_PERCENT\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8868\u793A\uFF0C\u5373\u8868\u793A\u4E3A0.09\u6216UNARY_PERCENT(9)\uFF0C\u800C\u4E0D\u8981\u8868\u793A\u4E3A9\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'YIELD',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u652F\u4ED8\u5229\u606F\u7684\u503A\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u652F\u4ED8\u5229\u606F\u7684\u503A\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'm': [6, 7],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'rate',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.057',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pr',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'YIELDDISC',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u4EF7\u683C\u8BA1\u7B97\u6298\u4EF7\u53D1\u884C\u7684\uFF08\u4E0D\u5E26\u606F\uFF09\u503A\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u4E8E\u4EF7\u683C\u8BA1\u7B97\u6298\u4EF7\u53D1\u884C\u7684\uFF08\u4E0D\u5E26\u606F\uFF09\u503A\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'pr',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NOMINAL',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u7ED9\u5B9A\u7684\u5B9E\u9645\u5229\u7387\u548C\u5E74\u590D\u5229\u671F\u6570\uFF0C\u8FD4\u56DE\u540D\u4E49\u5E74\u5229\u7387\u3002',\r\n        'a': '\u57FA\u4E8E\u7ED9\u5B9A\u7684\u5B9E\u9645\u5229\u7387\u548C\u5E74\u590D\u5229\u671F\u6570\uFF0C\u8FD4\u56DE\u540D\u4E49\u5E74\u5229\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'effect_rate',\r\n            'detail': '\u6BCF\u5E74\u7684\u5B9E\u9645\u5229\u7387\u3002',\r\n            'example': '0.85',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'npery',\r\n            'detail': '\u6BCF\u5E74\u7684\u590D\u5229\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'XIRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7EC4\u4E0D\u4E00\u5B9A\u5B9A\u671F\u53D1\u751F\u7684\u73B0\u91D1\u6D41\u7684\u5185\u90E8\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7EC4\u4E0D\u4E00\u5B9A\u5B9A\u671F\u53D1\u751F\u7684\u73B0\u91D1\u6D41\u7684\u5185\u90E8\u6536\u76CA\u7387\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'values',\r\n            'detail': '\u5176\u4E2D\u542B\u6709\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002\\n\\n\u73B0\u91D1\u6D41\u6570\u989D\u4E2D\u5FC5\u987B\u81F3\u5C11\u5305\u542B\u4E00\u9879\u8D1F\u7684\u548C\u4E00\u9879\u6B63\u7684\u73B0\u91D1\u6D41\u91D1\u989D\u624D\u80FD\u8BA1\u7B97\u56DE\u62A5\u7387\u3002',\r\n            'example': 'B2:B25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'dates',\r\n            'detail': '\u4E0E\u73B0\u91D1\u6D41\u6570\u989D\u53C2\u6570\u4E2D\u7684\u73B0\u91D1\u6D41\u5BF9\u5E94\u7684\u65E5\u671F\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'C2:C25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'guess',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0.1] - \u5BF9\u5185\u90E8\u56DE\u62A5\u7387\u7684\u4F30\u7B97\u503C\u3002',\r\n            'example': '250',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MIRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7CFB\u5217\u5B9A\u671F\u73B0\u91D1\u6D41\u7684\u4FEE\u6539\u540E\u5185\u90E8\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7CFB\u5217\u5B9A\u671F\u73B0\u91D1\u6D41\u7684\u4FEE\u6539\u540E\u5185\u90E8\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'values',\r\n            'detail': '\u5176\u4E2D\u542B\u6709\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002\\n\\n\u73B0\u91D1\u6D41\u6570\u989D\u4E2D\u5FC5\u987B\u81F3\u5C11\u5305\u542B\u4E00\u9879\u8D1F\u7684\u548C\u4E00\u9879\u6B63\u7684\u73B0\u91D1\u6D41\u91D1\u989D\u624D\u80FD\u8BA1\u7B97\u56DE\u62A5\u7387\u3002',\r\n            'example': 'A2:A25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'finance_rate',\r\n            'detail': '\u73B0\u91D1\u6D41\u4E2D\u4F7F\u7528\u7684\u8D44\u91D1\u652F\u4ED8\u7684\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'reinvest_rate',\r\n            'detail': '\u5C06\u73B0\u91D1\u6D41\u518D\u6295\u8D44\u7684\u6536\u76CA\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u7531\u503C\u4E2D\u7684\u6570\u5B57\u8868\u793A\u7684\u4E00\u7CFB\u5217\u73B0\u91D1\u6D41\u7684\u5185\u90E8\u6536\u76CA\u7387\u3002 ',\r\n        'a': '\u8FD4\u56DE\u7531\u503C\u4E2D\u7684\u6570\u5B57\u8868\u793A\u7684\u4E00\u7CFB\u5217\u73B0\u91D1\u6D41\u7684\u5185\u90E8\u6536\u76CA\u7387\u3002 ',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'values',\r\n            'detail': '\u5176\u4E2D\u542B\u6709\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002\\n\\n\u73B0\u91D1\u6D41\u6570\u989D\u4E2D\u5FC5\u987B\u81F3\u5C11\u5305\u542B\u4E00\u9879\u8D1F\u7684\u548C\u4E00\u9879\u6B63\u7684\u73B0\u91D1\u6D41\u91D1\u989D\u624D\u80FD\u8BA1\u7B97\u56DE\u62A5\u7387\u3002',\r\n            'example': 'A2:A25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'guess',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A 0.1] - \u5185\u90E8\u6536\u76CA\u7387\u7684\u4F30\u503C\u3002',\r\n            'example': '200',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NPV',\r\n        't': 8,\r\n        'd': '\u4F7F\u7528\u8D34\u73B0\u7387\u548C\u4E00\u7CFB\u5217\u672A\u6765\u652F\u51FA\uFF08\u8D1F\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u6765\u8BA1\u7B97\u4E00\u9879\u6295\u8D44\u7684\u51C0\u73B0\u503C\u3002',\r\n        'a': '\u4F7F\u7528\u8D34\u73B0\u7387\u548C\u4E00\u7CFB\u5217\u672A\u6765\u652F\u51FA\uFF08\u8D1F\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u6765\u8BA1\u7B97\u4E00\u9879\u6295\u8D44\u7684\u51C0\u73B0\u503C\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u67D0\u4E00\u671F\u95F4\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value1',\r\n            'detail': '\u7B2C\u4E00\u7B14\u652F\u51FA\uFF08\u8D1F\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u3002',\r\n            'example': '200',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2, ...',\r\n            'detail': '[\u53EF\u9009] - \u5176\u4ED6\u652F\u51FA\uFF08\u8D1F\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u3002',\r\n            'example': '250',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'XNPV',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7EC4\u73B0\u91D1\u6D41\u7684\u51C0\u73B0\u503C\uFF0C\u8FD9\u4E9B\u73B0\u91D1\u6D41\u4E0D\u4E00\u5B9A\u5B9A\u671F\u53D1\u751F\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7EC4\u73B0\u91D1\u6D41\u7684\u51C0\u73B0\u503C\uFF0C\u8FD9\u4E9B\u73B0\u91D1\u6D41\u4E0D\u4E00\u5B9A\u5B9A\u671F\u53D1\u751F\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5E94\u7528\u4E8E\u73B0\u91D1\u6D41\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'values',\r\n            'detail': '\u4E0E dates \u4E2D\u7684\u652F\u4ED8\u65F6\u95F4\u76F8\u5BF9\u5E94\u7684\u4E00\u7CFB\u5217\u73B0\u91D1\u6D41\u3002',\r\n            'example': 'B2:B25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'dates',\r\n            'detail': '\u4E0E\u73B0\u91D1\u6D41\u652F\u4ED8\u76F8\u5BF9\u5E94\u7684\u652F\u4ED8\u65E5\u671F\u8868\u3002',\r\n            'example': 'C2:C25',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'CUMIPMT',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u6295\u8D44\u5728\u4E00\u7CFB\u5217\u4ED8\u6B3E\u671F\u5185\u7684\u7D2F\u8BA1\u5229\u606F\u3002',\r\n        'a': '\u57FA\u4E8E\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\uFF0C\u8BA1\u7B97\u6295\u8D44\u5728\u4E00\u7CFB\u5217\u4ED8\u6B3E\u671F\u5185\u7684\u7D2F\u8BA1\u5229\u606F\u3002',\r\n        'm': [6, 6],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5229\u606F\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u603B\u4ED8\u6B3E\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'start_period',\r\n            'detail': '\u5F00\u59CB\u7D2F\u8BA1\u8BA1\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u53F7\u3002\\n\\n\u9996\u671F\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'end_period',\r\n            'detail': '\u7ED3\u675F\u7D2F\u8BA1\u8BA1\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u53F7\u3002\\n\\n\u672B\u671F\u5FC5\u987B\u5927\u4E8E\u9996\u671F\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PMT',\r\n        't': 8,\r\n        'd': '\u7528\u4E8E\u6839\u636E\u56FA\u5B9A\u4ED8\u6B3E\u989D\u548C\u56FA\u5B9A\u5229\u7387\u8BA1\u7B97\u8D37\u6B3E\u7684\u4ED8\u6B3E\u989D\u3002',\r\n        'a': '\u7528\u4E8E\u6839\u636E\u56FA\u5B9A\u4ED8\u6B3E\u989D\u548C\u56FA\u5B9A\u5229\u7387\u8BA1\u7B97\u8D37\u6B3E\u7684\u4ED8\u6B3E\u989D\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u8D37\u6B3E\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u8BE5\u9879\u8D37\u6B3E\u7684\u4ED8\u6B3E\u603B\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\uFF0C\u6216\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u989D\u73B0\u5728\u6240\u503C\u7684\u603B\u989D\uFF0C\u4E5F\u53EB\u672C\u91D1\u3002',\r\n            'example': ' 100000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': 'D2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IPMT',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u65B9\u5F0F\uFF0C\u8FD4\u56DE\u7ED9\u5B9A\u671F\u6570\u5185\u5BF9\u6295\u8D44\u7684\u5229\u606F\u507F\u8FD8\u989D\u3002',\r\n        'a': '\u57FA\u4E8E\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u65B9\u5F0F\uFF0C\u8FD4\u56DE\u7ED9\u5B9A\u671F\u6570\u5185\u5BF9\u6295\u8D44\u7684\u5229\u606F\u507F\u8FD8\u989D\u3002',\r\n        'm': [4, 6],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'per',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u5176\u5229\u606F\u6570\u989D\u7684\u671F\u6570\uFF0C\u5FC5\u987B\u5728 1 \u5230 nper \u4E4B\u95F4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\uFF0C\u6216\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u7684\u5F53\u524D\u503C\u7684\u7D2F\u79EF\u548C\u3002',\r\n            'example': '80000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': 'E2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PPMT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6839\u636E\u5B9A\u671F\u56FA\u5B9A\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\u800C\u5B9A\u7684\u6295\u8D44\u5728\u5DF2\u77E5\u671F\u95F4\u5185\u7684\u672C\u91D1\u507F\u4ED8\u989D\u3002',\r\n        'a': '\u8FD4\u56DE\u6839\u636E\u5B9A\u671F\u56FA\u5B9A\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\u800C\u5B9A\u7684\u6295\u8D44\u5728\u5DF2\u77E5\u671F\u95F4\u5185\u7684\u672C\u91D1\u507F\u4ED8\u989D\u3002',\r\n        'm': [4, 6],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'per',\r\n            'detail': '\u6307\u5B9A\u671F\u6570\uFF0C\u8BE5\u503C\u5FC5\u987B\u5728 1 \u5230 nper \u8303\u56F4\u5185\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'nper',\r\n            'detail': '\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002',\r\n            'example': '3*12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\u5373\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u5F53\u524D\u503C\u7684\u603B\u548C\u3002',\r\n            'example': '100000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INTRATE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B8C\u5168\u6295\u8D44\u578B\u8BC1\u5238\u7684\u5229\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5B8C\u5168\u6295\u8D44\u578B\u8BC1\u5238\u7684\u5229\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'investment',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u6295\u8D44\u989D\u3002',\r\n            'example': '100000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u5230\u671F\u65F6\u7684\u5151\u6362\u503C\u3002',\r\n            'example': '101200',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'm': [6, 7],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'rate',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.057',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'yld',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.065',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICEDISC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6298\u4EF7\u53D1\u884C\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u6298\u4EF7\u53D1\u884C\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'discount',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '0.0525',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICEMAT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5230\u671F\u4ED8\u606F\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u5230\u671F\u4ED8\u606F\u7684\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'issue',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u53D1\u884C\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'rate',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u5728\u53D1\u884C\u65E5\u7684\u5229\u7387\u3002',\r\n            'example': '0.061',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'yld',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.061',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RECEIVED',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u6B21\u6027\u4ED8\u606F\u7684\u6709\u4EF7\u8BC1\u5238\u5230\u671F\u6536\u56DE\u7684\u91D1\u989D\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u6B21\u6027\u4ED8\u606F\u7684\u6709\u4EF7\u8BC1\u5238\u5230\u671F\u6536\u56DE\u7684\u91D1\u989D\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'investment',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u6295\u8D44\u989D\u3002',\r\n            'example': '10000000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'discount',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '0.0575',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DISC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'pr',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\uFF08\u6309\u9762\u503C\u4E3A \uFFE5100 \u8BA1\u7B97\uFF09\u3002',\r\n            'example': '97.975',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'redemption',\r\n            'detail': '\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NPER',\r\n        't': 8,\r\n        'd': '\u57FA\u4E8E\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u65B9\u5F0F\uFF0C\u8FD4\u56DE\u67D0\u9879\u6295\u8D44\u7684\u603B\u671F\u6570\u3002',\r\n        'a': '\u57FA\u4E8E\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u989D\u5206\u671F\u4ED8\u6B3E\u65B9\u5F0F\uFF0C\u8FD4\u56DE\u67D0\u9879\u6295\u8D44\u7684\u603B\u671F\u6570\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name': 'rate',\r\n            'detail': '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pmt',\r\n            'detail': '\u5404\u671F\u6240\u5E94\u652F\u4ED8\u7684\u91D1\u989D\uFF0C\u5728\u6574\u4E2A\u5E74\u91D1\u671F\u95F4\u4FDD\u6301\u4E0D\u53D8\u3002',\r\n            'example': '500',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'pv',\r\n            'detail': '\u73B0\u503C\uFF0C\u6216\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u7684\u5F53\u524D\u503C\u7684\u7D2F\u79EF\u548C\u3002',\r\n            'example': '40000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'fv',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u672A\u6765\u503C\uFF0C\u6216\u5728\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'type',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\u3002\\n\\n0 \u8868\u793A\u671F\u672B\uFF1B\\n\\n1 \u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SLN',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u671F\u95F4\u5185\u7684\u8D44\u4EA7\u7684\u76F4\u7EBF\u6298\u65E7\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u671F\u95F4\u5185\u7684\u8D44\u4EA7\u7684\u76F4\u7EBF\u6298\u65E7\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'cost',\r\n            'detail': '\u8D44\u4EA7\u539F\u503C\u3002',\r\n            'example': '300000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'salvage',\r\n            'detail': '\u6298\u65E7\u672B\u5C3E\u65F6\u7684\u503C\uFF08\u6709\u65F6\u4E5F\u79F0\u4E3A\u8D44\u4EA7\u6B8B\u503C\uFF09\u3002',\r\n            'example': '75000',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'life',\r\n            'detail': '\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\uFF08\u6709\u65F6\u4E5F\u79F0\u4F5C\u8D44\u4EA7\u7684\u4F7F\u7528\u5BFF\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DURATION',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5047\u8BBE\u9762\u503C \uFFE5100 \u7684\u5B9A\u671F\u4ED8\u606F\u6709\u4EF7\u8BC1\u5238\u7684\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'a': '\u8FD4\u56DE\u5047\u8BBE\u9762\u503C \uFFE5100 \u7684\u5B9A\u671F\u4ED8\u606F\u6709\u4EF7\u8BC1\u5238\u7684\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'coupon',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'yld',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MDURATION',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5047\u8BBE\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684 Macauley \u4FEE\u6B63\u671F\u9650\u3002',\r\n        'a': '\u8FD4\u56DE\u5047\u8BBE\u9762\u503C \uFFE5100 \u7684\u6709\u4EF7\u8BC1\u5238\u7684 Macauley \u4FEE\u6B63\u671F\u9650\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name': 'settlement',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\u3002 \u6709\u4EF7\u8BC1\u5238\u7ED3\u7B97\u65E5\u662F\u5728\u53D1\u884C\u65E5\u4E4B\u540E\uFF0C\u6709\u4EF7\u8BC1\u5238\u5356\u7ED9\u8D2D\u4E70\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'maturity',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\u3002 \u5230\u671F\u65E5\u662F\u6709\u4EF7\u8BC1\u5238\u6709\u6548\u671F\u622A\u6B62\u65F6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'coupon',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'yld',\r\n            'detail': '\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'frequency',\r\n            'detail': '\u5E74\u4ED8\u606F\u6B21\u6570\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8\uFF0Cfrequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8\uFF0Cfrequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8\uFF0Cfrequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'basis',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A0] - \u6307\u793A\u8981\u4F7F\u7528\u54EA\u79CD\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\u201C\u7F8E\u56FD(NASD) 30/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u56FD\u5168\u56FD\u8BC1\u5238\u4EA4\u6613\u5546\u534F\u4F1A\u6807\u51C6\uFF0C\u5047\u8BBE\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\uFF0C\u5E76\u5BF9\u6240\u8F93\u5165\u7684\u6708\u672B\u65E5\u671F\u8FDB\u884C\u5177\u4F53\u8C03\u6574\u3002\\n\\n1\u8868\u793A\u201C\u5B9E\u9645/\u5B9E\u9645\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8BA1\u7B97\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u4E8E\u7F8E\u56FD\u957F\u671F\u503A\u5238\uFF0C\u4E5F\u662F\u5728\u975E\u8D22\u7ECF\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\u201C\u5B9E\u9645/360\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A360\u5929\u3002\\n\\n3\u8868\u793A\u201C\u5B9E\u9645/365\u201D\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u4E8E\u6307\u5B9A\u65E5\u671F\u4E4B\u95F4\u7684\u5B9E\u9645\u5929\u6570\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u5047\u5B9A\u6BCF\u5E74\u4E3A365\u5929\u3002\\n\\n4\u8868\u793A\u201C\u6B27\u6D3230/360\u201D\u65B9\u6CD5 - \u7C7B\u4F3C\u4E8E0\uFF0C\u6B64\u65B9\u6CD5\u57FA\u4E8E\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u8FDB\u884C\u8BA1\u7B97\uFF0C\u4F46\u6309\u7167\u6B27\u6D32\u91D1\u878D\u60EF\u4F8B\u5BF9\u6708\u672B\u65E5\u671F\u8FDB\u884C\u8C03\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2DEC',\r\n        't': 9,\r\n        'd': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768410\u4F4D\u4E8C\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5BF9\u4E8E\u6B64\u51FD\u6570\uFF0C\u6700\u5927\u7684\u6B63\u6570\u8F93\u5165\u503C\u4E3A0111111111\uFF0C\u6700\u5C0F\u7684\u8D1F\u6570\u8F93\u5165\u503C\u4E3A1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u4E8C\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CBIN2DEC(100)\u548CBIN2DEC(\"100\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A4\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2HEX',\r\n        't': 9,\r\n        'd': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768410\u4F4D\u4E8C\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5BF9\u4E8E\u6B64\u51FD\u6570\uFF0C\u6700\u5927\u7684\u6B63\u6570\u8F93\u5165\u503C\u4E3A0111111111\uFF0C\u6700\u5C0F\u7684\u8D1F\u6570\u8F93\u5165\u503C\u4E3A1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u4E8C\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CBIN2HEX(11111)\u548CBIN2HEX(\"11111\")\u5F97\u51FA \u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A1F\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\u4F8B\u5982\uFF0CBIN2HEX(\"11111\",8)\u6240\u5F97\u7684\u7ED3\u679C\u503C\u4E3A0000001F\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E1000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2OCT',\r\n        't': 9,\r\n        'd': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u4E8C\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768410\u4F4D\u4E8C\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5BF9\u4E8E\u6B64\u51FD\u6570\uFF0C\u6700\u5927\u7684\u6B63\u6570\u8F93\u5165\u503C\u4E3A0111111111\uFF0C\u6700\u5C0F\u7684\u8D1F\u6570\u8F93\u5165\u503C\u4E3A1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u4E8C\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CBIN2OCT(11111)\u548CBIN2OCT(\"11111\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A37\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\u4F8B\u5982\uFF0CBIN2OCT(\"11111\")\u5F97\u5230\u7684\u7ED3\u679C\u503C\u4E3A00000037\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E1000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2BIN',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u5341\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5BF9\u4E8E\u6B64\u51FD\u6570\uFF0C\u6700\u5927\u7684\u6B63\u6570\u8F93\u5165\u503C\u4E3A511\uFF0C\u6700\u5C0F\u7684\u8D1F\u6570\u8F93\u5165\u503C\u4E3A-512\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CDEC2BIN(199)\u548CDEC2BIN(\"199\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A11000111\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5341\u8FDB\u5236\u6570\u4E3A\u8D1F\u6570\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2HEX',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u5341\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A549755813887\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A-549755814888\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CDEC2HEX(100)\u548CDEC2HEX(\"100\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A64\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5341\u8FDB\u5236\u6570\u4E3A\u8D1F\u6570\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2OCT',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u5341\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A536870911\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A-53687092\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u8FDB\u5236\u6570\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CDEC2OCT(199)\u548CDEC2OCT(\"199\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A307\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5341\u8FDB\u5236\u6570\u4E3A\u8D1F\u6570\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2BIN',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768440\u4F4D\u5341\u516D\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A1FF\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3AFFFFFFFE00\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u516D\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CHEX2BIN(199)\u548CHEX2BIN(\"199\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A110011001\u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E8000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2DEC',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768440\u4F4D\u5341\u516D\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A7fffffffff\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A8000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u516D\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CHEX2DEC(199)\u548CHEX2DEC(\"199\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A409\u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2OCT',\r\n        't': 9,\r\n        'd': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u5341\u516D\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u516B\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768440\u4F4D\u5341\u516D\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A1FFFFFFF\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3AFFE0000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u5341\u516D\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0CHEX2OCT(199)\u548CHEX2OCT(\"199\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A631\u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u7ED9\u5B9A\u7684\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E8000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2BIN',\r\n        't': 9,\r\n        'd': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u4E8C\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u4E8C\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768430\u4F4D\u516B\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A777\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A7777777000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u516B\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0COCT2BIN(177)\u548COCT2BIN(\"177\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A1111111\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u7ED9\u5B9A\u7684\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E4000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2DEC',\r\n        't': 9,\r\n        'd': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5341\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768430\u4F4D\u516B\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684ba\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A3777777777\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A4000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u516B\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0COCT2DEC(177)\u548COCT2DEC(\"177\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A127\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2HEX',\r\n        't': 9,\r\n        'd': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'a': '\u5C06\u516B\u8FDB\u5236\u6570\u8F6C\u6362\u4E3A\u5341\u516D\u8FDB\u5236\u6570\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5E26\u7B26\u53F7\u7684\u5341\u516D\u8FDB\u5236\u6570\u7684\u5E26\u7B26\u53F7\u768430\u4F4D\u516B\u8FDB\u5236\u6570\u503C\uFF08\u4EE5\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E26\u7B26\u53F7\u7684ba\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u53F7\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8BF4\uFF0C\u8D1F\u6570\u662F\u4EE5\u4E8C\u7684\u8865\u7801\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6570\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6570\u503C\u4E3A3777777777\uFF0C\u6700\u5C0F\u8D1F\u6570\u503C\u4E3A4000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u662F\u6709\u6548\u7684\u516B\u8FDB\u5236\u6570\uFF0C\u51FD\u6570\u4F1A\u81EA\u52A8\u5C06\u5176\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u5B57\u7B26\u4E32\u8F93\u5165\u3002\u4F8B\u5982\uFF0COCT2HEX(177)\u548COCT2HEX(\"177\")\u5F97\u51FA\u7684\u7ED3\u679C\u76F8\u540C\uFF0C\u5747\u4E3A7F\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'places',\r\n            'detail': '[ \u53EF\u9009 ] - \u7ED3\u679C\u4E2D\u8981\u786E\u4FDD\u7684\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u8BBE\u7F6E\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u7ED3\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6570\uFF0C\u5219\u5728\u7ED3\u679C\u7684\u5DE6\u4FA7\u586B\u51450\uFF0C\u4F7F\u603B\u6709\u6548\u4F4D\u6570\u8FBE\u5230\u6709\u6548\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u7684\u6700\u9AD8\u4F4D\u4E3A1\uFF0C\u5219\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u5F53\u7ED9\u5B9A\u7684\u5E26\u7B26\u53F7\u7684\u516B\u8FDB\u5236\u6570\u5927\u4E8E\u7B49\u4E8E4000000000\u65F6\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COMPLEX',\r\n        't': 9,\r\n        'd': '\u5C06\u5B9E\u7CFB\u6570\u53CA\u865A\u7CFB\u6570\u8F6C\u6362\u4E3A x+yi \u6216 x+yj \u5F62\u5F0F\u7684\u590D\u6570\u3002',\r\n        'a': '\u5C06\u5B9E\u7CFB\u6570\u53CA\u865A\u7CFB\u6570\u8F6C\u6362\u4E3A x+yi \u6216 x+yj \u5F62\u5F0F\u7684\u590D\u6570\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'real_num',\r\n            'detail': '\u590D\u6570\u7684\u5B9E\u7CFB\u6570\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'i_num',\r\n            'detail': '\u590D\u6570\u7684\u865A\u7CFB\u6570\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'suffix',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A \"i\"] - \u590D\u6570\u4E2D\u865A\u7CFB\u6570\u7684\u540E\u7F00\u3002',\r\n            'example': '\"j\"',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangestring'\r\n        }]\r\n    }, {\r\n        'n': 'IMREAL',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u5B9E\u7CFB\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u5B9E\u7CFB\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'inumber',\r\n            'detail': '\u9700\u8981\u8BA1\u7B97\u5176\u5B9E\u7CFB\u6570\u7684\u590D\u6570\u3002',\r\n            'example': '\"4+5i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMAGINARY',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u865A\u7CFB\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u865A\u7CFB\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'inumber',\r\n            'detail': '\u9700\u8981\u8BA1\u7B97\u5176\u865A\u7CFB\u6570\u7684\u590D\u6570\u3002',\r\n            'example': '\"4+5i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMCONJUGATE',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u5171\u8F6D\u590D\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u5171\u8F6D\u590D\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'inumber',\r\n            'detail': '\u9700\u8981\u8BA1\u7B97\u5176\u5171\u8F6D\u6570\u7684\u590D\u6570\u3002',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMABS',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u7EDD\u5BF9\u503C\uFF08\u6A21\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u590D\u6570\u7684\u7EDD\u5BF9\u503C\uFF08\u6A21\uFF09\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'inumber',\r\n            'detail': '\u8981\u8BA1\u7B97\u5176\u7EDD\u5BF9\u503C\u7684\u590D\u6570\u3002',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DELTA',\r\n        't': 9,\r\n        'd': '\u68C0\u9A8C\u4E24\u4E2A\u503C\u662F\u5426\u76F8\u7B49\u3002 \u5982\u679C number1=number2\uFF0C\u5219\u8FD4\u56DE 1\uFF1B\u5426\u5219\u8FD4\u56DE 0\u3002',\r\n        'a': '\u68C0\u9A8C\u4E24\u4E2A\u503C\u662F\u5426\u76F8\u7B49\u3002 \u5982\u679C number1=number2\uFF0C\u5219\u8FD4\u56DE 1\uFF1B\u5426\u5219\u8FD4\u56DE 0\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'number1',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u6570\u5B57\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'number2',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A 0] - \u7B2C\u4E8C\u4E2A\u6570\u5B57\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IMSUM',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u4E2A\u590D\u6570\u7684\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u4E2A\u590D\u6570\u7684\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'inumber1',\r\n            'detail': '\u8981\u76F8\u52A0\u7684\u7B2C\u4E00\u4E2A\u590D\u6570',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'inumber2, \u2026',\r\n            'detail': '[\u53EF\u9009] - \u8981\u4E0E\u503C1 \u76F8\u52A0\u7684\u5176\u4ED6\u590D\u6570',\r\n            'example': '\"5-3i\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMSUB',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u4E24\u4E2A\u590D\u6570\u7684\u5DEE\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u4E24\u4E2A\u590D\u6570\u7684\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'inumber1',\r\n            'detail': '\u4ECE\uFF08\u590D\uFF09\u6570\u4E2D\u51CF\u53BB inumber2\u3002',\r\n            'example': '\"6+5i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'inumber2',\r\n            'detail': '\u4ECE inumber1 \u4E2D\u51CF\uFF08\u590D\uFF09\u6570\u3002',\r\n            'example': '\"2+3i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMPRODUCT',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u4E2A\u590D\u6570\u7684\u4E58\u79EF\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u4E2A\u590D\u6570\u7684\u4E58\u79EF\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'inumber1',\r\n            'detail': '\u7528\u4E8E\u8BA1\u7B97\u4E58\u79EF\u7684\u7B2C\u4E00\u4E2A\u590D\u6570',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'inumber2, \u2026',\r\n            'detail': '[\u53EF\u9009] - \u8981\u76F8\u4E58\u7684\u5176\u4ED6\u590D\u6570\u3002',\r\n            'example': '\"5-3i\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMDIV',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u4E24\u4E2A\u590D\u6570\u7684\u5546\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u4E24\u4E2A\u590D\u6570\u7684\u5546\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'inumber1',\r\n            'detail': '\u590D\u6570\u5206\u5B50\u6216\u88AB\u9664\u6570\u3002',\r\n            'example': '\"11+16i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'inumber2',\r\n            'detail': '\u590D\u6570\u5206\u6BCD\u6216\u9664\u6570\u3002',\r\n            'example': '\"3+2i\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NOT',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u67D0\u4E2A\u903B\u8F91\u503C\u7684\u76F8\u53CD\u503C - \u201CNOT(TRUE())\u201D\u5C06\u8FD4\u56DE FALSE\uFF1B\u201CNOT(FALSE())\u201D\u5C06\u8FD4\u56DE TRUE\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u4E2A\u903B\u8F91\u503C\u7684\u76F8\u53CD\u503C - \u201CNOT(TRUE())\u201D\u5C06\u8FD4\u56DE FALSE\uFF1B\u201CNOT(FALSE())\u201D\u5C06\u8FD4\u56DE TRUE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'logical',\r\n            'detail': '\u8BA1\u7B97\u7ED3\u679C\u4E3A TRUE \u6216 FALSE \u7684\u4EFB\u4F55\u503C\u6216\u8868\u8FBE\u5F0F\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TRUE',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u903B\u8F91\u503C TRUE\u3002',\r\n        'a': '\u8FD4\u56DE\u903B\u8F91\u503C TRUE\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'FALSE',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u903B\u8F91\u503C FALSE\u3002',\r\n        'a': '\u8FD4\u56DE\u903B\u8F91\u503C FALSE\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'AND',\r\n        't': 10,\r\n        'd': '\u6240\u6709\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A TRUE \u65F6\uFF0C\u8FD4\u56DE TRUE\uFF1B\u53EA\u8981\u6709\u4E00\u4E2A\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A FALSE\uFF0C\u5373\u8FD4\u56DE FALSE\u3002',\r\n        'a': '\u6240\u6709\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A TRUE \u65F6\uFF0C\u8FD4\u56DE TRUE\uFF1B\u53EA\u8981\u6709\u4E00\u4E2A\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A FALSE\uFF0C\u5373\u8FD4\u56DE FALSE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'logical1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u7684\u7B2C\u4E00\u4E2A\u6761\u4EF6\uFF0C\u5176\u8BA1\u7B97\u7ED3\u679C\u53EF\u4EE5\u4E3A TRUE \u6216 FALSE\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'logical2,...',\r\n            'detail': '[\u53EF\u9009] - \u8981\u6D4B\u8BD5\u7684\u5176\u4ED6\u6761\u4EF6\uFF0C\u5176\u8BA1\u7B97\u7ED3\u679C\u53EF\u4EE5\u4E3A TRUE \u6216 FALSE\uFF0C\u6700\u591A\u53EF\u5305\u542B 255 \u4E2A\u6761\u4EF6\u3002',\r\n            'example': 'A3 = \"bar\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IFERROR',\r\n        't': 10,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E0D\u662F\u9519\u8BEF\u503C\uFF0C\u5C31\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u53C2\u6570\uFF1B\u5426\u5219\uFF0C\u8FD4\u56DE\u7B2C\u4E8C\u4E2A\u53C2\u6570\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E0D\u662F\u9519\u8BEF\u503C',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u68C0\u67E5\u662F\u5426\u5B58\u5728\u9519\u8BEF\u7684\u53C2\u6570\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value_if_error',\r\n            'detail': '\u516C\u5F0F\u7684\u8BA1\u7B97\u7ED3\u679C\u9519\u8BEF\u65F6\u8FD4\u56DE\u7684\u503C\u3002 \u8BA1\u7B97\u4EE5\u4E0B\u9519\u8BEF\u7C7B\u578B\uFF1A#N/A\u3001#VALUE!\u3001#REF!\u3001#DIV/0!\u3001#NUM!\u3001#NAME? \u6216 #NULL!\u3002',\r\n            'example': '\"Error in cell A1\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IF',\r\n        't': 10,\r\n        'd': '\u5F53\u903B\u8F91\u8868\u8FBE\u5F0F\u7684\u503C\u4E3A TRUE \u65F6\u8FD4\u56DE\u4E00\u4E2A\u503C\uFF0C\u800C\u5F53\u5176\u4E3A FALSE \u65F6\u8FD4\u56DE\u53E6\u4E00\u4E2A\u503C\u3002',\r\n        'a': '\u5F53\u903B\u8F91\u8868\u8FBE\u5F0F\u7684\u503C\u4E3A TRUE \u65F6\u8FD4\u56DE\u4E00\u4E2A\u503C\uFF0C\u800C\u5F53\u5176\u4E3A FALSE \u65F6\u8FD4\u56DE\u53E6\u4E00\u4E2A\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'logical_test',\r\n            'detail': '\u4E00\u4E2A\u8868\u8FBE\u5F0F\u6216\u5BF9\u5305\u542B\u8868\u8FBE\u5F0F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u8BE5\u8868\u8FBE\u5F0F\u4EE3\u8868\u67D0\u79CD\u903B\u8F91\u503C\uFF08\u5373TRUE\u6216FALSE\uFF09\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value_if_true',\r\n            'detail': '\u5F53\u903B\u8F91\u8868\u8FBE\u5F0F\u4E3ATRUE\u65F6\u7684\u8FD4\u56DE\u503C\u3002',\r\n            'example': '\"A2 is foo\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value_if_false',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E3A\u7A7A\u767D] - \u5F53\u903B\u8F91\u8868\u8FBE\u5F0F\u7B49\u4E8EFALSE\u65F6\u7684\u51FD\u6570\u8FD4\u56DE\u503C\u3002',\r\n            'example': '\"A2 was false\"',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'OR',\r\n        't': 10,\r\n        'd': '\u53EA\u8981\u6709\u4E00\u4E2A\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A TRUE \u65F6\uFF0C\u8FD4\u56DE TRUE\uFF1B\u6240\u6709\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A FALSE\uFF0C\u5373\u8FD4\u56DE FALSE\u3002',\r\n        'a': '\u53EA\u8981\u6709\u4E00\u4E2A\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A TRUE \u65F6\uFF0C\u8FD4\u56DE TRUE\uFF1B\u6240\u6709\u53C2\u6570\u7684\u8BA1\u7B97\u7ED3\u679C\u4E3A FALSE\uFF0C\u5373\u8FD4\u56DE FALSE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'logical1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u7684\u7B2C\u4E00\u4E2A\u6761\u4EF6\uFF0C\u5176\u8BA1\u7B97\u7ED3\u679C\u53EF\u4EE5\u4E3A TRUE \u6216 FALSE\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': '\u903B\u8F91\u8868\u8FBE\u5F0F2',\r\n            'detail': '[\u53EF\u9009] - \u5176\u4ED6\u8868\u8FBE\u5F0F\u6216\u5BF9\u5305\u542B\u8868\u8FBE\u5F0F\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u8FD9\u4E9B\u8868\u8FBE\u5F0F\u4EE3\u8868\u67D0\u79CD\u903B\u8F91\u503C\uFF08\u5373TRUE\u6216FALSE\uFF09\u6216\u8005\u53EF\u4EE5\u5F3A\u5236\u8F6C\u6362\u4E3A\u903B\u8F91\u503C\u3002',\r\n            'example': ' A3 = \"bar\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u4E0D\u76F8\u7B49\uFF0C\u5219\u8FD4\u56DE\u201CTRUE\u201D\uFF1B\u5426\u5219\u8FD4\u56DE\u201CFALSE\u201D\u3002\u76F8\u5F53\u4E8E\u201C<>\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u4E0D\u76F8\u7B49\uFF0C\u5219\u8FD4\u56DE\u201CTRUE\u201D\uFF1B\u5426\u5219\u8FD4\u56DE\u201CFALSE\u201D\u3002\u76F8\u5F53\u4E8E\u201C<>\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u8981\u68C0\u67E5\u662F\u5426\u4E0E value1 \u4E0D\u76F8\u7B49\u7684\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EQ',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u76F8\u7B49\uFF0C\u5219\u8FD4\u56DE\u201CTRUE\u201D\uFF1B\u5426\u5219\u8FD4\u56DE\u201CFALSE\u201D\u3002\u76F8\u5F53\u4E8E\u201C=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u76F8\u7B49\uFF0C\u5219\u8FD4\u56DE\u201CTRUE\u201D\uFF1B\u5426\u5219\u8FD4\u56DE\u201CFALSE\u201D\u3002\u76F8\u5F53\u4E8E\u201C=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u8981\u68C0\u67E5\u662F\u5426\u4E0E value1 \u76F8\u7B49\u7684\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'GT',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E25\u683C\u5927\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C>\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E25\u683C\u5927\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C>\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5927\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'GTE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u5927\u4E8E\u6216\u7B49\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C>=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u5927\u4E8E\u6216\u7B49\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C>=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5927\u4E8E\u7B49\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LT',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E25\u683C\u5C0F\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C<\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E25\u683C\u5C0F\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C<\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5C0F\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LTE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u5C0F\u4E8E\u6216\u7B49\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C<=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u4E2A\u53C2\u6570\u5C0F\u4E8E\u6216\u7B49\u4E8E\u7B2C\u4E8C\u4E2A\uFF0C\u5219\u8FD4\u56DE TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002\u76F8\u5F53\u4E8E\u201C<=\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5C0F\u4E8E\u7B49\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ADD',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u503C\u4E4B\u548C\u3002\u76F8\u5F53\u4E8E `+` \u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u503C\u4E4B\u548C\u3002\u76F8\u5F53\u4E8E `+` \u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u52A0\u6570\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u52A0\u6570\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MINUS',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u503C\u4E4B\u5DEE\u3002\u76F8\u5F53\u4E8E\u201C-\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u503C\u4E4B\u5DEE\u3002\u76F8\u5F53\u4E8E\u201C-\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u88AB\u51CF\u6570\uFF0C\u5373\u8981\u5BF9\u5176\u8BA1\u51CF\u7684\u6570\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u51CF\u6570\uFF0C\u5373\u8981\u4ECE value1 \u4E2D\u51CF\u9664\u7684\u6570\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MULTIPLY',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u7684\u4E58\u79EF\u3002\u76F8\u5F53\u4E8E\u201C*\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u7684\u4E58\u79EF\u3002\u76F8\u5F53\u4E8E\u201C*\u201D\u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u4E58\u6570\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u4E58\u6570\u3002',\r\n            'example': 'B2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DIVIDE',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u53C2\u6570\u76F8\u9664\u6240\u5F97\u7684\u7ED3\u679C\u3002\u76F8\u5F53\u4E8E `/` \u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u53C2\u6570\u76F8\u9664\u6240\u5F97\u7684\u7ED3\u679C\u3002\u76F8\u5F53\u4E8E `/` \u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': '\u8981\u88AB\u9664\u7684\u6570\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u7528\u4E8E\u9664\u5176\u4ED6\u6570\u7684\u6570\u503C\u3002\\n\\n\u9664\u6570\u4E0D\u5F97\u4E3A0\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONCAT',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u503C\u7684\u4E32\u8054\u3002\u76F8\u5F53\u4E8E `&` \u8FD0\u7B97\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u503C\u7684\u4E32\u8054\u3002\u76F8\u5F53\u4E8E `&` \u8FD0\u7B97\u7B26\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value1',\r\n            'detail': 'value2 \u5C06\u9644\u4E8E\u5176\u540E\u7684\u503C\u3002',\r\n            'example': '\"de\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'value2',\r\n            'detail': '\u8981\u9644\u4E8E value1 \u4E4B\u540E\u7684\u503C\u3002',\r\n            'example': '\"mystify\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'UNARY_PERCENT',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u6309\u767E\u5206\u6BD4\u89E3\u91CA\u7684\u6570\u503C\u3002\u4F8B\u5982\uFF0C\u201CUNARY_PERCENT(100)\u201D\u7B49\u4E8E1\u3002',\r\n        'a': '\u8FD4\u56DE\u6309\u767E\u5206\u6BD4\u89E3\u91CA\u7684\u6570\u503C\u3002\u4F8B\u5982\uFF0C\u201CUNARY_PERCENT(100)\u201D\u7B49\u4E8E1\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u4F5C\u4E3A\u767E\u5206\u6BD4\u89E3\u91CA\u7684\u6570\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONCATENATE',\r\n        't': 12,\r\n        'd': '\u5C06\u4E24\u4E2A\u6216\u591A\u4E2A\u6587\u672C\u5B57\u7B26\u4E32\u8054\u63A5\u4E3A\u4E00\u4E2A\u5B57\u7B26\u4E32\u3002',\r\n        'a': '\u5C06\u4E24\u4E2A\u6216\u591A\u4E2A\u6587\u672C\u5B57\u7B26\u4E32\u8054\u63A5\u4E3A\u4E00\u4E2A\u5B57\u7B26\u4E32\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'text1',\r\n            'detail': '\u521D\u59CB\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"Super\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'text2 ...',\r\n            'detail': '[\u53EF\u9009] - \u8981\u6309\u987A\u5E8F\u8FDE\u63A5\u5728\u4E00\u8D77\u7684\u5176\u4ED6\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"calla\"',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CODE',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5B57\u7B26\u4E32\u4E2D\u9996\u5B57\u7B26\u7684 Unicode \u6620\u5C04\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5B57\u7B26\u4E32\u4E2D\u9996\u5B57\u7B26\u7684 Unicode \u6620\u5C04\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u9996\u5B57\u7B26\u7684Unicode\u6620\u5C04\u503C\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"a\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CHAR',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u5F53\u524D Unicode \u7F16\u7801\u8868\uFF0C\u5C06\u6570\u5B57\u8F6C\u6362\u4E3A\u5BF9\u5E94\u7684\u5B57\u7B26\u3002',\r\n        'a': '\u6309\u7167\u5F53\u524D Unicode \u7F16\u7801\u8868\uFF0C\u5C06\u6570\u5B57\u8F6C\u6362\u4E3A\u5BF9\u5E94\u7684\u5B57\u7B26\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u4ECB\u4E8E 1 \u5230 255 \u4E4B\u95F4\u7684\u6570\u5B57\u3002',\r\n            'example': '97',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ARABIC',\r\n        't': 12,\r\n        'd': '\u5C06\u7F57\u9A6C\u6570\u5B57\u8F6C\u6362\u4E3A\u963F\u62C9\u4F2F\u6570\u5B57\u3002',\r\n        'a': '\u5C06\u7F57\u9A6C\u6570\u5B57\u8F6C\u6362\u4E3A\u963F\u62C9\u4F2F\u6570\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8F6C\u6362\u683C\u5F0F\u7684\u7F57\u9A6C\u6570\u5B57',\r\n            'example': '\"XIV\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ROMAN',\r\n        't': 12,\r\n        'd': '\u5C06\u6570\u5B57\u683C\u5F0F\u8BBE\u7F6E\u4E3A\u7F57\u9A6C\u6570\u5B57\u5F62\u5F0F\u3002',\r\n        'a': '\u5C06\u6570\u5B57\u683C\u5F0F\u8BBE\u7F6E\u4E3A\u7F57\u9A6C\u6570\u5B57\u5F62\u5F0F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u6570\u5B57\uFF0C\u4ECB\u4E8E1\u52303999\u4E4B\u95F4\uFF08\u5305\u62EC\u8FD9\u4E24\u4E2A\u6570\u5B57\uFF09\u3002',\r\n            'example': '499',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'REGEXEXTRACT',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u6B63\u5219\u8868\u8FBE\u5F0F\u63D0\u53D6\u5339\u914D\u7684\u5B50\u4E32\u3002',\r\n        'a': '\u6309\u7167\u6B63\u5219\u8868\u8FBE\u5F0F\u63D0\u53D6\u5339\u914D\u7684\u5B50\u4E32\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8F93\u5165\u6587\u672C\u3002',\r\n            'example': '\"Needle in a haystack\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'regular_expression',\r\n            'detail': '\u6B64\u51FD\u6570\u5C06\u8FD4\u56DE\u6587\u672C\u4E2D\u7B26\u5408\u6B64\u8868\u8FBE\u5F0F\u7684\u7B2C\u4E00\u4E2A\u5B50\u4E32\u3002',\r\n            'example': '\".e{2}dle\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'REGEXMATCH',\r\n        't': 12,\r\n        'd': '\u5224\u65AD\u4E00\u6BB5\u6587\u672C\u662F\u5426\u4E0E\u6B63\u5219\u8868\u8FBE\u5F0F\u76F8\u5339\u914D\u3002',\r\n        'a': '\u5224\u65AD\u4E00\u6BB5\u6587\u672C\u662F\u5426\u4E0E\u6B63\u5219\u8868\u8FBE\u5F0F\u76F8\u5339\u914D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u6D4B\u8BD5\u7684\u6587\u672C\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'regular_expression',\r\n            'detail': '\u7528\u6765\u6D4B\u8BD5\u6587\u672C\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u3002',\r\n            'example': '\"S.r\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'REGEXREPLACE',\r\n        't': 12,\r\n        'd': '\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u5C06\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u7684\u4E00\u90E8\u5206\u66FF\u6362\u4E3A\u5176\u4ED6\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n        'a': '\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u5C06\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u7684\u4E00\u90E8\u5206\u66FF\u6362\u4E3A\u5176\u4ED6\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u5BF9\u5176\u5C40\u90E8\u8FDB\u884C\u66FF\u6362\u64CD\u4F5C\u7684\u6587\u672C\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'regular_expression',\r\n            'detail': '\u6B63\u5219\u8868\u8FBE\u5F0F\u3002 text \u4E2D\u6240\u6709\u5339\u914D\u7684\u5B9E\u4F8B\u90FD\u5C06\u88AB\u66FF\u6362\u3002',\r\n            'example': '\"S.*d\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'replacement',\r\n            'detail': '\u8981\u63D2\u5165\u5230\u539F\u6709\u6587\u672C\u4E2D\u7684\u6587\u672C\u3002',\r\n            'example': '\"Bed\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'T',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u672C\u683C\u5F0F\u7684\u5B57\u7B26\u4E32\u53C2\u6570\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u672C\u683C\u5F0F\u7684\u5B57\u7B26\u4E32\u53C2\u6570\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u6587\u672C\u7684\u53C2\u6570\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6587\u672C\uFF0CT\u5C06\u8FD4\u56DE\u503C\u672C\u8EAB\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6307\u5411\u5305\u542B\u6587\u672C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CT\u5C06\u8FD4\u56DE\u503C\u4E2D\u7684\u5185\u5BB9\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u9519\u8BEF\u503C\u6216\u5305\u542B\u9519\u8BEF\u503C\u7684\u5355\u5143\u683C\uFF0CT\u5C06\u8FD4\u56DE\u8BE5\u9519\u8BEF\u503C\u3002\\n\\n\u5BF9\u4E8E\u6240\u6709\u5176\u4ED6\u60C5\u51B5\uFF0CT\u5C06\u8FD4\u56DE\u7A7A\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'FIXED',\r\n        't': 12,\r\n        'd': '\u4EE5\u56FA\u5B9A\u7684\u5C0F\u6570\u4F4D\u6570\u8BBE\u7F6E\u6570\u5B57\u7684\u683C\u5F0F\u3002',\r\n        'a': '\u4EE5\u56FA\u5B9A\u7684\u5C0F\u6570\u4F4D\u6570\u8BBE\u7F6E\u6570\u5B57\u7684\u683C\u5F0F\u3002',\r\n        'm': [1, 3],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u8981\u8FDB\u884C\u820D\u5165\u5E76\u8F6C\u6362\u4E3A\u6587\u672C\u7684\u6570\u5B57\u3002',\r\n            'example': '3.141592653',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'decimals',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A2] - \u7ED3\u679C\u4E2D\u8981\u663E\u793A\u7684\u5C0F\u6570\u4F4D\u6570\u3002\\n\\n\u5982\u679C\u6570\u503C\u7684\u6709\u6548\u4F4D\u6570\u5C0F\u4E8E\u5C0F\u6570\u4F4D\u6570\uFF0C\u5C06\u4EE5\u96F6\u586B\u5145\u3002\u5982\u679C\u6570\u503C\u7684\u6709\u6548\u4F4D\u6570\u5927\u4E8E\u5C0F\u6570\u4F4D\u6570\uFF0C\u5219\u5C06\u5176\u820D\u5165\u5230\u6240\u9700\u7684\u5C0F\u6570\u4F4D\u6570\u800C\u4E0D\u662F\u5C06\u5176\u622A\u65AD\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'no_commas',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3AFALSE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u5982\u679C\u4E3A TRUE()\uFF0C\u5219\u4F1A\u7981\u6B62 FIXED \u5728\u8FD4\u56DE\u7684\u6587\u672C\u4E2D\u5305\u542B\u9017\u53F7\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'FIND',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u533A\u5206\u5927\u5C0F\u5199\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u533A\u5206\u5927\u5C0F\u5199\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'find_text',\r\n            'detail': '\u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u67E5\u627E\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"n\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'within_text',\r\n            'detail': '\u8981\u5728\u5176\u4E2D\u641C\u7D22\u641C\u7D22\u5B57\u7B26\u4E32\u7684\u9996\u6B21\u51FA\u73B0\u4F4D\u7F6E\u7684\u6587\u672C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_num',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u5F00\u59CB\u641C\u7D22\u7684\u5B57\u7B26\u4F4D\u7F6E\u3002',\r\n            'example': '14',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FINDB',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u67D0\u4E2A\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u6BCF\u4E2A\u53CC\u5B57\u8282\u5B57\u7B26\u5360\u4E24\u4E2A\u4F4D\u7F6E\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u4E2A\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u6BCF\u4E2A\u53CC\u5B57\u8282\u5B57\u7B26\u5360\u4E24\u4E2A\u4F4D\u7F6E\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'find_text',\r\n            'detail': '\u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u67E5\u627E\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"\u65B0\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'within_text',\r\n            'detail': '\u8981\u5728\u5176\u4E2D\u641C\u7D22\u641C\u7D22\u5B57\u7B26\u4E32\u7684\u9996\u6B21\u51FA\u73B0\u4F4D\u7F6E\u7684\u6587\u672C\u3002',\r\n            'example': '\"\u519C\u5386\u65B0\u5E74\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_num',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A 1] - \u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u5F00\u59CB\u641C\u7D22\u7684\u5B57\u7B26\u4F4D\u7F6E\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'JOIN',\r\n        't': 12,\r\n        'd': '\u5C06\u4E00\u4E2A\u6216\u591A\u4E2A\u4F7F\u7528\u6307\u5B9A\u5B9A\u754C\u7B26\u7684\u4E00\u7EF4\u6570\u7EC4\u7684\u5143\u7D20\u8FDE\u63A5\u5230\u4E00\u8D77\u3002',\r\n        'a': '\u5C06\u4E00\u4E2A\u6216\u591A\u4E2A\u4F7F\u7528\u6307\u5B9A\u5B9A\u754C\u7B26\u7684\u4E00\u7EF4\u6570\u7EC4\u7684\u5143\u7D20\u8FDE\u63A5\u5230\u4E00\u8D77\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name': 'separator',\r\n            'detail': '\u7F6E\u4E8E\u76F8\u4E92\u8FDE\u63A5\u7684\u503C\u4E4B\u95F4\u7684\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u3002\\n\\n\u5B9A\u754C\u7B26\u53EF\u4EE5\u4E3A\u7A7A\uFF0C\u4F8B\u5982JOIN(,{1,2,3})\u3002',\r\n            'example': '\" and-a \"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'array1',\r\n            'detail': '\u8981\u4F7F\u7528\u5B9A\u754C\u7B26\u8FDE\u63A5\u7684\u4E00\u4E2A\u6216\u591A\u4E2A\u503C\u3002',\r\n            'example': '{1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'array2, ...',\r\n            'detail': '[\u53EF\u9009] - \u8981\u4F7F\u7528\u5B9A\u754C\u7B26\u8FDE\u63A5\u7684\u5176\u4ED6\u503C\u6216\u6570\u7EC4\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LEFT',\r\n        't': 12,\r\n        'd': '\u4ECE\u6587\u672C\u5B57\u7B26\u4E32\u7684\u7B2C\u4E00\u4E2A\u5B57\u7B26\u5F00\u59CB\u8FD4\u56DE\u6307\u5B9A\u4E2A\u6570\u7684\u5B57\u7B26\u3002',\r\n        'a': '\u4ECE\u6587\u672C\u5B57\u7B26\u4E32\u7684\u7B2C\u4E00\u4E2A\u5B57\u7B26\u5F00\u59CB\u8FD4\u56DE\u6307\u5B9A\u4E2A\u6570\u7684\u5B57\u7B26\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u5305\u542B\u8981\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'num_chars',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u6307\u5B9A\u8981\u7531 LEFT \u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RIGHT',\r\n        't': 12,\r\n        'd': '\u6839\u636E\u6240\u6307\u5B9A\u7684\u5B57\u7B26\u6570\u8FD4\u56DE\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u6700\u540E\u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u7B26\u3002',\r\n        'a': '\u6839\u636E\u6240\u6307\u5B9A\u7684\u5B57\u7B26\u6570\u8FD4\u56DE\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u6700\u540E\u4E00\u4E2A\u6216\u591A\u4E2A\u5B57\u7B26\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u5305\u542B\u8981\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'num_chars',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1] - \u6307\u5B9A\u8981\u7531 RIGHT \u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MID',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u4ECE\u6307\u5B9A\u4F4D\u7F6E\u5F00\u59CB\u7684\u7279\u5B9A\u6570\u76EE\u7684\u5B57\u7B26\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u4ECE\u6307\u5B9A\u4F4D\u7F6E\u5F00\u59CB\u7684\u7279\u5B9A\u6570\u76EE\u7684\u5B57\u7B26\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u5305\u542B\u8981\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"get this\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_num',\r\n            'detail': '\u8981\u4ECE\u5B57\u7B26\u4E32\u4E2D\u5F00\u59CB\u63D0\u53D6\u7684\u4F4D\u7F6E\u3002\u5B57\u7B26\u4E32\u4E2D\u7B2C\u4E00\u4E2A\u5B57\u7B26\u7684\u7D22\u5F15\u4E3A1\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'num_chars',\r\n            'detail': '\u6307\u5B9A\u8981\u7531 MID \u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\u3002\\n\\n\u5982\u679C\u63D0\u53D6\u7684\u5B57\u7B26\u6570\u5C1A\u4E0D\u8DB3\u63D0\u53D6\u957F\u5EA6\u4E2A\u5B57\u7B26\u65F6\u5C31\u5230\u8FBE\u4E86\u5B57\u7B26\u4E32\u5C3E\u90E8\uFF0C\u5219MID\u8FD4\u56DE\u4ECE\u5F00\u59CB\u4F4D\u7F6E\u5230\u5B57\u7B26\u4E32\u5C3E\u90E8\u7684\u5B57\u7B26\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LEN',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u7ED9\u5B9A\u5B57\u7B26\u4E32\u7684\u957F\u5EA6\u3002',\r\n        'a': '\u8FD4\u56DE\u7ED9\u5B9A\u5B57\u7B26\u4E32\u7684\u957F\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u957F\u5EA6\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LENB',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u672C\u4E2D\u6240\u5305\u542B\u7684\u5B57\u7B26\u6570\u3002\u4E0E\u53CC\u5B57\u8282\u5B57\u7B26\u96C6(DBCS)\u4E00\u8D77\u4F7F\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u672C\u4E2D\u6240\u5305\u542B\u7684\u5B57\u7B26\u6570\u3002\u4E0E\u53CC\u5B57\u8282\u5B57\u7B26\u96C6(DBCS)\u4E00\u8D77\u4F7F\u7528\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8FD4\u56DE\u5176\u5B57\u8282\u6570\u7684\u5B57\u7B26\u4E32\u3002\uFF08\u4E00\u4E2A\u6C49\u5B57\u4E3A\u4E24\u4E2A\u5B57\u8282\u6570\uFF09',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LOWER',\r\n        't': 12,\r\n        'd': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F6C\u6362\u4E3A\u5C0F\u5199\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F6C\u6362\u4E3A\u5C0F\u5199\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5C0F\u5199\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"LOREM IPSUM\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'UPPER',\r\n        't': 12,\r\n        'd': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F6C\u6362\u4E3A\u5927\u5199\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F6C\u6362\u4E3A\u5927\u5199\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u5927\u5199\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"lorem ipsum\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EXACT',\r\n        't': 12,\r\n        'd': '\u6BD4\u8F83\u4E24\u4E2A\u5B57\u7B26\u4E32\u662F\u5426\u76F8\u540C\u3002',\r\n        'a': '\u6BD4\u8F83\u4E24\u4E2A\u5B57\u7B26\u4E32\u662F\u5426\u76F8\u540C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'text1',\r\n            'detail': '\u8981\u6BD4\u8F83\u7684\u7B2C\u4E00\u4E2A\u5B57\u7B26\u4E32\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'text2',\r\n            'detail': '\u8981\u6BD4\u8F83\u7684\u7B2C\u4E8C\u4E2A\u5B57\u7B26\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'REPLACE',\r\n        't': 12,\r\n        'd': '\u5C06\u6587\u672C\u5B57\u7B26\u4E32\u7684\u4E00\u90E8\u5206\u66FF\u6362\u4E3A\u5176\u4ED6\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n        'a': '\u5C06\u6587\u672C\u5B57\u7B26\u4E32\u7684\u4E00\u90E8\u5206\u66FF\u6362\u4E3A\u5176\u4ED6\u6587\u672C\u5B57\u7B26\u4E32\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name': 'old_text',\r\n            'detail': '\u8981\u5BF9\u5176\u5C40\u90E8\u8FDB\u884C\u66FF\u6362\u64CD\u4F5C\u7684\u6587\u672C\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_num',\r\n            'detail': '\u5F00\u59CB\u8FDB\u884C\u66FF\u6362\u64CD\u4F5C\u7684\u4F4D\u7F6E\uFF08\u6587\u672C\u5F00\u5934\u4F4D\u7F6E\u4E3A 1\uFF09\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'num_chars',\r\n            'detail': '\u8981\u5728\u6587\u672C\u4E2D\u66FF\u6362\u7684\u5B57\u7B26\u4E2A\u6570\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'new_text',\r\n            'detail': '\u8981\u63D2\u5165\u5230\u539F\u6709\u6587\u672C\u4E2D\u7684\u6587\u672C\u3002',\r\n            'example': '\"Bed\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'REPT',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6587\u672C\u7684\u591A\u6B21\u91CD\u590D\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6587\u672C\u7684\u591A\u6B21\u91CD\u590D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u91CD\u590D\u7684\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"ha\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'number_times',\r\n            'detail': '\u8981\u91CD\u590D\u7684\u6587\u672C\u8981\u5728\u8FD4\u56DE\u503C\u4E2D\u51FA\u73B0\u7684\u6B21\u6570\u3002\\n\\n\u6700\u5927\u91CD\u590D\u6B21\u6570\u4E3A100\u3002\u5373\u4F7F\u91CD\u590D\u6B21\u6570\u5927\u4E8E100\uFF0CREPT\u4E5F\u4EC5\u5C06\u76F8\u5E94\u6587\u672C\u91CD\u590D100\u6B21\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SEARCH',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u7B26\u4E32\u5728\u6587\u672C\u4E2D\u9996\u6B21\u51FA\u73B0\u7684\u4F4D\u7F6E\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'find_text',\r\n            'detail': '\u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u67E5\u627E\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"n\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'within_text',\r\n            'detail': '\u8981\u5728\u5176\u4E2D\u641C\u7D22\u641C\u7D22\u5B57\u7B26\u4E32\u7684\u9996\u6B21\u51FA\u73B0\u4F4D\u7F6E\u7684\u6587\u672C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'start_num',\r\n            'detail': '[ \u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3A1 ] - \u8981\u5728\u8981\u641C\u7D22\u7684\u6587\u672C\u4E2D\u5F00\u59CB\u641C\u7D22\u7684\u5B57\u7B26\u4F4D\u7F6E\u3002',\r\n            'example': '14',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUBSTITUTE',\r\n        't': 12,\r\n        'd': '\u5728\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u7528 new_text \u66FF\u6362 old_text\u3002',\r\n        'a': '\u5728\u6587\u672C\u5B57\u7B26\u4E32\u4E2D\u7528 new_text \u66FF\u6362 old_text\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u9700\u8981\u66FF\u6362\u5176\u4E2D\u5B57\u7B26\u7684\u6587\u672C\uFF0C\u6216\u5BF9\u542B\u6709\u6587\u672C\uFF08\u9700\u8981\u66FF\u6362\u5176\u4E2D\u5B57\u7B26\uFF09\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3002',\r\n            'example': '\"search for it\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'old_text',\r\n            'detail': '\u9700\u8981\u66FF\u6362\u7684\u6587\u672C\u3002',\r\n            'example': '\"search for\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'new_text',\r\n            'detail': '\u7528\u4E8E\u66FF\u6362 old_text \u7684\u6587\u672C\u3002',\r\n            'example': '\"Google\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'instance_num',\r\n            'detail': '[ \u53EF\u9009 ] - \u6307\u5B9A\u8981\u7528 new_text \u66FF\u6362 old_text \u7684\u4E8B\u4EF6\u3002 \u5982\u679C\u6307\u5B9A\u4E86 instance_num\uFF0C\u5219\u53EA\u6709\u6EE1\u8DB3\u8981\u6C42\u7684 old_text \u88AB\u66FF\u6362\u3002 \u5426\u5219\uFF0C\u6587\u672C\u4E2D\u51FA\u73B0\u7684\u6240\u6709 old_text \u90FD\u4F1A\u66F4\u6539\u4E3A new_text\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CLEAN',\r\n        't': 12,\r\n        'd': '\u79FB\u9664\u6587\u672C\u4E2D\u7684\u4E0D\u53EF\u6253\u5370 ASCII \u5B57\u7B26\u540E\u5C06\u5176\u8FD4\u56DE\u3002',\r\n        'a': '\u79FB\u9664\u6587\u672C\u4E2D\u7684\u4E0D\u53EF\u6253\u5370 ASCII \u5B57\u7B26\u540E\u5C06\u5176\u8FD4\u56DE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u79FB\u9664\u5176\u4E2D\u4E0D\u53EF\u6253\u5370\u5B57\u7B26\u7684\u6587\u672C\u3002',\r\n            'example': '\"AF\"&CHAR(31)',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TEXT',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u6307\u5B9A\u683C\u5F0F\u5C06\u6570\u5B57\u8F6C\u6362\u4E3A\u6587\u672C\u3002',\r\n        'a': '\u6309\u7167\u6307\u5B9A\u683C\u5F0F\u5C06\u6570\u5B57\u8F6C\u6362\u4E3A\u6587\u672C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u6570\u5B57\u3001\u65E5\u671F\u6216\u65F6\u95F4\u3002',\r\n            'example': '1.23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'format_text',\r\n            'detail': '\u4EE5\u62EC\u53F7\u62EC\u8D77\u6765\u7684\u6A21\u5F0F\u4E32\uFF0C\u5C06\u6309\u8BE5\u6A21\u5F0F\u8BBE\u7F6E\u6570\u5B57\u7684\u683C\u5F0F\u3002\\n\\n0\u8868\u793A\u5728\u6570\u503C\u4F4D\u6570\u5C11\u4E8E\u683C\u5F0F\u6307\u5B9A\u7684\u4F4D\u6570\u65F6\u5FC5\u5B9A\u4EE5\u96F6\u586B\u5145\u3002\u4F8B\u5982\uFF0CTEXT(12.3,\"000.00\")\u5C06\u8FD4\u56DE012.30\u3002\u5F53\u6570\u503C\u7684\u5C0F\u6570\u4F4D\u6570\u8D85\u8FC7\u6A21\u5F0F\u6307\u5B9A\u7684\u5C0F\u6570\u4F4D\u6570\u65F6\uFF0C\u56DB\u820D\u4E94\u5165\u4E3A\u6307\u5B9A\u7684\u5C0F\u6570\u4F4D\u6570\u3002\u4F8B\u5982\uFF0CTEXT(12.305,\"00.00\")\u5C06\u8FD4\u56DE12.31\u3002\\n\\n#\u7C7B\u4F3C\u4E8E0\uFF0C\u4F46\u5E76\u4E0D\u662F\u5728\u5C0F\u6570\u70B9\u7684\u4E24\u4FA7\u90FD\u4EE5\u96F6\u586B\u5145\u3002\u4F8B\u5982\uFF0CTEXT(12.3,\"###.##\")\u5C06\u8FD4\u56DE12.3\u3002',\r\n            'example': '\"$0.00\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TRIM',\r\n        't': 12,\r\n        'd': '\u5220\u9664\u6307\u5B9A\u5B57\u7B26\u4E32\u524D\u540E\u7684\u7A7A\u683C\u3002',\r\n        'a': '\u5220\u9664\u6307\u5B9A\u5B57\u7B26\u4E32\u524D\u540E\u7684\u7A7A\u683C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u4FEE\u526A\u7684\u5B57\u7B26\u4E32\u6216\u6307\u5411\u5305\u542B\u8BE5\u5B57\u7B26\u4E32\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3002',\r\n            'example': '\" lorem ipsum\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'VALUE',\r\n        't': 12,\r\n        'd': '\u5C06\u53EF\u8BC6\u522B\u7684\u4EFB\u4F55\u65E5\u671F\u3001\u65F6\u95F4\u6216\u6570\u5B57\u683C\u5F0F\u7684\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u6570\u5B57\u3002',\r\n        'a': '\u5C06\u53EF\u8BC6\u522B\u7684\u4EFB\u4F55\u65E5\u671F\u3001\u65F6\u95F4\u6216\u6570\u5B57\u683C\u5F0F\u7684\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u6570\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u5305\u542B\u8981\u8F6C\u6362\u7684\u503C\u7684\u5B57\u7B26\u4E32\u3002',\r\n            'example': '\"123\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PROPER',\r\n        't': 12,\r\n        'd': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u6BCF\u4E2A\u5355\u8BCD\u7684\u9996\u5B57\u6BCD\u8F6C\u4E3A\u5927\u5199\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u5B57\u7B26\u4E32\u4E2D\u6BCF\u4E2A\u5355\u8BCD\u7684\u9996\u5B57\u6BCD\u8F6C\u4E3A\u5927\u5199\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'text',\r\n            'detail': '\u8981\u8F6C\u6362\u7684\u6587\u672C\uFF0C\u5176\u4E2D\u6BCF\u4E2A\u5355\u8BCD\u7684\u9996\u5B57\u6BCD\u90FD\u5C06\u8F6C\u4E3A\u5927\u5199\uFF0C\u6240\u6709\u5176\u4ED6\u5B57\u6BCD\u5219\u8F6C\u4E3A\u5C0F\u5199\u3002',\r\n            'example': '\"united states\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CONVERT',\r\n        't': 13,\r\n        'd': '\u5C06\u6570\u5B57\u4ECE\u4E00\u79CD\u5EA6\u91CF\u7CFB\u7EDF\u8F6C\u6362\u4E3A\u53E6\u4E00\u79CD\u5EA6\u91CF\u7CFB\u7EDF\u3002',\r\n        'a': '\u5C06\u6570\u5B57\u4ECE\u4E00\u79CD\u5EA6\u91CF\u7CFB\u7EDF\u8F6C\u6362\u4E3A\u53E6\u4E00\u79CD\u5EA6\u91CF\u7CFB\u7EDF\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'number',\r\n            'detail': '\u662F\u4EE5 from_unit \u4E3A\u5355\u4F4D\u7684\u9700\u8981\u8FDB\u884C\u8F6C\u6362\u7684\u6570\u503C\u3002',\r\n            'example': '5.1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'from_unit',\r\n            'detail': '\u662F\u6570\u503C\u7684\u5355\u4F4D\u3002',\r\n            'example': '\"g\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'to_unit',\r\n            'detail': '\u662F\u7ED3\u679C\u7684\u5355\u4F4D\u3002',\r\n            'example': '\"kg\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'SUMX2MY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u7684\u5E73\u65B9\u5DEE\u4E4B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u7684\u5E73\u65B9\u5DEE\u4E4B\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array_x',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array_y',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMX2PY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u7684\u5E73\u65B9\u548C\u4E4B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u7684\u5E73\u65B9\u548C\u4E4B\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array_x',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array_y',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMXMY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u4E4B\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u6570\u7EC4\u4E2D\u5BF9\u5E94\u6570\u503C\u4E4B\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array_x',\r\n            'detail': '\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array_y',\r\n            'detail': '\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TRANSPOSE',\r\n        't': 14,\r\n        'd': '\u5C06\u6570\u7EC4\u6216\u5355\u5143\u683C\u8303\u56F4\u7684\u884C\u5217\u8F6C\u7F6E\u3002',\r\n        'a': '\u5C06\u6570\u7EC4\u6216\u5355\u5143\u683C\u8303\u56F4\u7684\u884C\u5217\u8F6C\u7F6E\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u5C06\u5176\u884C\u5217\u4E92\u6362\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': '{1,2}',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'TREND',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u7EBF\u6027\u8D8B\u52BF\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7EBF\u6027\u8D8B\u52BF\u503C\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'known_y',\r\n            'detail': '\u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5219 known_x \u7684\u7EF4\u6570\u5FC5\u987B\u4E0E\u4E4B\u76F8\u540C\uFF0C\u6216\u8005\u7701\u7565\u6B64\u53C2\u6570\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'known_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u8BE5\u6570\u7EC4\u4E3A{1,2,3,...},\u5176\u5927\u5C0F\u4E0E known_y \u76F8\u540C] - \u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684\u53EF\u9009 x \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'new_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E0E known_x \u76F8\u540C] -  \u9700\u8981\u51FD\u6570 TREND \u8FD4\u56DE\u5BF9\u5E94 y \u503C\u7684\u65B0 x \u503C\u3002',\r\n            'example': 'A11:A13',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'const',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u5C06\u5E38\u91CF b \u5F3A\u5236\u8BBE\u4E3A 0\u3002\\n\\nTRUE() \u8868\u793A b \u5C06\u6309\u6B63\u5E38\u8BA1\u7B97\uFF1B\\n\\nFALSE() \u8868\u793A b \u5C06\u88AB\u8BBE\u4E3A 0\uFF08\u96F6\uFF09\uFF0Cm \u5C06\u88AB\u8C03\u6574\u4EE5\u4F7F y = mx\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'FREQUENCY',\r\n        't': 14,\r\n        'd': '\u8BA1\u7B97\u6570\u503C\u5728\u67D0\u4E2A\u533A\u57DF\u5185\u7684\u51FA\u73B0\u9891\u7387\uFF0C\u7136\u540E\u8FD4\u56DE\u4E00\u4E2A\u5782\u76F4\u6570\u7EC4\u3002',\r\n        'a': '\u8BA1\u7B97\u6570\u503C\u5728\u67D0\u4E2A\u533A\u57DF\u5185\u7684\u51FA\u73B0\u9891\u7387\uFF0C\u7136\u540E\u8FD4\u56DE\u4E00\u4E2A\u5782\u76F4\u6570\u7EC4\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'data_array',\r\n            'detail': '\u8981\u5BF9\u5176\u9891\u7387\u8FDB\u884C\u8BA1\u6570\u7684\u4E00\u7EC4\u6570\u503C\u6216\u5BF9\u8FD9\u7EC4\u6570\u503C\u7684\u5F15\u7528\u3002',\r\n            'example': 'A2:A40',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'bins_array',\r\n            'detail': '\u8981\u5C06 data_array \u4E2D\u7684\u503C\u63D2\u5165\u5230\u7684\u95F4\u9694\u6570\u7EC4\u6216\u5BF9\u95F4\u9694\u7684\u5F15\u7528\u3002\\n\\n\u4E3A\u6E05\u6670\u8D77\u89C1\uFF0C\u5E94\u5C06\u7C7B\u522B\u6392\u5E8F\uFF0C\u4F46\u5982\u679C\u672A\u6392\u5E8F\uFF0CFREQUENCY\u4F1A\u5728\u5185\u90E8\u5BF9\u8FD9\u4E9B\u6307\u5B9A\u7684\u503C\u8FDB\u884C\u6392\u5E8F\u5E76\u8FD4\u56DE\u6B63\u786E\u7ED3\u679C\u3002',\r\n            'example': 'B2:B5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GROWTH',\r\n        't': 14,\r\n        'd': '\u4F7F\u7528\u73B0\u6709\u6570\u636E\u8BA1\u7B97\u9884\u6D4B\u7684\u6307\u6570\u7B49\u6BD4\u3002',\r\n        'a': '\u4F7F\u7528\u73B0\u6709\u6570\u636E\u8BA1\u7B97\u9884\u6D4B\u7684\u6307\u6570\u7B49\u6BD4\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'known_y',\r\n            'detail': '\u5173\u7CFB\u8868\u8FBE\u5F0F y = b*m^x \u4E2D\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6570\u636E_y\u4E3A\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5219\u5DF2\u77E5\u6570\u636E_x\u7684\u7EF4\u6570\u5FC5\u987B\u4E0E\u4E4B\u76F8\u540C\uFF0C\u6216\u8005\u7701\u7565\u6B64\u53C2\u6570\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6570\u636E_y\u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5DF2\u77E5\u6570\u636E_x\u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C\u5DF2\u77E5\u6570\u636E_y\u4E3A\u5355\u884C\uFF0C\u5219\u5C06\u5DF2\u77E5\u6570\u636E_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E\u5DF2\u77E5\u6570\u636E_y\u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'known_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u8BE5\u6570\u7EC4\u4E3A{1,2,3,...},\u5176\u5927\u5C0F\u4E0E known_y \u76F8\u540C] - \u5173\u7CFB\u8868\u8FBE\u5F0F y = b*m^x \u4E2D\u5DF2\u77E5\u7684\u53EF\u9009 x \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6570\u636E_y\u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5DF2\u77E5\u6570\u636E_x\u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C\u5DF2\u77E5\u6570\u636E_y\u4E3A\u5355\u884C\uFF0C\u5219\u5C06\u5DF2\u77E5\u6570\u636E_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E\u5DF2\u77E5\u6570\u636E_y\u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'new_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u4E0E known_x \u76F8\u540C] - \u9700\u8981\u51FD\u6570 GROWTH \u8FD4\u56DE\u5BF9\u5E94 y \u503C\u7684\u65B0 x \u503C\u3002',\r\n            'example': 'A11:A13',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'const',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] -\u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u5C06\u5E38\u91CF b \u5F3A\u5236\u8BBE\u4E3A 1\u3002\\n\\nTRUE() \u8868\u793A b \u5C06\u6309\u6B63\u5E38\u8BA1\u7B97\uFF1B\\n\\nFALSE() \u8868\u793A b \u5C06\u88AB\u8BBE\u4E3A 1\uFF0Cm \u5C06\u88AB\u8C03\u6574\u4EE5\u4F7F y = m^x\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LINEST',\r\n        't': 14,\r\n        'd': '\u53EF\u901A\u8FC7\u4F7F\u7528\u6700\u5C0F\u4E8C\u4E58\u6CD5\u8BA1\u7B97\u4E0E\u73B0\u6709\u6570\u636E\u6700\u4F73\u62DF\u5408\u7684\u76F4\u7EBF\uFF0C\u6765\u8BA1\u7B97\u67D0\u76F4\u7EBF\u7684\u7EDF\u8BA1\u503C\uFF0C\u7136\u540E\u8FD4\u56DE\u63CF\u8FF0\u6B64\u76F4\u7EBF\u7684\u6570\u7EC4\u3002',\r\n        'a': '\u53EF\u901A\u8FC7\u4F7F\u7528\u6700\u5C0F\u4E8C\u4E58\u6CD5\u8BA1\u7B97\u4E0E\u73B0\u6709\u6570\u636E\u6700\u4F73\u62DF\u5408\u7684\u76F4\u7EBF\uFF0C\u6765\u8BA1\u7B97\u67D0\u76F4\u7EBF\u7684\u7EDF\u8BA1\u503C\uFF0C\u7136\u540E\u8FD4\u56DE\u63CF\u8FF0\u6B64\u76F4\u7EBF\u7684\u6570\u7EC4\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'known_y',\r\n            'detail': '\u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5219 known_x \u7684\u7EF4\u6570\u5FC5\u987B\u4E0E\u4E4B\u76F8\u540C\uFF0C\u6216\u8005\u7701\u7565\u6B64\u53C2\u6570\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'known_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u8BE5\u6570\u7EC4\u4E3A{1,2,3,...},\u5176\u5927\u5C0F\u4E0E known_y \u76F8\u540C] - \u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684\u53EF\u9009 x \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'const',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u5C06\u5E38\u91CF b \u5F3A\u5236\u8BBE\u4E3A 0\u3002\\n\\nTRUE() \u8868\u793A b \u5C06\u6309\u6B63\u5E38\u8BA1\u7B97\uFF1B\\n\\nFALSE() \u8868\u793A b \u5C06\u88AB\u8BBE\u4E3A 0\uFF08\u96F6\uFF09\uFF0Cm \u5C06\u88AB\u8C03\u6574\u4EE5\u4F7F y = mx\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'stats',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3AFALSE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u8FD4\u56DE\u9644\u52A0\u56DE\u5F52\u7EDF\u8BA1\u503C\u3002\\n\\n\u5982\u679C\u8BE6\u7EC6\u4E3ATRUE\uFF0C\u9664\u4E86\u5BF9\u5E94\u4E8E\u6BCF\u4E2A\u81EA\u53D8\u91CF\u7684\u4E00\u7EC4\u7EBF\u6027\u7CFB\u6570\u548Cy\u622A\u8DDD\u4E4B\u5916\uFF0CLINEST\u8FD8\u8FD4\u56DE\u4EE5\u4E0B\u4FE1\u606F\uFF1A\\n\\n\u6BCF\u9879\u7CFB\u6570\u548C\u622A\u8DDD\u7684\u6807\u51C6\u8BEF\u5DEE\u3001\\n\\n\u9650\u5B9A\u7CFB\u6570\uFF08\u4ECB\u4E8E0\u548C1\u4E4B\u95F4\uFF0C1\u8868\u793A\u5B8C\u5168\u76F8\u5173\uFF09\u3001\\n\\n\u56E0\u53D8\u91CF\u503C\u7684\u6807\u51C6\u8BEF\u5DEE\u3001\\n\\nF\u7EDF\u8BA1\u6216F\u89C2\u6D4B\u503C\uFF0C\u6307\u793A\u6240\u89C2\u6D4B\u5230\u7684\u56E0\u53D8\u91CF\u548C\u81EA\u53D8\u91CF\u53D8\u91CF\u4E4B\u95F4\u7684\u5173\u7CFB\u662F\u968F\u673A\u7684\u8FD8\u662F\u7EBF\u6027\u7684\u3001\\n\\n\u81EA\u7531\u5EA6\uFF0C\u7528\u4E8E\u5728\u53C2\u7167\u8868\u4E2D\u67E5\u627EF\u7EDF\u8BA1\u503C\u4EE5\u4F30\u7B97\u53EF\u4FE1\u5EA6\u3001\\n\\n\u56DE\u5F52\u5E73\u65B9\u548C\uFF0C\u4EE5\u53CA\\n\\n\u6B8B\u5DEE\u5E73\u65B9\u548C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LOGEST',\r\n        't': 14,\r\n        'd': '\u5728\u56DE\u5F52\u5206\u6790\u4E2D\uFF0C\u8BA1\u7B97\u6700\u7B26\u5408\u6570\u636E\u7684\u6307\u6570\u56DE\u5F52\u62DF\u5408\u66F2\u7EBF\uFF0C\u5E76\u8FD4\u56DE\u63CF\u8FF0\u8BE5\u66F2\u7EBF\u7684\u6570\u503C\u6570\u7EC4\u3002',\r\n        'a': '\u5728\u56DE\u5F52\u5206\u6790\u4E2D\uFF0C\u8BA1\u7B97\u6700\u7B26\u5408\u6570\u636E\u7684\u6307\u6570\u56DE\u5F52\u62DF\u5408\u66F2\u7EBF\uFF0C\u5E76\u8FD4\u56DE\u63CF\u8FF0\u8BE5\u66F2\u7EBF\u7684\u6570\u503C\u6570\u7EC4\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'known_y',\r\n            'detail': '\u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0C\u5219 known_x \u7684\u7EF4\u6570\u5FC5\u987B\u4E0E\u4E4B\u76F8\u540C\uFF0C\u6216\u8005\u7701\u7565\u6B64\u53C2\u6570\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'known_x',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u8BE5\u6570\u7EC4\u4E3A{1,2,3,...},\u5176\u5927\u5C0F\u4E0E known_y \u76F8\u540C] - \u5173\u7CFB\u8868\u8FBE\u5F0F y = mx + b \u4E2D\u5DF2\u77E5\u7684\u53EF\u9009 x \u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C known_y \u4E3A\u4E00\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\uFF0Cknown_x \u5219\u53EF\u4EE3\u8868\u4E8C\u7EF4\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u591A\u4E2A\u81EA\u53D8\u91CF\u3002\u4E5F\u5C31\u662F\u8BF4\uFF0C\u5982\u679C known_y \u4E3A\u5355\u884C\uFF0C\u5219\u5C06 known_x \u4E2D\u7684\u6BCF\u884C\u89E3\u91CA\u4E3A\u5404\u81EA\u72EC\u7ACB\u7684\u503C\uFF0C\u7C7B\u4F3C\u60C5\u51B5\u4E5F\u9002\u7528\u4E8E known_y \u4E3A\u5355\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'const',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3ATRUE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u5C06\u5E38\u91CF b \u5F3A\u5236\u8BBE\u4E3A 0\u3002\\n\\nTRUE() \u8868\u793A b \u5C06\u6309\u6B63\u5E38\u8BA1\u7B97\uFF1B\\n\\nFALSE() \u8868\u793A b \u5C06\u88AB\u8BBE\u4E3A 0\uFF08\u96F6\uFF09\uFF0Cm \u5C06\u88AB\u8C03\u6574\u4EE5\u4F7F y = mx\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'stats',\r\n            'detail': '[\u53EF\u9009 - \u9ED8\u8BA4\u503C\u4E3AFALSE()] - \u4E00\u4E2A\u903B\u8F91\u503C\uFF0C\u7528\u4E8E\u6307\u5B9A\u662F\u5426\u8FD4\u56DE\u9644\u52A0\u56DE\u5F52\u7EDF\u8BA1\u503C\u3002\\n\\n\u5982\u679C\u8BE6\u7EC6\u4E3ATRUE\uFF0C\u5219\u9664\u4E86\u4E3A\u6BCF\u4E2A\u81EA\u53D8\u91CF\u548C\u7CFB\u6570 b \u8FD4\u56DE\u4E00\u7EC4\u6307\u6570\u503C\u4E4B\u5916\uFF0CLOGEST \u8FD8\u5C06\u8FD4\u56DE\u4EE5\u4E0B\u6570\u636E\uFF1A\\n\\n\u6BCF\u9879\u6307\u6570\u548C\u7CFB\u6570\u7684\u6807\u51C6\u8BEF\u5DEE\u3001\\n\\n\u9650\u5B9A\u7CFB\u6570\uFF08\u4ECB\u4E8E 0 \u548C 1 \u4E4B\u95F4\uFF0C1 \u8868\u793A\u5B8C\u5168\u76F8\u5173\uFF09\u3001\\n\\n\u56E0\u53D8\u91CF\u503C\u7684\u6807\u51C6\u8BEF\u5DEE\u3001\\n\\nF \u7EDF\u8BA1\u6216 F \u89C2\u6D4B\u503C\uFF0C\u6307\u793A\u6240\u89C2\u6D4B\u5230\u7684\u56E0\u53D8\u91CF\u548C\u81EA\u53D8\u91CF\u4E4B\u95F4\u7684\u5173\u7CFB\u662F\u968F\u673A\u7684\u8FD8\u662F\u6307\u6570\u7684\u3001\\n\\n\u81EA\u7531\u5EA6 - \u7528\u4E8E\u5728\u53C2\u7167\u8868\u4E2D\u67E5\u627E F \u7EDF\u8BA1\u503C\u4EE5\u4F30\u7B97\u53EF\u4FE1\u5EA6\u3001\\n\\n\u56DE\u5F52\u5E73\u65B9\u548C\uFF0C\u4EE5\u53CA\\n\\n\u6B8B\u5DEE\u5E73\u65B9\u548C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'MDETERM',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E00\u4E2A\u6570\u7EC4\u7684\u77E9\u9635\u884C\u5217\u5F0F\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u4E2A\u6570\u7EC4\u7684\u77E9\u9635\u884C\u5217\u5F0F\u7684\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u884C\u6570\u548C\u5217\u6570\u76F8\u7B49\u7684\u6570\u503C\u6570\u7EC4\u3002',\r\n            'example': 'A1:D4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MINVERSE',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u6570\u7EC4\u4E2D\u5B58\u50A8\u7684\u77E9\u9635\u7684\u9006\u77E9\u9635\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u7EC4\u4E2D\u5B58\u50A8\u7684\u77E9\u9635\u7684\u9006\u77E9\u9635\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u884C\u6570\u548C\u5217\u6570\u76F8\u7B49\u7684\u6570\u503C\u6570\u7EC4\u3002',\r\n            'example': 'A1:D4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MMULT',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u7EC4\u7684\u77E9\u9635\u4E58\u79EF\u3002\u7ED3\u679C\u77E9\u9635\u7684\u884C\u6570\u4E0E array1 \u7684\u884C\u6570\u76F8\u540C\uFF0C\u77E9\u9635\u7684\u5217\u6570\u4E0E array2 \u7684\u5217\u6570\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E24\u4E2A\u6570\u7EC4\u7684\u77E9\u9635\u4E58\u79EF\u3002\u7ED3\u679C\u77E9\u9635\u7684\u884C\u6570\u4E0E array1 \u7684\u884C\u6570\u76F8\u540C\uFF0C\u77E9\u9635\u7684\u5217\u6570\u4E0E array2 \u7684\u5217\u6570\u76F8\u540C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'array1',\r\n            'detail': '\u8981\u8FDB\u884C\u77E9\u9635\u4E58\u6CD5\u8FD0\u7B97\u7684\u7B2C\u4E00\u4E2A\u77E9\u9635\u6570\u7EC4\u3002\\n\\narray1 \u5217\u6570\u5FC5\u987B\u4E0E array2 \u7684\u884C\u6570\u76F8\u540C',\r\n            'example': 'A1:B3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array2',\r\n            'detail': '\u8981\u8FDB\u884C\u77E9\u9635\u4E58\u6CD5\u8FD0\u7B97\u7684\u7B2C\u4E8C\u4E2A\u77E9\u9635\u6570\u7EC4\u3002\\n\\narray2 \u7684\u884C\u6570\u5FC5\u987B\u4E0E array1 \u5217\u6570\u76F8\u540C',\r\n            'example': 'C1:F2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMPRODUCT',\r\n        't': 14,\r\n        'd': '\u5728\u7ED9\u5B9A\u7684\u51E0\u7EC4\u6570\u7EC4\u4E2D\uFF0C\u5C06\u6570\u7EC4\u95F4\u5BF9\u5E94\u7684\u5143\u7D20\u76F8\u4E58\uFF0C\u5E76\u8FD4\u56DE\u4E58\u79EF\u4E4B\u548C\u3002',\r\n        'a': '\u5728\u7ED9\u5B9A\u7684\u51E0\u7EC4\u6570\u7EC4\u4E2D\uFF0C\u5C06\u6570\u7EC4\u95F4\u5BF9\u5E94\u7684\u5143\u7D20\u76F8\u4E58\uFF0C\u5E76\u8FD4\u56DE\u4E58\u79EF\u4E4B\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name': 'array1',\r\n            'detail': '\u5176\u76F8\u5E94\u5143\u7D20\u9700\u8981\u8FDB\u884C\u76F8\u4E58\u5E76\u6C42\u548C\u7684\u7B2C\u4E00\u4E2A\u6570\u7EC4\u53C2\u6570\u3002',\r\n            'example': 'A2:C5',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'array2',\r\n            'detail': '[\u53EF\u9009] - \u5176\u76F8\u5E94\u5143\u7D20\u9700\u8981\u8FDB\u884C\u76F8\u4E58\u5E76\u6C42\u548C\u7684\u5176\u5B83\u6570\u7EC4\u53C2\u6570\u3002',\r\n            'example': 'D2:F5',\r\n            'require': 'o',\r\n            'repeat': 'y',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ISFORMULA',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u516C\u5F0F\u662F\u5426\u4F4D\u4E8E\u5F15\u7528\u7684\u5355\u5143\u683C\u4E2D\u3002',\r\n        'a': '\u68C0\u67E5\u516C\u5F0F\u662F\u5426\u4F4D\u4E8E\u5F15\u7528\u7684\u5355\u5143\u683C\u4E2D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'cell',\r\n            'detail': '\u8981\u68C0\u67E5\u662F\u5426\u5B58\u5728\u516C\u5F0F\u7684\u5355\u5143\u683C\u3002\\n\\n\u5982\u679C cell \u4E3A\u5305\u542B\u516C\u5F0F\u7684\u5355\u5143\u683C\uFF0C\u5219 ISFORMULA \u5C06\u8FD4\u56DE TRUE\u3002\u5982\u679C cell \u4E3A\u76F8\u5E94\u5355\u5143\u683C\u8303\u56F4\uFF0C\u5219\u5F53\u8BE5\u8303\u56F4\u5185\u7684\u9996\u4E2A\u5355\u5143\u683C\u5305\u542B\u516C\u5F0F\u65F6\uFF0C\u7CFB\u7EDF\u4F1A\u8FD4\u56DE TRUE\u3002\u5982\u679C\u662F\u4EFB\u4F55\u5176\u4ED6\u503C\uFF0C\u7CFB\u7EDF\u90FD\u5C06\u8FD4\u56DE FALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'CELL',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u6709\u5173\u5355\u5143\u683C\u7684\u683C\u5F0F\u3001\u4F4D\u7F6E\u6216\u5185\u5BB9\u7684\u4FE1\u606F\u3002',\r\n        'a': '\u8FD4\u56DE\u6709\u5173\u5355\u5143\u683C\u7684\u683C\u5F0F\u3001\u4F4D\u7F6E\u6216\u5185\u5BB9\u7684\u4FE1\u606F\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name': 'info_type',\r\n            'detail': '\u4E00\u4E2A\u6587\u672C\u503C\uFF0C\u6307\u5B9A\u8981\u8FD4\u56DE\u7684\u5355\u5143\u683C\u4FE1\u606F\u7684\u7C7B\u578B\u3002',\r\n            'example': '\"type\"',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'reference',\r\n            'detail': '\u9700\u8981\u5176\u76F8\u5173\u4FE1\u606F\u7684\u5355\u5143\u683C\u3002',\r\n            'example': 'C2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'NA',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u9519\u8BEF\u503C #N/A\u3002',\r\n        'a': '\u8FD4\u56DE\u9519\u8BEF\u503C #N/A\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'ERROR_TYPE',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u4E0E\u5176\u4ED6\u5355\u5143\u683C\u4E2D\u7684\u9519\u8BEF\u503C\u76F8\u5BF9\u5E94\u7684\u6570\u5B57\u3002',\r\n        'a': '\u8FD4\u56DE\u4E0E\u5176\u4ED6\u5355\u5143\u683C\u4E2D\u7684\u9519\u8BEF\u503C\u76F8\u5BF9\u5E94\u7684\u6570\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'error_val',\r\n            'detail': '\u7528\u4E8E\u67E5\u627E\u9519\u8BEF\u53F7\u7684\u5355\u5143\u683C\uFF0C\u867D\u7136\u60A8\u4E5F\u53EF\u4EE5\u76F4\u63A5\u63D0\u4F9B\u9519\u8BEF\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISBLANK',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u6240\u5F15\u7528\u7684\u5355\u5143\u683C\u662F\u5426\u4E3A\u7A7A\u3002',\r\n        'a': '\u68C0\u67E5\u6240\u5F15\u7528\u7684\u5355\u5143\u683C\u662F\u5426\u4E3A\u7A7A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u5BF9\u8981\u68C0\u67E5\u5176\u662F\u5426\u4E3A\u7A7A\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\u3002\\n\\n\u5982\u679C\u662F\u7A7A\u5355\u5143\u683C\uFF0C\u5219 TRUE\uFF1B\u5426\u5219\u8FD4\u56DE FALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'ISERR',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A #N/A \u4EE5\u5916\u7684\u9519\u8BEF\u503C\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A #N/A \u4EE5\u5916\u7684\u9519\u8BEF\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A#N/A\u4EE5\u5916\u7684\u9519\u8BEF\u7C7B\u578B\u7684\u503C\u3002\\n\\n\u5982\u679C\u503C\u662F\u9664#N/A\u4E4B\u5916\u7684\u4EFB\u4F55\u9519\u8BEF\uFF08\u5305\u62EC#DIV/0!\u3001#NAME?\u3001#NULL!\u3001#NUM!\u3001#VALUE!\u548C#REF!\uFF09\uFF0CISERR\u5C06\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISERROR',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u9519\u8BEF\u503C\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u9519\u8BEF\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u9519\u8BEF\u7C7B\u578B\u7684\u503C\u3002\\n\\n\u53EA\u8981\u503C\u662F\u67D0\u79CD\u9519\u8BEF\u503C\uFF08\u5305\u62EC#DIV/0!\u3001#N/A\u3001#NAME?\u3001#NULL!\u3001#NUM!\u3001#VALUE!\u548C#REF!\uFF09\uFF0CISERROR\u5C31\u4F1A\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISLOGICAL',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F TRUE \u8FD8\u662F FALSE\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F TRUE \u8FD8\u662F FALSE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u4E3A\u903B\u8F91TRUE\u8FD8\u662F\u903B\u8F91FALSE\u7684\u503C\u3002\\n\\n*\u5982\u679C\u503C\u4E3ATRUE\u6216FALSE\uFF0C\u6216\u4E3A\u6307\u5411\u503C\u4E3ATRUE\u6216FALSE\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CISLOGICAL\u5C06\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISNA',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u9519\u8BEF\u503C #N/A\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u9519\u8BEF\u503C #N/A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u4E0E\u9519\u8BEF\u503C#N/A\u8FDB\u884C\u6BD4\u8F83\u7684\u503C\u3002\\n\\n*\u5982\u679C\u503C\u4E3A#N/A\u6216\u6307\u5411\u5305\u542B#N/A\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219ISNA\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISNONTEXT',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u975E\u6587\u672C\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u975E\u6587\u672C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u68C0\u67E5\u7684\u6587\u672C\u3002\\n\\n*\u5982\u679C\u53C2\u6570\u4E3A\u6587\u672C\u503C\u6216\u6307\u5411\u5305\u542B\u6587\u672C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CISNONTEXT\u5C06\u8FD4\u56DEFALSE\uFF0C\u5426\u5219\u8FD4\u56DETRUE\u3002\\n\\n\u5F53\u503C\u4E3A\u6307\u5411\u7A7A\u5355\u5143\u683C\u7684\u5F15\u7528\u65F6\uFF0CISNONTEXT\u4F1A\u8FD4\u56DETRUE\u3002\\n\\n\u5F53\u503C\u4E3A\u7A7A\u5B57\u7B26\u4E32\u65F6\uFF0CISNONTEXT\u5C06\u8FD4\u56DEFALSE\uFF0C\u56E0\u4E3A\u7A7A\u4E32\u88AB\u89C6\u4F5C\u6587\u672C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISNUMBER',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6570\u5B57\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6570\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u6570\u5B57\u7684\u503C\u3002\\n\\n*\u5982\u679C\u53C2\u6570\u4E3A\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u5B57\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CISNUMBER\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISREF',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6709\u6548\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6709\u6548\u7684\u5355\u5143\u683C\u5F15\u7528\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u5355\u5143\u683C\u5F15\u7528\u7684\u503C\u3002\\n\\n*\u5982\u679C\u53C2\u6570\u662F\u6709\u6548\u7684\u5355\u5143\u683C\u5F15\u7528\uFF0CISREF\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'ISTEXT',\r\n        't': 15,\r\n        'd': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6587\u672C\u3002',\r\n        'a': '\u68C0\u67E5\u67D0\u4E2A\u503C\u662F\u5426\u4E3A\u6587\u672C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u9A8C\u8BC1\u5176\u662F\u5426\u4E3A\u6587\u672C\u7684\u503C\u3002\\n\\n\u5982\u679C\u53C2\u6570\u4E3A\u6587\u672C\u503C\u6216\u6307\u5411\u5305\u542B\u6587\u672C\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CISTEXT\u5C06\u8FD4\u56DETRUE\uFF0C\u5426\u5219\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TYPE',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u6570\u503C\u7684\u7C7B\u578B\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u503C\u7684\u7C7B\u578B\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u786E\u5B9A\u5176\u7C7B\u578B\u7684\u6570\u636E\u3002\\n\\n\u6570\u5B57 \u8FD4\u56DE 1;\\n\\n\u6587\u672C \u8FD4\u56DE 2;\\n\\n\u903B\u8F91\u503C \u8FD4\u56DE 4;\\n\\n\u9519\u8BEF\u503C \u8FD4\u56DE 16;\\n\\n\u6570\u7EC4 \u8FD4\u56DE 64;',\r\n            'example': 'C4',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'N',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u8F6C\u5316\u4E3A\u6570\u503C\u540E\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u8F6C\u5316\u4E3A\u6570\u503C\u540E\u7684\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u6570\u5B57\u7684\u53C2\u6570\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6570\u5B57\uFF0C\u5219\u8FD4\u56DE\u8BE5\u6570\u5B57\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u65E5\u671F\uFF0C\u5219\u8FD4\u56DE\u8BE5\u65E5\u671F\u7684\u5E8F\u5217\u53F7\u3002\\n\\n\u5982\u679C\u503C\u4E3ATRUE\uFF0C\u5219\u8FD4\u56DE1\u3002\\n\\n\u5982\u679C\u503C\u4E3AFALSE\uFF0C\u5219\u8FD4\u56DE0\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u9519\u8BEF\u503C\uFF0C\u5219\u8FD4\u56DE\u9519\u8BEF\u503C\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u5176\u4ED6\u503C\uFF0C\u5219\u8FD4\u56DE0\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TO_DATE',\r\n        't': 16,\r\n        'd': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u65E5\u671F\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u65E5\u671F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u65E5\u671F\u7684\u53C2\u6570\u6216\u5176\u5355\u5143\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CTO_DATE\u4F1A\u5C06\u503C\u8F6C\u6362\u4E3A\u76F8\u5E94\u7684\u65E5\u671F\u5E76\u8FD4\u56DE\uFF0C\u503C\u4EE3\u8868\u4ECE\u5341\u4E8C\u670830\u65E5\u5230\u5BF9\u5E94\u7684\u65E5\u671F\u4E4B\u95F4\u7684\u5929\u6570\uFF0C\\n\\n\u8D1F\u503C\u8868\u793A\u5BF9\u5E94\u7684\u65E5\u671F\u5728\u5341\u4E8C\u670830\u65E5\u4E4B\u524D\uFF0C\u800C\u5C0F\u6570\u503C\u5219\u4EE3\u8868\u4E00\u5929\u4E2D\u4ECE\u5348\u591C\u7B97\u8D77\u7684\u65F6\u95F4\u3002\\n\u5982\u679C\u503C\u4E0D\u662F\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219TO_DATE\u5C06\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '25405',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TO_PURE_NUMBER',\r\n        't': 16,\r\n        'd': '\u5C06\u7ED9\u5B9A\u7684\u65E5\u671F/\u65F6\u95F4\u3001\u767E\u5206\u6BD4\u3001\u8D27\u5E01\u91D1\u989D\u6216\u5176\u4ED6\u683C\u5F0F\u7684\u6570\u503C\u8F6C\u6362\u4E3A\u4E0D\u5E26\u683C\u5F0F\u7684\u7EAF\u6570\u5B57\u3002',\r\n        'a': '\u5C06\u7ED9\u5B9A\u7684\u65E5\u671F/\u65F6\u95F4\u3001\u767E\u5206\u6BD4\u3001\u8D27\u5E01\u91D1\u989D\u6216\u5176\u4ED6\u683C\u5F0F\u7684\u6570\u503C\u8F6C\u6362\u4E3A\u4E0D\u5E26\u683C\u5F0F\u7684\u7EAF\u6570\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u7EAF\u6570\u5B57\u7684\u53C2\u6570\u6216\u5176\u5355\u5143\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6570\u5B57\u6216\u6307\u5411\u5305\u542B\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CTO_PURE_NUMBER\u5C06\u4EE5\u4E0D\u5E26\u4EFB\u4F55\u683C\u5F0F\u4E0E\u89E3\u91CA\u7684\u5F62\u5F0F\u8FD4\u56DE\u503C\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219TO_PERCENT\u5C06\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '50%',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TO_TEXT',\r\n        't': 16,\r\n        'd': '\u5C06\u7ED9\u5B9A\u7684\u6570\u5B57\u503C\u8F6C\u6362\u4E3A\u6587\u672C\u683C\u5F0F\u3002',\r\n        'a': '\u5C06\u7ED9\u5B9A\u7684\u6570\u5B57\u503C\u8F6C\u6362\u4E3A\u6587\u672C\u683C\u5F0F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u6587\u672C\u7684\u53C2\u6570\u6216\u5176\u5355\u5143\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6570\u5B57\u6216\u6307\u5411\u5305\u542B\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CTO_TEXT\u5C06\u8FD4\u56DE\u5B57\u7B26\u4E32\u5F62\u5F0F\u7684\u503C\uFF0C\u5E76\u4FDD\u6301\u73B0\u6709\u683C\u5F0F\u3002\u5373\u539F\u4E3A\u8D27\u5E01\u7684\u4ECD\u4E3A\u8D27\u5E01\uFF0C\u539F\u4E3A\u5341\u8FDB\u5236\u6570\u7684\u4ECD\u4E3A\u5341\u8FDB\u5236\u6570\uFF0C\u539F\u4E3A\u767E\u5206\u6BD4\u7684\u4ECD\u4E3A\u767E\u5206\u6BD4\uFF0C\u539F\u4E3A\u65E5\u671F\u7684\u4ECD\u4E3A\u65E5\u671F\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219TO_TEXT\u5C06\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '24',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TO_DOLLARS',\r\n        't': 16,\r\n        'd': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u7F8E\u5143\u91D1\u989D\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u7F8E\u5143\u91D1\u989D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u7F8E\u5143\u91D1\u989D\u7684\u53C2\u6570\u6216\u5176\u5355\u5143\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219 TO_DOLLARS \u5C06\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TO_PERCENT',\r\n        't': 16,\r\n        'd': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u767E\u5206\u6BD4\u3002',\r\n        'a': '\u5C06\u6307\u5B9A\u7684\u6570\u5B57\u8F6C\u6362\u4E3A\u767E\u5206\u6BD4\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name': 'value',\r\n            'detail': '\u8981\u8F6C\u6362\u4E3A\u767E\u5206\u6BD4\u7684\u53C2\u6570\u6216\u5176\u5355\u5143\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E3A\u6570\u5B57\u6216\u6307\u5411\u5305\u542B\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0CTO_PERCENT\u4F1A\u4EE51 = 100%\u4E3A\u6807\u51C6\uFF0C\u5C06\u503C\u8F6C\u6362\u4E3A\u767E\u5206\u6BD4\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6570\u5B57\u6216\u6307\u5411\u5185\u5BB9\u4E3A\u6570\u503C\u7684\u5355\u5143\u683C\u7684\u5F15\u7528\uFF0C\u5219TO_PERCENT\u5C06\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DGET',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u4ECE\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5217\u4E2D\u63D0\u53D6\u7B26\u5408\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u4E2A\u503C\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u4ECE\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5217\u4E2D\u63D0\u53D6\u7B26\u5408\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u4E2A\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DMAX',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5927\u6570\u5B57\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5927\u6570\u5B57\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DMIN',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5C0F\u6570\u5B57\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5C0F\u6570\u5B57\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DAVERAGE',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u5BF9\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u503C\u6C42\u5E73\u5747\u503C\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u5BF9\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u503C\u6C42\u5E73\u5747\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DCOUNT',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u5305\u542B\u6570\u5B57\u7684\u5355\u5143\u683C\u7684\u4E2A\u6570\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u5305\u542B\u6570\u5B57\u7684\u5355\u5143\u683C\u7684\u4E2A\u6570\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DCOUNTA',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u975E\u7A7A\u5355\u5143\u683C\u7684\u4E2A\u6570\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u975E\u7A7A\u5355\u5143\u683C\u7684\u4E2A\u6570\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DPRODUCT',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u503C\u7684\u4E58\u79EF\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u503C\u7684\u4E58\u79EF\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DSTDEV',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u4E00\u4E2A\u6837\u672C\u4F30\u7B97\u51FA\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u4E00\u4E2A\u6837\u672C\u4F30\u7B97\u51FA\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DSTDEVP',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u51FA\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u6837\u672C\u603B\u4F53\u8BA1\u7B97\u51FA\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DSUM',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4E4B\u548C\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4E4B\u548C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DVAR',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u4E00\u4E2A\u6837\u672C\u4F30\u7B97\u51FA\u7684\u603B\u4F53\u65B9\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5229\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u4F5C\u4E3A\u4E00\u4E2A\u6837\u672C\u4F30\u7B97\u51FA\u7684\u603B\u4F53\u65B9\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        'n': 'DVARP',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u901A\u8FC7\u4F7F\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u8BA1\u7B97\u6837\u672C\u603B\u4F53\u7684\u6837\u672C\u603B\u4F53\u65B9\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528 SQL \u5F0F\u67E5\u8BE2\uFF0C\u901A\u8FC7\u4F7F\u7528\u5217\u8868\u6216\u6570\u636E\u5E93\u4E2D\u6EE1\u8DB3\u6307\u5B9A\u6761\u4EF6\u7684\u8BB0\u5F55\u5B57\u6BB5\uFF08\u5217\uFF09\u4E2D\u7684\u6570\u5B57\u8BA1\u7B97\u6837\u672C\u603B\u4F53\u7684\u6837\u672C\u603B\u4F53\u65B9\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name': 'database',\r\n            'detail': '\u6784\u6210\u5217\u8868\u6216\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\uFF0C\u5217\u8868\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6807\u7B7E\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'field',\r\n            'detail': '\u6307\u5B9A database \u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u63D0\u53D6\u548C\u7528\u4E8E\u8BA1\u7B97\u7684\u503C\u3002\\n\\nfield \u53EF\u4EE5\u662F\u4E0E database \u7B2C\u4E00\u884C\u4E2D\u67D0\u4E2A\u5217\u6807\u9898\u5BF9\u5E94\u7684\u6587\u672C\u6807\u7B7E\uFF0C\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u5173\u5217\u7684\u6570\u5B57\u7D22\u5F15\uFF0C\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u4E3A 1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'criteria',\r\n            'detail': '\u5305\u542B\u6240\u6307\u5B9A\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\u3002\u8BA1\u7B97\u4E4B\u524D\u5C06\u4F7F\u7528\u8FD9\u4E9B\u6761\u4EF6\u6765\u8FC7\u6EE4 database \u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }]\r\n    }, {\r\n        \"n\": \"AGE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u5E74\u9F84\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u5E74\u9F84\u3002\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": \"A1\",\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u622A\u6B62\u65E5\u671F\",\r\n            \"example\": '\"2017-10-01\"',\r\n            \"detail\": \"\u5E74\u9F84\u8BA1\u7B97\u7684\u622A\u6B62\u65E5\u671F\u6216\u8303\u56F4\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u65E5\u3002\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedatetime\"\r\n        }]\r\n    },\r\n    // SEX_BY_IDCARD\r\n    {\r\n        \"n\": \"SEX_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u6027\u522B\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u6027\u522B\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // BIRTHDAY_BY_IDCARD\r\n    {\r\n        \"n\": \"BIRTHDAY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u751F\u65E5\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u751F\u65E5\u3002\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u751F\u65E5\u683C\u5F0F\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u65E5\u671F\u7C7B\u578B,\u9ED8\u8BA40:[1900/01/01], 1:[1900-01-01], 2:[1900\u5E741\u67081\u65E5]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // PROVINCE_BY_IDCARD\r\n    {\r\n        \"n\": \"PROVINCE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u7C4D\u8D2F\u7684\u7701\u4EFD\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u7C4D\u8D2F\u7684\u7701\u4EFD\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // CITY_BY_IDCARD\r\n    {\r\n        \"n\": \"CITY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u7C4D\u8D2F\u7684\u57CE\u5E02\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u7C4D\u8D2F\u7684\u57CE\u5E02\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // STAR_BY_IDCARD\r\n    {\r\n        \"n\": \"STAR_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u661F\u5EA7\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u661F\u5EA7\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // ANIMAL_BY_IDCARD\r\n    {\r\n        \"n\": \"ANIMAL_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u636E\u4E2D\u56FD\u8EAB\u4EFD\u8BC1\u53F7\u8BA1\u7B97\u51FA\u751F\u8096\uFF08\u9F20\u3001\u725B\u3001\u864E\u3001\u5154...\uFF09\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u6839\u636E\u8EAB\u4EFD\u8BC1\u53F7\u5F97\u5230\u751F\u8096\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // ISIDCARD\r\n    {\r\n        \"n\": \"ISIDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u9A8C\u8BC1\u8EAB\u4EFD\u8BC1\u7684\u683C\u5F0F\u662F\u5426\u6B63\u786E\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8BC1\",\r\n        \"a\": \"\u9A8C\u8BC1\u8EAB\u4EFD\u8BC1\u683C\u5F0F\u6B63\u786E\u6027\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u8EAB\u4EFD\u8BC1\u53F7\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\": \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8BC1\u53F7\u6216\u8303\u56F4\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    // DM_TEXT_CUTWORD\r\n    {\r\n        \"n\": \"DM_TEXT_CUTWORD\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u6587\u672C\u5206\u8BCD\u3002\u628A\u4E00\u8FDE\u4E32\u6587\u5B57\u62C6\u5206\u4E3A\u4E00\u7CFB\u5217\u5355\u72EC\u8BCD\u8BED\",\r\n        \"a\": \"\u4E2D\u6587\u6587\u672C\u5206\u8BCD\u3002\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"\u6587\u672C\",\r\n            \"example\": '\"\u6211\u6765\u5230\u5317\u4EAC\u6E05\u534E\u5927\u5B66\"',\r\n            \"detail\": \"\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u5206\u8BCD\u6A21\u5F0F\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9ED8\u8BA4\u4E3A0[\u7CBE\u786E\u6A21\u5F0F], 1[\u5168\u6A21\u5F0F], 2[\u641C\u7D22\u5F15\u64CE\u6A21\u5F0F]\u3002\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DM_TEXT_TFIDF\r\n    {\r\n        \"n\": \"DM_TEXT_TFIDF\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u91C7\u7528tf-idf\u7B97\u6CD5\u8FDB\u884C\u5173\u952E\u8BCD\u63D0\u53D6\u3002\u4ECE\u4E00\u8FDE\u4E32\u6587\u5B57\u4E2D\u8BC6\u522B\u5173\u952E\u8BCD\",\r\n        \"a\": \"tf-idf\u5173\u952E\u8BCD\u8BC6\u522B\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u6587\u672C\",\r\n            \"example\": '\"\u6211\u6765\u5230\u5317\u4EAC\u6E05\u534E\u5927\u5B66\"',\r\n            \"detail\": \"\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u5173\u952E\u8BCD\u4E2A\u6570\",\r\n            \"example\": '20',\r\n            \"detail\": \"\u7B97\u6CD5\u8FD4\u56DE\u7684\u5173\u952E\u8BCD\u4E2A\u6570\uFF0C\u9ED8\u8BA420\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"\u8BED\u6599\u5E93\",\r\n            \"example\": '1',\r\n            \"detail\": \"\u9009\u62E9\u7279\u5B9A\u9886\u57DF\u7684\u8BED\u6599\u5E93\uFF0C\u9ED8\u8BA40[\u901A\u7528], 1[\u91D1\u878D], 2[\u533B\u7597]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DM_TEXT_TEXTRANK\r\n    {\r\n        \"n\": \"DM_TEXT_TEXTRANK\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u91C7\u7528TextRank\u7B97\u6CD5\u8FDB\u884C\u5173\u952E\u8BCD\u63D0\u53D6\u3002\u4ECE\u4E00\u8FDE\u4E32\u6587\u5B57\u4E2D\u8BC6\u522B\u5173\u952E\u8BCD\",\r\n        \"a\": \"TextRank\u5173\u952E\u8BCD\u8BC6\u522B\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u6587\u672C\",\r\n            \"example\": '\"\u6211\u6765\u5230\u5317\u4EAC\u6E05\u534E\u5927\u5B66\"',\r\n            \"detail\": \"\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u5173\u952E\u8BCD\u4E2A\u6570\",\r\n            \"example\": '20',\r\n            \"detail\": \"\u7B97\u6CD5\u8FD4\u56DE\u7684\u5173\u952E\u8BCD\u4E2A\u6570\uFF0C\u9ED8\u8BA420\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"\u8BED\u6599\u5E93\",\r\n            \"example\": '1',\r\n            \"detail\": \"\u9009\u62E9\u7279\u5B9A\u9886\u57DF\u7684\u8BED\u6599\u5E93\uFF0C\u9ED8\u8BA40[\u901A\u7528], 1[\u91D1\u878D], 2[\u533B\u7597]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_CLOSE\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_CLOSE\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6536\u76D8\u4EF7\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6536\u76D8\u4EF7\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_OPEN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_OPEN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u5F00\u76D8\u4EF7\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u5F00\u76D8\u4EF7\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_MAX\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MAX\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6700\u9AD8\u4EF7\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6700\u9AD8\u4EF7\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_MIN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MIN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6700\u4F4E\u4EF7\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6700\u4F4E\u4EF7\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_VOLUMN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_VOLUMN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6210\u4EA4\u91CF\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6210\u4EA4\u91CF\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_AMOUNT\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_AMOUNT\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u636E\u80A1\u7968\u4EE3\u7801\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6210\u4EA4\u989D\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5BF9\u5E94\u80A1\u7968\u6210\u4EA4\u989D\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"\u80A1\u7968\u4EE3\u7801\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\": \"6\u4F4D\u80A1\u7968\u4EE3\u7801\uFF0C\u5FC5\u586B\u9879\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\": \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"\u590D\u6743\u9664\u6743\",\r\n            \"example\": '0',\r\n            \"detail\": \"\u9009\u62E9\u80A1\u7968\u7684\u9664\u6743\u590D\u6743\u7C7B\u578B\uFF0C\u9ED8\u8BA40[\u524D\u590D\u6743], 1[\u539F\u59CB\u4EF7\u683C], 2[\u540E\u590D\u6743]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    // ISDATE\r\n    {\r\n        \"n\": \"ISDATE\",\r\n        \"t\": \"6\",\r\n        \"d\": \"\u9A8C\u8BC1\u65E5\u671F\u7684\u683C\u5F0F\u662F\u5426\u6B63\u786E\u3002\u652F\u6301\u591A\u79CD\u65E5\u671F\u683C\u5F0F\",\r\n        \"a\": \"\u9A8C\u8BC1\u65E5\u671F\u683C\u5F0F\u6B63\u786E\u6027\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u65E5\u671F\",\r\n            \"example\": '\"1990-01-01\"',\r\n            \"detail\": \"\u65E5\u671F\u503C\uFF0C\u4F8B\u59821990/01/01, 1990\u5E741\u67081\u65E5\u7B49\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    //sparklines\u51FD\u6570\uFF0C\u7EBF\u56FE\r\n    {\r\n        \"n\": \"LINESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u6298\u7EBF\u56FEsparklines\uFF0C\u7528\u4E8E\u63CF\u8FF0\u6570\u636E\u7684\u8FDE\u7EED\u8D70\u52BF\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u6298\u7EBF\u56FE\",\r\n        \"m\": [1, 8],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\": \"\u7EBF\u6761\u989C\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            // {\r\n            //     \"name\": \"\u586B\u5145\u989C\u8272\",\r\n            //     \"example\": '#CCF3F4',\r\n            //     \"detail\": \"\u5F62\u6210\u9762\u79EF\u56FE\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            //lineWidth\r\n            {\r\n                \"name\": \"\u7EBF\u6761\u7C97\u7EC6\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u6298\u7EBF\u56FE\u7EBF\u6BB5\u7C97\u7EC6\uFF0C\u9ED8\u8BA4\u4E3A1px\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //normalRangeMin\u548CnormalRangeMax\u8BBE\u4E3A\u76F8\u540C\u7684\u503C\uFF0Cmin\u3001max\u3001avg\u3001median\u9700\u8981\u8BA1\u7B97\r\n            {\r\n                \"name\": \"\u8F85\u52A9\u7EBF\",\r\n                \"example\": 'avg',\r\n                \"detail\": \"\u4E00\u6761\u6A2A\u7EBF\uFF0C\u53EF\u4EE5\u662Fmin\u3001max\u3001avg\u3001median\u3001\u8303\u56F4\u6216\u81EA\u5B9A\u4E49\u6570\u503C\uFF0C\u9ED8\u8BA40\u65E0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //normalRangeColor\r\n            {\r\n                \"name\": \"\u8F85\u52A9\u7EBF\u989C\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\": \"\u8F85\u52A9\u7EBF\u7684\u989C\u8272\u8BBE\u7F6E\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //maxSpotColor\r\n            {\r\n                \"name\": \"\u6700\u5927\u503C\u6807\u8BC6\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5927\u503C\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //minSpotColor\r\n            {\r\n                \"name\": \"\u6700\u5C0F\u503C\u6807\u8BC6\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5C0F\u503C\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //spotRadius\r\n            {\r\n                \"name\": \"\u6807\u8BC6\u5927\u5C0F\",\r\n                \"example\": '1.5',\r\n                \"detail\": \"\u6700\u5927\u503C\u548C\u6700\u5C0F\u503C\u7684\u6807\u8BC6\u5927\u5C0F\u8BBE\u7F6E\uFF0C\u9ED8\u8BA4\u4E3A1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u9762\u79EF\u56FE\r\n    {\r\n        \"n\": \"AREASPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u9762\u79EF\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u6570\u636E\u7684\u8FDE\u7EED\u7D2F\u79EF\u503C\u8D70\u52BF\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u9762\u79EF\u56FE\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\": \"\u7EBF\u6761\u989C\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //fillColor\r\n            {\r\n                \"name\": \"\u586B\u5145\u989C\u8272\",\r\n                \"example\": '#CCF3F4',\r\n                \"detail\": \"\u5F62\u6210\u9762\u79EF\u56FE\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //lineWidth\r\n            {\r\n                \"name\": \"\u7EBF\u6761\u7C97\u7EC6\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u6298\u7EBF\u56FE\u7EBF\u6BB5\u7C97\u7EC6\uFF0C\u9ED8\u8BA4\u4E3A1px\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //normalRangeMin\u548CnormalRangeMax\u8BBE\u4E3A\u76F8\u540C\u7684\u503C\uFF0Cmin\u3001max\u3001avg\u3001median\u9700\u8981\u8BA1\u7B97\r\n            {\r\n                \"name\": \"\u8F85\u52A9\u7EBF\",\r\n                \"example\": 'avg',\r\n                \"detail\": \"\u4E00\u6761\u6A2A\u7EBF\uFF0C\u53EF\u4EE5\u662Fmin\u3001max\u3001avg\u3001median\u3001\u8303\u56F4\u6216\u81EA\u5B9A\u4E49\u6570\u503C\uFF0C\u9ED8\u8BA40\u65E0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //normalRangeColor\r\n            {\r\n                \"name\": \"\u8F85\u52A9\u7EBF\u989C\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\": \"\u8F85\u52A9\u7EBF\u7684\u989C\u8272\u8BBE\u7F6E\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n            // //maxSpotColor\r\n            // {\r\n            //     \"name\": \"\u6700\u5927\u503C\u6807\u8BC6\",\r\n            //     \"example\": '#fc5c5c',\r\n            //     \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5927\u503C\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            // //minSpotColor\r\n            // {\r\n            //     \"name\": \"\u6700\u5C0F\u503C\u6807\u8BC6\",\r\n            //     \"example\": '#fc5c5c',\r\n            //     \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5927\u503C\uFF0C\u540C\u7EBF\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            // //spotRadius\r\n            // {\r\n            //     \"name\": \"\u6807\u8BC6\u5927\u5C0F\",\r\n            //     \"example\": '1.5',\r\n            //     \"detail\": \"\u6700\u5927\u503C\u548C\u6700\u5C0F\u503C\u7684\u6807\u8BC6\u5927\u5C0F\u8BBE\u7F6E\uFF0C\u9ED8\u8BA4\u4E3A1.5\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // }\r\n        ]\r\n    },\r\n    //sparklines\u67F1\u72B6\u56FE\r\n    {\r\n        \"n\": \"COLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u5782\u76F4\u67F1\u72B6\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u79BB\u6563\u6570\u636E\u4E4B\u95F4\u7684\u5927\u5C0F\u60C5\u51B5\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u5782\u76F4\u67F1\u72B6\u56FE\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\": \"\u67F1\u6761\u95F4\u9694\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u67F1\u6761\u4E4B\u95F4\u7684\u95F4\u9694\u8DDD\u79BB\uFF0C\u9ED8\u8BA4\u4E3A1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barColor\r\n            {\r\n                \"name\": \"\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\u8BBE\u7F6E\uFF0C\u4EE3\u8868\u8D1F\u503C\u7684\u989C\u8272\uFF0C\u540C\u67F1\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\": \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\": \"\u67F1\u56FE\u6700\u5927\u503C\uFF0C\u7528\u4E8E\u89C4\u8303\u67F1\u56FE\u957F\u5EA6\uFF0C\u9ED8\u8BA4\u4E3A\u81EA\u52A8\u8BA1\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\": \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u5355\u72EC\u8BBE\u7F6E\u6BCF\u4E2A\u67F1\u6761\u7684\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u591A\u4E2A\uFF0C\u652F\u6301\u4E24\u79CD\u683C\u5F0F\uFF1A1\u989C\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u4E2A\u67F1\u7684\u989C\u8272\u662F\u9ED1\u8272\uFF1B2\u6570\u503C\u8303\u56F4:\u989C\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6570\u503C\u4E3A-2\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C0:5:#000\u8868\u793A\u6570\u503C0-5\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7D2F\u79EF\u67F1\u72B6\u56FE\r\n    {\r\n        \"n\": \"STACKCOLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u7D2F\u79EF\u5782\u76F4\u67F1\u72B6\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u79BB\u6563\u6570\u636E\u591A\u4E2A\u7EF4\u5EA6\u7684\u6570\u503C\u5927\u5C0F\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u7D2F\u79EF\u5782\u76F4\u67F1\u72B6\u56FE\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //stackconfig\r\n            {\r\n                \"name\": \"\u6309\u5217\u5806\u79EF\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u5982\u679C\u9700\u8981\u6309\u884C\u5806\u79EF\u5219\u672C\u9879\u8BBE\u4E3Afalse\u62160\uFF0C\u9ED8\u8BA4\u4E3A\u662F1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\": \"\u67F1\u6761\u95F4\u9694\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u67F1\u6761\u4E4B\u95F4\u7684\u95F4\u9694\u8DDD\u79BB\uFF0C\u9ED8\u8BA4\u4E3A1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\": \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\": \"\u7D2F\u79EF\u67F1\u56FE\u6700\u5927\u503C\uFF0C\u7528\u4E8E\u89C4\u8303\u67F1\u56FE\u957F\u5EA6\uFF0C\u9ED8\u8BA4\u4E3A\u81EA\u52A8\u8BA1\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //stackedBarColor\r\n            {\r\n                \"name\": \"\u7D2F\u79EF\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u5355\u72EC\u8BBE\u7F6E\u6BCF\u4E2A\u7EF4\u5EA6\u7684\u67F1\u6761\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u4E3AA1:A10\u7B49\u8303\u56F4\uFF0C\u9ED8\u8BA4\u4E3A#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u6761\u5F62\u56FE\r\n    {\r\n        \"n\": \"BARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u6A2A\u5411\u6761\u5F62\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u79BB\u6563\u6570\u636E\u4E4B\u95F4\u7684\u5927\u5C0F\u60C5\u51B5\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u6A2A\u5411\u6761\u5F62\u56FE\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\": \"\u67F1\u6761\u95F4\u9694\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u67F1\u6761\u4E4B\u95F4\u7684\u95F4\u9694\u8DDD\u79BB\uFF0C\u9ED8\u8BA4\u4E3A1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barColor\r\n            {\r\n                \"name\": \"\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\u8BBE\u7F6E\uFF0C\u4EE3\u8868\u8D1F\u503C\u7684\u989C\u8272\uFF0C\u540C\u67F1\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\": \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\": \"\u67F1\u56FE\u6700\u5927\u503C\uFF0C\u7528\u4E8E\u89C4\u8303\u67F1\u56FE\u957F\u5EA6\uFF0C\u9ED8\u8BA4\u4E3A\u81EA\u52A8\u8BA1\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\": \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u5355\u72EC\u8BBE\u7F6E\u6BCF\u4E2A\u67F1\u6761\u7684\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u591A\u4E2A\uFF0C\u652F\u6301\u4E24\u79CD\u683C\u5F0F\uFF1A1\u989C\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u4E2A\u67F1\u7684\u989C\u8272\u662F\u9ED1\u8272\uFF1B2\u6570\u503C\u8303\u56F4:\u989C\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6570\u503C\u4E3A-2\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C0:5:#000\u8868\u793A\u6570\u503C0-5\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7D2F\u79EF\u6761\u5F62\u56FE\r\n    {\r\n        \"n\": \"STACKBARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u7D2F\u79EF\u6A2A\u5411\u6761\u5F62\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u79BB\u6563\u6570\u636E\u591A\u4E2A\u7EF4\u5EA6\u7684\u6570\u503C\u5927\u5C0F\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u7D2F\u79EF\u6A2A\u5411\u6761\u5F62\u56FE\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //stackconfig\r\n            {\r\n                \"name\": \"\u6309\u5217\u5806\u79EF\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u5982\u679C\u9700\u8981\u6309\u884C\u5806\u79EF\u5219\u672C\u9879\u8BBE\u4E3Afalse\u62160\uFF0C\u9ED8\u8BA4\u4E3A\u662F1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\": \"\u67F1\u6761\u95F4\u9694\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u67F1\u6761\u4E4B\u95F4\u7684\u95F4\u9694\u8DDD\u79BB\uFF0C\u9ED8\u8BA4\u4E3A1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\": \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\": \"\u7D2F\u79EF\u67F1\u56FE\u6700\u5927\u503C\uFF0C\u7528\u4E8E\u89C4\u8303\u67F1\u56FE\u957F\u5EA6\uFF0C\u9ED8\u8BA4\u4E3A\u81EA\u52A8\u8BA1\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //stackedBarColor\r\n            {\r\n                \"name\": \"\u7D2F\u79EF\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u5355\u72EC\u8BBE\u7F6E\u6BCF\u4E2A\u7EF4\u5EA6\u7684\u67F1\u6761\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u4E3AA1:A10\u7B49\u8303\u56F4\uFF0C\u9ED8\u8BA4\u4E3A#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u79BB\u6563\u56FE\r\n    {\r\n        \"n\": \"DISCRETESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u79BB\u6563\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u79BB\u6563\u6570\u636E\u8D70\u52BF\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u79BB\u6563\u56FE\",\r\n        \"m\": [1, 4],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //thresholdValue\r\n            {\r\n                \"name\": \"\u5206\u5272\u9608\u503C\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u79BB\u6563\u56FE\u67F1\u5F62\u989C\u8272\u7684\u533A\u5206\uFF0C\u4F8B\u5982\uFF1A\u8BE5\u503C\u4E3A0\uFF0C\u5219\u5927\u4E8E0\u4E3A\u84DD\u8272\uFF0C\u5C0F\u4E8E0\u4E3A\u7EA2\u8272\uFF0C\u9ED8\u8BA4\u4E3A0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\": \"\u9608\u503C\u4EE5\u4E0A\u989C\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //thresholdColor\r\n            {\r\n                \"name\": \"\u9608\u503C\u4EE5\u4E0B\u989C\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u9608\u503C\u4EE5\u4E0B\u67F1\u6761\u989C\u8272\u8BBE\u7F6E\uFF0C\u540C\u9608\u503C\u4EE5\u4E0A\u989C\u8272\uFF0C\u9ED8\u8BA4#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u4E09\u6001\u56FE\r\n    {\r\n        \"n\": \"TRISTATESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u4E09\u6001\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u4E09\u79CD\u6001\u52BF\u7684\u8D70\u52BF\u4F8B\u5982\u80DC\u8D1F\u5E73\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u4E09\u6001\u56FE\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\": \"\u67F1\u6761\u95F4\u9694\",\r\n                \"example\": '1',\r\n                \"detail\": \"\u67F1\u6761\u4E4B\u95F4\u7684\u95F4\u9694\u8DDD\u79BB\uFF0C\u9ED8\u8BA4\u4E3A1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //posBarColor\r\n            {\r\n                \"name\": \"\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\": \"\u7EBF\u56FE\u7684\u7EBF\u6761\u989C\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u4E2A\u8303\u56F4A1\u3001\u8272\u8868\u7D22\u5F15\u6570\u503C\u6216\u8005\u5177\u4F53\u989C\u8272\u503C\uFF0C\u8BBE\u7F6E\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8BA4#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8D1F\u5411\u67F1\u6761\u989C\u8272\u8BBE\u7F6E\uFF0C\u4EE3\u8868\u8D1F\u503C\u7684\u989C\u8272\uFF0C\u540C\u67F1\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //zeroBarColor\r\n            {\r\n                \"name\": \"\u96F6\u503C\u67F1\u6761\u989C\u8272\",\r\n                \"example\": '#999',\r\n                \"detail\": \"\u96F6\u503C\u67F1\u6761\u989C\u8272\u8BBE\u7F6E\uFF0C\u4EE3\u88680\u503C\u989C\u8272\uFF0C\u540C\u67F1\u6761\u989C\u8272\u914D\u7F6E\uFF0C\u9ED8\u8BA4#999\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\": \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u5355\u72EC\u8BBE\u7F6E\u6BCF\u4E2A\u67F1\u6761\u7684\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u591A\u4E2A\uFF0C\u652F\u6301\u4E24\u79CD\u683C\u5F0F\uFF1A1\u989C\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u4E2A\u67F1\u7684\u989C\u8272\u662F\u9ED1\u8272\uFF1B2\u6570\u503C\u8303\u56F4:\u989C\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6570\u503C\u4E3A-2\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C0-5:#000\u8868\u793A\u6570\u503C0-5\u7684\u67F1\u4E3A\u9ED1\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u997C\u56FE\r\n    {\r\n        \"n\": \"PIESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u997C\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u6570\u636E\u5360\u6BD4\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u997C\u56FE\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //offset\r\n            {\r\n                \"name\": \"\u65CB\u8F6C\u89D2\u5EA6\",\r\n                \"example\": '0',\r\n                \"detail\": \"\u997C\u56FE\u7684\u65CB\u8F6C\u89D2\u5EA6\uFF0C\u9ED8\u8BA4\u4E3A0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //borderWidth\r\n            {\r\n                \"name\": \"\u997C\u56FE\u8FB9\u6846\",\r\n                \"example\": '0',\r\n                \"detail\": \"\u997C\u56FE\u8FB9\u6846\u5927\u5C0F\uFF0C\u9ED8\u8BA4\u4E3A\u65E00\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //borderColor\r\n            {\r\n                \"name\": \"\u8FB9\u6846\u989C\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\": \"\u997C\u56FE\u8FB9\u6846\u989C\u8272\uFF0C\u9ED8\u8BA4\u4E3A#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //sliceColors\r\n            {\r\n                \"name\": \"\u997C\u56FE\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\": \"\u8C03\u8272\u677F\u53EF\u4EE5\u8BBE\u7F6E\u5207\u7247\u7684\u989C\u8272\uFF0C\u53EF\u8BBE\u7F6E\u4E3AA1:A10\u7B49\u8303\u56F4\uFF0C\u9ED8\u8BA4\u4E3A#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7BB1\u7EBF\u56FE\r\n    {\r\n        \"n\": \"BOXSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u7BB1\u7EBF\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u6570\u636E\u96C6\u7684\u7EDF\u8BA1\u5206\u5E03\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u7BB1\u7EBF\u56FE\",\r\n        \"m\": [1, 4],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u6570\u636E\u8303\u56F4\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\": \"\u6570\u636E\u8303\u56F4\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //outlierIQR\uFF0C\u5982\u679C\u4E3A0\u6216false\u5219showOutliers\u8BBE\u4E3Afalse\uFF0C\u5426\u5219\u4E3Atrue\r\n            {\r\n                \"name\": \"\u79BB\u7FA4\u70B9\u6BD4\u4F8B\",\r\n                \"example\": '1.5',\r\n                \"detail\": \"\u79BB\u7FA4\u70B9\u7684\u9608\u503C\u8303\u56F4\uFF0C\u5982\u679C\u4E3A0\u6216false\u5219\u4E0D\u663E\u793A\uFF0C\u9ED8\u8BA4\u4E3A1.5\u500D\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //target\r\n            {\r\n                \"name\": \"\u76EE\u6807\u70B9\u503C\",\r\n                \"example\": '10',\r\n                \"detail\": \"\u7BB1\u7EBF\u56FE\u4E0A\u7684\u76EE\u6807\u503C\u8BBE\u7F6E\uFF0C\u9ED8\u8BA4\u4E3Afalse\u4E0D\u663E\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //spotRadius\r\n            {\r\n                \"name\": \"\u6570\u636E\u70B9\u5927\u5C0F\",\r\n                \"example\": '1.5',\r\n                \"detail\": \"\u76EE\u6807\u70B9\u548C\u79BB\u7FA4\u70B9\u7684\u534A\u5F84\u5927\u5C0F\u8BBE\u7F6E\uFF0C\u9ED8\u8BA4\u4E3A1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u5B50\u5F39\u56FE\r\n    {\r\n        \"n\": \"BULLETSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5355\u5143\u683C\u5185\u7684\u5B50\u5F39\u56FEsparklines\uFF0C\u4E00\u822C\u7528\u4E8E\u63CF\u8FF0\u4EFB\u52A1\u8FBE\u6210\u7387\",\r\n        \"a\": \"\u751F\u6210\u5355\u5143\u683C\u5B50\u5F39\u56FE\",\r\n        \"m\": [2, 3],\r\n        \"p\": [\r\n            //\u76EE\u6807data1\r\n            {\r\n                \"name\": \"\u76EE\u6807\",\r\n                \"example\": '10',\r\n                \"detail\": \"\u8FBE\u6210\u7684\u76EE\u6807\u503C\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1\uFF0C 100\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //\u76EE\u524D\u8FBE\u6210data2\r\n            {\r\n                \"name\": \"\u5B9E\u9645\u5B8C\u6210\",\r\n                \"example\": '8',\r\n                \"detail\": \"\u76EE\u524D\u5B8C\u6210\u503C\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1\uFF0C 100\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            //\u5BF9\u6BD4\u503Cdatax\r\n            {\r\n                \"name\": \"\u5BF9\u6BD4\u503C\",\r\n                \"example\": '12',\r\n                \"detail\": \"\u5BF9\u6BD4\u503C\uFF0C\u4F8B\u5982\u8D85\u989D\u3001\u6700\u4F4E\u3001\u83B7\u5956\u5E95\u7EBF\u7B49\uFF0C\u6570\u503C\u624D\u80FD\u88AB\u6709\u6548\u8BA1\u7B97\uFF0C\u4F8B\u5982A1\uFF0C 100\u7B49\u3002\u53EF\u4EE5\u8BBE\u7F6E\u6700\u591A9\u4E2A\u5BF9\u6BD4\u503C\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7EC4\u5408\u56FE\uFF0C\u652F\u6301\u591A\u4E2A\u7C7B\u578B\u7684\u56FE\u753B\u5728\u540C\u4E00\u4E2A\u5355\u5143\u683C\r\n    {\r\n        \"n\": \"COMPOSESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u652F\u6301\u591A\u4E2A\u7C7B\u578B\u7684\u56FE\u753B\u5728\u540C\u4E00\u4E2A\u5355\u5143\u683C,\u6BCF\u4E2A\u53C2\u6570\u4EE3\u8868\u4E00\u4E2Asparklines\u56FE\",\r\n        \"a\": \"\u7EC4\u5408sparklines\u56FE\u5230\u4E00\u4E2A\u5355\u5143\u683C\",\r\n        \"m\": [1, 1],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\": \"\u56FE\u8BBE\u7F6E\",\r\n                \"example\": 'PIESPLINES(A1:A20)',\r\n                \"detail\": \"sparklines\u56FE\u8BBE\u7F6E\uFF0C\u4F8B\u5982A1:A20\uFF0C \u4E00\u4E2A\u5B8C\u6210\u7684\u997C\u56FE\u3001\u7EBF\u56FE\u8BBE\u7F6E\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\r\n    {\r\n        'n': 'SORT',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE\u6570\u7EC4\u4E2D\u5143\u7D20\u7684\u6392\u5E8F\u6570\u7EC4\u3002\u8FD4\u56DE\u7684\u6570\u7EC4\u4E0E\u63D0\u4F9B\u7684\u6570\u7EC4\u53C2\u6570\u5F62\u72B6\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u6570\u7EC4\u4E2D\u5143\u7D20\u7684\u6392\u5E8F\u6570\u7EC4\u3002\u8FD4\u56DE\u7684\u6570\u7EC4\u4E0E\u63D0\u4F9B\u7684\u6570\u7EC4\u53C2\u6570\u5F62\u72B6\u76F8\u540C\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u6392\u5E8F\u7684\u8303\u56F4\u6216\u6570\u7EC4\u3002',\r\n            'example': 'A2:A17',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'sort_index',\r\n            'detail': '[\u53EF\u9009] - \u8868\u793A\u8981\u6392\u5E8F\u7684\u884C\u6216\u5217\u7684\u6570\u5B57\u3002\uFF08\u9ED8\u8BA4row1/col1\uFF09',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'sort_order',\r\n            'detail': '[\u53EF\u9009] - \u8868\u793A\u6240\u9700\u6392\u5E8F\u987A\u5E8F\u7684\u6570\u5B57\uFF1B1\u8868\u793A\u5347\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0C-1\u8868\u793A\u964D\u5E8F\u3002',\r\n            'example': '-1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'by_col',\r\n            'detail': '[\u53EF\u9009] - \u8868\u793A\u6240\u9700\u6392\u5E8F\u65B9\u5411\u7684\u903B\u8F91\u503C\uFF1B\u6309\u884C\u6392\u5E8F\u4E3AFALSE()\uFF08\u9ED8\u8BA4\uFF09\uFF0C\u6309\u5217\u6392\u5E8F\u4E3ATRUE()\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'FILTER',\r\n        't': '14',\r\n        'd': '\u57FA\u4E8E\u4E00\u4E2A\u5E03\u5C14\uFF08\u771F/\u5047\uFF09\u6570\u7EC4\u8FC7\u6EE4\u4E00\u4E2A\u6570\u7EC4\u3002',\r\n        'a': '\u57FA\u4E8E\u4E00\u4E2A\u5E03\u5C14\uFF08\u771F/\u5047\uFF09\u6570\u7EC4\u8FC7\u6EE4\u4E00\u4E2A\u6570\u7EC4\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u8981\u7B5B\u9009\u7684\u6570\u7EC4\u6216\u8303\u56F4\u3002',\r\n            'example': 'A5:D20',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'include',\r\n            'detail': '\u5E03\u5C14\u6570\u7EC4\uFF0C\u5176\u9AD8\u5EA6\u6216\u5BBD\u5EA6\u4E0E\u6570\u7EC4\u76F8\u540C',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'range'\r\n        }, {\r\n            'name': 'if_empty',\r\n            'detail': '[\u53EF\u9009] - \u5982\u679C\u5305\u542B\u6570\u7EC4\u4E2D\u7684\u6240\u6709\u503C\u90FD\u4E3A\u7A7A(filter\u4E0D\u8FD4\u56DE\u4EFB\u4F55\u503C)\uFF0C\u5219\u8FD4\u56DE\u7684\u503C\u3002',\r\n            'example': '\"\"',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'UNIQUE',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE\u5217\u8868\u6216\u533A\u57DF\u4E2D\u7684\u552F\u4E00\u503C\u7684\u5217\u8868\u3002',\r\n        'a': '\u8FD4\u56DE\u5217\u8868\u6216\u533A\u57DF\u4E2D\u7684\u552F\u4E00\u503C\u7684\u5217\u8868\u3002',\r\n        'm': [1, 3],\r\n        'p': [{\r\n            'name': 'array',\r\n            'detail': '\u4ECE\u5176\u8FD4\u56DE\u552F\u4E00\u503C\u7684\u6570\u7EC4\u6216\u533A\u57DF\u3002',\r\n            'example': 'A2:B26',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'by_col',\r\n            'detail': '[\u53EF\u9009] - \u903B\u8F91\u503C\uFF0C\u6307\u793A\u5982\u4F55\u6BD4\u8F83\uFF1B\u6309\u884C = FALSE() \u6216\u7701\u7565\uFF1B\u6309\u5217 = TRUE()\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }, {\r\n            'name': 'occurs_once',\r\n            'detail': '[\u53EF\u9009] - \u903B\u8F91\u503C\uFF0C\u4EC5\u8FD4\u56DE\u552F\u4E00\u503C\u4E2D\u51FA\u73B0\u4E00\u6B21 = TRUE()\uFF1B\u5305\u62EC\u6240\u6709\u552F\u4E00\u503C = FALSE() \u6216\u7701\u7565\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANDARRAY',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE 0 \u5230 1 \u4E4B\u95F4\u7684\u968F\u673A\u6570\u5B57\u6570\u7EC4\u3002',\r\n        'a': '\u8FD4\u56DE 0 \u5230 1 \u4E4B\u95F4\u7684\u968F\u673A\u6570\u5B57\u6570\u7EC4\u3002',\r\n        'm': [0, 2],\r\n        'p': [{\r\n            'name': 'rows',\r\n            'detail': '[\u53EF\u9009] - \u8981\u8FD4\u56DE\u7684\u884C\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cols',\r\n            'detail': '[\u53EF\u9009] - \u8981\u8FD4\u56DE\u7684\u5217\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SEQUENCE',\r\n        't': '14',\r\n        'd': '\u751F\u6210\u6570\u5B57\u5E8F\u5217\u7684\u5217\u8868\u3002',\r\n        'a': '\u751F\u6210\u6570\u5B57\u5E8F\u5217\u7684\u5217\u8868\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name': 'rows',\r\n            'detail': '\u8981\u8FD4\u56DE\u7684\u884C\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'cols',\r\n            'detail': '[\u53EF\u9009] - \u8981\u8FD4\u56DE\u7684\u5217\u6570\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'start',\r\n            'detail': '[\u53EF\u9009] - \u5E8F\u5217\u4E2D\u7684\u7B2C\u4E00\u4E2A\u6570\u5B57\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }, {\r\n            'name': 'step',\r\n            'detail': '[\u53EF\u9009] - \u5E8F\u5217\u4E2D\u6BCF\u4E2A\u5E8F\u5217\u503C\u7684\u589E\u91CF\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat': 'n',\r\n            'type': 'rangenumber'\r\n        }]\r\n    },\r\n    {\r\n        \"n\": \"EVALUATE\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u5BF9\u4EE5\u6587\u5B57\u8868\u793A\u7684\u516C\u5F0F\u6216\u8005\u8868\u8FBE\u5F0F\u6C42\u503C\uFF0C\u5E76\u8FD4\u56DE\u7ED3\u679C\u3002\",\r\n        \"a\": \"\u6839\u636E\u6587\u5B57\u516C\u5F0F\u6216\u8005\u8868\u8FBE\u5F0F\u6C42\u503C\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u516C\u5F0F\",\r\n            \"example\": '\"A1+5*2^2\"',\r\n            \"detail\": \"\u516C\u5F0F\u6216\u8868\u8FBE\u5F0F\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    ],\r\n    toolbar: {\r\n        undo: '\u64A4\u9500',\r\n        redo: '\u91CD\u505A',\r\n        paintFormat: '\u683C\u5F0F\u5237',\r\n        currencyFormat: '\u8D27\u5E01\u683C\u5F0F',\r\n        percentageFormat: '\u767E\u5206\u6BD4\u683C\u5F0F',\r\n        numberDecrease: '\u51CF\u5C11\u5C0F\u6570\u4F4D\u6570',\r\n        numberIncrease: '\u589E\u52A0\u5C0F\u6570\u4F4D\u6570',\r\n        moreFormats: '\u66F4\u591A\u683C\u5F0F',\r\n        font: '\u5B57\u4F53',\r\n        fontSize: '\u5B57\u53F7\u5927\u5C0F',\r\n        bold: '\u7C97\u4F53 (Ctrl+B)',\r\n        italic: '\u659C\u4F53 (Ctrl+I)',\r\n        strikethrough: '\u5220\u9664\u7EBF (Alt+Shift+5)',\r\n        underline: '\u4E0B\u5212\u7EBF',\r\n        textColor: '\u6587\u672C\u989C\u8272',\r\n        chooseColor: '\u989C\u8272\u9009\u62E9',\r\n        resetColor: '\u91CD\u7F6E\u989C\u8272',\r\n        customColor: '\u81EA\u5B9A\u4E49',\r\n        alternatingColors: '\u4EA4\u66FF\u989C\u8272',\r\n        confirmColor: '\u786E\u5B9A\u989C\u8272',\r\n        cancelColor: '\u53D6\u6D88',\r\n        collapse: '\u6536\u8D77',\r\n        fillColor: '\u5355\u5143\u683C\u989C\u8272',\r\n        border: '\u8FB9\u6846',\r\n        borderStyle: '\u8FB9\u6846\u7C7B\u578B',\r\n        mergeCell: '\u5408\u5E76\u5355\u5143\u683C',\r\n        chooseMergeType: '\u9009\u62E9\u5408\u5E76\u7C7B\u578B',\r\n        horizontalAlign: '\u6C34\u5E73\u5BF9\u9F50',\r\n        verticalAlign: '\u5782\u76F4\u5BF9\u9F50',\r\n        alignment: '\u5BF9\u9F50\u65B9\u5F0F',\r\n        textWrap: '\u6587\u672C\u6362\u884C',\r\n        textWrapMode: '\u6362\u884C\u65B9\u5F0F',\r\n        textRotate: '\u6587\u672C\u65CB\u8F6C',\r\n        textRotateMode: '\u65CB\u8F6C\u65B9\u5F0F',\r\n        freezeTopRow: '\u51BB\u7ED3\u9996\u884C',\r\n        sortAndFilter: '\u6392\u5E8F\u548C\u7B5B\u9009',\r\n        findAndReplace: '\u67E5\u627E\u66FF\u6362',\r\n        sum: '\u6C42\u548C',\r\n        autoSum: '\u81EA\u52A8\u6C42\u548C',\r\n        moreFunction: '\u66F4\u591A\u51FD\u6570',\r\n        conditionalFormat: '\u6761\u4EF6\u683C\u5F0F',\r\n        postil: '\u6279\u6CE8',\r\n        pivotTable: '\u6570\u636E\u900F\u89C6\u8868', \r\n        chart: '\u56FE\u8868',\r\n        screenshot: '\u622A\u56FE',\r\n        splitColumn: '\u5206\u5217',\r\n        insertImage: '\u63D2\u5165\u56FE\u7247',\r\n        insertLink: '\u63D2\u5165\u94FE\u63A5',\r\n        dataVerification: '\u6570\u636E\u9A8C\u8BC1',\r\n        protection:\"\u4FDD\u62A4\u5DE5\u4F5C\u8868\u5185\u5BB9\",\r\n\r\n        clearText:\"\u6E05\u9664\u989C\u8272\u9009\u62E9\",\r\n        noColorSelectedText:\"\u6CA1\u6709\u989C\u8272\u88AB\u9009\u62E9\",\r\n\r\n        toolMore:\"\u66F4\u591A\",\r\n        toolLess:\"\u5C11\u4E8E\",\r\n        toolClose:\"\u6536\u8D77\",\r\n        toolMoreTip:\"\u66F4\u591A\u529F\u80FD\",\r\n        moreOptions:\"\u66F4\u591A\u9009\u9879\",\r\n\r\n        cellFormat:\"\u8BBE\u7F6E\u5355\u5143\u683C\u683C\u5F0F\",\r\n        print:\"\u6253\u5370\",\r\n    },\r\n    alternatingColors:{\r\n        applyRange: '\u5E94\u7528\u8303\u56F4',\r\n        selectRange: '\u9009\u62E9\u5E94\u7528\u8303\u56F4',\r\n        header: '\u9875\u7709',\r\n        footer: '\u9875\u811A',\r\n\r\n        errorInfo:\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\",\r\n        textTitle:\"\u683C\u5F0F\u6837\u5F0F\",\r\n        custom:\"\u81EA\u5B9A\u4E49\",\r\n        close:\"\u5173\u95ED\",\r\n        selectionTextColor:\"\u9009\u62E9\u6587\u672C\u989C\u8272\",\r\n        selectionCellColor:\"\u9009\u62E9\u5355\u5143\u683C\u989C\u8272\",\r\n        removeColor:\"\u79FB\u9664\u4EA4\u66FF\u989C\u8272\",\r\n        colorShow:\"\u989C\u8272\",\r\n        currentColor:\"\u5F53\u524D\u989C\u8272\",\r\n\r\n        tipSelectRange:\"\u8BF7\u9009\u62E9\u4EA4\u66FF\u989C\u8272\u5E94\u7528\u8303\u56F4\",\r\n        errorNoRange:\"\u60A8\u9009\u62E9\u7684\u5E94\u7528\u8303\u56F4\u4E0D\u662F\u9009\u533A\uFF01\",\r\n        errorExistColors:\"\u60A8\u9009\u62E9\u7684\u5E94\u7528\u8303\u56F4\u5DF2\u5B58\u5728\u4EA4\u66FF\u989C\u8272\u4E14\u4E0D\u5C5E\u4E8E\u4F60\u8981\u7F16\u8F91\u7684\u5E94\u7528\u8303\u56F4\uFF01\",\r\n    },\r\n    button: {\r\n        confirm: '\u786E\u5B9A',\r\n        cancel: '\u53D6\u6D88',\r\n        close:\"\u5173\u95ED\",\r\n        update:\"Update\",\r\n        delete:\"Delete\",\r\n        insert:\"\u65B0\u5EFA\",\r\n        prevPage: \"\u4E0A\u4E00\u9875\",\r\n        nextPage: \"\u4E0B\u4E00\u9875\",\r\n        total: \"\u603B\u5171\uFF1A\"\r\n    },\r\n    paint: {\r\n        start: '\u683C\u5F0F\u5237\u5F00\u542F',\r\n        end: 'ESC\u952E\u9000\u51FA',\r\n\r\n        tipSelectRange:\"\u8BF7\u9009\u62E9\u9700\u8981\u590D\u5236\u683C\u5F0F\u7684\u533A\u57DF\",\r\n        tipNotMulti:\"\u65E0\u6CD5\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n    },\r\n    format: {\r\n        moreCurrency: '\u66F4\u591A\u8D27\u5E01\u683C\u5F0F',\r\n        moreDateTime: '\u66F4\u591A\u65E5\u671F\u4E0E\u65F6\u95F4\u683C\u5F0F',\r\n        moreNumber: '\u66F4\u591A\u6570\u5B57\u683C\u5F0F',\r\n\r\n        titleCurrency: '\u8D27\u5E01\u683C\u5F0F',\r\n        decimalPlaces: '\u5C0F\u6570\u4F4D\u6570',\r\n        titleDateTime: '\u65E5\u671F\u4E0E\u65F6\u95F4\u683C\u5F0F',\r\n        titleNumber: '\u6570\u5B57\u683C\u5F0F'\r\n    },\r\n    info: {\r\n        detailUpdate: '\u65B0\u6253\u5F00',\r\n        detailSave: '\u5DF2\u6062\u590D\u672C\u5730\u7F13\u5B58',\r\n        row: '\u884C',\r\n        column: '\u5217',\r\n        loading:\"\u6E32\u67D3\u4E2D\u00B7\u00B7\u00B7\",\r\n\r\n        copy:\"\u526F\u672C\",\r\n        return:\"\u8FD4\u56DE\",\r\n        rename:\"\u91CD\u547D\u540D\",\r\n        tips:\"\u8868\u683C\u91CD\u547D\u540D\",\r\n        noName:\"\u65E0\u6807\u9898\u7684\u7535\u5B50\u8868\u683C\",\r\n        wait:\"\u5F85\u66F4\u65B0\",\r\n\r\n        add:\"\u6DFB\u52A0\",\r\n        addLast:\"\u5728\u5E95\u90E8\u6DFB\u52A0\",\r\n        backTop:\"\u56DE\u5230\u9876\u90E8\",\r\n        pageInfo:'\u5171${total}\u6761\uFF0C${totalPage}\u9875\uFF0C\u5F53\u524D\u5DF2\u663E\u793A${currentPage}\u9875',\r\n        nextPage:\"\u4E0B\u4E00\u9875\",\r\n\r\n        tipInputNumber:\"\u8BF7\u8F93\u5165\u6570\u5B57\",\r\n        tipInputNumberLimit:\"\u589E\u52A0\u8303\u56F4\u9650\u5236\u57281-100\",\r\n\r\n        tipRowHeightLimit:\"\u884C\u9AD8\u5FC5\u987B\u57280 ~ 545\u4E4B\u95F4\",\r\n        tipColumnWidthLimit:\"\u5217\u5BBD\u5FC5\u987B\u57280 ~ 2038\u4E4B\u95F4\",\r\n        pageInfoFull:'\u5171${total}\u6761\uFF0C${totalPage}\u9875\uFF0C\u5DF2\u663E\u793A\u5168\u90E8\u6570\u636E',\r\n\r\n    },\r\n    currencyDetail:{\r\n        RMB:'\u4EBA\u6C11\u5E01',\r\n        USdollar:'\u7F8E\u5143',\r\n        EUR:'\u6B27\u5143',\r\n        GBP:'\u82F1\u9551',\r\n        HK:'\u6E2F\u5143',\r\n        JPY:'\u65E5\u5143',\r\n        AlbanianLek:'\u963F\u5C14\u5DF4\u5C3C\u4E9A\u5217\u514B',\r\n        AlgerianDinar:'\u963F\u5C14\u53CA\u5229\u4E9A\u7B2C\u7EB3\u5C14',\r\n        Afghani:'\u963F\u5BCC\u6C57\u5C3C',\r\n        ArgentinePeso:'\u963F\u6839\u5EF7\u6BD4\u7D22',\r\n        UnitedArabEmiratesDirham:'\u963F\u62C9\u4F2F\u8054\u5408\u914B\u957F\u56FD\u8FEA\u62C9\u59C6',\r\n        ArubanFlorin:'\u963F\u9C81\u5DF4\u5F17\u7F57\u6797',\r\n        OmaniRial:'\u963F\u66FC\u91CC\u4E9A\u5C14',\r\n        Azerbaijanimanat:'\u963F\u585E\u62DC\u7586\u9A6C\u7EB3\u7279',\r\n        EgyptianPound:'\u57C3\u53CA\u9551',\r\n        EthiopianBirr:'\u57C3\u585E\u4FC4\u6BD4\u4E9A\u6BD4\u5C14',\r\n        AngolaKwanza:'\u5B89\u54E5\u62C9\u5BBD\u624E',\r\n        AustralianDollar:'\u6FB3\u5927\u5229\u4E9A\u5143',\r\n        Patacas:'\u6FB3\u95E8\u5143',\r\n        BarbadosDollar:'\u5DF4\u5DF4\u591A\u65AF\u5143',\r\n        PapuaNewGuineaKina:'\u5DF4\u5E03\u4E9A\u65B0\u51E0\u5185\u4E9A\u57FA\u90A3',\r\n        BahamianDollar:'\u5DF4\u54C8\u9A6C\u5143',\r\n        PakistanRupee:'\u5DF4\u57FA\u65AF\u5766\u5362\u6BD4',\r\n        ParaguayanGuarani:'\u5DF4\u62C9\u572D\u74DC\u62C9\u5C3C',\r\n        BahrainiDinar:'\u5DF4\u6797\u7B2C\u7EB3\u5C14',\r\n        PanamanianBalboa:'\u5DF4\u62FF\u9A6C\u5DF4\u6CE2\u4E9A',\r\n        Brazilianreal:'\u5DF4\u897F\u91CC\u4E9A\u4F0A',\r\n        Belarusianruble:'\u767D\u4FC4\u7F57\u65AF\u5362\u5E03',\r\n        BermudianDollar:'\u767E\u6155\u5927\u5143',\r\n        BulgarianLev:'\u4FDD\u52A0\u5229\u4E9A\u5217\u5F17',\r\n        IcelandKrona:'\u51B0\u5C9B\u514B\u6717',\r\n        BosniaHerzegovinaConvertibleMark:'\u6CE2\u9ED1\u53EF\u5151\u6362\u9A6C\u514B',\r\n        PolishZloty:'\u6CE2\u5170\u5179\u7F57\u63D0',\r\n        Boliviano:'\u73BB\u5229\u7EF4\u4E9A\u8BFA',\r\n        BelizeDollar:'\u4F2F\u5229\u5179\u5143',\r\n        BotswanaPula:'\u535A\u8328\u74E6\u7EB3\u666E\u62C9',\r\n        NotDannuzhamu:'\u4E0D\u4E39\u52AA\u624E\u59C6',\r\n        BurundiFranc:'\u5E03\u9686\u8FEA\u6CD5\u90CE',\r\n        NorthKoreanWon:'\u671D\u9C9C\u5706',\r\n        DanishKrone:'\u4E39\u9EA6\u514B\u6717',\r\n        EastCaribbeanDollar:'\u4E1C\u52A0\u52D2\u6BD4\u5143',\r\n        DominicaPeso:'\u591A\u7C73\u5C3C\u52A0\u6BD4\u7D22',\r\n        RussianRuble:'\u4FC4\u56FD\u5362\u5E03',\r\n        EritreanNakfa:'\u5384\u7ACB\u7279\u91CC\u4E9A\u7EB3\u514B\u6CD5',\r\n        CFAfranc:'\u975E\u6D32\u91D1\u878D\u5171\u540C\u4F53\u6CD5\u90CE',\r\n        PhilippinePeso:'\u83F2\u5F8B\u5BBE\u6BD4\u7D22',\r\n        FijiDollar:'\u6590\u6D4E\u5143',\r\n        CapeVerdeEscudo:'\u4F5B\u5F97\u89D2\u57C3\u65AF\u5E93\u591A',\r\n        FalklandIslandsPound:'\u798F\u514B\u5170\u7FA4\u5C9B\u9551',\r\n        GambianDalasi:'\u5188\u6BD4\u4E9A\u8FBE\u62C9\u897F',\r\n        Congolesefranc:'\u521A\u679C\u6CD5\u90CE',\r\n        ColombianPeso:'\u54E5\u4F26\u6BD4\u4E9A\u6BD4\u7D22',\r\n        CostaRicanColon:'\u54E5\u65AF\u8FBE\u9ECE\u52A0\u79D1\u6717',\r\n        CubanPeso:'\u53E4\u5DF4\u6BD4\u7D22',\r\n        Cubanconvertiblepeso:'\u53E4\u5DF4\u53EF\u5151\u6362\u6BD4\u7D22',\r\n        GuyanaDollar:'\u572D\u4E9A\u90A3\u5143',\r\n        KazakhstanTenge:'\u54C8\u8428\u514B\u65AF\u5766\u575A\u6208',\r\n        Haitiangourde:'\u6D77\u5730\u53E4\u5FB7',\r\n        won:'\u97E9\u5143',\r\n        NetherlandsAntillesGuilder:'\u8377\u5C5E\u5B89\u7684\u5217\u65AF\u76FE',\r\n        Honduraslempiras:'\u6D2A\u90FD\u62C9\u65AF\u62C9\u4F26\u76AE\u62C9',\r\n        DjiboutiFranc:'\u5409\u5E03\u63D0\u6CD5\u90CE',\r\n        KyrgyzstanSom:'\u5409\u5C14\u5409\u65AF\u65AF\u5766\u7D22\u59C6',\r\n        GuineaFranc:'\u51E0\u5185\u4E9A\u6CD5\u90CE',\r\n        CanadianDollar:'\u52A0\u62FF\u5927\u5143',\r\n        GhanaianCedi:'\u52A0\u7EB3\u585E\u5730',\r\n        Cambodianriel:'\u67EC\u57D4\u5BE8\u745E\u5C14',\r\n        CzechKoruna:'\u6377\u514B\u514B\u6717',\r\n        ZimbabweDollar:'\u6D25\u5DF4\u5E03\u97E6\u5143',\r\n        QatariRiyal:'\u5361\u5854\u5C14\u91CC\u4E9A\u5C14',\r\n        CaymanIslandsDollar:'\u5F00\u66FC\u7FA4\u5C9B\u5143',\r\n        Comorianfranc:'\u79D1\u6469\u7F57\u6CD5\u90CE',\r\n        KuwaitiDinar:'\u79D1\u5A01\u7279\u7B2C\u7EB3\u5C14',\r\n        CroatianKuna:'\u514B\u7F57\u5730\u4E9A\u5E93\u7EB3',\r\n        KenyanShilling:'\u80AF\u5C3C\u4E9A\u5148\u4EE4',\r\n        LesothoLoti:'\u83B1\u7D22\u6258\u6D1B\u8482',\r\n        LaoKip:'\u8001\u631D\u57FA\u666E',\r\n        LebanesePound:'\u9ECE\u5DF4\u5AE9\u9551',\r\n        Lithuanianlitas:'\u7ACB\u9676\u5B9B\u7ACB\u7279',\r\n        LibyanDinar:'\u5229\u6BD4\u4E9A\u7B2C\u7EB3\u5C14',\r\n        LiberianDollar:'\u5229\u6BD4\u4E9A\u5143',\r\n        RwandaFranc:'\u5362\u65FA\u8FBE\u6CD5\u90CE',\r\n        RomanianLeu:'\u7F57\u9A6C\u5C3C\u4E9A\u5217\u4F0A',\r\n        MalagasyAriary:'\u9A6C\u8FBE\u52A0\u65AF\u52A0\u963F\u91CC\u4E9A\u91CC',\r\n        MaldivianRufiyaa:'\u9A6C\u5C14\u4EE3\u592B\u62C9\u83F2\u4E9A',\r\n        MalawiKwacha:'\u9A6C\u62C9\u7EF4\u514B\u74E6\u67E5',\r\n        MalaysianRinggit:'\u9A6C\u6765\u897F\u4E9A\u6797\u5409\u7279',\r\n        MacedoniawearingDinar:'\u9A6C\u5176\u987F\u6234\u7B2C\u7EB3\u5C14',\r\n        MauritiusRupee:'\u6BDB\u91CC\u6C42\u65AF\u5362\u6BD4',\r\n        MauritanianOuguiya:'\u6BDB\u91CC\u5854\u5C3C\u4E9A\u4E4C\u5409\u4E9A',\r\n        MongolianTugrik:'\u8499\u53E4\u56FE\u683C\u91CC\u514B',\r\n        BangladeshiTaka:'\u5B5F\u52A0\u62C9\u5854\u5361',\r\n        PeruvianNuevoSol:'\u79D8\u9C81\u65B0\u7D22\u5C14',\r\n        MyanmarKyat:'\u7F05\u7538\u5F00\u4E9A\u7279',\r\n        MoldovanLeu:'\u6469\u5C14\u591A\u74E6\u5217\u4F0A',\r\n        MoroccanDirham:'\u6469\u6D1B\u54E5\u8FEA\u62C9\u59C6',\r\n        MozambiqueMetical:'\u83AB\u6851\u6BD4\u514B\u6885\u8482\u5361\u5C14',\r\n        MexicanPeso:'\u58A8\u897F\u54E5\u6BD4\u7D22',\r\n        NamibianDollar:'\u7EB3\u7C73\u6BD4\u4E9A\u5143',\r\n        SouthAfricanRand:'\u5357\u975E\u5170\u7279',\r\n        SouthSudanesePound:'\u5357\u82CF\u4E39\u9551',\r\n        NicaraguaCordoba:'\u5C3C\u52A0\u62C9\u74DC\u79D1\u591A\u5DF4',\r\n        NepaleseRupee:'\u5C3C\u6CCA\u5C14\u5362\u6BD4',\r\n        NigerianNaira:'\u5C3C\u65E5\u5229\u4E9A\u5948\u62C9',\r\n        NorwegianKrone:'\u632A\u5A01\u514B\u6717',\r\n        GeorgianLari:'\u4E54\u6CBB\u4E9A\u62C9\u745E',\r\n        RMBOffshore:'\u4EBA\u6C11\u5E01\uFF08\u79BB\u5CB8\uFF09',\r\n        SwedishKrona:'\u745E\u5178\u514B\u6717',\r\n        SwissFranc:'\u745E\u58EB\u6CD5\u90CE',\r\n        SerbianDinar:'\u585E\u5C14\u7EF4\u4E9A\u7B2C\u7EB3\u5C14',\r\n        SierraLeone:'\u585E\u62C9\u5229\u6602\u5229\u6602',\r\n        SeychellesRupee:'\u585E\u820C\u5C14\u5362\u6BD4',\r\n        SaudiRiyal:'\u6C99\u7279\u91CC\u4E9A\u5C14',\r\n        SaoTomeDobra:'\u5723\u591A\u7F8E\u591A\u5E03\u62C9',\r\n        SaintHelenapound:'\u5723\u8D6B\u52D2\u62FF\u7FA4\u5C9B\u78C5',\r\n        SriLankaRupee:'\u65AF\u91CC\u5170\u5361\u5362\u6BD4',\r\n        SwazilandLilangeni:'\u65AF\u5A01\u58EB\u5170\u91CC\u5170\u5409\u5C3C',\r\n        SudanesePound:'\u82CF\u4E39\u9551',\r\n        Surinamesedollar:'\u82CF\u91CC\u5357\u5143',\r\n        SolomonIslandsDollar:'\u6240\u7F57\u95E8\u7FA4\u5C9B\u5143',\r\n        SomaliShilling:'\u7D22\u9A6C\u91CC\u5148\u4EE4',\r\n        TajikistanSomoni:'\u5854\u5409\u514B\u65AF\u5766\u7D22\u83AB\u5C3C',\r\n        PacificFranc:'\u592A\u5E73\u6D0B\u6CD5\u90CE',\r\n        ThaiBaht:'\u6CF0\u56FD\u94E2',\r\n        TanzanianShilling:'\u5766\u6851\u5C3C\u4E9A\u5148\u4EE4',\r\n        TonganPaanga:'\u6C64\u52A0\u6F58\u52A0',\r\n        TrinidadandTobagoDollar:'\u7279\u7ACB\u5C3C\u8FBE\u548C\u591A\u5DF4\u54E5\u5143',\r\n        TunisianDinar:'\u7A81\u5C3C\u65AF\u7B2C\u7EB3\u5C14',\r\n        TurkishLira:'\u571F\u8033\u5176\u91CC\u62C9',\r\n        VanuatuVatu:'\u74E6\u52AA\u963F\u56FE\u74E6\u56FE',\r\n        GuatemalanQuetzal:'\u5371\u5730\u9A6C\u62C9\u683C\u67E5\u5C14',\r\n        CommissionBolivar:'\u59D4\u5185\u745E\u62C9\u535A\u5229\u74E6',\r\n        BruneiDollar:'\u6587\u83B1\u5143',\r\n        UgandanShilling:'\u4E4C\u5E72\u8FBE\u5148\u4EE4',\r\n        UkrainianHryvnia:'\u4E4C\u514B\u5170\u683C\u91CC\u592B\u5C3C\u4E9A',\r\n        UruguayanPeso:'\u4E4C\u62C9\u572D\u6BD4\u7D22',\r\n        Uzbekistansom:'\u4E4C\u5179\u522B\u514B\u65AF\u5766\u82CF\u59C6',\r\n        WesternSamoaTala:'\u897F\u8428\u6469\u4E9A\u5854\u62C9',\r\n        SingaporeDollar:'\u65B0\u52A0\u5761\u5143',\r\n        NT:'\u65B0\u53F0\u5E01',\r\n        NewZealandDollar:'\u65B0\u897F\u5170\u5143',\r\n        HungarianForint:'\u5308\u7259\u5229\u798F\u6797',\r\n        SyrianPound:'\u53D9\u5229\u4E9A\u9551',\r\n        JamaicanDollar:'\u7259\u4E70\u52A0\u5143',\r\n        ArmenianDram:'\u4E9A\u7F8E\u5C3C\u4E9A\u5FB7\u62C9\u59C6',\r\n        YemeniRial:'\u4E5F\u95E8\u91CC\u4E9A\u5C14',\r\n        IraqiDinar:'\u4F0A\u62C9\u514B\u7B2C\u7EB3\u5C14',\r\n        IranianRial:'\u4F0A\u6717\u91CC\u4E9A\u5C14',\r\n        NewIsraeliShekel:'\u4EE5\u8272\u5217\u65B0\u8C22\u514B\u5C14',\r\n        IndianRupee:'\u5370\u5EA6\u5362\u6BD4',\r\n        IndonesianRupiah:'\u5370\u5EA6\u5C3C\u897F\u4E9A\u5362\u6BD4',\r\n        JordanianDinar:'\u7EA6\u65E6\u7B2C\u7EB3\u5C14',\r\n        VND:'\u8D8A\u5357\u76FE',\r\n        ZambianKwacha:'\u8D5E\u6BD4\u4E9A\u514B\u74E6\u67E5',\r\n        GibraltarPound:'\u76F4\u5E03\u7F57\u9640\u9551',\r\n        ChileanPeso:'\u667A\u5229\u6BD4\u7D22',\r\n        CFAFrancBEAC:'\u4E2D\u975E\u91D1\u878D\u5408\u4F5C\u6CD5\u90CE',\r\n    },\r\n    defaultFmt:[\r\n        { \"text\": '\u81EA\u52A8', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": '\u7EAF\u6587\u672C', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u6570\u5B57', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": '\u767E\u5206\u6BD4', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": '\u79D1\u5B66\u8BA1\u6570', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u4F1A\u8BA1', \"value\": \"\u00A5(0.00)\", \"example\": \"\u00A5(1200.09)\" },\r\n        //{ \"text\": \"\u8D22\u52A1\", \"value\": \"(#.####)\", \"example\": \"(1200.09)\" },\r\n        { \"text\": '\u4E07\u5143', \"value\": \"w\", \"example\": \"1\u4EBF2000\u4E072500\" },\r\n        { \"text\": '\u8D27\u5E01', \"value\": \"\u00A50.00\", \"example\": \"\u00A51200.09\" },\r\n        //{ \"text\": \"\u8D27\u5E01\u6574\u6570\", \"value\": \"\u00A5####\", \"example\": \"\u00A51200\" },\r\n        { \"text\": '\u4E07\u51432\u4F4D\u5C0F\u6570', \"value\": \"w0.00\", \"example\": \"2\u4E072500.55\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u65E5\u671F', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": '\u65F6\u95F4', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": '\u65F6\u95F424H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": '\u65E5\u671F\u65F6\u95F4', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": '\u65E5\u671F\u65F6\u95F424H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u81EA\u5B9A\u4E49\u683C\u5F0F', \"value\": \"fmtOtherSelf\", \"example\": \"more\" }\r\n    ],\r\n    dateFmtList:[\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930\u5E748\u67085\u65E5\",\r\n            \"value\": 'yyyy\"\u5E74\"M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"8\u67085\u65E5\",\r\n            \"value\": 'M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u534801:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u53481:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm'\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u53481:30:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 \u4E0B\u534801:30\",\r\n            \"value\": \"MM-dd \u4E0A\u5348/\u4E0B\u5348 hh:mm\"\r\n        },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C \u4E0B\u53481:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    fontFamily:{\r\n        MicrosoftYaHei:\"Microsoft YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\",\"Arial\",\"Tahoma\",\"Verdana\",\"\u5FAE\u8F6F\u96C5\u9ED1\",\"\u5B8B\u4F53\",\"\u9ED1\u4F53\",\"\u6977\u4F53\",\"\u4EFF\u5B8B\",\"\u65B0\u5B8B\u4F53\",\"\u534E\u6587\u65B0\u9B4F\",\"\u534E\u6587\u884C\u6977\",\"\u534E\u6587\u96B6\u4E66\"],\r\n    fontjson: {\"times new roman\":0,\"arial\":1,\"tahoma\":2,\"verdana\":3,\"\u5FAE\u8F6F\u96C5\u9ED1\":4,\"microsoft yahei\":4,\"\u5B8B\u4F53\":5,\"simsun\":5,\"\u9ED1\u4F53\":6,\"simhei\":6,\"\u6977\u4F53\":7,\"kaiti\":7,\"\u4EFF\u5B8B\":8,\"fangsong\":8,\"\u65B0\u5B8B\u4F53\":9,\"nsimsun\":9,\"\u534E\u6587\u65B0\u9B4F\":10,\"stxinwei\":10,\"\u534E\u6587\u884C\u6977\":11,\"stxingkai\":11,\"\u534E\u6587\u96B6\u4E66\":12,\"stliti\":12,},\r\n    border:{\r\n        borderTop:'\u4E0A\u6846\u7EBF',\r\n        borderBottom:'\u4E0B\u6846\u7EBF',\r\n        borderLeft:'\u5DE6\u6846\u7EBF',\r\n        borderRight:'\u53F3\u6846\u7EBF',\r\n        borderNone:'\u65E0',\r\n        borderAll:'\u6240\u6709',\r\n        borderOutside:'\u5916\u4FA7',\r\n        borderInside:'\u5185\u4FA7',\r\n        borderHorizontal:'\u5185\u4FA7\u6A2A\u7EBF',\r\n        borderVertical:'\u5185\u4FA7\u7AD6\u7EBF',\r\n        borderColor:'\u8FB9\u6846\u989C\u8272',\r\n        borderSize:'\u8FB9\u6846\u7C97\u7EC6'\r\n    },\r\n    merge:{\r\n        mergeAll:\"\u5168\u90E8\u5408\u5E76\",\r\n        mergeV:\"\u5782\u76F4\u5408\u5E76\",\r\n        mergeH:\"\u6C34\u5E73\u5408\u5E76\",\r\n        mergeCancel:\"\u53D6\u6D88\u5408\u5E76\",\r\n        overlappingError:\"\u4E0D\u80FD\u5408\u5E76\u91CD\u53E0\u533A\u57DF\",\r\n        partiallyError:\"\u65E0\u6CD5\u5BF9\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n    },\r\n    align:{\r\n        left:\"\u5DE6\u5BF9\u9F50\",\r\n        center:\"\u4E2D\u95F4\u5BF9\u9F50\",\r\n        right:\"\u53F3\u5BF9\u9F50\",\r\n\r\n        top:\"\u9876\u90E8\u5BF9\u9F50\",\r\n        middle:\"\u5C45\u4E2D\u5BF9\u9F50\",\r\n        bottom:\"\u5E95\u90E8\u5BF9\u9F50\",\r\n    },\r\n    textWrap:{\r\n        \"overflow\":\"\u6EA2\u51FA\",\r\n        \"wrap\":\"\u81EA\u52A8\u6362\u884C\",\r\n        \"clip\":\"\u622A\u65AD\",\r\n    },\r\n    rotation:{\r\n        \"none\":\"\u65E0\u65CB\u8F6C\",\r\n        \"angleup\":\"\u5411\u4E0A\u503E\u659C\",\r\n        \"angledown\":\"\u5411\u4E0B\u503E\u659C\",\r\n        \"vertical\":\"\u7AD6\u6392\u6587\u5B57\",\r\n        \"rotationUp\":\"\u5411\u4E0A90\u00B0\",\r\n        \"rotationDown\":\"\u5411\u4E0B90\u00B0\"\r\n    },\r\n    freezen:{\r\n        default:\"\u51BB\u7ED3\u9996\u884C\",\r\n        freezenRow:\"\u51BB\u7ED3\u9996\u884C\",\r\n        freezenColumn:\"\u51BB\u7ED3\u9996\u5217\",\r\n        freezenRC:\"\u51BB\u7ED3\u884C\u5217\",\r\n        freezenRowRange:\"\u51BB\u7ED3\u884C\u5230\u9009\u533A\",\r\n        freezenColumnRange:\"\u51BB\u7ED3\u5217\u5230\u9009\u533A\",\r\n        freezenRCRange:\"\u51BB\u7ED3\u884C\u5217\u5230\u9009\u533A\",\r\n        freezenCancel:\"\u53D6\u6D88\u51BB\u7ED3\",\r\n\r\n        noSeletionError:\"\u6CA1\u6709\u9009\u533A\",\r\n    },\r\n    sort:{\r\n        \"asc\":\"\u5347\u5E8F\",\r\n        \"desc\":\"\u964D\u5E8F\",\r\n        \"custom\":\"\u81EA\u5B9A\u4E49\u6392\u5E8F\",\r\n\r\n        \"hasTitle\":\"\u6570\u636E\u5177\u6709\u6807\u9898\u884C\",\r\n        \"sortBy\":\"\u6392\u5E8F\u4F9D\u636E\",\r\n        \"addOthers\":\"\u6DFB\u52A0\u5176\u4ED6\u6392\u5E8F\u5217\",\r\n        \"close\":\"\u5173\u95ED\",\r\n        \"confirm\":\"\u6392\u5E8F\",\r\n\r\n        \"columnOperation\":\"\u5217\",\r\n        \"secondaryTitle\":\"\u6B21\u8981\u6392\u5E8F\",\r\n\r\n        \"sortTitle\":\"\u6392\u5E8F\u8303\u56F4\",\r\n\r\n        \"sortRangeTitle\":\"\u6392\u5E8F\u8303\u56F4\u4ECE\",\r\n        \"sortRangeTitleTo\":\"\u5230\",\r\n\r\n\r\n        \"noRangeError\":\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\",\r\n        \"mergeError\":\"\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF01\",\r\n\r\n    },\r\n    filter:{\r\n        \"filter\":\"\u7B5B\u9009\", \r\n        \"clearFilter\":\"\u6E05\u9664\u7B5B\u9009\", \r\n\r\n        sortByAsc:\"\u4EE5A-Z\u5347\u5E8F\u6392\u5217\",\r\n        sortByDesc:\"\u4EE5Z-A\u964D\u5E8F\u6392\u5217\",\r\n        filterByColor:\"\u6309\u989C\u8272\u7B5B\u9009\",\r\n        filterByCondition:\"\u6309\u6761\u4EF6\u8FC7\u6EE4\",\r\n        filterByValues:\"\u6309\u503C\u8FC7\u6EE4\",\r\n\r\n        filiterInputNone:\"\u65E0\",\r\n\r\n        filiterInputTip:\"\u8F93\u5165\u7B5B\u9009\u503C\",\r\n        filiterRangeStartTip:\"\u8303\u56F4\u5F00\u59CB\",\r\n        filiterRangeEndTip:\"\u8303\u56F4\u7ED3\u675F\",\r\n\r\n        filterValueByAllBtn:\"\u5168\u9009\",\r\n        filterValueByClearBtn:\"\u6E05\u9664\",\r\n        filterValueByInverseBtn:\"\u53CD\u9009\",\r\n        filterValueByTip:\"\u6309\u7167\u503C\u8FDB\u884C\u7B5B\u9009\",\r\n        filterConform:\"\u786E \u8BA4\",\r\n        filterCancel:\"\u53D6 \u6D88\",\r\n        clearFilter:\"\u6E05\u9664\u7B5B\u9009\",\r\n\r\n        conditionNone:\"\u65E0\",\r\n        conditionCellIsNull:\"\u5355\u5143\u683C\u4E3A\u7A7A\",\r\n        conditionCellNotNull:\"\u5355\u5143\u683C\u6709\u6570\u636E\",\r\n        conditionCellTextContain:\"\u6587\u672C\u5305\u542B\",\r\n        conditionCellTextNotContain:\"\u6587\u672C\u4E0D\u5305\u542B\",\r\n        conditionCellTextStart:\"\u6587\u672C\u5F00\u5934\u4E3A\",\r\n        conditionCellTextEnd:\"\u6587\u672C\u7ED3\u5C3E\u4E3A\",\r\n        conditionCellTextEqual:\"\u6587\u672C\u7B49\u4E8E\",\r\n        conditionCellDateEqual:\"\u65E5\u671F\u7B49\u4E8E\",\r\n        conditionCellDateBefore:\"\u65E5\u671F\u65E9\u4E8E\",\r\n        conditionCellDateAfter:\"\u65E5\u671F\u665A\u4E8E\",\r\n        conditionCellGreater:\"\u5927\u4E8E\",\r\n        conditionCellGreaterEqual:\"\u5927\u4E8E\u7B49\u4E8E\",\r\n        conditionCellLess:\"\u5C0F\u4E8E\",\r\n        conditionCellLessEqual:\"\u5C0F\u4E8E\u7B49\u4E8E\",\r\n        conditionCellEqual:\"\u7B49\u4E8E\",\r\n        conditionCellNotEqual:\"\u4E0D\u7B49\u4E8E\",\r\n        conditionCellBetween:\"\u4ECB\u4E8E\",\r\n        conditionCellNotBetween:\"\u4E0D\u5728\u5176\u4E2D\",\r\n\r\n        filiterMoreDataTip:\"\u6570\u636E\u91CF\u5927\uFF01\u8BF7\u7A0D\u540E\",\r\n        filiterMonthText:\"\u6708\",\r\n        filiterYearText:\"\u5E74\",\r\n        filiterByColorTip:\"\u6309\u5355\u5143\u683C\u989C\u8272\u7B5B\u9009\",\r\n        filiterByTextColorTip:\"\u6309\u5355\u5143\u683C\u5B57\u4F53\u989C\u8272\u7B5B\u9009\",\r\n        filterContainerOneColorTip:\"\u672C\u5217\u4EC5\u5305\u542B\u4E00\u79CD\u989C\u8272\",\r\n        filterDateFormatTip:\"\u65E5\u671F\u683C\u5F0F\",\r\n\r\n        valueBlank:\"(\u7A7A\u767D)\",\r\n        mergeError:\"\u7B5B\u9009\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF01\",\r\n    },\r\n    rightclick: {\r\n        copy: '\u590D\u5236',\r\n        copyAs: '\u590D\u5236\u4E3A',\r\n        paste: '\u7C98\u8D34',\r\n        insert: '\u63D2\u5165',\r\n        delete: '\u5220\u9664',\r\n        deleteCell: '\u5220\u9664\u5355\u5143\u683C',\r\n        deleteSelected: '\u5220\u9664\u9009\u4E2D',\r\n        hide: '\u9690\u85CF',\r\n        hideSelected: '\u9690\u85CF\u9009\u4E2D',\r\n        showHide: '\u663E\u793A\u9690\u85CF',\r\n        to: '\u5411',\r\n        left: '\u5DE6',\r\n        right: '\u53F3',\r\n        top: '\u4E0A',\r\n        bottom: '\u4E0B',\r\n        moveLeft: '\u5DE6\u79FB',\r\n        moveUp: '\u4E0A\u79FB',\r\n        add: '\u589E\u52A0',\r\n        row: '\u884C',\r\n        column: '\u5217',\r\n        width: '\u5BBD',\r\n        height: '\u9AD8',\r\n        number: '\u6570\u5B57',\r\n        confirm: '\u786E\u8BA4',\r\n        orderAZ: 'A-Z\u987A\u5E8F\u6392\u5217',\r\n        orderZA: 'Z-A\u964D\u5E8F\u6392\u5217',\r\n        clearContent: '\u6E05\u9664\u5185\u5BB9',\r\n        matrix: '\u77E9\u9635\u64CD\u4F5C\u9009\u533A',\r\n        sortSelection: '\u6392\u5E8F\u9009\u533A',\r\n        filterSelection: '\u7B5B\u9009\u9009\u533A',\r\n        chartGeneration: '\u56FE\u8868\u751F\u6210',\r\n        firstLineTitle: '\u9996\u884C\u4E3A\u6807\u9898',\r\n        untitled: '\u65E0\u6807\u9898',\r\n        array1: '\u4E00\u7EF4\u6570\u7EC4',\r\n        array2: '\u4E8C\u7EF4\u6570\u7EC4',\r\n        array3: '\u591A\u7EF4\u6570\u7EC4',\r\n        diagonal: '\u5BF9\u89D2\u7EBF',\r\n        antiDiagonal: '\u53CD\u5BF9\u89D2\u7EBF',\r\n        diagonalOffset: '\u5BF9\u89D2\u504F\u79FB',\r\n        offset: '\u504F\u79FB\u91CF',\r\n        boolean: '\u5E03\u5C14\u503C',\r\n        flip: '\u7FFB\u8F6C',\r\n        upAndDown: '\u4E0A\u4E0B',\r\n        leftAndRight: '\u5DE6\u53F3',\r\n        clockwise: '\u987A\u65F6\u9488',\r\n        counterclockwise: '\u9006\u65F6\u9488',\r\n        transpose: '\u8F6C\u7F6E',\r\n        matrixCalculation: '\u77E9\u9635\u8BA1\u7B97',\r\n        plus: '\u52A0',\r\n        minus: '\u51CF',\r\n        multiply: '\u4E58',\r\n        divided: '\u9664',\r\n        power: '\u6B21\u65B9',\r\n        root: '\u6B21\u65B9\u6839',\r\n        log: 'log',\r\n        delete0: '\u5220\u9664\u4E24\u7AEF0\u503C',\r\n        removeDuplicate: '\u5220\u9664\u91CD\u590D\u503C',\r\n        byRow: '\u6309\u884C',\r\n        byCol: '\u6309\u5217',\r\n        generateNewMatrix: '\u751F\u6210\u65B0\u77E9\u9635',\r\n    },\r\n    comment:{\r\n        \"insert\":\"\u65B0\u5EFA\u6279\u6CE8\",\r\n        \"edit\":\"\u7F16\u8F91\u6279\u6CE8\",\r\n        \"delete\":\"\u5220\u9664\",\r\n        \"showOne\":\"\u663E\u793A/\u9690\u85CF\u6279\u6CE8\",\r\n        \"showAll\":\"\u663E\u793A/\u9690\u85CF\u6240\u6709\u6279\u6CE8\"\r\n    },\r\n    screenshot:{\r\n        screenshotTipNoSelection:\"\u8BF7\u6846\u9009\u9700\u8981\u622A\u56FE\u7684\u8303\u56F4\",\r\n        screenshotTipTitle:\"\u63D0\u793A\uFF01\",\r\n        screenshotTipHasMerge:\"\u65E0\u6CD5\u5BF9\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n        screenshotTipHasMulti:\"\u65E0\u6CD5\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n        screenshotTipSuccess:\"\u622A\u53D6\u6210\u529F\",\r\n        screenshotImageName:\"\u622A\u56FE\",\r\n\r\n        downLoadClose:\"\u5173\u95ED\",\r\n        downLoadCopy:\"\u590D\u5236\u5230\u526A\u5207\u677F\",\r\n        downLoadBtn:\"\u4E0B\u8F7D\",\r\n        browserNotTip:\"\u4E0B\u8F7D\u529F\u80FDIE\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\uFF01\",\r\n        rightclickTip:\"\u8BF7\u5728\u56FE\u7247\u4E0A\u53F3\u952E\u70B9\u51FB'\u590D\u5236'\",\r\n        successTip:\"\u5DF2\u6210\u529F\u590D\u5236\uFF08\u5982\u679C\u7C98\u8D34\u5931\u8D25\uFF0C\u8BF7\u5728\u56FE\u7247\u4E0A\u53F3\u952E\u70B9\u51FB'\u590D\u5236\u56FE\u7247'\uFF09\",\r\n    },\r\n    splitText:{\r\n        splitDelimiters:\"\u5206\u5272\u7B26\u53F7\",\r\n        splitOther:\"\u5176\u5B83\",\r\n        splitContinueSymbol:\"\u8FDE\u7EED\u5206\u9694\u7B26\u53F7\u89C6\u4E3A\u5355\u4E2A\u5904\u7406\",\r\n        splitDataPreview:\"\u6570\u636E\u9884\u89C8\",\r\n        splitTextTitle:\"\u6587\u672C\u5206\u5217\",\r\n        splitConfirmToExe:\"\u6B64\u5904\u5DF2\u6709\u6570\u636E\uFF0C\u662F\u5426\u66FF\u6362\u5B83\uFF1F\",\r\n\r\n        tipNoMulti:\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\",\r\n        tipNoMultiColumn:\"\u4E00\u6B21\u53EA\u80FD\u8F6C\u6362\u4E00\u5217\u6570\u636E\uFF0C\u9009\u5B9A\u533A\u57DF\u53EF\u4EE5\u6709\u591A\u884C\uFF0C\u4F46\u4E0D\u80FD\u6709\u591A\u5217\uFF0C\u8BF7\u5728\u9009\u5B9A\u5355\u5217\u533A\u57DF\u4EE5\u540E\u518D\u8BD5\",\r\n    },\r\n    imageText:{\r\n        imageSetting: '\u56FE\u7247\u8BBE\u7F6E',\r\n        close: '\u5173\u95ED',\r\n        conventional: '\u5E38\u89C4',\r\n        moveCell1: '\u79FB\u52A8\u5E76\u8C03\u6574\u5355\u5143\u683C\u5927\u5C0F',\r\n        moveCell2: '\u79FB\u52A8\u5E76\u4E14\u4E0D\u8C03\u6574\u5355\u5143\u683C\u7684\u5927\u5C0F',\r\n        moveCell3: '\u4E0D\u8981\u79FB\u52A8\u5355\u5143\u683C\u5E76\u8C03\u6574\u5176\u5927\u5C0F',\r\n        fixedPos: '\u56FA\u5B9A\u4F4D\u7F6E',\r\n        border: '\u8FB9\u6846',\r\n        width: '\u5BBD\u5EA6',\r\n        radius: '\u534A\u5F84',\r\n        style: '\u6837\u5F0F',\r\n        solid: '\u5B9E\u7EBF',\r\n        dashed: '\u865A\u7EBF',\r\n        dotted: '\u70B9\u72B6',\r\n        double: '\u53CC\u7EBF',\r\n        color: '\u989C\u8272',\r\n    },\r\n    punctuation:{\r\n        \"tab\":\"Tab \u952E\",\r\n        \"semicolon\":\"\u5206\u53F7\",\r\n        \"comma\":\"\u9017\u53F7\",\r\n        \"space\":\"\u7A7A\u683C\",\r\n        \r\n    },\r\n    findAndReplace:{\r\n        find:\"\u67E5\u627E\",\r\n        replace:\"\u66FF\u6362\",\r\n        goto:\"\u8F6C\u5230\",\r\n        location:\"\u5B9A\u4F4D\u6761\u4EF6\",\r\n        formula:\"\u516C\u5F0F\",\r\n        date:\"\u65E5\u671F\",\r\n        number:\"\u6570\u5B57\",\r\n        string:\"\u5B57\u7B26\",\r\n        error:\"\u9519\u8BEF\",\r\n        condition:\"\u6761\u4EF6\u683C\u5F0F\",\r\n        rowSpan:\"\u95F4\u9694\u884C\",\r\n        columnSpan:\"\u95F4\u9694\u5217\",\r\n        locationExample:\"\u5B9A\u4F4D\",\r\n        lessTwoRowTip:\"\u8BF7\u9009\u62E9\u6700\u5C11\u4E24\u884C\",\r\n        lessTwoColumnTip:\"\u8BF7\u9009\u62E9\u6700\u5C11\u4E24\u884C\",\r\n\r\n        findTextbox:\"\u67E5\u627E\u5185\u5BB9\",\r\n        replaceTextbox:\"\u66FF\u6362\u5185\u5BB9\",\r\n\r\n        regexTextbox:\"\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\",\r\n        wholeTextbox:\"\u6574\u8BCD\u5339\u914D\",\r\n        distinguishTextbox:\"\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\",\r\n\r\n        allReplaceBtn:\"\u5168\u90E8\u66FF\u6362\",\r\n        replaceBtn:\"\u66FF\u6362\",\r\n        allFindBtn:\"\u67E5\u627E\u5168\u90E8\",\r\n        findBtn:\"\u67E5\u627E\u4E0B\u4E00\u4E2A\",\r\n\r\n        noFindTip:\"\u6CA1\u6709\u67E5\u627E\u5230\u8BE5\u5185\u5BB9\",\r\n        modeTip:\"\u8BE5\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u8FDB\u884C\u6B64\u64CD\u4F5C\",\r\n\r\n        searchTargetSheet:\"\u5DE5\u4F5C\u8868\",\r\n        searchTargetCell:\"\u5355\u5143\u683C\",\r\n        searchTargetValue:\"\u503C\",\r\n\r\n        searchInputTip:\"\u8BF7\u8F93\u5165\u67E5\u627E\u5185\u5BB9\",\r\n\r\n        noReplceTip:\"\u6CA1\u6709\u53EF\u66FF\u6362\u7684\u5185\u5BB9\",\r\n        noMatchTip:\"\u627E\u4E0D\u5230\u5339\u914D\u9879\",\r\n\r\n        successTip:\"\u5DF2\u7ECF\u5E2E\u60A8\u641C\u7D22\u5E76\u8FDB\u884C\u4E86${xlength}\u5904\u66FF\u6362\",\r\n\r\n        locationConstant:\"\u5E38\u91CF\",\r\n        locationFormula:\"\u516C\u5F0F\",\r\n        locationDate:\"\u65E5\u671F\",\r\n        locationDigital:\"\u6570\u5B57\",\r\n        locationString:\"\u5B57\u7B26\",\r\n        locationBool:\"\u903B\u8F91\u503C\",\r\n        locationError:\"\u9519\u8BEF\",\r\n        locationNull:\"\u7A7A\u503C\",\r\n        locationCondition:\"\u6761\u4EF6\u683C\u5F0F\",\r\n        locationRowSpan:\"\u95F4\u9694\u884C\",\r\n        locationColumnSpan:\"\u95F4\u9694\u5217\",\r\n\r\n        locationTiplessTwoRow:\"\u8BF7\u9009\u62E9\u6700\u5C11\u4E24\u884C\",\r\n        locationTiplessTwoColumn:\"\u8BF7\u9009\u62E9\u6700\u5C11\u4E24\u5217\",\r\n        locationTipNotFindCell:\"\u672A\u627E\u5230\u5355\u5143\u683C\"\r\n\r\n    },\r\n    sheetconfig: {\r\n        delete: '\u5220\u9664',\r\n        copy: '\u590D\u5236',\r\n        rename: '\u91CD\u547D\u540D',\r\n        changeColor: '\u66F4\u6539\u989C\u8272',\r\n        hide: '\u9690\u85CF',\r\n        unhide: '\u53D6\u6D88\u9690\u85CF',\r\n        moveLeft: '\u5411\u5DE6\u79FB',\r\n        moveRight: '\u5411\u53F3\u79FB',\r\n        resetColor: '\u91CD\u7F6E\u989C\u8272',\r\n        cancelText: '\u53D6\u6D88',\r\n        chooseText: '\u786E\u5B9A\u989C\u8272',\r\n\r\n        tipNameRepeat:\"\u6807\u7B7E\u9875\u7684\u540D\u79F0\u4E0D\u80FD\u91CD\u590D\uFF01\u8BF7\u91CD\u65B0\u4FEE\u6539\",\r\n        noMoreSheet:\"\u5DE5\u4F5C\u8584\u5185\u81F3\u5C11\u542B\u6709\u4E00\u5F20\u53EF\u89C6\u5DE5\u4F5C\u8868\u3002\u82E5\u9700\u5220\u9664\u9009\u5B9A\u7684\u5DE5\u4F5C\u8868\uFF0C\u8BF7\u5148\u63D2\u5165\u4E00\u5F20\u65B0\u5DE5\u4F5C\u8868\u6216\u663E\u793A\u4E00\u5F20\u9690\u85CF\u7684\u5DE5\u4F5C\u8868\u3002\",\r\n        confirmDelete:\"\u662F\u5426\u5220\u9664\",\r\n        redoDelete:\"\u53EF\u4EE5\u901A\u8FC7Ctrl+Z\u64A4\u9500\u5220\u9664\",\r\n        noHide:\"\u4E0D\u80FD\u9690\u85CF, \u81F3\u5C11\u4FDD\u7559\u4E00\u4E2Asheet\u6807\u7B7E\",\r\n        chartEditNoOpt:\"\u56FE\u8868\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\",\r\n        sheetNameSpecCharError:\"\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC731\u4E2A\u5B57\u7B26\uFF0C\u9996\u5C3E\u4E0D\u80FD\u662F' \u4E14\u540D\u79F0\u4E0D\u80FD\u5305\u542B:\\r\\n[ ] : \\\\ ? * /\",\r\n        sheetNamecannotIsEmptyError:\"\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A!\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u5927\u4E8E',\r\n        conditionformat_greaterThan_title: '\u4E3A\u5927\u4E8E\u4EE5\u4E0B\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_lessThan: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u5C0F\u4E8E',\r\n        conditionformat_lessThan_title: '\u4E3A\u5C0F\u4E8E\u4EE5\u4E0B\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_betweenness: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u4ECB\u4E8E',\r\n        conditionformat_betweenness_title: '\u4E3A\u4ECB\u4E8E\u4EE5\u4E0B\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_equal: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u7B49\u4E8E',\r\n        conditionformat_equal_title: '\u4E3A\u7B49\u4E8E\u4EE5\u4E0B\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_textContains: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u6587\u672C\u5305\u542B',\r\n        conditionformat_textContains_title: '\u4E3A\u5305\u542B\u4EE5\u4E0B\u6587\u672C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_occurrenceDate: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u53D1\u751F\u65E5\u671F',\r\n        conditionformat_occurrenceDate_title: '\u4E3A\u5305\u542B\u4EE5\u4E0B\u65E5\u671F\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_duplicateValue: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u91CD\u590D\u503C',\r\n        conditionformat_duplicateValue_title: '\u4E3A\u5305\u542B\u4EE5\u4E0B\u7C7B\u578B\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_top10: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u524D 10 \u9879',\r\n        conditionformat_top10_percent: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u524D 10%',\r\n        conditionformat_top10_title: '\u4E3A\u503C\u6700\u5927\u7684\u90A3\u4E9B\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_last10: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u6700\u540E 10 \u9879',\r\n        conditionformat_last10_percent: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u6700\u540E 10%',\r\n        conditionformat_last10_title: '\u4E3A\u503C\u6700\u5C0F\u7684\u90A3\u4E9B\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_AboveAverage: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u9AD8\u4E8E\u5E73\u5747\u503C',\r\n        conditionformat_AboveAverage_title: '\u4E3A\u9AD8\u4E8E\u5E73\u5747\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        conditionformat_SubAverage: '\u6761\u4EF6\u683C\u5F0F\u2014\u2014\u4F4E\u4E8E\u5E73\u5747\u503C',\r\n        conditionformat_SubAverage_title: '\u4E3A\u4F4E\u4E8E\u5E73\u5747\u503C\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        rule: '\u89C4\u5219',\r\n        newRule: '\u65B0\u5EFA\u89C4\u5219',\r\n        editRule: '\u7F16\u8F91\u89C4\u5219',\r\n        deleteRule: '\u5220\u9664\u89C4\u5219',\r\n        deleteCellRule: '\u6E05\u9664\u6240\u9009\u5355\u5143\u683C\u7684\u89C4\u5219',\r\n        deleteSheetRule: '\u6E05\u9664\u6574\u4E2A\u5DE5\u4F5C\u8868\u7684\u89C4\u5219',\r\n        manageRules: '\u7BA1\u7406\u89C4\u5219',\r\n        showRules: '\u663E\u793A\u5176\u683C\u5F0F\u89C4\u5219',\r\n        highlightCellRules: '\u7A81\u51FA\u663E\u793A\u5355\u5143\u683C\u89C4\u5219',\r\n        itemSelectionRules: '\u9879\u76EE\u9009\u53D6\u89C4\u5219',\r\n        conditionformatManageRules: '\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u7BA1\u7406\u5668',\r\n        format: '\u683C\u5F0F',\r\n        setFormat: '\u8BBE\u7F6E\u683C\u5F0F',\r\n        setAs: '\u8BBE\u7F6E\u4E3A',\r\n        setAsByArea: '\u9488\u5BF9\u9009\u5B9A\u533A\u57DF\uFF0C\u8BBE\u7F6E\u4E3A',\r\n        applyRange: '\u5E94\u7528\u8303\u56F4',\r\n        selectRange: '\u70B9\u51FB\u9009\u62E9\u5E94\u7528\u8303\u56F4',\r\n        selectRange_percent: '\u6240\u9009\u8303\u56F4\u7684\u767E\u5206\u6BD4',\r\n        selectRange_average: '\u9009\u5B9A\u8303\u56F4\u7684\u5E73\u5747\u503C',\r\n        selectRange_value: '\u9009\u5B9A\u8303\u56F4\u4E2D\u7684\u6570\u503C',\r\n        pleaseSelectRange: '\u8BF7\u9009\u62E9\u5E94\u7528\u8303\u56F4',\r\n        selectDataRange: '\u70B9\u51FB\u9009\u62E9\u6570\u636E\u8303\u56F4',\r\n        selectCell: '\u9009\u62E9\u5355\u5143\u683C',\r\n        pleaseSelectCell: '\u8BF7\u9009\u62E9\u5355\u5143\u683C',\r\n        pleaseSelectADate: '\u8BF7\u9009\u62E9\u65E5\u671F',\r\n        pleaseEnterInteger: '\u8BF7\u8F93\u5165\u4E00\u4E2A\u4ECB\u4E8E 1 \u548C 1000 \u4E4B\u95F4\u7684\u6574\u6570',\r\n        onlySingleCell: '\u53EA\u80FD\u5BF9\u5355\u4E2A\u5355\u5143\u683C\u8FDB\u884C\u5F15\u7528',\r\n        conditionValueCanOnly: '\u6761\u4EF6\u503C\u53EA\u80FD\u662F\u6570\u5B57\u6216\u8005\u5355\u4E2A\u5355\u5143\u683C',\r\n        ruleTypeItem1: '\u57FA\u4E8E\u5404\u81EA\u503C\u8BBE\u7F6E\u6240\u6709\u5355\u5143\u683C\u7684\u683C\u5F0F',\r\n        ruleTypeItem2: '\u53EA\u4E3A\u5305\u542B\u4EE5\u4E0B\u5185\u5BB9\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F',\r\n        ruleTypeItem2_title: '\u53EA\u4E3A\u6EE1\u8DB3\u4EE5\u4E0B\u6761\u4EF6\u7684\u5355\u5143\u683C',\r\n        ruleTypeItem3: '\u4EC5\u5BF9\u6392\u540D\u9760\u524D\u6216\u9760\u540E\u7684\u6570\u503C\u8BBE\u7F6E\u683C\u5F0F',\r\n        ruleTypeItem3_title: '\u4E3A\u4EE5\u4E0B\u6392\u540D\u5185\u7684\u503C',\r\n        ruleTypeItem4: '\u4EC5\u5BF9\u9AD8\u4E8E\u6216\u4F4E\u4E8E\u5E73\u5747\u503C\u7684\u6570\u503C\u8BBE\u7F6E\u683C\u5F0F',\r\n        ruleTypeItem4_title: '\u4E3A\u6EE1\u8DB3\u4EE5\u4E0B\u6761\u4EF6\u7684\u503C',\r\n        ruleTypeItem5: '\u4EC5\u5BF9\u552F\u4E00\u503C\u6216\u91CD\u590D\u503C\u8BBE\u7F6E\u683C\u5F0F',\r\n        ruleTypeItem6: '\u4F7F\u7528\u516C\u5F0F\u786E\u5B9A\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u5355\u5143\u683C',\r\n        formula: '\u516C\u5F0F',\r\n        textColor: '\u6587\u672C\u989C\u8272',\r\n        cellColor: '\u5355\u5143\u683C\u989C\u8272',\r\n        confirm: '\u786E\u5B9A',\r\n        confirmColor: '\u786E\u5B9A\u989C\u8272',\r\n        cancel: '\u53D6\u6D88',\r\n        close: '\u5173\u95ED',\r\n        clearColorSelect: '\u6E05\u9664\u989C\u8272\u9009\u62E9',\r\n        sheet: '\u8868',\r\n        currentSheet: '\u5F53\u524D\u5DE5\u4F5C\u8868',\r\n        dataBar: '\u6570\u636E\u6761',\r\n        dataBarColor: '\u6570\u636E\u6761\u989C\u8272',\r\n        gradientDataBar_1: '\u84DD-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        gradientDataBar_2: '\u7EFF-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        gradientDataBar_3: '\u7EA2-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        gradientDataBar_4: '\u6A59-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        gradientDataBar_5: '\u6D45\u84DD-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        gradientDataBar_6: '\u7D2B-\u767D\u6E10\u53D8\u6570\u636E\u6761',\r\n        solidColorDataBar_1: '\u84DD\u8272\u6570\u636E\u6761',\r\n        solidColorDataBar_2: '\u7EFF\u8272\u6570\u636E\u6761',\r\n        solidColorDataBar_3: '\u7EA2\u8272\u6570\u636E\u6761',\r\n        solidColorDataBar_4: '\u6A59\u8272\u6570\u636E\u6761',\r\n        solidColorDataBar_5: '\u6D45\u84DD\u8272\u6570\u636E\u6761',\r\n        solidColorDataBar_6: '\u7D2B\u8272\u6570\u636E\u6761',\r\n        colorGradation: '\u8272\u9636',\r\n        colorGradation_1: '\u7EFF-\u9EC4-\u7EA2\u8272\u9636',\r\n        colorGradation_2: '\u7EA2-\u9EC4-\u7EFF\u8272\u9636',\r\n        colorGradation_3: '\u7EFF-\u767D-\u7EA2\u8272\u9636',\r\n        colorGradation_4: '\u7EA2-\u767D-\u7EFF\u8272\u9636',\r\n        colorGradation_5: '\u84DD-\u767D-\u7EA2\u8272\u9636',\r\n        colorGradation_6: '\u7EA2-\u767D-\u84DD\u8272\u9636',\r\n        colorGradation_7: '\u767D-\u7EA2\u8272\u9636',\r\n        colorGradation_8: '\u7EA2-\u767D\u8272\u9636',\r\n        colorGradation_9: '\u7EFF-\u767D\u8272\u9636',\r\n        colorGradation_10: '\u767D-\u7EFF\u8272\u9636',\r\n        colorGradation_11: '\u7EFF-\u9EC4\u8272\u9636',\r\n        colorGradation_12: '\u9EC4-\u7EFF\u8272\u9636',\r\n        icons: '\u56FE\u6807\u96C6',\r\n        pleaseSelectIcon: '\u8BF7\u70B9\u51FB\u9009\u62E9\u4E00\u7EC4\u56FE\u6807\uFF1A',\r\n        cellValue: '\u5355\u5143\u683C\u503C',\r\n        specificText: '\u7279\u5B9A\u6587\u672C',\r\n        occurrence: '\u53D1\u751F\u65E5\u671F',\r\n        greaterThan: '\u5927\u4E8E',\r\n        lessThan: '\u5C0F\u4E8E',\r\n        between: '\u4ECB\u4E8E',\r\n        equal: '\u7B49\u4E8E',\r\n        in: '\u548C',\r\n        to: '\u5230',\r\n        between2: '\u4E4B\u95F4',\r\n        contain: '\u5305\u542B',\r\n        textContains: '\u6587\u672C\u5305\u542B',\r\n        duplicateValue: '\u91CD\u590D\u503C',\r\n        uniqueValue: '\u552F\u4E00\u503C',\r\n        top: '\u524D',\r\n        top10: '\u524D 10 \u9879',\r\n        top10_percent: '\u524D 10%',\r\n        last: '\u540E',\r\n        last10: '\u540E 10 \u9879',\r\n        last10_percent: '\u540E 10%',\r\n        oneself: '\u4E2A',\r\n        above: '\u9AD8\u4E8E',\r\n        aboveAverage: '\u9AD8\u4E8E\u5E73\u5747\u503C',\r\n        below: '\u4F4E\u4E8E',\r\n        belowAverage: '\u4F4E\u4E8E\u5E73\u5747\u503C',\r\n        all: '\u5168\u90E8',\r\n        yesterday: '\u6628\u5929',\r\n        today: '\u4ECA\u5929',\r\n        tomorrow: '\u660E\u5929',\r\n        lastWeek: '\u4E0A\u5468',\r\n        thisWeek: '\u672C\u5468',\r\n        lastMonth: '\u4E0A\u6708',\r\n        thisMonth: '\u672C\u6708',\r\n        lastYear: '\u53BB\u5E74',\r\n        thisYear: '\u672C\u5E74',\r\n        last7days: '\u6700\u8FD17\u5929',\r\n        last30days: '\u6700\u8FD130\u5929',\r\n        next7days: '\u672A\u67657\u5929',\r\n        next30days: '\u672A\u676530\u5929',\r\n        next60days: '\u672A\u676560\u5929',\r\n        chooseRuleType: '\u9009\u62E9\u89C4\u5219\u7C7B\u578B',\r\n        editRuleDescription: '\u7F16\u8F91\u89C4\u5219\u8BF4\u660E',\r\n        newFormatRule: '\u65B0\u5EFA\u683C\u5F0F\u89C4\u5219',\r\n        editFormatRule: '\u7F16\u8F91\u683C\u5F0F\u89C4\u5219',\r\n        formatStyle: '\u683C\u5F0F\u6837\u5F0F',\r\n        fillType: '\u586B\u5145\u7C7B\u578B',\r\n        color: '\u989C\u8272',\r\n        twocolor: '\u53CC\u8272',\r\n        tricolor: '\u4E09\u8272',\r\n        multicolor: '\u5F69\u8272',\r\n        grayColor: '\u7070\u8272',\r\n        gradient: '\u6E10\u53D8',\r\n        solid: '\u5B9E\u5FC3',\r\n        maxValue: '\u6700\u5927\u503C',\r\n        medianValue: '\u4E2D\u95F4\u503C',\r\n        minValue: '\u6700\u5C0F\u503C',\r\n        direction: '\u65B9\u5411',\r\n        threeWayArrow: '\u4E09\u5411\u7BAD\u5934',\r\n        fourWayArrow: '\u56DB\u5411\u7BAD\u5934',\r\n        fiveWayArrow: '\u4E94\u5411\u7BAD\u5934',\r\n        threeTriangles: '3\u4E2A\u4E09\u89D2\u5F62',\r\n        shape: '\u5F62\u72B6',\r\n        threeColorTrafficLight: '\u4E09\u8272\u4EA4\u901A\u706F',\r\n        fourColorTrafficLight: '\u56DB\u8272\u4EA4\u901A\u706F',\r\n        threeSigns: '\u4E09\u6807\u5FD7',\r\n        greenRedBlackGradient: '\u7EFF-\u7EA2-\u9ED1\u6E10\u53D8',\r\n        rimless: '\u65E0\u8FB9\u6846',\r\n        bordered: '\u6709\u8FB9\u6846',\r\n        mark: '\u6807\u8BB0',\r\n        threeSymbols: '\u4E09\u4E2A\u7B26\u53F7',\r\n        tricolorFlag: '\u4E09\u8272\u65D7',\r\n        circled: '\u6709\u5706\u5708',\r\n        noCircle: '\u65E0\u5706\u5708',\r\n        grade: '\u7B49\u7EA7',\r\n        grade4: '\u56DB\u7B49\u7EA7',\r\n        grade5: '\u4E94\u7B49\u7EA7',\r\n        threeStars: '3\u4E2A\u661F\u5F62',\r\n        fiveQuadrantDiagram: '\u4E94\u8C61\u9650\u56FE',\r\n        fiveBoxes: '5\u4E2A\u6846',\r\n    },\r\n    insertLink: {\r\n        linkText: \"\u6587\u672C\",\r\n        linkType: \"\u94FE\u63A5\u7C7B\u578B\",\r\n        external: \"\u5916\u90E8\u94FE\u63A5\",\r\n        internal: \"\u5185\u90E8\u94FE\u63A5\",\r\n        linkAddress: \"\u94FE\u63A5\u5730\u5740\",\r\n        linkSheet: \"\u5DE5\u4F5C\u8868\",\r\n        linkCell: \"\u5355\u5143\u683C\u5F15\u7528\",\r\n        linkTooltip: \"\u63D0\u793A\",\r\n        placeholder1: \"\u8BF7\u8F93\u5165\u7F51\u9875\u94FE\u63A5\u5730\u5740\",\r\n        placeholder2: \"\u8BF7\u8F93\u5165\u8981\u5F15\u7528\u7684\u5355\u5143\u683C\uFF0C\u4F8BA1\",\r\n        placeholder3: \"\u8BF7\u8F93\u5165\u63D0\u793A\u5185\u5BB9\",\r\n        tooltipInfo1: \"\u8BF7\u8F93\u5165\u6709\u6548\u7684\u94FE\u63A5\",\r\n        tooltipInfo2: \"\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u5355\u5143\u683C\u5F15\u7528\",\r\n    },\r\n    dataVerification: {\r\n        cellRange: '\u5355\u5143\u683C\u8303\u56F4',\r\n        selectCellRange: '\u70B9\u51FB\u9009\u62E9\u5355\u5143\u683C\u8303\u56F4',\r\n        selectCellRange2: '\u8BF7\u9009\u62E9\u5355\u5143\u683C\u8303\u56F4',\r\n        verificationCondition: '\u9A8C\u8BC1\u6761\u4EF6',\r\n        allowMultiSelect: '\u662F\u5426\u5141\u8BB8\u591A\u9009',\r\n        dropdown: '\u4E0B\u62C9\u5217\u8868',\r\n        checkbox: '\u590D\u9009\u6846',\r\n        number: '\u6570\u5B57',\r\n        number_integer: '\u6570\u5B57-\u6574\u6570',\r\n        number_decimal: '\u6570\u5B57-\u5C0F\u6570',\r\n        text_content: '\u6587\u672C-\u5185\u5BB9',\r\n        text_length: '\u6587\u672C-\u957F\u5EA6',\r\n        date: '\u65E5\u671F',\r\n        validity: '\u6709\u6548\u6027',\r\n        placeholder1: '\u8BF7\u8F93\u5165\u9009\u9879\uFF0C\u4EE5\u82F1\u6587\u9017\u53F7\u5206\u9694\uFF0C\u59821,2,3,4,5',\r\n        placeholder2: '\u8BF7\u8F93\u5165\u5185\u5BB9',\r\n        placeholder3: '\u6570\u503C\uFF0C\u598210',\r\n        placeholder4: '\u8BF7\u8F93\u5165\u6307\u5B9A\u7684\u6587\u672C',\r\n        placeholder5: '\u8BF7\u8F93\u5165\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u7684\u63D0\u793A\u8BED',\r\n        selected: '\u9009\u62E9\u65F6',\r\n        notSelected: '\u672A\u9009\u62E9',\r\n        between: '\u4ECB\u4E8E',\r\n        notBetween: '\u4E0D\u4ECB\u4E8E',\r\n        equal: '\u7B49\u4E8E',\r\n        notEqualTo: '\u4E0D\u7B49\u4E8E',\r\n        moreThanThe: '\u5927\u4E8E',\r\n        lessThan: '\u5C0F\u4E8E',\r\n        greaterOrEqualTo: '\u5927\u4E8E\u7B49\u4E8E',\r\n        lessThanOrEqualTo: '\u5C0F\u4E8E\u7B49\u4E8E',\r\n        include: '\u5305\u62EC',\r\n        exclude: '\u4E0D\u5305\u62EC',\r\n        earlierThan: '\u65E9\u4E8E',\r\n        noEarlierThan: '\u4E0D\u65E9\u4E8E',\r\n        laterThan: '\u665A\u4E8E',\r\n        noLaterThan: '\u4E0D\u665A\u4E8E',\r\n        identificationNumber: '\u8EAB\u4EFD\u8BC1\u53F7\u7801',\r\n        phoneNumber: '\u624B\u673A\u53F7',\r\n        remote: '\u81EA\u52A8\u8FDC\u7A0B\u83B7\u53D6\u9009\u9879',\r\n        prohibitInput: '\u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165',\r\n        hintShow: '\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED',\r\n        deleteVerification: '\u5220\u9664\u9A8C\u8BC1',\r\n        tooltipInfo1: '\u4E0B\u62C9\u5217\u8868\u9009\u9879\u4E0D\u53EF\u4E3A\u7A7A',\r\n        tooltipInfo2: '\u590D\u9009\u6846\u5185\u5BB9\u4E0D\u53EF\u4E3A\u7A7A',\r\n        tooltipInfo3: '\u8F93\u5165\u7684\u503C\u4E0D\u662F\u6570\u503C\u7C7B\u578B',\r\n        tooltipInfo4: '\u6570\u503C2\u4E0D\u80FD\u5C0F\u4E8E\u6570\u503C1',\r\n        tooltipInfo5: '\u6587\u672C\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A',\r\n        tooltipInfo6: '\u8F93\u5165\u7684\u503C\u4E0D\u662F\u65E5\u671F\u7C7B\u578B',\r\n        tooltipInfo7: '\u65E5\u671F2\u4E0D\u80FD\u5C0F\u4E8E\u65E5\u671F1',\r\n        textlengthInteger: '\u6587\u672C\u957F\u5EA6\u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E0\u7684\u6574\u6570',\r\n    },\r\n    formula:{\r\n        sum:\"\u6C42\u548C\",\r\n        average:\"\u5E73\u5747\u503C\",\r\n        count:\"\u8BA1\u6570\",\r\n        max:\"\u6700\u5927\u503C\",\r\n        min:\"\u6700\u5C0F\u503C\",\r\n        ifGenerate:\"if\u516C\u5F0F\u751F\u6210\u5668\",\r\n        find:\"\u66F4\u591A\u51FD\u6570\",\r\n\r\n        tipNotBelongToIf:\"\u8BE5\u5355\u5143\u683C\u51FD\u6570\u4E0D\u5C5E\u4E8Eif\u516C\u5F0F\uFF01\",\r\n        tipSelectCell:\"\u8BF7\u9009\u62E9\u5355\u5143\u683C\u63D2\u5165\u51FD\u6570\",\r\n\r\n        ifGenCompareValueTitle:\"\u6BD4\u8F83\u503C\",\r\n        ifGenSelectCellTitle:\"\u70B9\u51FB\u9009\u62E9\u5355\u5143\u683C\",\r\n        ifGenRangeTitle:\"\u8303\u56F4\",\r\n        ifGenRangeTo:\"\u81F3\",\r\n        ifGenRangeEvaluate:\"\u8303\u56F4\u8BC4\u4F30\",\r\n        ifGenSelectRangeTitle:\"\u70B9\u51FB\u9009\u62E9\u8303\u56F4\",\r\n        ifGenCutWay:\"\u5212\u5206\u65B9\u5F0F\",\r\n        ifGenCutSame:\"\u5212\u5206\u503C\u76F8\u540C\",\r\n        ifGenCutNpiece:\"\u5212\u5206\u4E3AN\u4EFD\",\r\n        ifGenCutCustom:\"\u81EA\u5B9A\u4E49\u8F93\u5165\",\r\n        ifGenCutConfirm:\"\u751F\u6210\",\r\n\r\n        ifGenTipSelectCell:\"\u9009\u62E9\u5355\u5143\u683C\",\r\n        ifGenTipSelectCellPlace:\"\u8BF7\u9009\u62E9\u5355\u5143\u683C\",\r\n\r\n        ifGenTipSelectRange:\"\u9009\u62E9\u5355\u8303\u56F4\",\r\n        ifGenTipSelectRangePlace:\"\u8BF7\u9009\u62E9\u8303\u56F4\",\r\n\r\n        ifGenTipNotNullValue:\"\u6BD4\u8F83\u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01\",\r\n        ifGenTipLableTitile:\"\u6807\u7B7E\",\r\n        ifGenTipRangeNotforNull:\"\u8303\u56F4\u4E0D\u80FD\u4E3A\u7A7A\uFF01\",\r\n        ifGenTipCutValueNotforNull:\"\u5212\u5206\u503C\u4E0D\u80FD\u4E3A\u7A7A\uFF01\",\r\n        ifGenTipNotGenCondition:\"\u6CA1\u6709\u751F\u6210\u53EF\u7528\u7684\u6761\u4EF6\uFF01\",\r\n    },\r\n    formulaMore:{\r\n        valueTitle:\"\u503C\",\r\n        tipSelectDataRange:\"\u9009\u53D6\u6570\u636E\u8303\u56F4\",\r\n        tipDataRangeTile:\"\u6570\u636E\u8303\u56F4\",\r\n        findFunctionTitle:\"\u67E5\u627E\u51FD\u6570\",\r\n        tipInputFunctionName:\"\u8BF7\u8F93\u5165\u60A8\u8981\u67E5\u627E\u7684\u51FD\u6570\u540D\u79F0\u6216\u51FD\u6570\u529F\u80FD\u7684\u7B80\u8981\u63CF\u8FF0\",\r\n\r\n        \"Array\":\"\u6570\u7EC4\",\r\n        \"Database\":\"\u6570\u636E\u6E90\",\r\n        \"Date\":\"\u65E5\u671F\",\r\n        \"Engineering\":\"\u5DE5\u7A0B\u8BA1\u7B97\",\r\n        \"Filter\":\"\u8FC7\u6EE4\u5668\",\r\n        \"Financial\":\"\u8D22\u52A1\",\r\n        \"luckysheet\":\"Luckysheet\u5185\u7F6E\",\r\n        \"other\":\"\u5176\u5B83\",\r\n        \"Logical\":\"\u903B\u8F91\",\r\n        \"Lookup\":\"\u67E5\u627E\",\r\n        \"Math\":\"\u6570\u5B66\",\r\n        \"Operator\":\"\u8FD0\u7B97\u7B26\",\r\n        \"Parser\":\"\u8F6C\u6362\u5DE5\u5177\",\r\n        \"Statistical\":\"\u7EDF\u8BA1\",\r\n        \"Text\":\"\u6587\u672C\",\r\n        \"dataMining\":\"\u6570\u636E\u6316\u6398\",\r\n\r\n        \"selectFunctionTitle\":\"\u9009\u62E9\u51FD\u6570\",\r\n        \"calculationResult\":\"\u8BA1\u7B97\u7ED3\u679C\",\r\n\r\n        tipSuccessText:\"\u6210\u529F\",\r\n        tipParamErrorText:\"\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\",\r\n\r\n        \"helpClose\":\"\u5173\u95ED\",\r\n        \"helpCollapse\":\"\u6536\u8D77\",\r\n        \"helpExample\":\"\u793A\u4F8B\",\r\n        \"helpAbstract\":\"\u6458\u8981\",\r\n\r\n        \"execfunctionError\":'\u63D0\u793A\", \"\u516C\u5F0F\u5B58\u5728\u9519\u8BEF',\r\n        \"execfunctionSelfError\":'\u516C\u5F0F\u4E0D\u53EF\u5F15\u7528\u5176\u672C\u8EAB\u7684\u5355\u5143\u683C',\r\n        \"execfunctionSelfErrorResult\":'\u516C\u5F0F\u4E0D\u53EF\u5F15\u7528\u5176\u672C\u8EAB\u7684\u5355\u5143\u683C\uFF0C\u4F1A\u5BFC\u81F4\u8BA1\u7B97\u7ED3\u679C\u4E0D\u51C6\u786E',\r\n\r\n        \"allowRepeatText\":\"\u53EF\u91CD\u590D\",\r\n        \"allowOptionText\":\"\u53EF\u9009\",\r\n\r\n        \"selectCategory\":\"\u6216\u9009\u62E9\u7C7B\u522B\",\r\n    },\r\n    drag:{\r\n        noMerge:\"\u65E0\u6CD5\u5BF9\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n        affectPivot:\"\u65E0\u6CD5\u5BF9\u6240\u9009\u5355\u5143\u683C\u8FDB\u884C\u6B64\u66F4\u6539\uFF0C\u56E0\u4E3A\u5B83\u4F1A\u5F71\u54CD\u6570\u636E\u900F\u89C6\u8868\uFF01\",\r\n        noMulti:\"\u65E0\u6CD5\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C,\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\",\r\n        noPaste:\"\u65E0\u6CD5\u5728\u6B64\u5904\u7C98\u8D34\u6B64\u5185\u5BB9\uFF0C\u8BF7\u9009\u62E9\u7C98\u8D34\u533A\u57DF\u7684\u4E00\u4E2A\u5355\u5143\u683C\uFF0C\u7136\u540E\u518D\u6B21\u5C1D\u8BD5\u7C98\u8D34\",\r\n        noPartMerge:\"\u65E0\u6CD5\u5BF9\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\",\r\n\r\n        inputCorrect:\"\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u6570\u503C\",\r\n        notLessOne:\"\u884C\u5217\u6570\u4E0D\u80FD\u5C0F\u4E8E1\",\r\n        offsetColumnLessZero:\"\u504F\u79FB\u5217\u4E0D\u80FD\u4E3A\u8D1F\u6570\uFF01\",\r\n\r\n        pasteMustKeybordAlert:\"Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut\",\r\n        pasteMustKeybordAlertHTMLTitle:\"Copy and paste in the Sheet\",\r\n        pasteMustKeybordAlertHTML:\"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut\",\r\n    },\r\n    pivotTable:{\r\n        title:\"\u6570\u636E\u900F\u89C6\u8868\",\r\n        closePannel:\"\u5173\u95ED\",\r\n        editRange:\"\u7F16\u8F91\u8303\u56F4\",\r\n        tipPivotFieldSelected:\"\u9009\u62E9\u9700\u8981\u6DFB\u52A0\u5230\u6570\u636E\u900F\u89C6\u8868\u7684\u5B57\u6BB5\",\r\n        tipClearSelectedField:\"\u6E05\u9664\u6240\u6709\u5DF2\u9009\u5B57\u6BB5\",\r\n        btnClearSelectedField:\"\u6E05\u9664\",\r\n        btnFilter:\"\u7B5B\u9009\",\r\n        titleRow:\"\u884C\",\r\n        titleColumn:\"\u5217\",\r\n        titleValue:\"\u6570\u503C\",\r\n        tipShowColumn:\"\u7EDF\u8BA1\u5B57\u6BB5\u663E\u793A\u4E3A\u5217\",\r\n        tipShowRow:\"\u7EDF\u8BA1\u5B57\u6BB5\u663E\u793A\u4E3A\u884C\",\r\n\r\n        titleSelectionDataRange:\"\u9009\u53D6\u6570\u636E\u8303\u56F4\",\r\n        titleDataRange:\"\u6570\u636E\u8303\u56F4\",\r\n\r\n        valueSum:\"\u603B\u8BA1\",\r\n\r\n        valueStatisticsSUM:\"\u6C42\u548C\",\r\n        valueStatisticsCOUNT:\"\u6570\u503C\u8BA1\u6570\",\r\n        valueStatisticsCOUNTA:\"\u8BA1\u6570\",\r\n        valueStatisticsCOUNTUNIQUE:\"\u53BB\u91CD\u8BA1\u6570\",\r\n        valueStatisticsAVERAGE:\"\u5E73\u5747\u503C\",\r\n        valueStatisticsMAX:\"\u6700\u5927\u503C\",\r\n        valueStatisticsMIN:\"\u6700\u5C0F\u503C\",\r\n        valueStatisticsMEDIAN:\"\u4E2D\u4F4D\u6570\",\r\n        valueStatisticsPRODUCT:\"\u4E58\u79EF\",\r\n        valueStatisticsSTDEV:\"\u6807\u51C6\u5DEE\",\r\n\r\n        valueStatisticsSTDEVP:\"\u6574\u4F53\u6807\u51C6\u5DEE\",\r\n        valueStatisticslet:\"\u65B9\u5DEE\",\r\n        valueStatisticsVARP:\"\u6574\u4F53\u65B9\u5DEE\",\r\n\r\n        errorNotAllowEdit:\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u7981\u6B62\u8BE5\u64CD\u4F5C\uFF01\",\r\n        errorNotAllowMulti:\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\",\r\n        errorSelectRange:\"\u8BF7\u9009\u62E9\u65B0\u5EFA\u900F\u89C6\u8868\u7684\u533A\u57DF\",\r\n        errorIsDamage:\"\u6B64\u6570\u636E\u900F\u89C6\u8868\u7684\u6E90\u6570\u636E\u5DF2\u635F\u574F\uFF01\",\r\n        errorNotAllowPivotData:\"\u4E0D\u53EF\u9009\u62E9\u6570\u636E\u900F\u89C6\u8868\u4E3A\u6E90\u6570\u636E\uFF01\",\r\n        errorSelectionRange:\"\u9009\u62E9\u5931\u8D25, \u8F93\u5165\u8303\u56F4\u9519\u8BEF\uFF01\",\r\n        errorIncreaseRange:\"\u8BF7\u6269\u5927\u9009\u62E9\u7684\u6570\u636E\u8303\u56F4!\",\r\n\r\n        titleAddColumn:\"\u6DFB\u52A0\u5217\u5230\u6570\u636E\u900F\u89C6\u8868\",\r\n        titleMoveColumn:\"\u79FB\u52A8\u8BE5\u5217\u5230\u4E0B\u65B9\u767D\u6846\",\r\n        titleClearColumnFilter:\"\u6E05\u9664\u8BE5\u5217\u7684\u7B5B\u9009\u6761\u4EF6\",\r\n        titleFilterColumn:\"\u7B5B\u9009\u8BE5\u5217\",\r\n\r\n        titleSort:\"\u6392\u5E8F\",\r\n        titleNoSort:\"\u65E0\u6392\u5E8F\",\r\n        titleSortAsc:\"\u5347\u5E8F\",\r\n        titleSortDesc:\"\u964D\u5E8F\",\r\n        titleSortBy:\"\u6392\u5E8F\u4F9D\u636E\",\r\n        titleShowSum:\"\u663E\u793A\u603B\u8BA1\",\r\n        titleStasticTrue:\"\u662F\",\r\n        titleStasticFalse:\"\u5426\",\r\n    },\r\n    dropCell:{\r\n        copyCell:\"\u590D\u5236\u5355\u5143\u683C\",\r\n        sequence:\"\u586B\u5145\u5E8F\u5217\",\r\n        onlyFormat:\"\u4EC5\u586B\u5145\u683C\u5F0F\",\r\n        noFormat:\"\u4E0D\u5E26\u683C\u5F0F\u586B\u5145\",\r\n        day:\"\u4EE5\u5929\u6570\u586B\u5145\",\r\n        workDay:\"\u4EE5\u5DE5\u4F5C\u65E5\u586B\u5145\",\r\n        month:\"\u4EE5\u6708\u586B\u5145\",\r\n        year:\"\u4EE5\u5E74\u586B\u5145\",\r\n        chineseNumber:\"\u4EE5\u4E2D\u6587\u5C0F\u5199\u6570\u5B57\u586B\u5145\"\r\n    },\r\n    imageCtrl:{\r\n        borderTile:\"\u56FE\u7247\u8FB9\u6846\u989C\u8272\u9009\u62E9\",\r\n        borderCur:\"\u5F53\u524D\u989C\u8272\",\r\n    },\r\n    protection:{\r\n        protectiontTitle:\"\u4FDD\u62A4\u5DE5\u4F5C\u8868\",\r\n        enterPassword:\"\u8BF7\u8F93\u5165\u5BC6\u7801\uFF08\u53EF\u7559\u7A7A\uFF09\",\r\n        enterHint:\"\u60A8\u8BD5\u56FE\u66F4\u6539\u7684\u5355\u5143\u683C\u6216\u56FE\u8868\u4F4D\u4E8E\u53D7\u4FDD\u62A4\u7684\u5DE5\u4F5C\u8868\u4E2D\u3002\u82E5\u8981\u66F4\u6539\uFF0C\u8BF7\u53D6\u6D88\u5DE5\u4F5C\u8868\u4FDD\u62A4\u3002\u60A8\u53EF\u80FD\u9700\u8981\u8F93\u5165\u5BC6\u7801\",\r\n        swichProtectionTip:\"\u4FDD\u62A4\u5DE5\u4F5C\u8868\u53CA\u9501\u5B9A\u7684\u5355\u5143\u683C\u5185\u5BB9\",\r\n        authorityTitle:\"\u5141\u8BB8\u6B64\u5DE5\u4F5C\u8868\u7684\u7528\u6237\u8FDB\u884C:\",\r\n        selectLockedCells:\"\u9009\u5B9A\u9501\u5B9A\u5355\u5143\u683C\",\r\n        selectunLockedCells:\"\u9009\u5B9A\u89E3\u9664\u9501\u5B9A\u7684\u5355\u5143\u683C\",\r\n        formatCells:\"\u8BBE\u7F6E\u5355\u5143\u683C\u683C\u5F0F\",\r\n        formatColumns:\"\u8BBE\u7F6E\u5217\u683C\u5F0F\",\r\n        formatRows:\"\u8BBE\u7F6E\u884C\u683C\u5F0F\",\r\n        insertColumns:\"\u63D2\u5165\u5217\",\r\n        insertRows:\"\u63D2\u5165\u884C\",\r\n        insertHyperlinks:\"\u63D2\u5165\u8D85\u94FE\u63A5\",\r\n        deleteColumns:\"\u5220\u9664\u5217\",\r\n        deleteRows:\"\u5220\u9664\u884C\",\r\n        sort:\"\u6392\u5E8F\",\r\n        filter:\"\u4F7F\u7528\u81EA\u52A8\u7B5B\u9009\",\r\n        usePivotTablereports:\"\u4F7F\u7528\u6570\u636E\u900F\u89C6\u8868\u548C\u62A5\u8868\",\r\n        editObjects:\"\u7F16\u8F91\u5BF9\u8C61\",\r\n        editScenarios:\"\u7F16\u8F91\u65B9\u6848\",\r\n\r\n        allowRangeTitle:\"\u5141\u8BB8\u7528\u6237\u7F16\u8F91\u533A\u57DF\",\r\n        allowRangeAdd:\"\u65B0\u5EFA...\",\r\n\r\n        allowRangeAddTitle:\"\u6807\u9898\",\r\n        allowRangeAddSqrf:\"\u5F15\u7528\u5355\u5143\u683C\",\r\n        selectCellRange: '\u70B9\u51FB\u9009\u62E9\u5355\u5143\u683C\u8303\u56F4',\r\n        selectCellRangeHolder:\"\u8BF7\u8F93\u5165\u5355\u5143\u683C\u8303\u56F4\",\r\n        allowRangeAddTitlePassword:\"\u5BC6\u7801\",\r\n        allowRangeAddTitleHint:\"\u63D0\u793A\",\r\n        allowRangeAddTitleHintTitle:\"\u8BBE\u7F6E\u5BC6\u7801\u540E\uFF0C\u63D0\u793A\u7528\u6237\u8F93\u5165\u5BC6\u7801(\u53EF\u7559\u7A7A)\",\r\n        allowRangeAddtitleDefault:\"\u8BF7\u8F93\u5165\u533A\u57DF\u540D\u79F0\",\r\n\r\n        rangeItemDblclick:\"\u53CC\u51FB\u8FDB\u884C\u7F16\u8F91\",\r\n        rangeItemHasPassword:\"\u5DF2\u8BBE\u7F6E\u5BC6\u7801\",\r\n\r\n        rangeItemErrorTitleNull:\"\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A\",\r\n        rangeItemErrorRangeNull:\"\u5355\u5143\u683C\u8303\u56F4\u4E0D\u80FD\u4E3A\u7A7A\",\r\n        rangeItemErrorRange:\"\u5355\u5143\u683C\u8303\u56F4\u683C\u5F0F\u9519\u8BEF\",\r\n\r\n        validationTitle:\"\u9A8C\u8BC1\u63D0\u793A\",\r\n        validationTips:\"\u9700\u8981\u8F93\u5165\u5BC6\u7801\u6765\u64A4\u9500\u5DE5\u4F5C\u8868\u7684\u4FDD\u62A4\",\r\n        validationInputHint:\"\u8BF7\u8F93\u5165\u5BC6\u7801\",\r\n\r\n        checkPasswordNullalert:\"\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF01\",\r\n        checkPasswordWrongalert:\"\u5BC6\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5\uFF01\",\r\n\r\n        checkPasswordSucceedalert:\"\u89E3\u9501\u6210\u529F\uFF0C\u53EF\u4EE5\u7F16\u8F91\u8BE5\u533A\u57DF!\",\r\n        defaultRangeHintText:\"\u8BE5\u5355\u5143\u683C\u6B63\u5728\u53D7\u5BC6\u7801\u4FDD\u62A4\u3002\",\r\n        defaultSheetHintText:\"\u8BE5\u5355\u5143\u683C\u6216\u56FE\u8868\u4F4D\u4E8E\u53D7\u4FDD\u62A4\u7684\u5DE5\u4F5C\u8868\u4E2D\uFF0C\u82E5\u8981\u8FDB\u884C\u66F4\u6539\uFF0C\u8BF7\u53D6\u6D88\u5DE5\u4F5C\u8868\u4FDD\u62A4\uFF0C\u60A8\u53EF\u80FD\u9700\u8981\u8F93\u5165\u5BC6\u7801\u3002\",\r\n    },\r\n    cellFormat:{\r\n        cellFormatTitle:\"\u8BBE\u7F6E\u5355\u5143\u683C\u683C\u5F0F\",\r\n        protection:\"\u4FDD\u62A4\",\r\n        locked:\"\u9501\u5B9A\u5355\u5143\u683C\",\r\n        hidden:\"\u9690\u85CF\u516C\u5F0F\",\r\n        protectionTips:\"\u53EA\u6709\u4FDD\u62A4\u5DE5\u4F5C\u8868\u529F\u80FD(\u5728\u83DC\u5355\u680F\u70B9\u51FB\u4FDD\u62A4\u5DE5\u4F5C\u8868\u6309\u94AE\u8FDB\u884C\u8BBE\u7F6E)\u5F00\u542F\u540E\uFF0C\u9501\u5B9A\u5355\u5143\u683C\u6216\u9690\u85CF\u516C\u5F0F\u624D\u80FD\u751F\u6548\",\r\n        tipsPart:\"\u90E8\u5206\u9009\u4E2D\",\r\n        tipsAll:\"\u5168\u90E8\u9009\u4E2D\",\r\n        selectionIsNullAlert:\"\u8BF7\u9009\u62E9\u4E00\u4E2A\u8303\u56F4\uFF01\",\r\n        sheetDataIsNullAlert:\"\u6570\u636E\u4E3A\u7A7A\u65E0\u6CD5\u8BBE\u7F6E\uFF01\",\r\n    },\r\n    print:{\r\n        normalBtn:\"\u5E38\u89C4\u89C6\u56FE\",\r\n        layoutBtn:\"\u9875\u9762\u5E03\u5C40\",\r\n        pageBtn:\"\u5206\u9875\u9884\u89C8\",\r\n\r\n        menuItemPrint:\"\u6253\u5370(Ctrl+P)\",\r\n        menuItemAreas:\"\u6253\u5370\u533A\u57DF\",\r\n        menuItemRows:\"\u6253\u5370\u6807\u9898\u884C\",\r\n        menuItemColumns:\"\u6253\u5370\u6807\u9898\u5217\",\r\n    },\r\n    edit:{\r\n        typing:\"\u6B63\u5728\u8F93\u5165\",\r\n    },\r\n    websocket:{\r\n        success: 'WebSocket\u8FDE\u63A5\u6210\u529F',\r\n        refresh: 'WebSocket\u8FDE\u63A5\u53D1\u751F\u9519\u8BEF, \u8BF7\u5237\u65B0\u9875\u9762\uFF01',\r\n        wait: 'WebSocket\u8FDE\u63A5\u53D1\u751F\u9519\u8BEF, \u8BF7\u8010\u5FC3\u7B49\u5F85\uFF01',\r\n        close: 'WebSocket\u8FDE\u63A5\u5173\u95ED',\r\n        contact: '\u670D\u52A1\u5668\u901A\u4FE1\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u540E\u518D\u8BD5\uFF0C\u5982\u82E5\u4E0D\u884C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01',\r\n        support: '\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301WebSocket',\r\n    }\r\n\r\n};\r\n", "export default {\r\n    functionlist:[{\r\n        \"n\": \"SUMIF\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a conditional sum across a range.\",\r\n        \"a\": \"A conditional sum across a range.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range which is tested against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sum_range\",\r\n            \"detail\": \"The range to be summed, if different from `range`.\",\r\n            \"example\": \"B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TAN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the tangent of an angle provided in radians.\",\r\n        \"a\": \"Tangent of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the tangent of, in radians.\",\r\n            \"example\": \"45*PI()/180\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TANH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic tangent of any real number.\",\r\n        \"a\": \"Hyperbolic tangent of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic tangent of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CEILING\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest integer multiple of specified significance `factor`.\",\r\n        \"a\": \"Rounds number up to nearest multiple of a factor.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round up to the nearest integer multiple of `factor`.\",\r\n            \"example\": \"23.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATAN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse tangent of a value, in radians.\",\r\n        \"a\": \"Inverse tangent of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse tangent.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ASINH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic sine of a number.\",\r\n        \"a\": \"Inverse hyperbolic sine of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic sine.\",\r\n            \"example\": \"0.9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ABS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the absolute value of a number.\",\r\n        \"a\": \"Absolute value of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number of which to return the absolute value.\",\r\n            \"example\": \"-2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACOS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse cosine of a value, in radians.\",\r\n        \"a\": \"Inverse cosine of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACOSH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic cosine of a number.\",\r\n        \"a\": \"Inverse hyperbolic cosine of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MULTINOMIAL\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the factorial of the sum of values divided by the product of the values' factorials.\",\r\n        \"a\": \"Multinomial distribution function.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATANH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse hyperbolic tangent of a number.\",\r\n        \"a\": \"Inverse hyperbolic tangent of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.\",\r\n            \"example\": \"0.9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ATAN2\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.\",\r\n        \"a\": \"Arctangent of a value.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"y\",\r\n            \"detail\": \"The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTBLANK\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of empty values in a list of values and ranges.\",\r\n        \"a\": \"Number of empty values.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range in which to count the number of blanks.\",\r\n            \"example\": \"A2:C100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COSH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic cosine of any real number.\",\r\n        \"a\": \"Hyperbolic cosine of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic cosine of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INT\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number down to the nearest integer that is less than or equal to it.\",\r\n        \"a\": \"Rounds number down to nearest integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round down to the nearest integer.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISEVEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Checks whether the provided value is even.\",\r\n        \"a\": \"Whether the provided value is even.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as even.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISODD\",\r\n        \"t\": 0,\r\n        \"d\": \"Checks whether the provided value is odd.\",\r\n        \"a\": \"Whether the provided value is odd.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as odd.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LCM\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the least common multiple of one or more integers.\",\r\n        \"a\": \"Least common multiple of one or more integers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range whose factors to consider in a calculation to find the least common multiple.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges whose factors to consider to find the least common multiple.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number, base e (Euler's number).\",\r\n        \"a\": \"The logarithm of a number, base e (euler's number).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm, base e.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOG\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number with respect to a base.\",\r\n        \"a\": \"The logarithm of a number with respect to a base.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm.\",\r\n            \"example\": \"128\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"base\",\r\n            \"detail\": \"The base to use for calculation of the logarithm.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOG10\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the logarithm of a number, base 10.\",\r\n        \"a\": \"The logarithm of a number, base 10.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the logarithm, base 10.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MOD\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the result of the modulo operator, the remainder after a division operation.\",\r\n        \"a\": \"Modulo (remainder) operator.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided to find the remainder.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MROUND\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds one number to the nearest integer multiple of another.\",\r\n        \"a\": \"Rounds a number to the nearest integer multiple.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number to round to the nearest integer multiple of another.\",\r\n            \"example\": \"21\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ODD\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest odd integer.\",\r\n        \"a\": \"Rounds a number up to the nearest odd integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to the next greatest odd number.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMSQ\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of the squares of a series of numbers and/or cells.\",\r\n        \"a\": \"Sum of squares.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first number or range whose squares to add together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional numbers or ranges whose squares to add to the square(s) of `value1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMBIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects.\",\r\n        \"a\": \"Number of combinations from a set of objects.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"n\",\r\n            \"detail\": \"The size of the pool of objects to choose from.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"k\",\r\n            \"detail\": \"The number of objects to choose.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUM\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of a series of numbers and/or cells.\",\r\n        \"a\": \"Sum of a series of numbers and/or cells.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first number or range to add together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional numbers or ranges to add to `value1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUBTOTAL\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a subtotal for a vertical range of cells using a specified aggregation function.\",\r\n        \"a\": \"Subtotal for a range using a specific function.\",\r\n        \"m\": [2, 256],\r\n        \"p\": [{\r\n            \"name\": \"function_code\",\r\n            \"detail\": \"The function to use in subtotal aggregation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"range1\",\r\n            \"detail\": \"The first range over which to calculate a subtotal.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"range2\",\r\n            \"detail\": \"Additional ranges over which to calculate subtotals.\",\r\n            \"example\": \"B2:B8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ASIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the inverse sine of a value, in radians.\",\r\n        \"a\": \"Inverse sine of a value, in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTIF\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a conditional count across a range.\",\r\n        \"a\": \"A conditional count across a range.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range that is tested against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RADIANS\",\r\n        \"t\": 0,\r\n        \"d\": \"Converts an angle value in degrees to radians.\",\r\n        \"a\": \"Converts an angle value in degrees to radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to convert from degrees to radians.\",\r\n            \"example\": \"180\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RAND\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a random number between 0 inclusive and 1 exclusive.\",\r\n        \"a\": \"A random number between 0 inclusive and 1 exclusive.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"COUNTUNIQUE\",\r\n        \"t\": 0,\r\n        \"d\": \"Counts the number of unique values in a list of specified values and ranges.\",\r\n        \"a\": \"Counts number of unique values in a range.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider for uniqueness.\",\r\n            \"example\": \"A1:C100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider for uniqueness.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEGREES\",\r\n        \"t\": 0,\r\n        \"d\": \"Converts an angle value in radians to degrees.\",\r\n        \"a\": \"Converts an angle value in radians to degrees.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to convert from radians to degrees.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ERFC\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the complementary Gauss error function of a value.\",\r\n        \"a\": \"Complementary gauss error function of a value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"z\",\r\n            \"detail\": \"The number for which to calculate the complementary Gauss error function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EVEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number up to the nearest even integer.\",\r\n        \"a\": \"Rounds a number up to the nearest even integer.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to the next greatest even number.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXP\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns Euler's number, e (~2.718) raised to a power.\",\r\n        \"a\": \"Euler's number, e (~2.718) raised to a power.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"exponent\",\r\n            \"detail\": \"The exponent to raise e to.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FACT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the factorial of a number.\",\r\n        \"a\": \"Factorial of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number or reference to a number whose factorial will be calculated and returned.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FACTDOUBLE\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the \\\"double factorial\\\" of a number.\",\r\n        \"a\": \"\\\"double factorial\\\" of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number or reference to a number whose double factorial will be calculated and returned.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PI\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the value of Pi to 14 decimal places.\",\r\n        \"a\": \"The number pi.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"FLOOR\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number down to the nearest integer multiple of specified significance `factor`.\",\r\n        \"a\": \"Rounds number down to nearest multiple of a factor.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round down to the nearest integer multiple of `factor`.\",\r\n            \"example\": \"23.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The number to whose multiples `value` will be rounded.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GCD\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the greatest common divisor of one or more integers.\",\r\n        \"a\": \"Greatest common divisor of one or more integers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range whose factors to consider in a calculation to find the greatest common divisor.\",\r\n            \"example\": \"A2:A5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges whose factors to consider to find the greatest common divisor.\",\r\n            \"example\": \"96\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANDBETWEEN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a uniformly random integer between two values, inclusive.\",\r\n        \"a\": \"Random integer between two values, inclusive.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"low\",\r\n            \"detail\": \"The low end of the random range.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"high\",\r\n            \"detail\": \"The high end of the random range.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUND\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places according to standard rules.\",\r\n        \"a\": \"Rounds a number according to standard rules.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUNDDOWN\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.\",\r\n        \"a\": \"Rounds down a number.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places, always rounding down.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROUNDUP\",\r\n        \"t\": 0,\r\n        \"d\": \"Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.\",\r\n        \"a\": \"Rounds up a number.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to round to `places` number of places, always rounding up.\",\r\n            \"example\": \"99.44\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of decimal places to which to round.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SERIESSUM\",\r\n        \"t\": 0,\r\n        \"d\": \"Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a\",\r\n        \"a\": \"Sum of a power series.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The initial power to which to raise `x` in the power series.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"m\",\r\n            \"detail\": \"The additive increment by which to increase `x`.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"a\",\r\n            \"detail\": \"The array or range containing the coefficients of the power series.\",\r\n            \"example\": \"{FACT(0)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SIGN\",\r\n        \"t\": 0,\r\n        \"d\": \"Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.\",\r\n        \"a\": \"Sign of a provided number (+/-/0).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose sign will be evaluated.\",\r\n            \"example\": \"-42\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SIN\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sine of an angle provided in radians.\",\r\n        \"a\": \"Sine of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the sine of, in radians.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SINH\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the hyperbolic sine of any real number.\",\r\n        \"a\": \"Hyperbolic sine of any real number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Any real value to calculate the hyperbolic sine of.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SQRT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the positive square root of a positive number.\",\r\n        \"a\": \"Positive square root of a positive number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number for which to calculate the positive square root.\",\r\n            \"example\": \"9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SQRTPI\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the positive square root of the product of Pi and the given positive number.\",\r\n        \"a\": \"Square root of the product of pi and number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The number which will be multiplied by Pi and have the product's square root returned\",\r\n            \"example\": \"9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GAMMALN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the logarithm of a specified Gamma function, base e (Euler's number).\",\r\n        \"a\": \"Logarithm of gamma function.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the cosine of an angle provided in radians.\",\r\n        \"a\": \"Cosine of an angle provided in radians.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"angle\",\r\n            \"detail\": \"The angle to find the cosine of, in radians.\",\r\n            \"example\": \"PI()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRUNC\",\r\n        \"t\": 0,\r\n        \"d\": \"Truncates a number to a certain number of significant digits by omitting less significant digits.\",\r\n        \"a\": \"Truncates a number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be truncated.\",\r\n            \"example\": \"3.141592654\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"places\",\r\n            \"detail\": \"The number of significant digits to the right of the decimal point to retain.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUOTIENT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns one number divided by another.\",\r\n        \"a\": \"One number divided by another.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"POWER\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns a number raised to a power.\",\r\n        \"a\": \"A number raised to a power.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"base\",\r\n            \"detail\": \"The number to raise to the `exponent` power.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"exponent\",\r\n            \"detail\": \"The exponent to raise `base` to.\",\r\n            \"example\": \"0.5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMIFS\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the sum of a range depending on multiple criteria.\",\r\n        \"a\": \"Sums a range depending on multiple criteria.\",\r\n        \"m\": [3, 257],\r\n        \"p\": [{\r\n            \"name\": \"sum_range\",\r\n            \"detail\": \"The range to sum.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against criterion1.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to criteria_range1.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" C1:C10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTIFS\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the count of a range depending on multiple criteria.\",\r\n        \"a\": \"Count values depending on multiple criteria.\",\r\n        \"m\": [2, 256],\r\n        \"p\": [{\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against `criterion1`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range1`.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRODUCT\",\r\n        \"t\": 0,\r\n        \"d\": \"Returns the result of multiplying a series of numbers together.\",\r\n        \"a\": \"Result of multiplying a series of numbers together.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first number or range to calculate for the product.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"More numbers or ranges to calculate for the product.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HARMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the harmonic mean of a dataset.\",\r\n        \"a\": \"The harmonic mean of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HYPGEOMDIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.\",\r\n        \"a\": \"Hypergeometric distribution probability.\",\r\n        \"m\": [5, 5],\r\n        \"p\": [{\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The desired number of successes.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_draws\",\r\n            \"detail\": \"The number of permitted draws.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"successes_in_pop\",\r\n            \"detail\": \"The total number of successes in the population.\",\r\n            \"example\": \"20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"pop_size\",\r\n            \"detail\": \"The total size of the population\",\r\n            \"example\": \"40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\\n\\nif FALSE(), it returns the probability density function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INTERCEPT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).\",\r\n        \"a\": \"Y-intercept of line derived via linear regression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"KURT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the kurtosis of a dataset, which describes the shape, and in particular the \\\"peakedness\\\" of that dataset.\",\r\n        \"a\": \"Kurtosis of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LARGE\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the nth largest element from a data set, where n is user-defined.\",\r\n        \"a\": \"Nth largest element from a data set.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The rank from largest to smallest of the element to return.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STDEVA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard deviation based on a sample, setting text to the value `0`.\",\r\n        \"a\": \"Standard deviation of sample (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STDEVP\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard deviation based on an entire population.\",\r\n        \"a\": \"Standard deviation of an entire population.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GEOMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the geometric mean of a dataset.\",\r\n        \"a\": \"The geometric mean of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANK_EQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.\",\r\n        \"a\": \"Top rank of a specified value in a dataset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose rank will be determined.\",\r\n            \"example\": \"A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANK_AVG\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.\",\r\n        \"a\": \"Average rank of a specified value in a dataset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose rank will be determined.\",\r\n            \"example\": \"A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTRANK_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.\",\r\n        \"a\": \"Percentage rank (percentile) from 0 to 1 exclusive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose percentage rank will be determined.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTRANK_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.\",\r\n        \"a\": \"Percentage rank (percentile) from 0 to 1 inclusive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose percentage rank will be determined.\",\r\n            \"example\": \" A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FORECAST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the expected y-value for a specified x based on a linear regression of a dataset.\",\r\n        \"a\": \"Expected y-value based of linear regression.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The value on the x-axis to forecast.\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FISHERINV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the inverse Fisher transformation of a specified value.\",\r\n        \"a\": \"Inverse fisher transformation of a specified value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the inverse Fisher transformation.\",\r\n            \"example\": \"0.962\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FISHER\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the Fisher transformation of a specified value.\",\r\n        \"a\": \"Fisher transformation of a specified value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value for which to calculate the Fisher transformation.\",\r\n            \"example\": \"0.962\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MODE_SNGL\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the most commonly occurring value in a dataset.\",\r\n        \"a\": \"Most commonly occurring value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating mode.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating mode.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEIBULL_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.\",\r\n        \"a\": \"Weibull distribution function.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the Weibull distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"shape\",\r\n            \"detail\": \"The shape parameter of the Weibull distribution function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"scale\",\r\n            \"detail\": \"The scale parameter of the Weibull distribution function.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the cumulative distribution function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNT\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of numeric values in a dataset.\",\r\n        \"a\": \"The number of numeric values in dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when counting.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when counting.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUNTA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of values in a dataset.\",\r\n        \"a\": \"The number of values in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when counting.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when counting.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVEDEV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the average of the magnitudes of deviations of data from a dataset's mean.\",\r\n        \"a\": \"Average magnitude of deviations from mean.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGE\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the numerical average value in a dataset, ignoring text.\",\r\n        \"a\": \"Numerical average value in a dataset, ignoring text.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the average value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the average value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the numerical average value in a dataset.\",\r\n        \"a\": \"Numerical average value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the average value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the average value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BINOM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.\",\r\n        \"a\": \"Binomial distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The number of successes for which to calculate the probability in `num_trials` trials.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_trials\",\r\n            \"detail\": \"The number of independent trials.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.005\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the binomial cumulative distribution.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BINOM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.\",\r\n        \"a\": \"Inverse cumulative binomial distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"num_trials\",\r\n            \"detail\": \"The number of independent trials.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.005\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"target_prob\",\r\n            \"detail\": \"The desired threshold probability.\",\r\n            \"example\": \"0.8\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONFIDENCE_NORM\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the width of half the confidence interval for a normal distribution.\",\r\n        \"a\": \"Confidence interval for a normal distribution.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"alpha\",\r\n            \"detail\": \"One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.\",\r\n            \"example\": \"0.05\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation of the population.\",\r\n            \"example\": \"1.6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"pop_size\",\r\n            \"detail\": \"The size of the population.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CORREL\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COVARIANCE_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the covariance of a dataset.\",\r\n        \"a\": \"The covariance of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COVARIANCE_S\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the sample covariance of a dataset.\",\r\n        \"a\": \"The sample covariance of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEVSQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the sum of squares of deviations based on a sample.\",\r\n        \"a\": \"The sum of squares of deviations based on a sample.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXPON_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the exponential distribution function with a specified lambda at a specified value.\",\r\n        \"a\": \"Exponential distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the exponential distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"lambda\",\r\n            \"detail\": \"The lambda to specify the exponential distribution function.\",\r\n            \"example\": \"0.5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the exponential cumulative distribution.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEIF\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the average of a range depending on criteria.\",\r\n        \"a\": \"Average of values depending on criteria.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"criteria_range\",\r\n            \"detail\": \"The range to check against `criterion`.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criterion\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range`.\",\r\n            \"example\": \"\\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"average_range\",\r\n            \"detail\": \"The range to average. If not included, `criteria_range` is used for the average instead.\",\r\n            \"example\": \"B1:B10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AVERAGEIFS\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the average of a range depending on multiple criteria.\",\r\n        \"a\": \"Average of values depending on multiple criteria.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"average_range\",\r\n            \"detail\": \"The range to average.\",\r\n            \"example\": \"A1:A10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range1\",\r\n            \"detail\": \"The range to check against `criterion1`.\",\r\n            \"example\": \" B1:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criterion1\",\r\n            \"detail\": \"The pattern or test to apply to `criteria_range1`.\",\r\n            \"example\": \" \\\">20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria_range2\",\r\n            \"detail\": \"Additional ranges to check.\",\r\n            \"example\": \" C1:C10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERMUT\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.\",\r\n        \"a\": \"Number of permutations from a number of objects.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"n\",\r\n            \"detail\": \"The size of the pool of objects to choose from.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"k\",\r\n            \"detail\": \"The number of objects to choose.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRIMMEAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.\",\r\n        \"a\": \"Mean of a dataset excluding high/low ends.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"exclude_proportion\",\r\n            \"detail\": \"The proportion of the dataset to exclude, from the extremities of the set.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTILE_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n        \"a\": \"Value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"percentile\",\r\n            \"detail\": \"The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.\",\r\n            \"example\": \"0.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PERCENTILE_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value at a given percentile of a dataset.\",\r\n        \"a\": \"Value at a given percentile of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"percentile\",\r\n            \"detail\": \"The percentile whose value within `data` will be calculated and returned.`\",\r\n            \"example\": \"0.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PEARSON\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_S_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse standard normal distribution function for a specified value.\",\r\n        \"a\": \"Inverse standard normal distribution function.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse standard normal distribution function.\",\r\n            \"example\": \"0.75\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_S_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the standard normal cumulative distribution function for a specified value.\",\r\n        \"a\": \"Standard normal cumulative distribution function.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the standard normal cumulative distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.\",\r\n        \"a\": \"Inverse normal distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse normal distribution function.\",\r\n            \"example\": \"0.75\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the normal distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the normal distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NORM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.\",\r\n        \"a\": \"Normal distribution function.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the normal distribution function.\",\r\n            \"example\": \"2.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the normal distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the normal distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the normal cumulative distribution function rather than the distribution function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NEGBINOM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.\",\r\n        \"a\": \"Negative binomial distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"num_failures\",\r\n            \"detail\": \"The number of failures to model.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"num_successes\",\r\n            \"detail\": \"The number of successes to model.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"prob_success\",\r\n            \"detail\": \"The probability of success in any given trial.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the minimum numeric value in a dataset.\",\r\n        \"a\": \"Minimum numeric value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the minimum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MIN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the minimum value in a numeric dataset.\",\r\n        \"a\": \"Minimum value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the minimum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MEDIAN\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the median value in a numeric dataset.\",\r\n        \"a\": \"Median value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the median value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the median value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MAXA\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the maximum numeric value in a dataset.\",\r\n        \"a\": \"Maximum numeric value in a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the maximum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MAX\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the maximum value in a numeric dataset.\",\r\n        \"a\": \"Maximum value in a numeric dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range to consider when calculating the maximum value.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGNORM_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n        \"a\": \"Inverse log-normal cumulative distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"0.4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the inverse log-normal cumulative distribution function.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGNORM_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n        \"a\": \"Log-normal cumulative distribution probability.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the log-normal cumulative distribution function.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation (sigma) of the log-normal cumulative distribution function.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"Z_TEST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the one-tailed p-value of a Z-test with standard distribution.\",\r\n        \"a\": \"One-tailed p-value of a z-test.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"value\",\r\n            \"detail\": \"The test statistic to use in the Z-test.\",\r\n            \"example\": \"B2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROB\",\r\n        \"t\": 1,\r\n        \"d\": \"Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.\",\r\n        \"a\": \"Probability values lie in a range.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"Array or range containing the dataset to consider.\",\r\n            \"example\": \"A3:A6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"probabilities\",\r\n            \"detail\": \"Array or range containing probabilities corresponding to `data`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"low_limit\",\r\n            \"detail\": \"The lower bound on the value range for which to calculate the probability.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"high_limit\",\r\n            \"detail\": \"The upper bound on the value range for which to calculate the probability.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUARTILE_EXC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.\",\r\n        \"a\": \"Value nearest to a specific quartile of a dataset exclusive of 0 and 4.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"quartile_number\",\r\n            \"detail\": \"Which quartile to return.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"QUARTILE_INC\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns a value nearest to a specified quartile of a dataset.\",\r\n        \"a\": \"Value nearest to a specific quartile of a dataset.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"quartile_number\",\r\n            \"detail\": \"Which quartile value to return.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"POISSON_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.\",\r\n        \"a\": \"Poisson distribution function.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the Poisson distribution function.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean (mu) of the Poisson distribution function.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Whether to use the Poisson cumulative distribution function rather than the distribution function.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RSQ\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n        \"a\": \"Square of the correlation coefficient.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the left tail probability for a Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The left-tailed Student's t-distribution\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST_2T\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the probability for two tailed Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The two tailed Student's t-distribution\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_DIST_RT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the right tail probability for a Student's t-distribution with a given input (x).\",\r\n        \"a\": \"The right-tailed Student's t-distribution\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the t-distribution function.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"30\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_INV\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the negative inverse of the one-tailed TDIST function.\",\r\n        \"a\": \"T.INV\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"probability\",\r\n            \"detail\": \"The probability associated with the two-tailed t-distribution.\",\r\n            \"example\": \"0.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_INV_2T\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the inverse of the two-tailed TDIST function.\",\r\n        \"a\": \"T.INV.2T\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"probability\",\r\n            \"detail\": \"The probability associated with the two-tailed t-distribution.\",\r\n            \"example\": \"0.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom\",\r\n            \"detail\": \"The number of degrees of freedom.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T_TEST\",\r\n        \"t\": 1,\r\n        \"d\": \"t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.\",\r\n        \"a\": \"Returns the probability associated with t-test.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"range1\",\r\n            \"detail\": \"The first sample of data or group of cells to consider for the t-test.\",\r\n            \"example\": \"A1:A4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"range2\",\r\n            \"detail\": \"The second sample of data or group of cells to consider for the t-test.\",\r\n            \"example\": \"B1:B4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"tails\",\r\n            \"detail\": \"Specifies the number of distribution tails.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"Specifies the type of t-test.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"F_DIST\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n        \"a\": \"F probability distribution (left-tailed).\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n            \"example\": \"15.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom1\",\r\n            \"detail\": \"The numerator of the number of degrees of freedom.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom2\",\r\n            \"detail\": \"The denominator of the number of degrees of freedom.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cumulative\",\r\n            \"detail\": \"Logical value that determines the form of the function.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"F_DIST_RT\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n        \"a\": \"F probability distribution.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"x\",\r\n            \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n            \"example\": \"15.35\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom1\",\r\n            \"detail\": \"The numerator of the number of degrees of freedom.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"degrees_freedom2\",\r\n            \"detail\": \"The denominator of the number of degrees of freedom.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VAR_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on an entire population.\",\r\n        \"a\": \"Variance of entire population.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VAR_S\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on a sample.\",\r\n        \"a\": \"Variance.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VARA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on a sample, setting text to the value `0`.\",\r\n        \"a\": \"Variance of sample (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the sample.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the sample.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VARPA\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the variance based on an entire population, setting text to the value `0`.\",\r\n        \"a\": \"Variance of entire population (text as 0).\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the population.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the population.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STEYX\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the standard error of the predicted y-value for each x in the regression of a dataset.\",\r\n        \"a\": \"Standard error of predicted y-values in regression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STANDARDIZE\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.\",\r\n        \"a\": \"Normalized equivalent of a random variable.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value of the random variable to normalize.\",\r\n            \"example\": \"96\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"mean\",\r\n            \"detail\": \"The mean of the distribution.\",\r\n            \"example\": \"80\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"standard_deviation\",\r\n            \"detail\": \"The standard deviation of the distribution.\",\r\n            \"example\": \"6.7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SMALL\",\r\n        \"t\": 1,\r\n        \"d\": \"Returns the nth smallest element from a data set, where n is user-defined.\",\r\n        \"a\": \"Nth smallest element in a data set.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the dataset to consider.\",\r\n            \"example\": \"A2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"n\",\r\n            \"detail\": \"The rank from smallest to largest of the element to return.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SLOPE\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the slope of the line resulting from linear regression of a dataset.\",\r\n        \"a\": \"Slope of line from linear regression of data.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data_y\",\r\n            \"detail\": \"The range representing the array or matrix of dependent data.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"data_x\",\r\n            \"detail\": \"The range representing the array or matrix of independent data.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SKEW\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.\",\r\n        \"a\": \"Skewness of a dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SKEW_P\",\r\n        \"t\": 1,\r\n        \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.\",\r\n        \"a\": \"Skewness of a population's dataset.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value or range of the dataset.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional values or ranges to include in the dataset.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VLOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.\",\r\n        \"a\": \"Vertical lookup.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.\",\r\n            \"example\": \"A2:B26\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"index\",\r\n            \"detail\": \"The column index of the value to be returned, where the first column in `range` is numbered 1.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_sorted\",\r\n            \"detail\": \"Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HLOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.\",\r\n        \"a\": \"Horizontal lookup\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.\",\r\n            \"example\": \"A2:Z6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"index\",\r\n            \"detail\": \"The row index of the value to be returned, where the first row in `range` is numbered 1.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_sorted\",\r\n            \"detail\": \"Indicates whether the row to be searched (the first row of the specified range) is sorted.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOOKUP\",\r\n        \"t\": 2,\r\n        \"d\": \"Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.\",\r\n        \"a\": \"Look up a value.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for in the row or column. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"10003\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"search_range|search_result_array\",\r\n            \"detail\": \"One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.\",\r\n            \"example\": \"A1:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"result_range\",\r\n            \"detail\": \"The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.\",\r\n            \"example\": \"B1:B100\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ADDRESS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a cell reference as a string.\",\r\n        \"a\": \"Cell reference as a string.\",\r\n        \"m\": [2, 5],\r\n        \"p\": [{\r\n            \"name\": \"row\",\r\n            \"detail\": \"The row number of the cell reference\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"column\",\r\n            \"detail\": \"The column number (not name) of the cell reference. `A` is column number `1`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"absolute_relative_mode\",\r\n            \"detail\": \"An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).\",\r\n            \"example\": \"4\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"use_a1_notation\",\r\n            \"detail\": \"A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sheet\",\r\n            \"detail\": \"Text indicating the name of the sheet into which the address points.\",\r\n            \"example\": \"\\\"Sheet2\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INDIRECT\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a cell reference specified by a string.\",\r\n        \"a\": \"A cell reference specified by a string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference_as_string\",\r\n            \"detail\": \"A cell reference, written as a string with surrounding quotation marks.\",\r\n            \"example\": \"\\\"Sheet2!\\\"&B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"is_A1_notation\",\r\n            \"detail\": \"Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROW\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the row number of a specified cell.\",\r\n        \"a\": \"Row number of a specified cell.\",\r\n        \"m\": [0, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The cell whose row number will be returned.\",\r\n            \"example\": \"A9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROWS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the number of rows in a specified array or range.\",\r\n        \"a\": \"Number of rows in a specified array or range.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range whose row count will be returned.\",\r\n            \"example\": \"A9:A62\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMN\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the column number of a specified cell, with `A=1`.\",\r\n        \"a\": \"Column number of a specified cell.\",\r\n        \"m\": [0, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The cell whose column number will be returned. Column `A` corresponds to `1`.\",\r\n            \"example\": \"A9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMNS\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the number of columns in a specified array or range.\",\r\n        \"a\": \"Number of columns in a specified array or range.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The range whose column count will be returned.\",\r\n            \"example\": \"A9:W62\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OFFSET\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns a range reference shifted a specified number of rows and columns from a starting cell reference.\",\r\n        \"a\": \"A range reference offset relative to a cell.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"cell_reference\",\r\n            \"detail\": \"The starting point from which to count the offset rows and columns.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"offset_rows\",\r\n            \"detail\": \"The number of rows to offset by.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"offset_columns\",\r\n            \"detail\": \"The number of columns to offset by.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"height\",\r\n            \"detail\": \"The height of the range to return starting at the offset target.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"width\",\r\n            \"detail\": \"The width of the range to return starting at the offset target.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MATCH\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the relative position of an item in a range that matches a specified value.\",\r\n        \"a\": \"Position of item in range that matches value.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_key\",\r\n            \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\",\r\n            \"example\": \"\\\"Sunday\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"range\",\r\n            \"detail\": \"The one-dimensional array to be searched.\",\r\n            \"example\": \"A2:A9\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"search_type\",\r\n            \"detail\": \"The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INDEX\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns the content of a cell, specified by row and column offset.\",\r\n        \"a\": \"Content of cell specified by row and column offset.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The array of cells to be offset into.\",\r\n            \"example\": \"A1:C20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"row\",\r\n            \"detail\": \"The number of offset rows.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"column\",\r\n            \"detail\": \"The number of offset columns.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GETPIVOTDATA\",\r\n        \"t\": 2,\r\n        \"d\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n        \"a\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n        \"m\": [2, 254],\r\n        \"p\": [{\r\n            \"name\": \"value_name\",\r\n            \"detail\": \"The name of the value in the pivot table for which you want to get data.\",\r\n            \"example\": \"\\\"SUM of number of units\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"any_pivot_table_cell\",\r\n            \"detail\": \"Any reference to a cell in the desired pivot table (top corner recommended).\",\r\n            \"example\": \"'Pivot table'!A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"original_column\",\r\n            \"detail\": \"The name of the column in the original data set (not the pivot table).\",\r\n            \"example\": \"\\\"division\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"pivot_item\",\r\n            \"detail\": \"The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.\",\r\n            \"example\": \"\\\"east\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CHOOSE\",\r\n        \"t\": 2,\r\n        \"d\": \"Returns an element from a list of choices based on index.\",\r\n        \"a\": \"An element from a list of choices based on index.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"index\",\r\n            \"detail\": \"Which choice (of the up to 30 provided) to return.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"choice1\",\r\n            \"detail\": \"A potential value to return. Required. May be a reference to a cell or an individual value.\",\r\n            \"example\": \"\\\"A\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"choice2\",\r\n            \"detail\": \"Additional values among which to choose.\",\r\n            \"example\": \"\\\"B\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HYPERLINK\",\r\n        \"t\": 2,\r\n        \"d\": \"Creates a hyperlink inside a cell.\",\r\n        \"a\": \"Creates a hyperlink inside a cell.\",\r\n        \"p\": [{\r\n            \"name\": \"url\",\r\n            \"detail\": \"The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.\",\r\n            \"example\": \"\\\"http://www.luckysheet.com/\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"link_label\",\r\n            \"detail\": \"The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.\",\r\n            \"example\": \"\\\"luckysheet\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TIME\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided hour, minute, and second into a time.\",\r\n        \"a\": \"Converts hour/minute/second into a time.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"hour\",\r\n            \"detail\": \"The hour component of the time.\",\r\n            \"example\": \"11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"minute\",\r\n            \"detail\": \"The minute component of the time.\",\r\n            \"example\": \"40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"second\",\r\n            \"detail\": \"The second component of the time.\",\r\n            \"example\": \"59\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TIMEVALUE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the fraction of a 24-hour day the time represents.\",\r\n        \"a\": \"Converts a time string into its serial number representation.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time_string\",\r\n            \"detail\": \"The string that holds the time representation.\",\r\n            \"example\": \"\\\"2:15 PM\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EOMONTH\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a date on the last day of a month that falls a specified number of months before or after another date.\",\r\n        \"a\": \"Last day of a month before or after a date.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to calculate the result.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"months\",\r\n            \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to consider.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EDATE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a date a specified number of months before or after another date.\",\r\n        \"a\": \"Date a number of months before/after another date.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to calculate the result.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"months\",\r\n            \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to calculate.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SECOND\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the second component of a specific time, in numeric format.\",\r\n        \"a\": \"Second component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the second component\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINUTE\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the minute component of a specific time, in numeric format.\",\r\n        \"a\": \"Minute component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the minute component.\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HOUR\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the hour component of a specific time, in numeric format.\",\r\n        \"a\": \"Hour component of a specific time.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"time\",\r\n            \"detail\": \"The time from which to calculate the hour component.\",\r\n            \"example\": \"TIME(11\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOW\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the current date and time as a date value.\",\r\n        \"a\": \"Current date and time as a date value.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"NETWORKDAYS\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of net working days between two provided days.\",\r\n        \"a\": \"Net working days between two provided days.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the date serial numbers to consider holidays.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NETWORKDAYS_INTL\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of net working days between two provided days excluding specified weekend days and holidays.\",\r\n        \"a\": \"Net working days between two dates (specifying weekends).\",\r\n        \"m\": [2, 4],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date of the period from which to calculate the number of net working days.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"weekend\",\r\n            \"detail\": \"A number or string representing which days of the week are considered weekends.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider as holidays.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISOWEEKNUM\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the ISO week of the year where the provided date falls.\",\r\n        \"a\": \"ISO week number of the year.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEEKNUM\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the week of the year where the provided date falls.\",\r\n        \"a\": \"Week number of the year.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"A number representing the day that a week starts on. Sunday = 1.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WEEKDAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns a number representing the day of the week of the date provided.\",\r\n        \"a\": \"Day of the week of the date provided (as number).\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"type\",\r\n            \"detail\": \"A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the day of the month that a specific date falls on, in numeric format.\",\r\n        \"a\": \"Day of the month that a specific date falls on.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the day.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAYS\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of days between two dates.\",\r\n        \"a\": \"Number of days between two dates.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end of the date range.\",\r\n            \"example\": \"2011-3-15\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start of the date range.\",\r\n            \"example\": \"2011-2-1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAYS360\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the difference between two days based on the 360 day year used in some financial interest calculations.\",\r\n        \"a\": \"Days between two dates on a 360-day year.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"method\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATE\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided year, month, and day into a date.\",\r\n        \"a\": \"Converts year/month/day into a date.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"year\",\r\n            \"detail\": \"The year component of the date.\",\r\n            \"example\": \"1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"month\",\r\n            \"detail\": \"The month component of the date.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day\",\r\n            \"detail\": \"The day component of the date.\",\r\n            \"example\": \"20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATEVALUE\",\r\n        \"t\": 6,\r\n        \"d\": \"Converts a provided date string in a known format to a date value.\",\r\n        \"a\": \"Converts a date string to a date value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date_string\",\r\n            \"detail\": \"The string representing the date.\",\r\n            \"example\": \"\\\"1969-7-20\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATEDIF\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the number of days, months, or years between two dates.\",\r\n        \"a\": \"Date Difference.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"A string abbreviation for unit of time. For example, \\\"M\\\" for month. Accepted values are \\\"Y\\\",\\\"M\\\",\\\"D\\\",\\\"MD\\\",\\\"YM\\\",\\\"YD\\\".\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WORKDAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the date after a number of working days from a specified start date.\",\r\n        \"a\": \"Number of working days from start date.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to begin counting.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"num_days\",\r\n            \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider holidays.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"WORKDAY_INTL\",\r\n        \"t\": 6,\r\n        \"d\": \"Calculates the date after a specified number of workdays excluding specified weekend days and holidays.\",\r\n        \"a\": \"Date after a number of workdays (specifying weekends).\",\r\n        \"m\": [2, 4],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The date from which to begin counting.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"num_days\",\r\n            \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"weekend\",\r\n            \"detail\": \"A number or string representing which days of the week are considered weekends.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"holidays\",\r\n            \"detail\": \"A range or array constant containing the dates to consider holidays.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YEAR\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the year specified by a given date.\",\r\n        \"a\": \"Year specified by a given date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the year.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YEARFRAC\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the number of years, including fractional years, between two dates using a specified day count convention.\",\r\n        \"a\": \"Exact number of years between two dates.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"start_date\",\r\n            \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_date\",\r\n            \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n            \"example\": \"7\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"16)\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TODAY\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the current date as a date value.\",\r\n        \"a\": \"Current date as a date value.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"MONTH\",\r\n        \"t\": 6,\r\n        \"d\": \"Returns the month of the year a specific date falls in, in numeric format.\",\r\n        \"a\": \"Month of the year a specific date falls in.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"date\",\r\n            \"detail\": \"The date from which to extract the month.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EFFECT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.\",\r\n        \"a\": \"Annual effective interest rate.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"nominal_rate\",\r\n            \"detail\": \"The nominal interest rate per year.\",\r\n            \"example\": \"0.99\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"periods_per_year\",\r\n            \"detail\": \"The number of compounding periods per year.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLAR\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number into the currency specific to your spreadsheet locale.\",\r\n        \"a\": \"Formats a number as currency specific to your spreadsheet locale.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The value to be formatted.\",\r\n            \"example\": \"1.2351\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_places\",\r\n            \"detail\": \"The number of decimal places to display.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLARDE\",\r\n        \"t\": 8,\r\n        \"d\": \"Converts a price quotation given as a decimal fraction into a decimal value.\",\r\n        \"a\": \"Converts a decimal fraction to decimal value.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"fractional_price\",\r\n            \"detail\": \"The price quotation given using fractional decimal conventions.\",\r\n            \"example\": \"100.10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n            \"example\": \"32\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DOLLARFR\",\r\n        \"t\": 8,\r\n        \"d\": \"Converts a price quotation given as a decimal value into a decimal fraction.\",\r\n        \"a\": \"Converts a decimal value to decimal fraction.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_price\",\r\n            \"detail\": \"The price quotation given as a decimal value.\",\r\n            \"example\": \"100.125\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"unit\",\r\n            \"detail\": \"The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n            \"example\": \"32\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DB\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.\",\r\n        \"a\": \"Depreciation via declining balance method.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"month\",\r\n            \"detail\": \"The number of months in the first year of depreciation.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DDB\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the double-declining balance method.\",\r\n        \"a\": \"Depreciation via double-declining balance method.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor\",\r\n            \"detail\": \"The factor by which depreciation decreases.\",\r\n            \"example\": \"2.25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RATE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.\",\r\n        \"a\": \"Interest rate of an annuity investment.\",\r\n        \"m\": [3, 6],\r\n        \"p\": [{\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_per_period\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"-100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"400\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the interest rate will be.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CUMPRINC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Cumulative principal paid over a set of periods.\",\r\n        \"m\": [6, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"first_period\",\r\n            \"detail\": \"The number of the payment period to begin the cumulative calculation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"last_period\",\r\n            \"detail\": \"The number of the payment period to end the cumulative calculation.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPNUM\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.\",\r\n        \"a\": \"Number of coupons between settlement and maturity.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"02\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SYD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for a specified period using the sum of years digits method.\",\r\n        \"a\": \"Depreciation via sum of years digits method.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"50\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The single period within `life` for which to calculate depreciation.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLEQ\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.\",\r\n        \"a\": \"Equivalent rate of return for a Treasury bill.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the bill at time of purchase.\",\r\n            \"example\": \"2)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLYIELD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the yield of a US Treasury Bill based on price.\",\r\n        \"a\": \"The yield of a us treasury bill based on price.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TBILLPRICE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a US Treasury Bill based on discount rate.\",\r\n        \"a\": \"Price of US treasury bill.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the bill at time of purchase.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Present value of an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"D2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACCRINT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the accrued interest of a security that has periodic payments.\",\r\n        \"a\": \"Accrued interest of security with periodic payments.\",\r\n        \"m\": [6, 8],\r\n        \"p\": [{\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"first_payment\",\r\n            \"detail\": \"The first date interest will be paid.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"10000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"calc_method\",\r\n            \"detail\": \"[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \\n\\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \\n\\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ACCRINTM\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the accrued interest of a security that pays interest at maturity.\",\r\n        \"a\": \"Accrued interest of security paying at maturity.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity date of the security.\",\r\n            \"example\": \"DATE(1969\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"1000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYBS\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days from the first coupon, or interest payment, until settlement.\",\r\n        \"a\": \"Number of days from first coupon to settlement.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYS\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.\",\r\n        \"a\": \"Days in coupon period containing settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPDAYSNC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of days from the settlement date until the next coupon, or interest payment.\",\r\n        \"a\": \"Days from settlement until next coupon.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPNCD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates next coupon, or interest payment, date after the settlement date.\",\r\n        \"a\": \"Next coupon date after the settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"01)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"DATE(2019\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COUPPCD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates last coupon, or interest payment, date before the settlement date.\",\r\n        \"a\": \"Last coupon date before settlement date.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"01)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"DATE(2019\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Future value of an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount per period to be paid.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"400\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FVSCHEDULE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the future value of some principal based on a specified series of potentially varying interest rates.\",\r\n        \"a\": \"Future value of principal from series of rates.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"principal\",\r\n            \"detail\": \"The amount of initial capital or value to compound against.\",\r\n            \"example\": \"10000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"rate_schedule\",\r\n            \"detail\": \"A series of interest rates to compound against the `principal`.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YIELD\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.\",\r\n        \"a\": \"Annual yield of a security paying periodic interest.\",\r\n        \"m\": [6, 7],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.057\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"YIELDDISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual yield of a discount (non-interest-bearing) security, based on price.\",\r\n        \"a\": \"Annual yield of a discount security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"95\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOMINAL\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.\",\r\n        \"a\": \"Annual nominal interest rate.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"effective_rate\",\r\n            \"detail\": \"The effective interest rate per year.\",\r\n            \"example\": \"0.85\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"periods_per_year\",\r\n            \"detail\": \"The number of compounding periods per year.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"XIRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.\",\r\n        \"a\": \"Internal rate of return given non-periodic cashflows.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"B2:B25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"cashflow_dates\",\r\n            \"detail\": \"An array or range with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n            \"example\": \"C2:C25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the internal rate of return will be.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MIRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.\",\r\n        \"a\": \"Modified internal rate of return.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"A2:A25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"financing_rate\",\r\n            \"detail\": \"The interest rate paid on funds invested.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"reinvestment_return_rate\",\r\n            \"detail\": \"The return (as a percentage) earned on reinvestment of income received from the investment.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IRR\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the internal rate of return on an investment based on a series of periodic cash flows.\",\r\n        \"a\": \"Internal rate of return given periodic cashflows.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"An array or range containing the income or payments associated with the investment.\",\r\n            \"example\": \"A2:A25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"rate_guess\",\r\n            \"detail\": \"An estimate for what the internal rate of return will be.\",\r\n            \"example\": \"200\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NPV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n        \"a\": \"The net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the investment over one period.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cashflow1\",\r\n            \"detail\": \"The first future cash flow.\",\r\n            \"example\": \"200\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"cashflow2\",\r\n            \"detail\": \"Additional future cash flows.\",\r\n            \"example\": \"250\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"XNPV\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.\",\r\n        \"a\": \"Net present value given non-periodic cashflows.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the investment over one period.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"cashflow_amounts\",\r\n            \"detail\": \"A range of cells containing the income or payments associated with the investment.\",\r\n            \"example\": \"B2:B25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"cashflow_dates\",\r\n            \"detail\": \"A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n            \"example\": \"C2:C25\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CUMIPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Cumulative interest paid over a set of periods.\",\r\n        \"m\": [6, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"first_period\",\r\n            \"detail\": \"The number of the payment period to begin the cumulative calculation.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"last_period\",\r\n            \"detail\": \"The number of the payment period to end the cumulative calculation.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Periodic payment for an annuity investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \" 100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"D2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Payment on interest for an investment.\",\r\n        \"m\": [4, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The amortization period, in terms of number of periods.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"80000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"E2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PPMT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Payment on the principal of an investment.\",\r\n        \"m\": [4, 6],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"period\",\r\n            \"detail\": \"The amortization period, in terms of number of periods.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_periods\",\r\n            \"detail\": \"The number of payments to be made.\",\r\n            \"example\": \"3*12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"INTRATE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.\",\r\n        \"a\": \"Calculates effective interest rate.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"buy_date\",\r\n            \"detail\": \"The date of purchase of the investment.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"sell_date\",\r\n            \"detail\": \"The date of sale of the investment.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"buy_price\",\r\n            \"detail\": \"The price at which the investment was purchased.\",\r\n            \"example\": \"100000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sell_price\",\r\n            \"detail\": \"The price at which the investment was sold.\",\r\n            \"example\": \"101200\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICE\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n        \"a\": \"Price of a security paying periodic interest.\",\r\n        \"m\": [6, 7],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.057\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.065\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICEDISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a discount (non-interest-bearing) security, based on expected yield.\",\r\n        \"a\": \"Price of a discount security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the security at time of purchase.\",\r\n            \"example\": \"0.0525\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PRICEMAT\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the price of a security paying interest at maturity, based on expected yield.\",\r\n        \"a\": \"Price of security paying interest at maturity.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"issue\",\r\n            \"detail\": \"The date the security was initially issued.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.061\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.061\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RECEIVED\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.\",\r\n        \"a\": \"Amount received at maturity for a security.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"investment\",\r\n            \"detail\": \"The amount invested (irrespective of face value of each security).\",\r\n            \"example\": \"10000000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"discount\",\r\n            \"detail\": \"The discount rate of the security invested in.\",\r\n            \"example\": \"0.0575\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DISC\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the discount rate of a security based on price.\",\r\n        \"a\": \"The discount rate of a security based on price.\",\r\n        \"m\": [4, 5],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"price\",\r\n            \"detail\": \"The price at which the security is bought per 100 face value.\",\r\n            \"example\": \"97.975\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"redemption\",\r\n            \"detail\": \"The redemption amount per 100 face value, or par.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"12\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NPER\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n        \"a\": \"Number of payment periods for an investment.\",\r\n        \"m\": [3, 5],\r\n        \"p\": [{\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The interest rate.\",\r\n            \"example\": \"0.12\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"payment_amount\",\r\n            \"detail\": \"The amount of each payment made.\",\r\n            \"example\": \"500\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"present_value\",\r\n            \"detail\": \"The current value of the annuity.\",\r\n            \"example\": \"40000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"future_value\",\r\n            \"detail\": \"The future value remaining after the final payment has been made.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"end_or_beginning\",\r\n            \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SLN\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the depreciation of an asset for one period using the straight-line method.\",\r\n        \"a\": \"Depreciation of asset using the straight-line method.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"cost\",\r\n            \"detail\": \"The initial cost of the asset.\",\r\n            \"example\": \"300000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"salvage\",\r\n            \"detail\": \"The value of the asset at the end of depreciation.\",\r\n            \"example\": \"75000\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"life\",\r\n            \"detail\": \"The number of periods over which the asset is depreciated.\",\r\n            \"example\": \"10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DURATION\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.\",\r\n        \"a\": \"Number of periods for an investment to reach a value.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MDURATION\",\r\n        \"t\": 8,\r\n        \"d\": \"Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n        \"a\": \"Modified Macaulay duration.\",\r\n        \"m\": [5, 6],\r\n        \"p\": [{\r\n            \"name\": \"settlement\",\r\n            \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"maturity\",\r\n            \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n            \"example\": \"DATE(2010\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"rate\",\r\n            \"detail\": \"The annualized rate of interest.\",\r\n            \"example\": \"0.08\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"yield\",\r\n            \"detail\": \"The expected annual yield of the security.\",\r\n            \"example\": \"0.09\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"frequency\",\r\n            \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"day_count_convention\",\r\n            \"detail\": \"An indicator of what day count method to use.\",\r\n            \"example\": \"0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to decimal format.\",\r\n        \"a\": \"Converts a signed binary number to decimal format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to signed hexadecimal format.\",\r\n        \"a\": \"Converts a binary number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to signed hexademical, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIN2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed binary number to signed octal format.\",\r\n        \"a\": \"Converts a binary number to octal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_binary_number\",\r\n            \"detail\": \"The signed 10-bit binary value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"101\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed binary format.\",\r\n        \"a\": \"Converts a decimal number to signed binary format.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed hexadecimal format.\",\r\n        \"a\": \"Converts a decimal number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed hexadecimal, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DEC2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a decimal number to signed octal format.\",\r\n        \"a\": \"Converts a decimal number to signed octal format.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"decimal_number\",\r\n            \"detail\": \"The decimal value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to signed binary format.\",\r\n        \"a\": \"Converts a hexadecimal number to binary.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to decimal format.\",\r\n        \"a\": \"Converts a hexadecimal number to decimal.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"HEX2OCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed hexadecimal number to signed octal format.\",\r\n        \"a\": \"Converts a hexadecimal number to octal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_hexadecimal_number\",\r\n            \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.\",\r\n            \"example\": \"\\\"f3\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2BIN\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to signed binary format.\",\r\n        \"a\": \"Converts an octal number to binary.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to signed binary, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2DEC\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to decimal format.\",\r\n        \"a\": \"Converts a signed octal number to decimal format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to decimal, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OCT2HEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Converts a signed octal number to signed hexadecimal format.\",\r\n        \"a\": \"Converts an octal number to hexadecimal.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"signed_octal_number\",\r\n            \"detail\": \"The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.\",\r\n            \"example\": \"37\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"significant_digits\",\r\n            \"detail\": \"The number of significant digits to ensure in the result.\",\r\n            \"example\": \"8\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMPLEX\",\r\n        \"t\": 9,\r\n        \"d\": \"Creates a complex number given real and imaginary coefficients.\",\r\n        \"a\": \"Creates a complex number.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"real_part\",\r\n            \"detail\": \"The real coefficient.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"imaginary_part\",\r\n            \"detail\": \"The imaginary coefficient.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"suffix\",\r\n            \"detail\": \"The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.\",\r\n            \"example\": \"\\\"j\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangestring\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMREAL\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the real coefficient of a complex number.\",\r\n        \"a\": \"The real coefficient of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"complex_number\",\r\n            \"detail\": \"The complex number, in the a+bi or a+bj format.\",\r\n            \"example\": \"\\\"4+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMAGINARY\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the imaginary coefficient of a complex number.\",\r\n        \"a\": \"The imaginary coefficient of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"complex_number\",\r\n            \"detail\": \"The complex number, in the a+bi or a+bj format.\",\r\n            \"example\": \"\\\"4+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMCONJUGATE\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the complex conjugate of a number.\",\r\n        \"a\": \"The complex conjugate of a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The complex number to calculate the conjugate for.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMABS\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns absolute value (or modulus) of a complex number.\",\r\n        \"a\": \"The absolute value of a complex number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The complex number to calculate the absolute value of.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DELTA\",\r\n        \"t\": 9,\r\n        \"d\": \"Compare two numeric values, returning 1 if they're equal.\",\r\n        \"a\": \"Compare two numeric values.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"number1\",\r\n            \"detail\": \"The first number to compare.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number2\",\r\n            \"detail\": \"The second number to compare.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMSUM\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the sum of a series of complex numbers.\",\r\n        \"a\": \"Sum of a series of complex numbers.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first complex number or range to add together.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"Additional complex numbers or ranges to add to `value1`.\",\r\n            \"example\": \"\\\"5-3i\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMSUB\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the difference between two complex numbers.\",\r\n        \"a\": \"The difference between two complex numbers.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"first_number\",\r\n            \"detail\": \"The complex number to subtract second_number from.\",\r\n            \"example\": \"\\\"6+5i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"second_number\",\r\n            \"detail\": \"The complex number to subtract from first_number.\",\r\n            \"example\": \"\\\"2+3i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMPRODUCT\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns the result of multiplying a series of complex numbers together.\",\r\n        \"a\": \"Result of multiplying a series of complex numbers together.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first number or range to calculate for the product.\",\r\n            \"example\": \"\\\"3+4i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"Additional complex numbers or ranges to calculate for the product.\",\r\n            \"example\": \"\\\"5-3i\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IMDIV\",\r\n        \"t\": 9,\r\n        \"d\": \"Returns one complex number divided by another.\",\r\n        \"a\": \"One complex number divided by another.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The complex number to be divided.\",\r\n            \"example\": \"\\\"11+16i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The complex number to divide by.\",\r\n            \"example\": \"\\\"3+2i\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NOT\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.\",\r\n        \"a\": \"Returns opposite of provided logical value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression\",\r\n            \"detail\": \"An expression or reference to a cell holding an expression that represents some logical value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRUE\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the logical value `TRUE`.\",\r\n        \"a\": \"Logical value `true`.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"FALSE\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the logical value `FALSE`.\",\r\n        \"a\": \"Logical value `false`.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"AND\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.\",\r\n        \"a\": \"Logical `and` operator.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression1\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"logical_expression2\",\r\n            \"detail\": \"More expressions that represent logical values.\",\r\n            \"example\": \"A3 = \\\"bar\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IFERROR\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.\",\r\n        \"a\": \"Value if it is not an error, otherwise 2nd argument.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to return if `value` itself is not an error.\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_error\",\r\n            \"detail\": \"The value the function returns if `value` is an error.\",\r\n            \"example\": \"\\\"Error in cell A1\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"IF\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.\",\r\n        \"a\": \"Returns value depending on logical expression.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_true\",\r\n            \"detail\": \"The value the function returns if `logical_expression` is `TRUE`.\",\r\n            \"example\": \"\\\"A2 is foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_if_false\",\r\n            \"detail\": \"The value the function returns if `logical_expression` is `FALSE`.\",\r\n            \"example\": \"\\\"A2 was false\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"OR\",\r\n        \"t\": 10,\r\n        \"d\": \"Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.\",\r\n        \"a\": \"Logical `or` operator.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"logical_expression1\",\r\n            \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n            \"example\": \"A2 = \\\"foo\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"logical_expression2\",\r\n            \"detail\": \"More expressions that evaluate to logical values.\",\r\n            \"example\": \" A3 = \\\"bar\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.\",\r\n        \"a\": \"Not equal.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to test against `value1` for inequality.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EQ\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.\",\r\n        \"a\": \"Equal.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to test against `value1` for equality.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.\",\r\n        \"a\": \"Strictly greater than.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being greater than `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GTE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.\",\r\n        \"a\": \"Greater than or equal to.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being greater than or equal to `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.\",\r\n        \"a\": \"Less than.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being less than `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LTE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.\",\r\n        \"a\": \"Less than or equal to.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to test as being less than or equal to `value2`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second value.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ADD\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the sum of two numbers. Equivalent to the `+` operator.\",\r\n        \"a\": \"Sum of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The first addend.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The second addend.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINUS\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the difference of two numbers. Equivalent to the `-` operator.\",\r\n        \"a\": \"Difference of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The minuend, or number to be subtracted from.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The subtrahend, or number to subtract from `value1`.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MULTIPLY\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the product of two numbers. Equivalent to the `*` operator.\",\r\n        \"a\": \"Product of two numbers\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"factor1\",\r\n            \"detail\": \"The first multiplicand.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"factor2\",\r\n            \"detail\": \"The second multiplicand.\",\r\n            \"example\": \"B2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DIVIDE\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns one number divided by another. Equivalent to the `/` operator.\",\r\n        \"a\": \"One number divided by another\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"dividend\",\r\n            \"detail\": \"The number to be divided.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"divisor\",\r\n            \"detail\": \"The number to divide by.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONCAT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns the concatenation of two values. Equivalent to the `&` operator.\",\r\n        \"a\": \"Concatenation of two values\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"value1\",\r\n            \"detail\": \"The value to which `value2` will be appended.\",\r\n            \"example\": \"\\\"de\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value2\",\r\n            \"detail\": \"The value to append to `value1`.\",\r\n            \"example\": \"\\\"mystify\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UNARY_PERCENT\",\r\n        \"t\": 11,\r\n        \"d\": \"Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.\",\r\n        \"a\": \"Value interpreted as a percentage.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"percentage\",\r\n            \"detail\": \"The value to interpret as a percentage.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONCATENATE\",\r\n        \"t\": 12,\r\n        \"d\": \"Appends strings to one another.\",\r\n        \"a\": \"Appends strings to one another.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"string1\",\r\n            \"detail\": \"The initial string.\",\r\n            \"example\": \"\\\"Super\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"string2\",\r\n            \"detail\": \"More strings to append in sequence.\",\r\n            \"example\": \"\\\"calla\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CODE\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the numeric Unicode map value of the first character in the string provided.\",\r\n        \"a\": \"Numeric unicode map value of character.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string whose first character's Unicode map value will be returned.\",\r\n            \"example\": \"\\\"a\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CHAR\",\r\n        \"t\": 12,\r\n        \"d\": \"Convert a number into a character according to the current Unicode table.\",\r\n        \"a\": \"Gets character associated with number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"table_number\",\r\n            \"detail\": \"The number of the character to look up from the current Unicode table in decimal format.\",\r\n            \"example\": \"97\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ARABIC\",\r\n        \"t\": 12,\r\n        \"d\": \"Computes the value of a Roman numeral.\",\r\n        \"a\": \"Computes the value of a roman numeral.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"roman_numeral\",\r\n            \"detail\": \"The Roman numeral to format, whose value must be between 1 and 3999, inclusive.\",\r\n            \"example\": \"\\\"XIV\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ROMAN\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number in Roman numerals.\",\r\n        \"a\": \"Formats a number in Roman numerals.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number to format, between 1 and 3999, inclusive.\",\r\n            \"example\": \"499\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXEXTRACT\",\r\n        \"t\": 12,\r\n        \"d\": \"Extracts matching substrings according to a regular expression.\",\r\n        \"a\": \"Extracts matching substrings with regular expression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The input text.\",\r\n            \"example\": \"\\\"Needle in a haystack\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The first part of `text` that matches this expression will be returned.\",\r\n            \"example\": \"\\\".e{2}dle\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXMATCH\",\r\n        \"t\": 12,\r\n        \"d\": \"Whether a piece of text matches a regular expression.\",\r\n        \"a\": \"Whether a piece of text matches regular expression.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text to be tested against the regular expression.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The regular expression to test the text against.\",\r\n            \"example\": \"\\\"S.r\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REGEXREPLACE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces part of a text string with a different text string using regular expressions.\",\r\n        \"a\": \"Replaces text with regular expressions.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text, a part of which will be replaced.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"regular_expression\",\r\n            \"detail\": \"The regular expression.  All matching instances in `text` will be replaced.\",\r\n            \"example\": \"\\\"S.*d\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"replacement\",\r\n            \"detail\": \"The text which will be inserted into the original text.\",\r\n            \"example\": \"\\\"Bed\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"T\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns string arguments as text, or the empty string if the value is not text.\",\r\n        \"a\": \"String arguments as text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument to be converted to text.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FIXED\",\r\n        \"t\": 12,\r\n        \"d\": \"Formats a number with a fixed number of decimal places.\",\r\n        \"a\": \"Formats number with fixed number of decimal places.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number to format.\",\r\n            \"example\": \"3.141592653\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"number_of_places\",\r\n            \"detail\": \"The number of decimal places to display in the result.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"suppress_separator\",\r\n            \"detail\": \"Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FIND\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.\",\r\n        \"a\": \"First position of string found in text, case-sensitive.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"n\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FINDB\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text counting each double-character as 2.\",\r\n        \"a\": \"Position at which a string is first found within text (binary).\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"new\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"\\\"new year\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"JOIN\",\r\n        \"t\": 12,\r\n        \"d\": \"Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.\",\r\n        \"a\": \"Concatenates elements of arrays with delimiter.\",\r\n        \"m\": [2, 255],\r\n        \"p\": [{\r\n            \"name\": \"delimiter\",\r\n            \"detail\": \"The character or string to place between each concatenated value.\",\r\n            \"example\": \"\\\" and-a \\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_or_array1\",\r\n            \"detail\": \"The value or values to be appended using `delimiter`.\",\r\n            \"example\": \"{1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"value_or_array2\",\r\n            \"detail\": \"More values to be appended using `delimiter`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LEFT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a substring from the beginning of a specified string.\",\r\n        \"a\": \"Substring from beginning of specified string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string from which the left portion will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_characters\",\r\n            \"detail\": \"The number of characters to return from the left side of `string`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RIGHT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a substring from the end of a specified string.\",\r\n        \"a\": \"A substring from the end of a specified string.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string from which the right portion will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_characters\",\r\n            \"detail\": \"The number of characters to return from the right side of `string`.\",\r\n            \"example\": \"2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MID\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns a segment of a string.\",\r\n        \"a\": \"A segment of a string.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"string\",\r\n            \"detail\": \"The string to extract a segment from.\",\r\n            \"example\": \"\\\"get this\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.\",\r\n            \"example\": \"5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"extract_length\",\r\n            \"detail\": \"The length of the segment to extract.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LEN\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the length of a string.\",\r\n        \"a\": \"Length of a string.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string whose length will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LENB\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the length of a string in bytes.\",\r\n        \"a\": \"Length of a string in bytes.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string whose length will be returned.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOWER\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a specified string to lowercase.\",\r\n        \"a\": \"Converts a specified string to lowercase.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string to convert to lowercase.\",\r\n            \"example\": \"\\\"LOREM IPSUM\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UPPER\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a specified string to uppercase.\",\r\n        \"a\": \"Converts a specified string to uppercase.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string to convert to uppercase.\",\r\n            \"example\": \"\\\"lorem ipsum\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"EXACT\",\r\n        \"t\": 12,\r\n        \"d\": \"Tests whether two strings are identical.\",\r\n        \"a\": \"Tests whether two strings are identical.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"string1\",\r\n            \"detail\": \"The first string to compare\",\r\n            \"example\": \"A1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"string2\",\r\n            \"detail\": \"The second string to compare\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REPLACE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces part of a text string with a different text string.\",\r\n        \"a\": \"Replaces part of a text string with different text.\",\r\n        \"m\": [4, 4],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text, a part of which will be replaced.\",\r\n            \"example\": \"\\\"Spreadsheets\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"position\",\r\n            \"detail\": \"The position where the replacement will begin (starting from 1).\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"length\",\r\n            \"detail\": \"The number of characters in the text to be replaced.\",\r\n            \"example\": \"6\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_text\",\r\n            \"detail\": \"The text which will be inserted into the original text.\",\r\n            \"example\": \"\\\"Bed\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"REPT\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns specified text repeated a number of times.\",\r\n        \"a\": \"Specified text repeated a number of times.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"text_to_repeat\",\r\n            \"detail\": \"The character or string to repeat.\",\r\n            \"example\": \"\\\"ha\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"number_of_repetitions\",\r\n            \"detail\": \"The number of times `text_to_repeat` should appear in the value returned.\",\r\n            \"example\": \"4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEARCH\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.\",\r\n        \"a\": \"First position of string found in text, ignoring case.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to look for within `text_to_search`.\",\r\n            \"example\": \"\\\"n\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text to search for the first occurrence of `search_for`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"starting_at\",\r\n            \"detail\": \"The character within `text_to_search` at which to start the search.\",\r\n            \"example\": \"14\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUBSTITUTE\",\r\n        \"t\": 12,\r\n        \"d\": \"Replaces existing text with new text in a string.\",\r\n        \"a\": \"Replaces existing text with new text in a string.\",\r\n        \"m\": [3, 4],\r\n        \"p\": [{\r\n            \"name\": \"text_to_search\",\r\n            \"detail\": \"The text within which to search and replace.\",\r\n            \"example\": \"\\\"search for it\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"search_for\",\r\n            \"detail\": \"The string to search for within `text_to_search`.\",\r\n            \"example\": \"\\\"search for\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"replace_with\",\r\n            \"detail\": \"The string that will replace `search_for`.\",\r\n            \"example\": \"\\\"Google\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"occurrence_number\",\r\n            \"detail\": \"The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.\",\r\n            \"example\": \"3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CLEAN\",\r\n        \"t\": 12,\r\n        \"d\": \"Returns the text with the non-printable ASCII characters removed.\",\r\n        \"a\": \"Removes non-printable characters from a piece of text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text whose non-printable characters are to be removed.\",\r\n            \"example\": \"\\\"AF\\\"&CHAR(31)\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TEXT\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a number into text according to a specified format.\",\r\n        \"a\": \"Formats a number into text.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"number\",\r\n            \"detail\": \"The number, date, or time to format.\",\r\n            \"example\": \"1.23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"format\",\r\n            \"detail\": \"The pattern by which to format the number, enclosed in quotation marks.\",\r\n            \"example\": \"\\\"$0.00\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRIM\",\r\n        \"t\": 12,\r\n        \"d\": \"Removes leading, trailing, and repeated spaces in text.\",\r\n        \"a\": \"Removes space characters.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The text or reference to a cell containing text to be trimmed.\",\r\n            \"example\": \"\\\" lorem ipsum\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"VALUE\",\r\n        \"t\": 12,\r\n        \"d\": \"Converts a string in any of the date, time or number formats that Google Sheets understands into a number.\",\r\n        \"a\": \"Converts a date/time/number string into a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text\",\r\n            \"detail\": \"The string containing the value to be converted.\",\r\n            \"example\": \"\\\"123\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROPER\",\r\n        \"t\": 12,\r\n        \"d\": \"Capitalizes each word in a specified string.\",\r\n        \"a\": \"Capitalizes each word in a specified string.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"text_to_capitalize\",\r\n            \"detail\": \"The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.\",\r\n            \"example\": \"\\\"united states\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CONVERT\",\r\n        \"t\": 13,\r\n        \"d\": \"Converts a numeric value to a different unit of measure.\",\r\n        \"a\": \"Unit conversion for numbers.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The numeric value in `start_unit` to convert to `end_unit`.\",\r\n            \"example\": \"5.1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"start_unit\",\r\n            \"detail\": \"The starting unit, the unit currently assigned to `value`.\",\r\n            \"example\": \"\\\"g\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"end_unit\",\r\n            \"detail\": \"The unit of measure into which to convert the argument, `value`.\",\r\n            \"example\": \"\\\"kg\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMX2MY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the differences of the squares of values in two arrays.\",\r\n        \"a\": \"Sum of the differences of squares.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMX2PY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the sums of the squares of values in two arrays.\",\r\n        \"a\": \"Sum of the sums of squares.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMXMY2\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the squares of differences of values in two arrays.\",\r\n        \"a\": \"Sum of the squares of differences.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"array_x\",\r\n            \"detail\": \"The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.\",\r\n            \"example\": \"A2:A100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array_y\",\r\n            \"detail\": \"The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.\",\r\n            \"example\": \"B2:B100\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRANSPOSE\",\r\n        \"t\": 14,\r\n        \"d\": \"Transposes the rows and columns of an array or range of cells.\",\r\n        \"a\": \"Transposes the rows and columns of an array.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"array_or_range\",\r\n            \"detail\": \"The array or range whose rows and columns will be swapped.\",\r\n            \"example\": \"{1,2}\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TREND\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.\",\r\n        \"a\": \"Fits points to linear trend derived via least-squares.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_data_x\",\r\n            \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\",\r\n            \"example\": \"A11:A13\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FREQUENCY\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the frequency distribution of a one-column array into specified classes.\",\r\n        \"a\": \"The frequency distribution of array.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"data\",\r\n            \"detail\": \"The array or range containing the values to be counted.\",\r\n            \"example\": \"A2:A40\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"classes\",\r\n            \"detail\": \"The array or range containing the set of classes.\",\r\n            \"example\": \"B2:B5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"GROWTH\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.\",\r\n        \"a\": \"Fits points to exponential growth trend.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"new_data_x\",\r\n            \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\",\r\n            \"example\": \"A11:A13\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LINEST\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.\",\r\n        \"a\": \"Best-fit linear trend via least-squares.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"calculate_b\",\r\n            \"detail\": \"Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"verbose\",\r\n            \"detail\": \"A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LOGEST\",\r\n        \"t\": 14,\r\n        \"d\": \"Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.\",\r\n        \"a\": \"Best-fit exponential growth curve.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"known_data_y\",\r\n            \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n            \"example\": \"B2:B10\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"known_data_x\",\r\n            \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n            \"example\": \"A2:A10\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"b\",\r\n            \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"verbose\",\r\n            \"detail\": \"A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MDETERM\",\r\n        \"t\": 14,\r\n        \"d\": \"Returns the matrix determinant of a square matrix specified as an array or range.\",\r\n        \"a\": \"Matrix determinant of a square matrix.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"square_matrix\",\r\n            \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.\",\r\n            \"example\": \"A1:D4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MINVERSE\",\r\n        \"t\": 14,\r\n        \"d\": \"Returns the multiplicative inverse of a square matrix specified as an array or range.\",\r\n        \"a\": \"Multiplicative inverse of square matrix.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"square_matrix\",\r\n            \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.\",\r\n            \"example\": \"A1:D4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"MMULT\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the matrix product of two matrices specified as arrays or ranges.\",\r\n        \"a\": \"The matrix product of two matrices.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"matrix1\",\r\n            \"detail\": \"The first matrix in the matrix multiplication operation, represented as an array or range.\",\r\n            \"example\": \"A1:B3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"matrix2\",\r\n            \"detail\": \"The second matrix in the matrix multiplication operation, represented as an array or range.\",\r\n            \"example\": \"C1:F2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SUMPRODUCT\",\r\n        \"t\": 14,\r\n        \"d\": \"Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.\",\r\n        \"a\": \"Sum of products of elements in two arrays.\",\r\n        \"m\": [1, 255],\r\n        \"p\": [{\r\n            \"name\": \"array1\",\r\n            \"detail\": \"The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.\",\r\n            \"example\": \"A2:C5\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"array2\",\r\n            \"detail\": \"The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.\",\r\n            \"example\": \"D2:F5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISFORMULA\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a formula.\",\r\n        \"a\": \"Whether a value is a formula.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"cell\",\r\n            \"detail\": \"The cell to be verified as containing a formula.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CELL\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the requested information about the specified cell.\",\r\n        \"a\": \"Gets information about a cell.\",\r\n        \"m\": [2, 2],\r\n        \"p\": [{\r\n            \"name\": \"info_type\",\r\n            \"detail\": \"The type of information requested (see article for available types)\",\r\n            \"example\": \"\\\"type\\\"\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The reference to the cell.\",\r\n            \"example\": \"C2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"NA\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the \\\"value not available\\\" error, `#N/A`.\",\r\n        \"a\": \"The `#N/A` error.\",\r\n        \"m\": [0, 0],\r\n        \"p\": []\r\n    }, {\r\n        \"n\": \"ERROR_TYPE\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns a number corresponding to the error value in a different cell.\",\r\n        \"a\": \"Error value of cell (as number).\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"reference\",\r\n            \"detail\": \"The cell to find the error number for although you can also provide the error value directly.\",\r\n            \"example\": \"A3\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISBLANK\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether the referenced cell is empty.\",\r\n        \"a\": \"Whether the referenced cell is empty.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"Reference to the cell that will be checked for emptiness.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISERR\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is an error other than `#N/A`.\",\r\n        \"a\": \"Whether a value is an error other than `#n/a`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as an error type other than `#N/A`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISERROR\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is an error.\",\r\n        \"a\": \"Whether a value is an error.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as an error type.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISLOGICAL\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is `TRUE` or `FALSE`.\",\r\n        \"a\": \"Whether a value is `true` or `false`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a logical `TRUE` or `FALSE`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNA\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is the error `#N/A`.\",\r\n        \"a\": \"Whether a value is the error `#n/a`.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be compared with the error value `#N/A`.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNONTEXT\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is non-textual.\",\r\n        \"a\": \"Whether a value is non-textual.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be checked.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISNUMBER\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a number.\",\r\n        \"a\": \"Whether a value is a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a number.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISREF\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is a valid cell reference.\",\r\n        \"a\": \"Whether a value is a valid cell reference.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as a cell reference.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISTEXT\",\r\n        \"t\": 15,\r\n        \"d\": \"Checks whether a value is text.\",\r\n        \"a\": \"Whether a value is text.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value to be verified as text.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TYPE\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns a number associated with the type of data passed into the function.\",\r\n        \"a\": \"Get the type of a value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The value whose type is to be determined.\",\r\n            \"example\": \"C4\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"N\",\r\n        \"t\": 15,\r\n        \"d\": \"Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.\",\r\n        \"a\": \"Argument provided as a number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument to be converted to a number.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_DATE\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a date.\",\r\n        \"a\": \"Converts a provided number to a date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a date.\",\r\n            \"example\": \"25405\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_PURE_NUMBER\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.\",\r\n        \"a\": \"Converts any numeric value to a pure number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a pure number.\",\r\n            \"example\": \"50%\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_TEXT\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided numeric value to a text value.\",\r\n        \"a\": \"Converts a provided numeric value to a text value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to text.\",\r\n            \"example\": \"24\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_DOLLARS\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a dollar value.\",\r\n        \"a\": \"Converts a provided number to a dollar value.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a dollar value.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TO_PERCENT\",\r\n        \"t\": 16,\r\n        \"d\": \"Converts a provided number to a percentage.\",\r\n        \"a\": \"Converts a provided number to a percentage.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"detail\": \"The argument or reference to a cell to be converted to a percentage.\",\r\n            \"example\": \"A2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DGET\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns a single value from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Single value from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DMAX\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the maximum value selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Maximum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DMIN\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the minimum value selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Minimum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DAVERAGE\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Average of a set of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DCOUNT\",\r\n        \"t\": 17,\r\n        \"d\": \"Counts numeric values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Counts values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DCOUNTA\",\r\n        \"t\": 17,\r\n        \"d\": \"Counts values, including text, selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Counts values and text from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DPRODUCT\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the product of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Product of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSTDEV\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Standard deviation of population sample from table.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSTDEVP\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Standard deviation of entire population from table.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DSUM\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the sum of values selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Sum of values from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DVAR\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Variance of population sample from table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DVARP\",\r\n        \"t\": 17,\r\n        \"d\": \"Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n        \"a\": \"Variance of a population from a table-like range.\",\r\n        \"m\": [3, 3],\r\n        \"p\": [{\r\n            \"name\": \"database\",\r\n            \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n            \"example\": \"A2:F20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"field\",\r\n            \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n            \"example\": \"G2\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"criteria\",\r\n            \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n            \"example\": \"A22:D23\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AGE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the age based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get age based on ID number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"A1\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Deadline\",\r\n            \"example\": \"\\\"2017-10-01\\\"\",\r\n            \"detail\": \"The deadline or range of age calculation. The default is the current day.\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedatetime\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEX_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate gender based on Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get gender based on ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BIRTHDAY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the birthday based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the birthday based on the ID number.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Birthday format\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900\u5E741\u67081\u65E5]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PROVINCE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the province of birthplace based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"CITY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the city of birthplace based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STAR_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the constellation based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the constellation based on the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ANIMAL_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18\",\r\n        \"a\": \"Get the zodiac according to the ID number.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISIDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Verify that the format of the ID card is correct. Support 15 or 18\",\r\n        \"a\": \"Verify the correctness of the ID card format.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"ID number\",\r\n            \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n            \"detail\": \"15-digit or 18-digit ID number or range.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_CUTWORD\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Text segmentation. Split a series of words into a series of individual words\",\r\n        \"a\": \"Chinese text segmentation.\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Word segmentation mode\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"The default is 0[precision mode], 1[full mode], 2[search engine mode].\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_TFIDF\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text\",\r\n        \"a\": \"tf-idf keyword recognition.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Number of keywords\",\r\n            \"example\": \"20\",\r\n            \"detail\": \"The number of keywords returned by the algorithm, the default is 20\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"Corpus\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DM_TEXT_TEXTRANK\",\r\n        \"t\": \"4\",\r\n        \"d\": \"Use TextRank algorithm to extract keywords. Identify keywords from a series of text\",\r\n        \"a\": \"TextRank keyword recognition.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Text\",\r\n            \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n            \"detail\": \"Any text that needs word segmentation.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Number of keywords\",\r\n            \"example\": \"20\",\r\n            \"detail\": \"The number of keywords returned by the algorithm, the default is 20\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"Corpus\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_CLOSE\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock closing price of A shares.\",\r\n        \"a\": \"Returns the closing price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_OPEN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the opening price of stock.\",\r\n        \"a\": \"Return the opening price of a shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_MAX\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the highest price of stock.\",\r\n        \"a\": \"Return the highest price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_MIN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the lowest price of stock.\",\r\n        \"a\": \"Returns the lowest price of stock.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_VOLUMN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock trading volume of A shares.\",\r\n        \"a\": \"Returns the corresponding stock trading volume of A shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DATA_CN_STOCK_AMOUNT\",\r\n        \"t\": \"5\",\r\n        \"d\": \"According to the stock code and date, return the corresponding stock turnover of A shares.\",\r\n        \"a\": \"Returns the corresponding stock turnover of A shares.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"Stock code\",\r\n            \"example\": \"\\\"000001\\\"\",\r\n            \"detail\": \"6-digit stock code, required.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Date\",\r\n            \"example\": \"2015-01-08\",\r\n            \"detail\": \"The trading day of the stock, the default is the latest trading day\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangedate\"\r\n        }, {\r\n            \"name\": \"Reversion and exclusion\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"ISDATE\",\r\n        \"t\": \"6\",\r\n        \"d\": \"Returns whether a value is a date.\",\r\n        \"a\": \"Whether a value is a date.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"value\",\r\n            \"example\": \"\\\"1990-01-01\\\"\",\r\n            \"detail\": \"The value to be verified as a date.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"LINESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell to describe the continuous trend of data\",\r\n        \"a\": \"Generate sparklines line chart\",\r\n        \"m\": [1, 8],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line thickness\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Line thickness of the line graph, the default is 1px\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line\",\r\n            \"example\": \"avg\",\r\n            \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Maximum mark\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Minimum mark\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"Identify the minimum value of the line graph, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Mark size\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The maximum and minimum mark size settings, the default is 1.5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"AREASPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data\",\r\n        \"a\": \"Generate sparklines area chart\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Fill color\",\r\n            \"example\": \"#CCF3F4\",\r\n            \"detail\": \"Form an area chart, the same line color configuration, default 0 does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Line thickness\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Line thickness of the line graph, the default is 1px\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line\",\r\n            \"example\": \"avg\",\r\n            \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Auxiliary line color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data\",\r\n        \"a\": \"Generate sparklines vertical histogram\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STACKCOLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n        \"a\": \"Generate sparklines cumulative vertical histogram\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Stack by column\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the size of discrete data\",\r\n        \"a\": \"Generate sparklines horizontal bar graph\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"STACKBARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n        \"a\": \"Generate sparklines cumulative horizontal bar graph\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Stack by column\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Max\",\r\n            \"example\": \"100\",\r\n            \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"DISCRETESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the trend of discrete data\",\r\n        \"a\": \"Generate sparklines discrete graph\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Segmentation threshold\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Above threshold color\",\r\n            \"example\": \"#2ec7c9\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Below threshold color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"TRISTATESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.\",\r\n        \"a\": \"Generate sparklines three-state graph\",\r\n        \"m\": [1, 6],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar interval\",\r\n            \"example\": \"1\",\r\n            \"detail\": \"The distance between bars, the default is 1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Bar color\",\r\n            \"example\": \"#fc5c5c\",\r\n            \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Negative bar color\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Zero value bar color\",\r\n            \"example\": \"#999\",\r\n            \"detail\": \"Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"PIESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data\",\r\n        \"a\": \"Generate sparklines pie chart\",\r\n        \"m\": [1, 5],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Rotation angle\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"The rotation angle of the pie chart, the default is 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"border\",\r\n            \"example\": \"0\",\r\n            \"detail\": \"Pie chart border size, default is none 0\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Border color\",\r\n            \"example\": \"#000\",\r\n            \"detail\": \"The border color of the pie chart, the default is #000\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Color palette\",\r\n            \"example\": \"#97b552\",\r\n            \"detail\": \"The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BOXSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set\",\r\n        \"a\": \"Generate sparklines box plot\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"Range\",\r\n            \"example\": \"A1:A20\",\r\n            \"detail\": \"Range\uFF0CValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Outlier ratio\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Target value\",\r\n            \"example\": \"10\",\r\n            \"detail\": \"The target value setting on the box plot, the default is false and does not display\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Point size\",\r\n            \"example\": \"1.5\",\r\n            \"detail\": \"The radius of the target point and outlier is set, the default is 1.5\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"BULLETSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Generate sparklines embedded in the cell, generally used to describe the task achievement rate\",\r\n        \"a\": \"Generating sparklines bullets\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"Target\",\r\n            \"example\": \"10\",\r\n            \"detail\": \"The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"achieved\",\r\n            \"example\": \"8\",\r\n            \"detail\": \"Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"Contrast\",\r\n            \"example\": \"12\",\r\n            \"detail\": \"Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"COMPOSESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram\",\r\n        \"a\": \"Combine sparklines graphs into one cell\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"config\",\r\n            \"example\": \"PIESPLINES(A1:A20)\",\r\n            \"detail\": \"Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"y\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SORT\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Sorts the rows of a given array or range by the values in one or more columns.\",\r\n        \"a\": \"Sorts rows of range by specified column.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to be sorted.\",\r\n            \"example\": \"A2:A17\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sort_column\",\r\n            \"detail\": \"The index of the column in `range` or a range outside of `range` containing the values by which to sort.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"is_ascending\",\r\n            \"detail\": \"`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.\",\r\n            \"example\": \"-1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"sort_column2\",\r\n            \"detail\": \"Additional columns.\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"FILTER\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.\",\r\n        \"a\": \"Filters a range based off provided conditions.\",\r\n        \"m\": [2, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to be filtered.\",\r\n            \"example\": \"A5:D20\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"condition1\",\r\n            \"detail\": \"A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"range\"\r\n        }, {\r\n            \"name\": \"condition2\",\r\n            \"detail\": \"Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.\",\r\n            \"example\": \"\\\"\\\"\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"UNIQUE\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.\",\r\n        \"a\": \"Unique rows in the provided source range.\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\": \"range\",\r\n            \"detail\": \"The data to filter by unique entries.\",\r\n            \"example\": \"A2:B26\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"by_col\",\r\n            \"detail\": \"[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().\",\r\n            \"example\": \"TRUE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }, {\r\n            \"name\": \"occurs_once\",\r\n            \"detail\": \"[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.\",\r\n            \"example\": \"FALSE()\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    }, {\r\n        \"n\": \"RANDARRAY\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.\",\r\n        \"a\": \"Returns a grid of random numbers.\",\r\n        \"m\": [0, 2],\r\n        \"p\": [{\r\n            \"name\": \"rows\",\r\n            \"detail\": \"The number of rows to populate with a random number.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"columns\",\r\n            \"detail\": \"The number of columns to populate with a random number.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    }, {\r\n        \"n\": \"SEQUENCE\",\r\n        \"t\": \"14\",\r\n        \"d\": \"Returns a grid of sequential numbers starting at a specified start value and  increasing by a specified step size. By default, the sequence starts at and  increases by 1.\",\r\n        \"a\": \"Returns a grid of sequential numbers.\",\r\n        \"m\": [1, 4],\r\n        \"p\": [{\r\n            \"name\": \"rows\",\r\n            \"detail\": \"The number of rows in the function's resulting grid.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"columns\",\r\n            \"detail\": \"The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"start\",\r\n            \"detail\": \"The number, at which to start the sequence. If omitted, the sequence will start at 1.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }, {\r\n            \"name\": \"step\",\r\n            \"detail\": \"The amount each value in the sequence will differ by. If omitted, each value will differ by 1.\",\r\n            \"example\": \"1\",\r\n            \"require\": \"o\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangenumber\"\r\n        }]\r\n    },\r\n    {\r\n        \"n\": \"EVALUATE\",\r\n        \"t\": \"3\",\r\n        \"d\": \"Evaluate a formula or expression expressed in words and return the result\",\r\n        \"a\": \"Evaluate according to literal formula or expression.\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"expression\",\r\n            \"example\": '\"A1+5*2^2\"',\r\n            \"detail\": \"Formula or expression\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    ],\r\n    toolbar: {\r\n        undo: 'Deshacer',\r\n        redo: 'Rehacer',\r\n        paintFormat: 'Clonar formato',\r\n        currencyFormat: 'Formato de moneda',\r\n        percentageFormat: 'Formato de porcentaje',\r\n        numberDecrease: 'Menos decimales',\r\n        numberIncrease: 'M\u00E1s decimales',\r\n        moreFormats:'M\u00E1s formatos',\r\n        font: 'Fuente',\r\n        fontSize: 'Tama\u00F1o Fuente',\r\n        bold: 'Negrita (Ctrl+B)',\r\n        italic : 'It\u00E1lica (Ctrl+I)',\r\n        strikethrough: 'Tachar (Alt+Shift+5)',\r\n        underline: 'Guion bajo',\r\n        textColor: 'Color texto',\r\n        chooseColor: 'elegir color',\r\n        resetColor: 'Reinicializar',\r\n        customColor: 'PERSONALIZADO',\r\n        alternatingColors: 'Colores alternos',\r\n        confirmColor: 'Vale',\r\n        cancelColor: 'Cancelar',\r\n        collapse: 'Recoger',\r\n        fillColor: 'Color de relleno',\r\n        border: 'Borde',\r\n        borderStyle: 'Estilo Borde',\r\n        mergeCell: 'Juntar celdas',\r\n        chooseMergeType: 'Elegir tipo de uni\u00F3n',\r\n        horizontalAlign: 'Alineaci\u00F3n Horizontal',\r\n        verticalAlign: 'Alineaci\u00F3n Vertical',\r\n        alignment: 'Alineaci\u00F3n',\r\n        textWrap: 'Ajuste de texto',\r\n        textWrapMode: 'Modo de ajuste de texto',\r\n        textRotate: 'Rotar texto',\r\n        textRotateMode: 'Modo de rotar texto',\r\n        freezeTopRow: 'Fijar fila superior',\r\n        sortAndFilter: 'Ordenar y filtrar',\r\n        findAndReplace: 'Buscar y reemplazar',\r\n        sum: 'SUMA',\r\n        autoSum: 'SUMA autom\u00E1tica',\r\n        moreFunction: 'M\u00E1s funciones',\r\n        conditionalFormat: 'Formato condicional',\r\n        postil: 'Comentario',\r\n        pivotTable: 'Tabla Din\u00E1mica',\r\n        chart: 'Gr\u00E1fica',\r\n        screenshot: 'Captura de pantalla',\r\n        splitColumn: 'Separar texto',\r\n        insertImage: 'Insertar imagen',\r\n        dataVerification: 'Verificaci\u00F3n de datos',\r\n        protection:\"Proteger la hoja\",\r\n\r\n        clearText:\"Limpiar color\",\r\n        noColorSelectedText:\"Ning\u00FAn color seleccionado\",\r\n\r\n        toolMore:\"M\u00E1s\",\r\n        toolLess:\"Menos\",\r\n        toolClose:\"Cerrar\",\r\n        toolMoreTip:\"M\u00E1s funcionalidades\",\r\n        moreOptions:\"M\u00E1s opciones\",\r\n\r\n        cellFormat:\"Configuraci\u00F3n formato de celda\",\r\n        print:\"Imprimir\",\r\n    },\r\n    alternatingColors:{\r\n        applyRange: 'Aplicar a rango',\r\n        selectRange: 'Seleccionar un rango de datos',\r\n        header: 'Cabecera',\r\n        footer: 'Pie',\r\n\r\n        errorInfo:\"No se puede realizar esta operaci\u00F3n en varias \u00E1reas de selecci\u00F3n, selecciona una sola \u00E1rea y vuelve a intentarlo\",\r\n        textTitle:\"Estilo Formato\",\r\n        custom:\"PERSONALIZADO\",\r\n        close:\"cerrar\",\r\n        selectionTextColor:\"Haz clic para seleccionar el color del texto\",\r\n        selectionCellColor:\"Haz clic para seleccionar el color de la celda\",\r\n        removeColor:\"Eliminar colores alternos\",\r\n        colorShow:\"color\",\r\n        currentColor:\"Actual\",\r\n\r\n        tipSelectRange:\"Selecciona la gama de colores alternos\",\r\n        errorNoRange:\"No hay ning\u00FAn rango seleccionado\",\r\n        errorExistColors:\"Los colores alternos ya existen y no se pueden editar\",\r\n    },\r\n    button: {\r\n        confirm: 'Vale',\r\n        cancel: 'Cancelar',\r\n        close:\"Cerrar\",\r\n        update:\"Actualizar\",\r\n        delete:\"Eliminar\",\r\n        insert:\"Insertar\",\r\n        prevPage: \"Previous\",\r\n        nextPage: \"Next\",\r\n        total: \"total:\"\r\n    },\r\n    paint:{\r\n        start: 'Inicio clonar formato',\r\n        end: 'ESC',\r\n\r\n        tipSelectRange:\"Selecciona el rango que quieres copiar\",\r\n        tipNotMulti:\"No se puede realizar esta operaci\u00F3n en un rango de selecci\u00F3n m\u00FAltiple\",\r\n    },\r\n    format:{\r\n        moreCurrency: 'M\u00E1s formatos de moneda',\r\n        moreDateTime: 'M\u00E1s formatos de fecha y hora',\r\n        moreNumber: 'M\u00E1s formatos de n\u00FAmero',\r\n\r\n        titleCurrency: 'Formatos de moneda',\r\n        decimalPlaces: 'Decimales',\r\n        titleDateTime: 'Formatos de fecha y hora',\r\n        titleNumber: 'Formatos de n\u00FAmeros'\r\n    },\r\n    info:{\r\n        detailUpdate: 'Nuevo abierto',\r\n        detailSave: 'Cache local restaurado',\r\n        row: '',\r\n        column: '',\r\n        loading:\"Cargando...\",\r\n\r\n        copy:\"Copiar\",\r\n        return:\"Salir\",\r\n        rename:\"Renombrar\",\r\n        tips:\"Renombrar Libro\",\r\n        noName:\"Hoja sin t\u00EDtulo\",\r\n        wait:\"esperando actualizaci\u00F3n\",\r\n\r\n        add:\"A\u00F1adir\",\r\n        addLast:\"m\u00E1s filas al final\",\r\n        backTop:\"Volver arriba\",\r\n        pageInfo:'Total ${total}\uFF0Cp\u00E1gina ${totalPage}\uFF0Cactual ${currentPage}',\r\n        nextPage:\"Siguiente\",\r\n\r\n        tipInputNumber:\"Introduce el n\u00FAmero\",\r\n        tipInputNumberLimit:\"El rango de aumento est\u00E1 limitado a 1-100\",\r\n\r\n        tipRowHeightLimit:\"La altura de la fila debe estar entre 0 ~ 545\",\r\n        tipColumnWidthLimit:\"El ancho de la columna debe estar entre 0 ~ 2038\",\r\n        pageInfoFull:'Total ${total}\uFF0Cp\u00E1gina ${totalPage}\uFF0CSe muestran todos los datos',\r\n    },\r\n    currencyDetail:{\r\n        RMB:'RMB',\r\n        USdollar:'D\u00F3lar US',\r\n        EUR:'EUR',\r\n        GBP:'GBP',\r\n        HK:'HK',\r\n        JPY:'JPY',\r\n        AlbanianLek:'Albanian Lek',\r\n        AlgerianDinar:'Algerian Dinar',\r\n        Afghani:'Afghani',\r\n        ArgentinePeso:'Argentine Peso',\r\n        UnitedArabEmiratesDirham:'United Arab Emirates Dirham',\r\n        ArubanFlorin:'Aruban Florin',\r\n        OmaniRial:'Omani Rial',\r\n        Azerbaijanimanat:'Azerbaijani manat',\r\n        EgyptianPound:'Egyptian Pound',\r\n        EthiopianBirr:'Ethiopian Birr',\r\n        AngolaKwanza:'Angola Kwanza',\r\n        AustralianDollar:'Australian Dollar',\r\n        Patacas:'Patacas',\r\n        BarbadosDollar:'Barbados Dollar',\r\n        PapuaNewGuineaKina:'Papua New Guinea Kina',\r\n        BahamianDollar:'Bahamian Dollar',\r\n        PakistanRupee:'Pakistan Rupee',\r\n        ParaguayanGuarani:'Paraguayan Guarani',\r\n        BahrainiDinar:'Bahraini Dinar',\r\n        PanamanianBalboa:'Panamanian Balboa',\r\n        Brazilianreal:'Brazilian real',\r\n        Belarusianruble:'Belarusian ruble',\r\n        BermudianDollar:'Bermudian Dollar',\r\n        BulgarianLev:'Bulgarian Lev',\r\n        IcelandKrona:'Iceland Krona',\r\n        BosniaHerzegovinaConvertibleMark:'Bosnia-Herzegovina Convertible Mark',\r\n        PolishZloty:'Polish Zloty',\r\n        Boliviano:'Boliviano',\r\n        BelizeDollar:'Belize Dollar',\r\n        BotswanaPula:'Botswana Pula',\r\n        NotDannuzhamu:'Not Dannuzhamu',\r\n        BurundiFranc:'Burundi Franc',\r\n        NorthKoreanWon:'North Korean Won',\r\n        DanishKrone:'Danish Krone',\r\n        EastCaribbeanDollar:'East Caribbean Dollar',\r\n        DominicaPeso:'Dominica Peso',\r\n        RussianRuble:'Russian Ruble',\r\n        EritreanNakfa:'Eritrean Nakfa',\r\n        CFAfranc:'CFA franc',\r\n        PhilippinePeso:'Philippine Peso',\r\n        FijiDollar:'Fiji Dollar',\r\n        CapeVerdeEscudo:'Cape Verde Escudo',\r\n        FalklandIslandsPound:'Falkland Islands Pound',\r\n        GambianDalasi:'Gambian Dalasi',\r\n        Congolesefranc:'Congolese franc',\r\n        ColombianPeso:'Colombian Peso',\r\n        CostaRicanColon:'Costa Rican Colon',\r\n        CubanPeso:'Cuban Peso',\r\n        Cubanconvertiblepeso:'Cuban convertible peso',\r\n        GuyanaDollar:'Guyana Dollar',\r\n        KazakhstanTenge:'Kazakhstan Tenge',\r\n        Haitiangourde:'Haitian gourde',\r\n        won:'won',\r\n        NetherlandsAntillesGuilder:'Netherlands Antilles Guilder',\r\n        Honduraslempiras:'Honduras lempiras',\r\n        DjiboutiFranc:'Djibouti Franc',\r\n        KyrgyzstanSom:'Kyrgyzstan Som',\r\n        GuineaFranc:'Guinea Franc',\r\n        CanadianDollar:'Canadian Dollar',\r\n        GhanaianCedi:'Ghanaian Cedi',\r\n        Cambodianriel:'Cambodian riel',\r\n        CzechKoruna:'Czech Koruna',\r\n        ZimbabweDollar:'Zimbabwe Dollar',\r\n        QatariRiyal:'Qatari Riyal',\r\n        CaymanIslandsDollar:'Cayman Islands Dollar',\r\n        Comorianfranc:'Comorian franc',\r\n        KuwaitiDinar:'Kuwaiti Dinar',\r\n        CroatianKuna:'Croatian Kuna',\r\n        KenyanShilling:'Kenyan Shilling',\r\n        LesothoLoti:'Lesotho Loti',\r\n        LaoKip:'Lao Kip',\r\n        LebanesePound:'Lebanese Pound',\r\n        Lithuanianlitas:'Lithuanian litas',\r\n        LibyanDinar:'Libyan Dinar',\r\n        LiberianDollar:'Liberian Dollar',\r\n        RwandaFranc:'Rwanda Franc',\r\n        RomanianLeu:'Romanian Leu',\r\n        MalagasyAriary:'Malagasy Ariary',\r\n        MaldivianRufiyaa:'Maldivian Rufiyaa',\r\n        MalawiKwacha:'Malawi Kwacha',\r\n        MalaysianRinggit:'Malaysian Ringgit',\r\n        MacedoniawearingDinar:'Macedonia wearing Dinar',\r\n        MauritiusRupee:'Mauritius Rupee',\r\n        MauritanianOuguiya:'Mauritanian Ouguiya',\r\n        MongolianTugrik:'Mongolian Tugrik',\r\n        BangladeshiTaka:'Bangladeshi Taka',\r\n        PeruvianNuevoSol:'Peruvian Nuevo Sol',\r\n        MyanmarKyat:'Myanmar Kyat',\r\n        MoldovanLeu:'Moldovan Leu',\r\n        MoroccanDirham:'Moroccan Dirham',\r\n        MozambiqueMetical:'Mozambique Metical',\r\n        MexicanPeso:'Mexican Peso',\r\n        NamibianDollar:'Namibian Dollar',\r\n        SouthAfricanRand:'South African Rand',\r\n        SouthSudanesePound:'South Sudanese Pound',\r\n        NicaraguaCordoba:'Nicaragua Cordoba',\r\n        NepaleseRupee:'Nepalese Rupee',\r\n        NigerianNaira:'Nigerian Naira',\r\n        NorwegianKrone:'Norwegian Krone',\r\n        GeorgianLari:'Georgian Lari',\r\n        RMBOffshore:'RMB (Offshore)',\r\n        SwedishKrona:'Swedish Krona',\r\n        SwissFranc:'Swiss Franc',\r\n        SerbianDinar:'Serbian Dinar',\r\n        SierraLeone:'Sierra Leone',\r\n        SeychellesRupee:'Seychelles Rupee',\r\n        SaudiRiyal:'Saudi Riyal',\r\n        SaoTomeDobra:'Sao Tome Dobra',\r\n        SaintHelenapound:'Saint Helena pound',\r\n        SriLankaRupee:'Sri Lanka Rupee',\r\n        SwazilandLilangeni:'Swaziland Lilangeni',\r\n        SudanesePound:'Sudanese Pound',\r\n        Surinamesedollar:'Surinamese dollar',\r\n        SolomonIslandsDollar:'Solomon Islands Dollar',\r\n        SomaliShilling:'Somali Shilling',\r\n        TajikistanSomoni:'Tajikistan Somoni',\r\n        PacificFranc:'Pacific Franc',\r\n        ThaiBaht:'Thai Baht',\r\n        TanzanianShilling:'Tanzanian Shilling',\r\n        TonganPaanga:\"Tongan Pa'anga\",\r\n        TrinidadandTobagoDollar:'Trinidad and Tobago Dollar',\r\n        TunisianDinar:'Tunisian Dinar',\r\n        TurkishLira:'Turkish Lira',\r\n        VanuatuVatu:'Vanuatu Vatu',\r\n        GuatemalanQuetzal:'Guatemalan Quetzal',\r\n        CommissionBolivar:'Commission Bolivar',\r\n        BruneiDollar:'Brunei Dollar',\r\n        UgandanShilling:'Ugandan Shilling',\r\n        UkrainianHryvnia:'Ukrainian Hryvnia',\r\n        UruguayanPeso:'Uruguayan Peso',\r\n        Uzbekistansom:'Uzbekistan som',\r\n        WesternSamoaTala:'Western Samoa Tala',\r\n        SingaporeDollar:'Singapore Dollar',\r\n        NT:'NT',\r\n        NewZealandDollar:'New Zealand Dollar',\r\n        HungarianForint:'Hungarian Forint',\r\n        SyrianPound:'Syrian Pound',\r\n        JamaicanDollar:'Jamaican Dollar',\r\n        ArmenianDram:'Armenian Dram',\r\n        YemeniRial:'Yemeni Rial',\r\n        IraqiDinar:'Iraqi Dinar',\r\n        IranianRial:'Iranian Rial',\r\n        NewIsraeliShekel:'New Israeli Shekel',\r\n        IndianRupee:'Indian Rupee',\r\n        IndonesianRupiah:'Indonesian Rupiah',\r\n        JordanianDinar:'Jordanian Dinar',\r\n        VND:'VND',\r\n        ZambianKwacha:'Zambian Kwacha',\r\n        GibraltarPound:'Gibraltar Pound',\r\n        ChileanPeso:'Chilean Peso',\r\n        CFAFrancBEAC:'CFA Franc BEAC'\r\n    },\r\n    defaultFmt:[\r\n        { \"text\": 'Autom\u00E1tico', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": 'Texto', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'N\u00FAmero', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": 'Porcentaje', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": 'Cient\u00EDfico', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Contabilidad', \"value\": \"\u00A5(0.00)\", \"example\": \"\u00A5(1200.09)\" },\r\n\r\n\r\n        { \"text\": 'Moneda', \"value\": \"\u00A50.00\", \"example\": \"\u00A51200.09\" },\r\n\r\n\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'Fecha', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": 'Hora', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": 'Hora 24H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": 'Fecha Hora', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": 'Fecha Hora 24 H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'Formatos personalizados', \"value\": \"fmtOtherSelf\", \"example\": \"m\u00E1s\" }\r\n    ],\r\n    dateFmtList:[\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"PM 01:30\",\r\n            \"value\": 'AM/PM hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30\",\r\n            \"value\": 'AM/PM h:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30:30\",\r\n            \"value\": 'AM/PM h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 PM 01:30\",\r\n            \"value\": \"MM-dd AM/PM hh:mm\"\r\n        }\r\n    ],\r\n    fontFamily:{\r\n        MicrosoftYaHei:\"YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\",\"Arial\",\"Tahoma\",\"Verdana\"],\r\n    fontjson: {\"times new roman\":0,\"arial\":1,\"tahoma\":2,\"verdana\":3},\r\n    border:{\r\n        borderTop:'borderTop',\r\n        borderBottom:'borderBottom',\r\n        borderLeft:'borderLeft',\r\n        borderRight:'borderRight',\r\n        borderNone:'borderNone',\r\n        borderAll:'borderAll',\r\n        borderOutside:'borderOutside',\r\n        borderInside:'borderInside',\r\n        borderHorizontal:'borderHorizontal',\r\n        borderVertical:'borderVertical',\r\n        borderColor:'borderColor',\r\n        borderSize:'borderSize',\r\n    },\r\n    merge:{\r\n        mergeAll:\"Unir todo\",\r\n        mergeV:\"Verticalmente\",\r\n        mergeH:\"Horizontalmente\",\r\n        mergeCancel:\"Separar\",\r\n        overlappingError:\"No se pueden fusionar \u00E1reas superpuestas\",\r\n        partiallyError:\"No se puede realizar esta operaci\u00F3n en celdas parcialmente unidas\",\r\n    },\r\n    align:{\r\n        left:\"izquierda\",\r\n        center:\"centro\",\r\n        right:\"derecha\",\r\n\r\n        top:\"Arriba\",\r\n        middle:\"Centro\",\r\n        bottom:\"Abajo\",\r\n    },\r\n    textWrap:{\r\n        \"overflow\":\"Desbordar\",\r\n        \"wrap\":\"Ajustar\",\r\n        \"clip\":\"Cortar\",\r\n    },\r\n    rotation:{\r\n        \"none\":\"Ninguno\",\r\n        \"angleup\":\"Ladear Arriba\",\r\n        \"angledown\":\"Ladear Abajo\",\r\n        \"vertical\":\"Apilar Verticalmente\",\r\n        \"rotationUp\":\"Rotar Arriba\",\r\n        \"rotationDown\":\"Rotar Abajo\"\r\n    },\r\n    freezen:{\r\n        default:\"Fijar\",\r\n        freezenRow:\"Primera Fila\",\r\n        freezenColumn:\"Primera Columna\",\r\n        freezenRC:\"Ambas\",\r\n        freezenRowRange:\"Fijar rango filas\",\r\n        freezenColumnRange:\"Fijar rango columnas\",\r\n        freezenRCRange:\"Fijar ambos rangos\",\r\n        freezenCancel:\"Cancelar\",\r\n\r\n        noSeletionError:\"No hay rango para seleccionar\",\r\n    },\r\n    sort:{\r\n        \"asc\":\"Ascendente \",\r\n        \"desc\":\"Descendente \",\r\n        \"custom\":\"Ordenaci\u00F3n personalizada\",\r\n\r\n        \"hasTitle\":\"Los datos tienen una fila de encabezado\",\r\n        \"sortBy\":\"Ordenar por\",\r\n        \"addOthers\":\"A\u00F1adir otra columna de ordenaci\u00F3n\",\r\n        \"close\":\"cerrar\",\r\n        \"confirm\":\"ordenar\",\r\n\r\n        \"columnOperation\":\"Columna\",\r\n        \"secondaryTitle\":\"y despu\u00E9s por\",\r\n\r\n        \"sortTitle\":\"Ordenar rango\",\r\n\r\n        \"sortRangeTitle\":\"Ordenar rango de\",\r\n        \"sortRangeTitleTo\":\"a\",\r\n\r\n\r\n        \"noRangeError\":\"No se puede realizar esta operaci\u00F3n en m\u00FAltiples \u00E1reas de selecci\u00F3n, selecciona un solo rango e intenta nuevamente\",\r\n        \"mergeError\":\"Hay celdas combinadas en la selecci\u00F3n, \u00A1esta operaci\u00F3n no se puede realizar!\",\r\n\r\n    },\r\n    filter:{\r\n       filter:\"crear filtro\", \r\n\r\n       sortByAsc:\"Ordenar A-Z\",\r\n       sortByDesc:\"Ordenar Z-A\",\r\n       filterByColor:\"Filtrar por color\",\r\n       filterByCondition:\"Filtrar por condici\u00F3n\",\r\n       filterByValues:\"Filtrar por valores\",\r\n\r\n       filiterInputNone:\"Ninguno\",\r\n\r\n       filiterInputTip:\"Introduce valor de filtro\",\r\n       filiterRangeStartTip:\"Valor para f\u00F3rmula\",\r\n       filiterRangeEndTip:\"Valor para f\u00F3rmula\",\r\n\r\n       filterValueByAllBtn:\"Seleccionar todos\",\r\n       filterValueByClearBtn:\"Limpiar\",\r\n       filterValueByInverseBtn:\"Invertir\",\r\n       filterValueByTip:\"filtrar por valores\",\r\n       filterConform:\"Confirmar\",\r\n       filterCancel:\"Cancelar\",\r\n       clearFilter:\"Quitar filtro\",\r\n\r\n       conditionNone:\"Ninguno\",\r\n       conditionCellIsNull: \"Est\u00E1 vac\u00EDo\",\r\n       conditionCellNotNull: \"No est\u00E1 vac\u00EDo\",\r\n       conditionCellTextContain: \"El texto contiene\",\r\n       conditionCellTextNotContain: \"El texto no contiene\",\r\n       conditionCellTextStart: \"El texto empieza con\",\r\n       conditionCellTextEnd: \"El texto termina con\",\r\n       conditionCellTextEqual: \"El texto es exactamente\",\r\n       conditionCellDateEqual: \"La fecha es\",\r\n       conditionCellDateBefore: \"La fecha es anterior\",\r\n       conditionCellDateAfter: \"La fecha es posterior\",\r\n       conditionCellGreater: \"Mayor que\",\r\n       conditionCellGreaterEqual: \"Mayor o igual que\",\r\n       conditionCellLess: \"Menor que\",\r\n       conditionCellLessEqual: \"Menor o igual que\",\r\n       conditionCellEqual: \"Es igual a\",\r\n       conditionCellNotEqual: \"No es igual a\",\r\n       conditionCellBetween: \"Est\u00E1 entre\",\r\n       conditionCellNotBetween: \"No est\u00E1 entre\",\r\n\r\n        filiterMoreDataTip:\"\u00A1Gran cantidad de datos! por favor espera\",\r\n        filiterMonthText:\"Mes\",\r\n        filiterYearText:\"A\u00F1o\",\r\n        filiterByColorTip:\"Filtrar por color de celda\",\r\n        filiterByTextColorTip:\"Filtrar por color de fuente\",\r\n        filterContainerOneColorTip:\"Esta columna contiene solo un color\",\r\n        filterDateFormatTip:\"Format fecha\",\r\n\r\n        valueBlank:\"(Nulo)\",\r\n        mergeError:\"Hay celdas combinadas en la selecci\u00F3n del filtro, \u00A1esta operaci\u00F3n no se puede realizar!\",\r\n    },\r\n    rightclick: {\r\n        copy: 'Copiar',\r\n        copyAs: 'Copiar como',\r\n        paste: 'Pegar',\r\n        insert: 'Insertar',\r\n        delete: 'Eliminar',\r\n        deleteCell: 'Eliminar celda',\r\n        deleteSelected: 'Eliminar seleccionado ',\r\n        hide: 'Esconder',\r\n        hideSelected: 'Esconder seleccionado ',\r\n        showHide: 'Mostrar ocultos ',\r\n        to: 'Hacia',\r\n        left: 'Izquierda',\r\n        right: 'Derecha',\r\n        top: 'Arriba',\r\n        bottom: 'Abajo',\r\n        moveLeft: 'Mover izquierda',\r\n        moveUp: 'Mover arriba',\r\n        add: 'A\u00F1adir',\r\n        row: 'Fila',\r\n        column: 'Columna',\r\n        width: 'Ancho',\r\n        height: 'Alto',\r\n        number: 'N\u00FAmero',\r\n        confirm: 'Confirmar',\r\n        orderAZ: 'Ordenar A-Z',\r\n        orderZA: 'Ordenar Z-A',\r\n        clearContent: 'Limpiar contenido',\r\n        matrix: 'Operaci\u00F3n de Matriz',\r\n        sortSelection: 'Ordenar',\r\n        filterSelection: 'Filtrar',\r\n        chartGeneration: 'Crear gr\u00E1fico',\r\n        firstLineTitle: 't\u00EDtulo primera l\u00EDnea',\r\n        untitled: 'sin t\u00EDtulo',\r\n        array1: 'Matriz unidimensional',\r\n        array2: 'Matriz bidimensional',\r\n        array3: 'Matrices multidimensionales',\r\n        diagonal: 'Diagonal',\r\n        antiDiagonal: 'Anti-diagonal',\r\n        diagonalOffset: 'Desplazamiento Diagonal',\r\n        offset: 'Desplazamiento',\r\n        boolean: 'Booleana',\r\n        flip: 'Voltear',\r\n        upAndDown: 'Arriba y abajo',\r\n        leftAndRight: 'Izquierda y derecha',\r\n        clockwise: 'Sentido horario',\r\n        counterclockwise: 'Sentido anti-horario',\r\n        transpose: 'Transponer',\r\n        matrixCalculation: 'C\u00E1lculo de matrices',\r\n        plus: 'Suma',\r\n        minus: 'Resta',\r\n        multiply: 'Multiplicaci\u00F3n',\r\n        divided: 'Divisi\u00F3n',\r\n        power: 'Exponenciaci\u00F3n',\r\n        root: 'Ra\u00EDz Cuadrada',\r\n        log: 'Logaritmo',\r\n        delete0: 'Eliminar valores nulos en ambos extremos',\r\n        removeDuplicate: 'Eliminar valores duplicados',\r\n        byRow: 'Por fila',\r\n        byCol: 'Por columna',\r\n        generateNewMatrix: 'Generar nueva matriz',\r\n        \r\n    },\r\n    comment:{\r\n        \"insert\":\"Insertar\",\r\n        \"edit\":\"Editar\",\r\n        \"delete\":\"Elimiar\",\r\n        \"showOne\":\"Mostrar/Ocular\",\r\n        \"showAll\":\"Mostrar/Ocular Todo\"\r\n    },\r\n    screenshot:{\r\n        screenshotTipNoSelection:\"Selecciona el alcance de la captura de pantalla\",\r\n        screenshotTipTitle:\"\u00A1Advertencia!\",\r\n        screenshotTipHasMerge:\"Esta operaci\u00F3n no se puede realizar en celdas combinadas\",\r\n        screenshotTipHasMulti:\"Esta operaci\u00F3n no se puede realizar en varios rangos de selecci\u00F3n\",\r\n        screenshotTipSuccess:\"Exitoso\",\r\n        screenshotImageName:\"Captura de pantalla\",\r\n\r\n        downLoadClose:\"Cerrar\",\r\n        downLoadCopy:\"Copiar al portapapeles\",\r\n        downLoadBtn:\"Descargar\",\r\n        browserNotTip:\"no es compatible con el navegador IE.\",\r\n        rightclickTip:\"Haz clic con el bot\u00F3n derecho en la imagen y selecciona \\\"copiar\\\"\",\r\n        successTip:\"Con \u00E9xito (si falla el pegado, haz clic con el bot\u00F3n derecho en la imagen para \\\"copiar imagen\\\")\",\r\n    },\r\n    splitText:{\r\n        splitDelimiters:\"Delimitadores\",\r\n        splitOther:\"Otros\",\r\n        splitContinueSymbol:\"Los separadores consecutivos se tratan como uno solo\",\r\n        splitDataPreview:\"Previsualizar\",\r\n        splitTextTitle:\"Partir texto\",\r\n        splitConfirmToExe:\"Ya hay datos aqu\u00ED, \u00BFquieres reemplazarlos?\",\r\n\r\n        tipNoMulti: \"No se puede realizar esta operaci\u00F3n en varias \u00E1reas de selecci\u00F3n, selecciona una \u00FAnica \u00E1rea y vuelve a intentarlo\",\r\n        tipNoMultiColumn: \"Solo se puede convertir una columna de datos a la vez. El \u00E1rea seleccionado puede tener varias filas, pero no varias columnas. Vuelve a intentarlo despu\u00E9s de seleccionar un solo rango de columnas\",\r\n    },\r\n    imageText:{\r\n        imageSetting: 'Configuraci\u00F3n de imagen',\r\n        close: 'Cerrar',\r\n        conventional: 'Convencional',\r\n        moveCell1: 'Mover y cambiar el tama\u00F1o de las celdas',\r\n        moveCell2: 'Mover y no cambiar el tama\u00F1o de la celda',\r\n        moveCell3: 'No mover ni cambiar el tama\u00F1o de la celda',\r\n        fixedPos: 'Posici\u00F3n fija',\r\n        border: 'Borde',\r\n        width: 'Ancho',\r\n        radius: 'Radio',\r\n        style: 'Estilo',\r\n        solid: 'S\u00F3lido',\r\n        dashed: 'Discontinua',\r\n        dotted: 'Punteado',\r\n        double: 'Doble',\r\n        color: 'Color',\r\n    },\r\n    punctuation:{\r\n        \"tab\":\"Tabulaci\u00F3n\",\r\n        \"semicolon\":\"punto y coma\",\r\n        \"comma\":\"coma\",\r\n        \"space\":\"espacio\",\r\n        \r\n    },\r\n    findAndReplace:{\r\n        find:\"Encontrar\",\r\n        replace:\"Reemplazar\",\r\n        goto:\"Ir a\",\r\n        location:\"Ubicaci\u00F3n\",\r\n        formula:\"F\u00F3rmula\",\r\n        date:\"Fecha\",\r\n        number:\"N\u00FAmero\",\r\n        string:\"Texto\",\r\n        error:\"Error\",\r\n        condition:\"Condici\u00F3n\",\r\n        rowSpan:\"Intervalo de filas\",\r\n        columnSpan:\"Intervalo de columnas\",\r\n        locationExample:\"Ubicaci\u00F3n\",\r\n        lessTwoRowTip:\"Selecciona al menos dos filas\",\r\n        lessTwoColumnTip:\"Selecciona al menos dos columnas\",\r\n\r\n        findTextbox:\"Encontrar Contenido\",\r\n        replaceTextbox:\"Reemplazar Contenido\",\r\n\r\n        regexTextbox:\"Expresi\u00F3n Regular\",\r\n        wholeTextbox:\"Palabra entera\",\r\n        distinguishTextbox:\"Distingue may\u00FAsculas y min\u00FAsculas\",\r\n\r\n        allReplaceBtn:\"Reemplazar Todo\",\r\n        replaceBtn:\"Reemplazar\",\r\n        allFindBtn:\"Encontrar Todo\",\r\n        findBtn:\"Encontrar siguiente\",\r\n\r\n        noFindTip:\"No se encontr\u00F3 el contenido\",\r\n        modeTip:\"Esta operaci\u00F3n no est\u00E1 disponible en este modo\",\r\n\r\n        searchTargetSheet:\"Hoja\",\r\n        searchTargetCell:\"Celda\",\r\n        searchTargetValue:\"Valor\",\r\n\r\n        searchInputTip:\"Introduce el contenido de la b\u00FAsqueda\",\r\n\r\n        noReplceTip:\"No hay nada que reemplazar\",\r\n        noMatchTip:\"No se encontraron coincidencias\",\r\n\r\n        successTip:\"${xlength} elementos encontrados\",\r\n\r\n        locationConstant:\"Constante\",\r\n        locationFormula:\"F\u00F3rmula\",\r\n        locationDate:\"Fecha\",\r\n        locationDigital:\"N\u00FAmero\",\r\n        locationString:\"Texto\",\r\n        locationBool:\"L\u00F3gicos\",\r\n        locationError:\"Error\",\r\n        locationNull:\"Nulo\",\r\n        locationCondition:\"Formato condicional\",\r\n        locationRowSpan:\"Intervalo fila\",\r\n        locationColumnSpan:\"Intervalo columna\",\r\n\r\n        locationTiplessTwoRow:\"Selecciona al menos dos filas\",\r\n        locationTiplessTwoColumn:\"Selecciona al menos dos columnas\",\r\n        locationTipNotFindCell:\"Celda no encontrada\"\r\n    },\r\n    sheetconfig: {\r\n        delete: 'Eliminar',\r\n        copy: 'Copiar',\r\n        rename: 'Renombrar',\r\n        changeColor: 'Cambiar color',\r\n        hide: 'Ocultar',\r\n        unhide: 'Mostrar',\r\n        moveLeft: 'Mover izquierda',\r\n        moveRight: 'Mover derecja',\r\n        resetColor: 'Reiniciar color',\r\n        cancelText: 'Cancelar',\r\n        chooseText: 'Confirmar color',\r\n\r\n        tipNameRepeat:\"\u00A1El nombre de la p\u00E1gina de la pesta\u00F1a no se puede repetir! Rev\u00EDsalo\",\r\n        noMoreSheet:\"El libro de trabajo contiene al menos una hoja de trabajo visual. Para eliminar la hoja de trabajo seleccionada, inserta una nueva hoja de trabajo o muestra una hoja de trabajo oculta\",\r\n        confirmDelete:\"\u00BFEst\u00E1s seguro de eliminar\",\r\n        redoDelete:\"Se puede deshacer con Ctrl+Z\",\r\n        noHide:\"No se puede ocultar, al menos conserva una etiqueta de hoja\",\r\n        chartEditNoOpt:\"\u00A1Esta operaci\u00F3n no est\u00E1 permitida en el modo de edici\u00F3n de gr\u00E1ficos!\",\r\n        sheetNameSpecCharError:\"El nombre no puede contener:[ ] : \\ ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError:\"El nombre de la hoja no puede estar vac\u00EDo\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: 'Conditionformat-GreaterThan',\r\n        conditionformat_greaterThan_title: 'Dar formato a celdas mayores que',\r\n        conditionformat_lessThan: 'Conditionformat-LessThan',\r\n        conditionformat_lessThan_title: 'Dar formato a celdas m\u00E1s peque\u00F1as que',\r\n        conditionformat_betweenness: 'Conditionformat-Betweenness',\r\n        conditionformat_betweenness_title: 'Dar formato a celdas con valores entre',\r\n        conditionformat_equal: 'Conditionformat-Equal',\r\n        conditionformat_equal_title: 'Dar formato a celdas iguales a',\r\n        conditionformat_textContains: 'Conditionformat-TextContains',\r\n        conditionformat_textContains_title: 'Dar formato a las celdas que contienen el siguiente texto',\r\n        conditionformat_occurrenceDate: 'Conditionformat-OccurrenceDate',\r\n        conditionformat_occurrenceDate_title: 'Dar formato a celdas que contienen las siguientes fechas',\r\n        conditionformat_duplicateValue: 'Conditionformat-DuplicateValue',\r\n        conditionformat_duplicateValue_title: 'Dar formato a celdas que contienen los siguientes tipos de valores',\r\n        conditionformat_top10: 'Conditionformat-Top10',\r\n        conditionformat_top10_percent: 'Conditionformat-Top10%',\r\n        conditionformat_top10_title: 'Formatea las celdas con el valor m\u00E1s alto',\r\n        conditionformat_last10: 'Conditionformat-Last10',\r\n        conditionformat_last10_percent: 'Conditionformat-Last10%',\r\n        conditionformat_last10_title: 'Formatea las celdas con el valor m\u00E1s peque\u00F1o',\r\n        conditionformat_AboveAverage: 'Conditionformat-AboveAverage',\r\n        conditionformat_AboveAverage_title: 'Dar formato a celdas por encima del promedio',\r\n        conditionformat_SubAverage: 'Conditionformat-SubAverage',\r\n        conditionformat_SubAverage_title: 'Dar formato a celdas por debajo del promedio',\r\n        rule: 'Regla',\r\n        newRule: 'Nueva regla',\r\n        editRule: 'Editar regla',\r\n        deleteRule: 'Eliminar regla',\r\n        deleteCellRule: 'Eliminar regla de celda',\r\n        deleteSheetRule: 'Eliminar regla de hoja',\r\n        manageRules: 'Reglas administraci\u00F3n',\r\n        showRules: 'Muestra sus reglas de formato',\r\n        highlightCellRules: 'Resaltar reglas de celda',\r\n        itemSelectionRules: 'Reglas de selecci\u00F3n de elementos',\r\n        conditionformatManageRules: 'Administrador de reglas de formato condicional',\r\n        format: 'Formatear',\r\n        setFormat: 'Establecer formato',\r\n        setAs: 'Establecer como',\r\n        setAsByArea: 'Para el \u00E1rea seleccionada, establecer',\r\n        applyRange: 'Aplicar rango',\r\n        selectRange: 'Seleccionar rango de aplicaci\u00F3n',\r\n        selectRange_percent: 'Porcentaje del rango seleccionado',\r\n        selectRange_average: 'Valor promedio del rango seleccionado',\r\n        selectRange_value: 'Valor en el rango seleccionado',\r\n        pleaseSelectRange: 'Selecciona el rango de aplicaci\u00F3n',\r\n        selectDataRange: 'Seleccionar rango de datos',\r\n        selectCell: 'seleccionar celda',\r\n        pleaseSelectCell: 'Selecciona una celda',\r\n        pleaseSelectADate: 'Selecciona una fecha',\r\n        pleaseEnterInteger: 'Introduzca un n\u00FAmero entero entre 1 y 1000',\r\n        onlySingleCell: 'Solo se puede hacer referencia a una sola celda',\r\n        conditionValueCanOnly: 'El valor de la condici\u00F3n solo puede ser un n\u00FAmero o una sola celda',\r\n        ruleTypeItem1: 'Aplicar formato a todas las celdas seg\u00FAn sus valores respectivos',\r\n        ruleTypeItem2: 'Solo formatear celdas que contengan',\r\n        ruleTypeItem2_title: 'Solo para celdas que cumplan las siguientes condiciones',\r\n        ruleTypeItem3: 'Aplicar formato solo a los n\u00FAmeros superiores o inferiores',\r\n        ruleTypeItem3_title: 'Es el valor en la siguiente clasificaci\u00F3n',\r\n        ruleTypeItem4: 'Aplicar formato solo a los valores superiores o inferiores al promedio',\r\n        ruleTypeItem4_title: 'Es un valor que cumple las siguientes condiciones',\r\n        ruleTypeItem5: 'Aplicar formato solo a valores \u00FAnicos o repetidos',\r\n        ruleTypeItem6: 'Use f\u00F3rmulas para determinar qu\u00E9 celdas formatear',\r\n        formula: 'f\u00F3rmula',\r\n        textColor: 'Color Texto',\r\n        cellColor: 'Color Celda',\r\n        confirm: 'Confirma',\r\n        confirmColor: 'Confirma color',\r\n        cancel: 'Cancela',\r\n        close: 'Cierra',\r\n        clearColorSelect: 'Limpiar selecci\u00F3n de color',\r\n        sheet: 'Hoja',\r\n        currentSheet: 'Hoja actual',\r\n        dataBar: 'Barra de datos',\r\n        dataBarColor: 'Color barra de datos',\r\n        gradientDataBar_1: 'Barra de datos de degradado azul-blanco',\r\n        gradientDataBar_2: 'Barra de datos de degradado verde-blanco',\r\n        gradientDataBar_3: 'Barra de datos de degradado rojo-blanco',\r\n        gradientDataBar_4: 'Rayas de degradado de color naranja-blanco',\r\n        gradientDataBar_5: 'Rayas de degradado azul claro-blancas',\r\n        gradientDataBar_6: 'Barra de datos de degradado p\u00FArpura-blanco',\r\n        solidColorDataBar_1: 'Barra de datos azul',\r\n        solidColorDataBar_2: 'Barra de datos verde',\r\n        solidColorDataBar_3: 'Barra de datos roja',\r\n        solidColorDataBar_4: 'Barra de datos naranja',\r\n        solidColorDataBar_5: 'Barra de datos azul claro',\r\n        solidColorDataBar_6: 'Barra de datos p\u00FArpura',\r\n        colorGradation: 'Degradado de color',\r\n        colorGradation_1: 'Gradaci\u00F3n de color verde-amarillo-rojo',\r\n        colorGradation_2: 'Gradaci\u00F3n de color rojo-amarillo-verde',\r\n        colorGradation_3: 'Gradaci\u00F3n de color verde-blanco-rojo',\r\n        colorGradation_4: 'Gradaci\u00F3n de color rojo-blanco-verde',\r\n        colorGradation_5: 'Gradaci\u00F3n de color azul-blanco-rojo',\r\n        colorGradation_6: 'Gradaci\u00F3n de color rojo-blanco-azul',\r\n        colorGradation_7: 'Gradaci\u00F3n de color blanco-rojo',\r\n        colorGradation_8: 'Gradaci\u00F3n de color rojo-blanco',\r\n        colorGradation_9: 'Gradaci\u00F3n de color verde-blanco',\r\n        colorGradation_10: 'Gradaci\u00F3n de color blanco-verde',\r\n        colorGradation_11: 'Gradaci\u00F3n de color verde-amarillo',\r\n        colorGradation_12: 'Gradaci\u00F3n de color amarillo-verde',\r\n        icons: 'iconos',\r\n        pleaseSelectIcon: 'Haz clic para seleccionar un grupo de iconos:',\r\n        cellValue: 'Valor de celda',\r\n        specificText: 'Texto espec\u00EDfico',\r\n        occurrence: 'Fecha',\r\n        greaterThan: 'Mayor que',\r\n        lessThan: 'Menor que',\r\n        between: 'Entre',\r\n        equal: 'Igual',\r\n        in: 'En',\r\n        between2: '',\r\n        contain: 'Contiene',\r\n        textContains: 'Texto contiene',\r\n        duplicateValue: 'Valor duplicado',\r\n        uniqueValue: 'Valor Unico',\r\n        top: 'Mejor',\r\n        top10: '10 mejores',\r\n        top10_percent: '10% mejores',\r\n        last: 'Ultimo',\r\n        last10: 'Ultimos 10',\r\n        last10_percent: 'Ultimos 10%',\r\n        oneself: '',\r\n        above: 'Encima',\r\n        aboveAverage: 'Encima media',\r\n        below: 'Debajo',\r\n        belowAverage: 'Debajo media',\r\n        all: 'Todos',\r\n        yesterday: 'A\u00F1o a fecha',\r\n        today: 'Hoy',\r\n        tomorrow: 'Ma\u00F1ana',\r\n        lastWeek: 'Ultima semana',\r\n        thisWeek: 'Esta semana',\r\n        lastMonth: 'Ultimo mes',\r\n        thisMonth: 'Este mes',\r\n        lastYear: 'Ultimo a\u00F1o',\r\n        thisYear: 'Este a\u00F1o',\r\n        last7days: 'Ultimos 7 d\u00EDas',\r\n        last30days: 'Ultimos 30 d\u00EDas',\r\n        next7days: 'Siguientes 7 d\u00EDas',\r\n        next30days: 'Siguientes 30 d\u00EDas',\r\n        next60days: 'Siguientes 60 d\u00EDas',\r\n        chooseRuleType: 'Elige el tipo de regla',\r\n        editRuleDescription: 'Editar descripci\u00F3n de regla',\r\n        newFormatRule: 'Nueva regla de formato',\r\n        editFormatRule: 'Editar regla de formato',\r\n        formatStyle: 'Estilo',\r\n        fillType: 'Rellenar',\r\n        color: 'Color',\r\n        twocolor: 'Dos colores',\r\n        tricolor: 'Tricolor',\r\n        multicolor: 'Multi color',\r\n        grayColor: 'Color gris',\r\n        gradient: 'Gradiente',\r\n        solid: 'S\u00F3lido',\r\n        maxValue: 'Valor m\u00E1ximo',\r\n        medianValue: 'Valor mediano',\r\n        minValue: 'Valor m\u00EDnimo',\r\n        direction: 'Direcci\u00F3n',\r\n        threeWayArrow: 'Flecha de tres direcciones',\r\n        fourWayArrow: 'Flecha de cuatro direcciones',\r\n        fiveWayArrow: 'Flecha de cinco direcciones',\r\n        threeTriangles: 'Tres tri\u00E1ngulos',\r\n        shape: 'Forma',\r\n        threeColorTrafficLight: 'Sem\u00E1foro de tres colores',\r\n        fourColorTrafficLight: 'Sem\u00E1foro de cuatro colores',\r\n        threeSigns: 'Tres signos',\r\n        greenRedBlackGradient: 'Gradiente verde-rojo-negro',\r\n        rimless: 'Sin aros',\r\n        bordered: 'Bordeado',\r\n        mark: 'Marcar',\r\n        threeSymbols: 'Tres s\u00EDmbolos',\r\n        tricolorFlag: 'Bandera tricolor',\r\n        circled: 'Rodeado',\r\n        noCircle: 'Sin c\u00EDrculo',\r\n        grade: 'Grado',\r\n        grade4: '4 Grado',\r\n        grade5: '5 Grado',\r\n        threeStars: '3 Estrellas',\r\n        fiveQuadrantDiagram: 'Diagrama de cinco cuadrantes',\r\n        fiveBoxes: '5 Cajas',\r\n    },\r\n    dataVerification: {\r\n        cellRange: 'Rango celdas',\r\n        selectCellRange: 'Haz clic para seleccionar un rango de celdas',\r\n        selectCellRange2: 'Selecciona un rango de celdas',\r\n        verificationCondition: 'Condici\u00F3n de verificaci\u00F3n',\r\n        allowMultiSelect: \"Permitir selecci\u00F3n m\u00FAltiple\",\r\n        dropdown: 'lista desplegable',\r\n        checkbox: 'Casilla de verificaci\u00F3n',\r\n        number: 'N\u00FAmero',\r\n        number_integer: 'N\u00FAmero entero',\r\n        number_decimal: 'N\u00FAmero decimal',\r\n        text_content: 'Contenido texto',\r\n        text_length: 'Longitud texto',\r\n        date: 'Fecha',\r\n        validity: 'Eficacia',\r\n        placeholder1: 'Introduce las opciones, separadas por comas, como 1,2,3,4,5',\r\n        placeholder2: 'Introduce contenido',\r\n        placeholder3: 'Valor num\u00E9rico, como 10',\r\n        placeholder4: 'Introduce el texto especificado',\r\n        placeholder5: 'Introduce el mensaje que se muestra cuando se selecciona la celda',\r\n        selected: 'Seleccionado',\r\n        notSelected: 'No seleccionado',\r\n        between: 'Entre',\r\n        notBetween: 'No entre',\r\n        equal: 'Iqual',\r\n        notEqualTo: 'No iqual a',\r\n        moreThanThe: 'M\u00E1s que el',\r\n        lessThan: 'Menos que',\r\n        greaterOrEqualTo: 'Mayor o igual a',\r\n        lessThanOrEqualTo: 'Menor o igual a',\r\n        include: 'Incluir',\r\n        exclude: 'Excluir',\r\n        earlierThan: 'Antes de',\r\n        noEarlierThan: 'No antes de',\r\n        laterThan: 'Despu\u00E9s de',\r\n        noLaterThan: 'No despu\u00E9s de',\r\n        identificationNumber: 'N\u00FAmero de identificaci\u00F3n',\r\n        phoneNumber: 'N\u00FAmero de tel\u00E9fono',\r\n        remote: 'Opci\u00F3n de adquisici\u00F3n remota autom\u00E1tica',\r\n        prohibitInput: 'Prohibir la entrada cuando los datos de entrada no son v\u00E1lidos',\r\n        hintShow: 'Mostrar mensaje cuando se selecciona la celda',\r\n        deleteVerification: 'Eliminar verificaci\u00F3n',\r\n        tooltipInfo1: 'La opci\u00F3n de la lista desplegable no puede estar vac\u00EDa',\r\n        tooltipInfo2: 'El contenido de la casilla de verificaci\u00F3n no puede estar vac\u00EDo',\r\n        tooltipInfo3: 'El valor ingresado no es un tipo num\u00E9rico',\r\n        tooltipInfo4: 'El segundo valor no puede ser menor que el primero',\r\n        tooltipInfo5: 'El contenido del texto no puede estar vac\u00EDo',\r\n        tooltipInfo6: 'El valor ingresado no es una fecha',\r\n        tooltipInfo7: 'La segunda fecha no puede ser menor que la primera',\r\n        textlengthInteger: 'La longitud del texto debe ser un entero mayor o igual a 0',\r\n    },\r\n    formula:{\r\n        sum:\"Suma\",\r\n        average:\"Media\",\r\n        count:\"Contar\",\r\n        max:\"M\u00E1x\",\r\n        min:\"M\u00EDn\",\r\n        ifGenerate:\"Generador de f\u00F3rmula SI\",\r\n        find:\"Aprender m\u00E1s\",\r\n\r\n        tipNotBelongToIf: \"\u00A1Esta funci\u00F3n de celda no pertenece a la f\u00F3rmula SI!\",\r\n        tipSelectCell: \"Selecciona la celda para insertar la funci\u00F3n\",\r\n\r\n        ifGenCompareValueTitle:\"Valor de comparaci\u00F3n\",\r\n        ifGenSelectCellTitle:\"Haz click para seleccionar una celda\",\r\n        ifGenRangeTitle:\"Rango\",\r\n        ifGenRangeTo:\"a\",\r\n        ifGenRangeEvaluate:\"Evaluar rango\",\r\n        ifGenSelectRangeTitle:\"Haz click para seleccionar rango\",\r\n        ifGenCutWay:\"Forma particionado\",\r\n        ifGenCutSame:\"Mismo valor de particionado\",\r\n        ifGenCutNpiece:\"Particionar por N\",\r\n        ifGenCutCustom:\"Personalizado\",\r\n        ifGenCutConfirm:\"Confirma\",\r\n\r\n        ifGenTipSelectCell:\"Selecciona celdas\",\r\n        ifGenTipSelectCellPlace:\"Por favor selecciona celdas\",\r\n\r\n        ifGenTipSelectRange:\"Selecciona rango\",\r\n        ifGenTipSelectRangePlace:\"Por favor selecciona rango\",\r\n\r\n        ifGenTipNotNullValue:\"El valor de comparaci\u00F3n no puede ser vac\u00EDo!\",\r\n        ifGenTipLableTitile:\"Etiqueta\",\r\n        ifGenTipRangeNotforNull:\"El rango no puede quedar vac\u00EDo!\",\r\n        ifGenTipCutValueNotforNull:\"El valor de partici\u00F3n no puede ser vac\u00EDo!\",\r\n        ifGenTipNotGenCondition:\"No hay condiciones disponibles para la generaci\u00F3n!\",\r\n    },\r\n    formulaMore:{\r\n        valueTitle:\"Valor\",\r\n        tipSelectDataRange:\"Selecciona rango de datos\",\r\n        tipDataRangeTile:\"Rango de datos\",\r\n        findFunctionTitle:\"Funci\u00F3n de b\u00FAsqueda\",\r\n        tipInputFunctionName:\"Nombre o breve descripci\u00F3n de la funci\u00F3n\",\r\n\r\n        \"Array\":\"Vector\",\r\n        \"Database\":\"Base de datos\",\r\n        \"Date\":\"Fecha\",\r\n        \"Engineering\":\"Ingenier\u00EDa\",\r\n        \"Filter\":\"Filtro\",\r\n        \"Financial\":\"Financiero\",\r\n        \"luckysheet\":\"Luckysheet\",\r\n        \"other\":\"Otro\",\r\n        \"Logical\":\"L\u00F3gica\",\r\n        \"Lookup\":\"B\u00FAsqueda\",\r\n        \"Math\":\"Matem\u00E1tico\",\r\n        \"Operator\":\"Operadores\",\r\n        \"Parser\":\"Compilador\",\r\n        \"Statistical\":\"Estad\u00EDstico\",\r\n        \"Text\":\"Texto\",\r\n        \"dataMining\":\"Miner\u00EDa de datos\",\r\n\r\n        \"selectFunctionTitle\":\"Selecciona una funci\u00F3n\",\r\n        \"calculationResult\":\"Resultado\",\r\n\r\n        tipSuccessText:\"Exito\",\r\n        tipParamErrorText:\"Par\u00E1metro err\u00F3neo\",\r\n\r\n        \"helpClose\":\"Cerrar\",\r\n        \"helpCollapse\":\"Recoger\",\r\n        \"helpExample\":\"Ejemplo\",\r\n        \"helpAbstract\":\"Resumen\",\r\n\r\n        \"execfunctionError\":'Error en la f\u00F3rmula',\r\n        \"execfunctionSelfError\":'La f\u00F3rmula no puede hacer referencia a su propia celda',\r\n        \"execfunctionSelfErrorResult\":'La f\u00F3rmula no puede hacer referencia a su propia celda, lo que dar\u00E1 lugar a resultados de c\u00E1lculo inexactos',\r\n\r\n        \"allowRepeatText\":\"Repetir\",\r\n        \"allowOptionText\":\"Opci\u00F3n\",\r\n\r\n        \"selectCategory\":\"O selecciona una categor\u00EDa\",\r\n    },\r\n    drag:{\r\n        noMerge: \"No se puede realizar esta operaci\u00F3n en celdas combinadas\",\r\n        afectarPivot: \"\u00A1Este cambio no se puede realizar en la celda seleccionada porque afectar\u00E1 a la tabla din\u00E1mica!\",\r\n        noMulti: \"No se puede realizar esta operaci\u00F3n en varias \u00E1reas de selecci\u00F3n, selecciona una sola \u00E1rea\",\r\n        noPaste: \"No se puede pegar este contenido aqu\u00ED, selecciona una celda en el \u00E1rea de pegado e intenta pegar nuevamente\",\r\n        noPartMerge: \"No se puede realizar esta operaci\u00F3n en celdas parcialmente fusionadas\",\r\n\r\n        inputCorrect:\"Introduce el valor correcto\",\r\n        notLessOne:\"El n\u00FAmero de filas y columnas no puede ser inferior a 1\",\r\n        offsetColumnLessZero:\"\u00A1La columna de desplazamiento no puede ser negativa!\",\r\n\r\n        pasteMustKeybordAlert:\"\u5728\u8868\u683C\u4E2D\u8FDB\u884C\u590D\u5236\u7C98\u8D34: Ctrl + C \u8FDB\u884C\u590D\u5236, Ctrl + V \u8FDB\u884C\u7C98\u8D34, Ctrl + X \u8FDB\u884C\u526A\u5207\",\r\n        pasteMustKeybordAlertHTMLTitle:\"\u5728\u8868\u683C\u4E2D\u8FDB\u884C\u590D\u5236\u7C98\u8D34\",\r\n        pasteMustKeybordAlertHTML:\"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;\u8FDB\u884C\u590D\u5236<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;\u8FDB\u884C\u7C98\u8D34<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;\u8FDB\u884C\u526A\u5207\",\r\n    },\r\n    pivotTable:{\r\n        title:\"Tabla Din\u00E1mica\",\r\n        closePannel:\"Cerrar\",\r\n        editRange:\"Rango\",\r\n        tipPivotFieldSelected:\"Selecciona los campos\",\r\n        tipClearSelectedField:\"Limpiar todos los campos\",\r\n        btnClearSelectedField:\"Limpiar\",\r\n        btnFilter:\"Filtrar\",\r\n        titleRow:\"Fila\",\r\n        titleColumn:\"Columna\",\r\n        titleValue:\"Valor\",\r\n        tipShowColumn: \"Los campos de estad\u00EDsticas se muestran como columnas\",\r\n        tipShowRow: \"Los campos de estad\u00EDsticas se muestran como filas\",\r\n\r\n        titleSelectionDataRange:\"Selecciona rango\",\r\n        titleDataRange:\"Rango de datos\",\r\n\r\n        valueSum:\"SUMA\",\r\n\r\n        valueStatisticsSUM:\"Suma\",\r\n        valueStatisticsCOUNT:\"Contar\",\r\n        valueStatisticsCOUNTA:\"Contar A\",\r\n        valueStatisticsCOUNTUNIQUE:\"Contar Distintos\",\r\n        valueStatisticsAVERAGE:\"Media\",\r\n        valueStatisticsMAX:\"M\u00E1x\",\r\n        valueStatisticsMIN:\"M\u00EDn\",\r\n        valueStatisticsMEDIAN:\"Mediana\",\r\n        valueStatisticsPRODUCT:\"Producto\",\r\n        valueStatisticsSTDEV:\"Desviaci\u00F3n Est\u00E1ndar\",\r\n\r\n        valueStatisticsSTDEVP:\"Stdevp\",\r\n        valueStatisticslet:\"Varianza\",\r\n        valueStatisticsVARP:\"VarP\",\r\n\r\n        errorNotAllowEdit: \"\u00A1Esta operaci\u00F3n est\u00E1 prohibida en el modo sin edici\u00F3n!\",\r\n        errorNotAllowMulti: \"No se puede realizar esta operaci\u00F3n en varias \u00E1reas de selecci\u00F3n, selecciona un solo rango y vuelve a intentarlo\",\r\n        errorSelectRange: \"Seleccione el rango de la nueva tabla din\u00E1mica\",\r\n        errorIsDamage: \"\u00A1Los datos de origen de esta tabla din\u00E1mica est\u00E1n da\u00F1ados!\",\r\n        errorNotAllowPivotData: \"\u00A1No se puede seleccionar la tabla din\u00E1mica como datos de origen!\",\r\n        errorSelectionRange: \"\u00A1La selecci\u00F3n fall\u00F3, rango de entrada incorrecto!\",\r\n        errorIncreaseRange: \"\u00A1Por favor, expande el rango seleccionado!\",\r\n\r\n        titleAddColumn:\"A\u00F1adir columna a la tabla din\u00E1mica\",\r\n        titleMoveColumn:\"Muever la columna a la celda en blanco de abajo\",\r\n        titleClearColumnFilter:\"Quitar el filtro de esta columna\",\r\n        titleFilterColumn:\"Filtro\",\r\n\r\n        titleSort:\"Ordenar\",\r\n        titleNoSort:\"No Ordenar\",\r\n        titleSortAsc:\"ASC\",\r\n        titleSortDesc:\"DESC\",\r\n        titleSortBy:\"Ordenar por\",\r\n        titleShowSum:\"Mostrar total\",\r\n        titleStasticTrue:\"S\u00ED\",\r\n        titleStasticFalse:\"No\",\r\n    },\r\n    dropCell:{\r\n        copyCell:\"Copiar\",\r\n        sequence:\"Secuencia\",\r\n        onlyFormat:\"Solo formato\",\r\n        noFormat:\"Sin formato\",\r\n        day:\"D\u00EDa\",\r\n        workDay:\"D\u00EDa Laborable\",\r\n        month:\"Mes\",\r\n        year:\"A\u00F1o\",\r\n        chineseNumber:\"N\u00FAmeros Chinos\",\r\n    },\r\n    imageCtrl:{\r\n        borderTile:\"Color de borde de imagen\",\r\n        borderCur:\"Color\",\r\n    },\r\n    protection:{\r\n        protectiontTitle:\"Protecci\u00F3n\",\r\n        enterPassword:\"Introduce una contrase\u00F1a (opcional)\",\r\n        enterHintTitle:\"Preguntar cuando la edici\u00F3n est\u00E1 prohibida (opcional)\",\r\n        enterHint:\"La celda o el gr\u00E1fico que est\u00E1s intentando cambiar se encuentra en una hoja de trabajo protegida. Si quieres cambiarlo, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contrase\u00F1a\",\r\n        swichProtectionTip:\"Protege la hoja y el contenido de las celdas bloqueadas\",\r\n        authorityTitle:\"Permitir a los usuarios de esta hoja:\",\r\n        selectLockedCells:\"Selecciona celdas bloqueadas\",\r\n        selectunLockedCells:\"Selecciona celdas desbloqueadas\",\r\n        formatCells:\"Formatear celdas\",\r\n        formatColumns:\"Formatear columnas\",\r\n        formatRows:\"Formatear filas\",\r\n        insertColumns:\"Insertar columnas\",\r\n        insertRows:\"Insertar filas\",\r\n        insertHyperlinks:\"Insertar enlaces\",\r\n        deleteColumns:\"Eliminar columnas\",\r\n        deleteRows:\"Eliminar filas\",\r\n        sort:\"Ordenar\",\r\n        filter:\"Filtrar\",\r\n        usePivotTablereports:\"Usar informes de tabla din\u00E1mica\",\r\n        editObjects:\"Editar objetos\",\r\n        editScenarios:\"Editar escenarios\",\r\n\r\n        allowRangeTitle:\"Permitir a los usuarios del rango:\",\r\n        allowRangeAdd:\"Nuevo...\",\r\n\r\n        allowRangeAddTitle:\"T\u00EDtulo\",\r\n        allowRangeAddSqrf:\"Referencia\",\r\n        selectCellRange: 'Haz clic para seleccionar un rango de celdas',\r\n        selectCellRangeHolder:\"Rango de celdas\",\r\n        allowRangeAddTitlePassword:\"Contrase\u00F1a\",\r\n        allowRangeAddTitleHint:\"Pregunta\",\r\n        allowRangeAddTitleHintTitle:\"Preguntar cuando hay una contrase\u00F1a (opcional)\",\r\n        allowRangeAddtitleDefault:\"Nombre del rango de entrada\",\r\n\r\n        rangeItemDblclick:\"Haz doble clic para editar\",\r\n        rangeItemHasPassword:\"Tiene contrase\u00F1a\",\r\n\r\n        rangeItemErrorTitleNull:\"El t\u00EDtulo es nulo\",\r\n        rangeItemErrorRangeNull:\"La referencia es nula\",\r\n        rangeItemErrorRange:\"La reference tiene un error\",\r\n\r\n        validationTitle:\"Validaci\u00F3n de contrase\u00F1a\",\r\n        validationTips:\"Hay que ingresar una contrase\u00F1a para desbloquear la protecci\u00F3n de la hoja de trabajo\",\r\n        validationInputHint:\"Introduce una contrase\u00F1a\",\r\n\r\n        checkPasswordNullalert:\"Contrase\u00F1a requerida!\",\r\n        checkPasswordWrongalert:\"\u00A1Contrase\u00F1a incorrecta. Por favor, prueba de nuevo!\",\r\n\r\n        checkPasswordSucceedalert:\"Desbloqueo conseguido!\",\r\n        defaultRangeHintText:\"La celda est\u00E1 protegida con contrase\u00F1a.\",\r\n        defaultSheetHintText:\"La celda o el gr\u00E1fico est\u00E1n en una hoja de trabajo protegida. Para realizar cambios, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contrase\u00F1a\",\r\n    },\r\n    cellFormat:{\r\n        cellFormatTitle:\"Formatear celdas\",\r\n        protection:\"Protecci\u00F3n\",\r\n        locked:\"Bloqueado\",\r\n        hidden:\"Escondido\",\r\n        protectionTips:\"Para bloquear celdas u ocultar f\u00F3rmulas, protege la hoja de trabajo. En la barra de herramientas, haz clic en el bot\u00F3n Proteger hoja\",\r\n        tipsPart:\"Comprobado parcial\",\r\n        tipsAll:\"Todo seleccionado\",\r\n\r\n        selectionIsNullAlert:\"Se requiere una selecci\u00F3n!\",\r\n        sheetDataIsNullAlert:\"error, no hay datos!\",\r\n\r\n    },\r\n    print:{\r\n        normalBtn:\"Normal\",\r\n        layoutBtn:\"Disposici\u00F3n de p\u00E1gina\",\r\n        pageBtn:\"Previsualizaci\u00F3n de saltos de p\u00E1gina\",\r\n\r\n        menuItemPrint:\"Imprimir (Ctrl+P)\",\r\n        menuItemAreas:\"Imprimir \u00E1reas\",\r\n        menuItemRows:\"Imprimir t\u00EDtulos de filas\",\r\n        menuItemColumns:\"Imprimir t\u00EDtulos de columnas\",\r\n    },\r\n    edit:{\r\n        typing:\"mecanograf\u00EDa\",\r\n    },\r\n    websocket:{\r\n        success: '\u00C9xito de la conexi\u00F3n de WebSocket',\r\n        refresh: 'Se produjo un error en la conexi\u00F3n de WebSocket, \u00A1actualice la p\u00E1gina!',\r\n        wait: 'Se produjo un error en la conexi\u00F3n de WebSocket, \u00A1tenga paciencia!',\r\n        close: 'Conexi\u00F3n WebSocket cerrada',\r\n        contact: 'Ocurri\u00F3 un error de comunicaci\u00F3n con el servidor, actualice la p\u00E1gina y vuelva a intentarlo; de lo contrario, comun\u00EDquese con el administrador.',\r\n        support: 'El navegador actual no es compatible con WebSocket',\r\n    }\r\n  };", "export default {\r\n    functionlist: [{\r\n        'n': 'SUMIF',\r\n        't': 0,\r\n        'd': '\u5C0D\u7BC4\u570D\u4E2D\u7B26\u5408\u6307\u5B9A\u689D\u4EF6\u7684\u503C\u6C42\u548C\u3002',\r\n        'a': '\u5C0D\u7BC4\u570D\u4E2D\u7B26\u5408\u6307\u5B9A\u689D\u4EF6\u7684\u503C\u6C42\u548C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : '\u7BC4\u570D',\r\n            'detail' : '\u8981\u6839\u64DA\u689D\u4EF6\u9032\u884C\u6AA2\u6E2C\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u689D\u4EF6',\r\n            'detail' : '\u8981\u61C9\u7528\u65BC\u7BC4\u570D\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002\\n\\n\u5982\u679C\u7BC4\u570D\u5305\u542B\u7684\u662F\u8981\u6AA2\u6E2C\u7684\u6587\u5B57,\u5247\u689D\u4EF6\u5FC5\u9808\u70BA\u5B57\u4E32\u3002\u689D\u4EF6\u53EF\u4EE5\u5305\u542B\u842C\u7528\u5B57\u5143,\u5305\u62EC\u7528\u65BC\u5339\u914D\u55AE\u500B\u5B57\u5143\u7684\uFF1F\u6216\u7528\u65BC\u5339\u914D\u96F6\u500B\u6216\u9023\u7E8C\u591A\u500B\u5B57\u5143\u7684*\u3002\u8981\u5339\u914D\u554F\u865F\u661F\u865F\u672C\u8EAB,\u8ACB\u5728\u8A72\u5B57\u5143\u524D\u9762\u52A0\u4E0A\u6CE2\u6D6A\u865F\uFF08~\uFF09\u9996\u78BC\uFF08\u5373~\uFF1F\u548C~*\uFF09\u3002\u5B57\u4E32\u689D\u4EF6\u5FC5\u9808\u7528\u5F15\u865F\u62EC\u8D77\u4F86\u3002\u51FD\u6578\u6703\u6AA2\u67E5\u7BC4\u570D\u4E2D\u7684\u6BCF\u500B\u5132\u5B58\u683C\u8207\u689D\u4EF6\u662F\u5426\u76F8\u7B49\u6216\u5339\u914D\uFF08\u5982\u679C\u4F7F\u7528\u4E86\u842C\u7528\u5B57\u5143\uFF09\u3002\\n\\n\u5982\u679C\u7BC4\u570D\u5305\u542B\u7684\u662F\u8981\u6AA2\u6E2C\u7684\u6578\u4F4D,\u5247\u689D\u4EF6\u53EF\u4EE5\u662F\u5B57\u4E32\u4E5F\u53EF\u4EE5\u662F\u6578\u4F4D\u3002\u5982\u679C\u7D66\u5B9A\u7684\u689D\u4EF6\u662F\u4E00\u500B\u6578\u4F4D,\u5247\u6AA2\u67E5\u7BC4\u570D\u4E2D\u7684\u6BCF\u500B\u5132\u5B58\u683C\u662F\u5426\u7B49\u65BC\u689D\u4EF6\u3002\u53E6\u5916,\u689D\u4EF6\u4E5F\u53EF\u80FD\u662F\u5305\u542B\u6578\u4F4D\u7684\u5B57\u4E32\uFF08\u4E5F\u5C07\u5C0D\u5176\u9032\u884C\u76F8\u7B49\u6AA2\u6E2C\uFF09,\u6216\u8005\u5E36\u6709\u4EE5\u4E0B\u9996\u78BC\u7684\u6578\u4F4D:=\uFF08\u6AA2\u67E5\u662F\u5426\u76F8\u7B49\uFF09\u3001>\uFF08\u6AA2\u67E5\u7BC4\u570D\u5132\u5B58\u683C\u7684\u503C\u662F\u5426\u5927\u65BC\u689D\u4EF6\u503C\uFF09\u6216<\uFF08\u6AA2\u67E5\u7BC4\u570D\u5132\u5B58\u683C\u7684\u503C\u662F\u5426\u5C0F\u65BC\u689D\u4EF6\u503C\uFF09',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u6C42\u548C\u7BC4\u570D',\r\n            'detail' : '\u8981\u6C42\u548C\u7684\u7BC4\u570D\uFF08\u5982\u679C\u8207\u7BC4\u570D\u4E0D\u540C\uFF09\u3002',\r\n            'example': 'B1:B10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }]\r\n    }, {\r\n        'n': 'TAN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5DF2\u77E5\u89D2\u5EA6\u7684\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5DF2\u77E5\u89D2\u5EA6\u7684\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u89D2\u5EA6',\r\n            'detail' : '\u8981\u6C42\u5176\u6B63\u5207\u503C\u7684\u89D2\u5EA6,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': '45*PI()/180',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TANH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u96D9\u66F2\u6B63\u5207\u503C\u7684\u5BE6\u6578\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CEILING',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u6307\u5B9A\u56E0\u6578\u7684\u500D\u6578\u3002',\r\n        'a': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u6307\u5B9A\u56E0\u6578\u7684\u500D\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5411\u4E0A\u820D\u5165\u7684\u6578\u503C\u3002',\r\n            'example': '23.25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u56E0\u6578',\r\n            'detail' : '\u8981\u5C07\u503C\u820D\u5165\u5230\u6B64\u6578\u7684\u6574\u6578\u500D\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ATAN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u6B63\u5207\u503C,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u6B63\u5207\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u6B63\u5207\u503C\u7684\u6578\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ASINH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u96D9\u66F2\u6B63\u5F26\u503C\u7684\u6578\u503C\u3002',\r\n            'example': '0.9',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ABS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u7D55\u5C0D\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u7D55\u5C0D\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u7D55\u5C0D\u503C\u7684\u6578\u3002',\r\n            'example': '-2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACOS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u4F59\u5F26\u503C,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u4F59\u5F26\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u4F59\u5F26\u503C\u7684\u6578\u503C\u3002\u5FC5\u9808\u4ECB\u65BC-1\u548C1\u4E4B\u9593,\u5305\u62EC\u5169\u7AEF\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACOSH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u96D9\u66F2\u4F59\u5F26\u503C\u7684\u6578\u503C\u3002\u5FC5\u9808\u5927\u65BC\u7B49\u65BC1\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MULTINOMIAL',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u53C3\u6578\u548C\u7684\u968E\u4E58\u9664\u4EE5\u5404\u53C3\u6578\u968E\u4E58\u7684\u4E58\u7A4D\u5F8C\u5F97\u5230\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u53C3\u6578\u548C\u7684\u968E\u4E58\u9664\u4EE5\u5404\u53C3\u6578\u968E\u4E58\u7684\u4E58\u7A4D\u5F8C\u5F97\u5230\u7684\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7684\u7B2C\u4E00\u9805\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ATANH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u6B63\u5207\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u96D9\u66F2\u6B63\u5207\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u96D9\u66F2\u6B63\u5207\u503C\u7684\u6578\u503C\u3002\u5FC5\u9808\u4ECB\u65BC-1\u548C1\u4E4B\u9593\uFF08\u4E0D\u5305\u62EC-1\u548C1\uFF09\u3002',\r\n            'example': '0.9',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ATAN2',\r\n        't': 0,\r\n        'd': '\u4EE5\u5F27\u5EA6\u70BA\u7D44\u7E54\u8FD4\u56DEx\u8EF8\u8207\u5F9E\u539F\u9EDE\uFF080,0\uFF09\u5230\u6307\u5B9A\u5EA7\u6A19\u9EDE\uFF08`x`,`y`\uFF09\u4E4B\u9593\u9023\u7DDA\u7684\u593E\u89D2\u3002',\r\n        'a': '\u4EE5\u5F27\u5EA6\u70BA\u7D44\u7E54\u8FD4\u56DEx\u8EF8\u8207\u5F9E\u539F\u9EDE\uFF080,0\uFF09\u5230\u6307\u5B9A\u5EA7\u6A19\u9EDE\uFF08`x`,`y`\uFF09\u4E4B\u9593\u9023\u7DDA\u7684\u593E\u89D2\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u8207x\u8EF8\u593E\u89D2\u5927\u5C0F\u7684\u7DDA\u6BB5\u7684\u7D42\u9EDEx\u5EA7\u6A19\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'y',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u8207x\u8EF8\u593E\u89D2\u5927\u5C0F\u7684\u7DDA\u6BB5\u7684\u7D42\u9EDEy\u5EA7\u6A19\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTBLANK',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u7BC4\u570D\u5167\u7684\u7A7A\u5132\u5B58\u683C\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u7BC4\u570D\u5167\u7684\u7A7A\u5132\u5B58\u683C\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u7BC4\u570D',\r\n            'detail' : '\u8981\u7D71\u8A08\u7A7A\u767D\u5132\u5B58\u683C\u6578\u91CF\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:C100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }]\r\n    }, {\r\n        'n': 'COSH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u4F59\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u96D9\u66F2\u4F59\u5F26\u503C\u7684\u5BE6\u6578\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INT',\r\n        't': 0,\r\n        'd': '\u6578\u503C\u5411\u4E0B\u53D6\u6574\u70BA\u5C0F\u65BC\u6216\u7B49\u65BC\u8A72\u6578\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6578\u3002',\r\n        'a': '\u6578\u503C\u5411\u4E0B\u53D6\u6574\u70BA\u5C0F\u65BC\u6216\u7B49\u65BC\u8A72\u6578\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5411\u4E0B\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u6574\u6578\u7684\u6578\u503C\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ISEVEN',\r\n        't': 0,\r\n        'd': '\u6AA2\u67E5\u6240\u63D0\u4F9B\u7684\u6578\u503C\u662F\u5426\u70BA\u5076\u6578\u3002',\r\n        'a': '\u6AA2\u67E5\u6240\u63D0\u4F9B\u7684\u6578\u503C\u662F\u5426\u70BA\u5076\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u5076\u6578\u7684\u6578\u503C\u3002\\n\\n\u5982\u679C\u503C\u70BA\u5076\u6578\u6216\u6307\u5411\u5305\u542B\u5076\u6578\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,ISEVEN\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ISODD',\r\n        't': 0,\r\n        'd': '\u6AA2\u67E5\u6240\u63D0\u4F9B\u7684\u6578\u503C\u662F\u5426\u70BA\u5947\u6578\u3002',\r\n        'a': '\u6AA2\u67E5\u6240\u63D0\u4F9B\u7684\u6578\u503C\u662F\u5426\u70BA\u5947\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u5947\u6578\u7684\u6578\u503C\u3002\\n\\n\u5982\u679C\u503C\u70BA\u5947\u6578\u6216\u6307\u5411\u5305\u542B\u5947\u6578\u7684\u5132\u5B58\u683C,ISODD\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LCM',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u6216\u591A\u500B\u6574\u6578\u7684\u6700\u5C0F\u516C\u500D\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u6216\u591A\u500B\u6574\u6578\u7684\u6700\u5C0F\u516C\u500D\u6578\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8981\u5728\u6C42\u6700\u5C0F\u516C\u500D\u6578\u6578\u7684\u8A08\u7B97\u4E2D\u6AA2\u67E5\u5176\u56E0\u6578\u7684\u7B2C\u4E00\u9805\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u6C42\u6700\u5C0F\u516C\u500D\u6578\u6642\u8981\u8003\u616E\u5176\u56E0\u6578\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '3',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u4EE5e\uFF08\u6B50\u62C9\u6578\uFF09\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u4EE5e\uFF08\u6B50\u62C9\u6578\uFF09\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u4EE5e\u70BA\u5E95\u6578\u8A08\u7B97\u5176\u5C0D\u6578\u7684\u503C\u3002\\n\\n\u503C\u5FC5\u9808\u70BA\u6B63\u6578\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOG',\r\n        't': 0,\r\n        'd': '\u6839\u64DA\u6307\u5B9A\u5E95\u6578\u8FD4\u56DE\u6578\u4F4D\u7684\u5C0D\u6578\u3002',\r\n        'a': '\u6839\u64DA\u6307\u5B9A\u5E95\u6578\u8FD4\u56DE\u6578\u4F4D\u7684\u5C0D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u60F3\u8981\u8A08\u7B97\u5176\u5C0D\u6578\u7684\u6B63\u5BE6\u6578\u3002',\r\n            'example': '128',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u5E95\u6578',\r\n            'detail' : '[\u53EF\u9078] - \u5C0D\u6578\u7684\u5E95\u6578\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOG10',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u4EE510\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u4EE510\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u4EE510\u70BA\u5E95\u7684\u5C0D\u6578\u7684\u6578\u503C\u3002\\n\\n\u503C\u5FC5\u9808\u70BA\u6B63\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MOD',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5169\u6578\u76F8\u9664\u7684\u9918\u6578,\u7D50\u679C\u7684\u7B26\u865F\u8207\u9664\u6578\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u6578\u76F8\u9664\u7684\u9918\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u88AB\u9664\u6578',\r\n            'detail' : '\u8981\u5C07\u5176\u76F8\u9664\u4EE5\u5F97\u5230\u9918\u6578\u7684\u6578\u503C\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u9664\u6578',\r\n            'detail' : '\u7528\u65BC\u9664\u5176\u4ED6\u6578\u7684\u6578\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MROUND',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u503C\u53D6\u6574\u70BA\u53E6\u4E00\u6574\u6578\u6700\u63A5\u8FD1\u7684\u6574\u6578\u500D\u3002',\r\n        'a': '\u5C07\u6578\u503C\u53D6\u6574\u70BA\u53E6\u4E00\u6574\u6578\u6700\u63A5\u8FD1\u7684\u6574\u6578\u500D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u53D6\u6574\u70BA\u53E6\u4E00\u6574\u6578\u6700\u63A5\u8FD1\u7684\u6574\u6578\u500D\u7684\u6578\u503C\u3002',\r\n            'example': '21',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u56E0\u6578',\r\n            'detail' : '\u503C\u5C07\u53D6\u6B64\u56E0\u6578\u7684\u6574\u6578\u500D\u3002',\r\n            'example': '14',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ODD',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u5947\u6574\u6578\u3002',\r\n        'a': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u5947\u6574\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5411\u4E0A\u53D6\u6574\u7684\u6578\u503C,\u53D6\u6574\u503C\u70BA\u5927\u65BC\u6B64\u503C\u7684\u6700\u63A5\u8FD1\u7684\u5947\u6578\u3002\\n\\n\u5982\u679C\u503C\u70BA\u8CA0\u6578,\u5247\u5C07\u5176\u53D6\u6574\u70BA\u7D55\u5C0D\u503C\u5927\u65BC\u8A72\u503C\u7684\u76F8\u9130\u8CA0\u5947\u6578',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMSQ',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u7D44\u6578\u503C\u548C/\u6216\u5132\u5B58\u683C\u7684\u5E73\u65B9\u7E3D\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7D44\u6578\u503C\u548C/\u6216\u5132\u5B58\u683C\u7684\u5E73\u65B9\u7E3D\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8981\u5C07\u5176\u5E73\u65B9\u76F8\u52A0\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u5C07\u5176\u5E73\u65B9\u8207\u503C1\u7684\u5E73\u65B9\u76F8\u52A0\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COMBIN',\r\n        't': 0,\r\n        'd': '\u7D66\u5B9A\u96C6\u5408\u4E2D\u7684\u5C0D\u8C61\u7E3D\u6578\u548C\u8981\u9078\u64C7\u7684\u5C0D\u8C61\u6578\u91CF,\u8FD4\u56DE\u5171\u6709\u591A\u5C11\u7A2E\u4E0D\u540C\u9078\u64C7\u7BA1\u9053\u3002',\r\n        'a': '\u7D66\u5B9A\u96C6\u5408\u4E2D\u7684\u5C0D\u8C61\u7E3D\u6578\u548C\u8981\u9078\u64C7\u7684\u5C0D\u8C61\u6578\u91CF',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'n',\r\n            'detail' : '\u8981\u5F9E\u4E2D\u9032\u884C\u9078\u64C7\u7684\u5C0D\u8C61\u96C6\u5408\u7684\u5927\u5C0F\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'k',\r\n            'detail' : '\u8981\u9078\u64C7\u7684\u5C0D\u8C61\u6578\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUM',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u7D44\u6578\u503C\u548C/\u6216\u5132\u5B58\u683C\u7684\u7E3D\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7D44\u6578\u503C\u548C/\u6216\u5132\u5B58\u683C\u7684\u7E3D\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8981\u76F8\u52A0\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u76F8\u52A0\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'SUBTOTAL',\r\n        't': 0,\r\n        'd': '\u4F7F\u7528\u6307\u5B9A\u7684\u532F\u7E3D\u51FD\u6578,\u8FD4\u56DE\u4E00\u7CFB\u5217\u7E31\u5411\u5132\u5B58\u683C\u7684\u5206\u985E\u532F\u7E3D\u3002',\r\n        'a': '\u4F7F\u7528\u6307\u5B9A\u7684\u532F\u7E3D\u51FD\u6578',\r\n        'm': [2, 256],\r\n        'p': [{\r\n            'name'   : '\u51FD\u6578\u7A0B\u5F0F\u78BC',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u5206\u985E\u532F\u7E3D\u7684\u51FD\u6578\u3002\\n\\n1\u4EE3\u8868AVERAGE\\n\\n2\u4EE3\u8868COUNT\\n\\n3\u4EE3\u8868COUNTA\\n\\n4\u4EE3\u8868MAX\\n\\n5\u4EE3\u8868MIN\\n\\n6\u4EE3\u8868PRODUCT\\n\\n7\u4EE3\u8868STDEV\\n\\n8\u4EE3\u8868STDEVP\\n\\n9\u4EE3\u8868SUM\\n\\n10\u4EE3\u8868VAR\\n\\n11\u4EE3\u8868VARP\\n\\n\u901A\u904E\u5728\u9019\u4E9B2\u4F4D\u7A0B\u5F0F\u78BC\u524D\u9644\u52A010\uFF08\u5C0D\u65BC1\u4F4D\u7A0B\u5F0F\u78BC\uFF09\u62161\uFF08\u5C0D\u65BC2\u4F4D\u7A0B\u5F0F\u78BC\uFF09,\u53EF\u4EE5\u5C07\u96B1\u85CF\u503C\u5FFD\u7565\u3002\u4F8B\u5982,102\u4EE3\u8868\u5FFD\u7565\u96B1\u85CF\u5132\u5B58\u683C\u7684COUNT,\u800C110\u5247\u4EE3\u8868\u5FFD\u7565\u96B1\u85CF\u503C\u7684VAR\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u7BC4\u570D1',\r\n            'detail' : '\u8981\u8A08\u7B97\u5206\u985E\u532F\u7E3D\u7684\u7B2C\u4E00\u500B\u7BC4\u570D\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u7BC4\u570D2',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u8A08\u7B97\u5206\u985E\u532F\u7E3D\u7684\u5176\u4ED6\u7BC4\u570D\u3002',\r\n            'example': 'B2:B8',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'range'\r\n        }]\r\n    }, {\r\n        'n': 'ASIN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u6B63\u5F26\u503C,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u53CD\u6B63\u5F26\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u53CD\u6B63\u5F26\u503C\u7684\u6578\u503C\u3002\u5FC5\u9808\u4ECB\u65BC-1\u548C1\u4E4B\u9593,\u5305\u62EC\u5169\u7AEF\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTIF',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u7BC4\u570D\u5167\u6EFF\u8DB3\u67D0\u500B\u689D\u4EF6\u7684\u5132\u5B58\u683C\u7684\u6578\u91CF\u3002',\r\n        'a': '\u8FD4\u56DE\u7BC4\u570D\u5167\u6EFF\u8DB3\u67D0\u500B\u689D\u4EF6\u7684\u5132\u5B58\u683C\u7684\u6578\u91CF\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u7BC4\u570D',\r\n            'detail' : '\u8981\u6839\u64DA\u689D\u4EF6\u9032\u884C\u6AA2\u6E2C\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u689D\u4EF6',\r\n            'detail' : '\u8981\u61C9\u7528\u65BC\u7BC4\u570D\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002\\n\\n\u5982\u679C\u7BC4\u570D\u5305\u542B\u7684\u662F\u8981\u6AA2\u6E2C\u7684\u6587\u5B57,\u5247\u689D\u4EF6\u5FC5\u9808\u70BA\u5B57\u4E32\u3002\u689D\u4EF6\u53EF\u4EE5\u5305\u542B\u842C\u7528\u5B57\u5143,\u5305\u62EC\u7528\u65BC\u5339\u914D\u55AE\u500B\u5B57\u5143\u7684\uFF1F\u6216\u7528\u65BC\u5339\u914D\u96F6\u500B\u6216\u9023\u7E8C\u591A\u500B\u5B57\u5143\u7684*\u3002\u8981\u5339\u914D\u554F\u865F\u661F\u865F\u672C\u8EAB,\u8ACB\u5728\u8A72\u5B57\u5143\u524D\u9762\u52A0\u4E0A\u6CE2\u6D6A\u865F\uFF08~\uFF09\u9996\u78BC\uFF08\u5373~\uFF1F\u548C~*\uFF09\u3002\u5B57\u4E32\u689D\u4EF6\u5FC5\u9808\u7528\u5F15\u865F\u62EC\u8D77\u4F86\u3002\u51FD\u6578\u6703\u6AA2\u67E5\u7BC4\u570D\u4E2D\u7684\u6BCF\u500B\u5132\u5B58\u683C\u8207\u689D\u4EF6\u662F\u5426\u76F8\u7B49\u6216\u5339\u914D\uFF08\u5982\u679C\u4F7F\u7528\u4E86\u842C\u7528\u5B57\u5143\uFF09\u3002\\n\\n\u5982\u679C\u7BC4\u570D\u5305\u542B\u7684\u662F\u8981\u6AA2\u6E2C\u7684\u6578\u4F4D,\u5247\u689D\u4EF6\u53EF\u4EE5\u662F\u5B57\u4E32\u4E5F\u53EF\u4EE5\u662F\u6578\u4F4D\u3002\u5982\u679C\u7D66\u5B9A\u7684\u689D\u4EF6\u662F\u4E00\u500B\u6578\u4F4D,\u5247\u6AA2\u67E5\u7BC4\u570D\u4E2D\u7684\u6BCF\u500B\u5132\u5B58\u683C\u662F\u5426\u7B49\u65BC\u689D\u4EF6\u3002\u53E6\u5916,\u689D\u4EF6\u4E5F\u53EF\u80FD\u662F\u5305\u542B\u6578\u4F4D\u7684\u5B57\u4E32\uFF08\u4E5F\u5C07\u5C0D\u5176\u9032\u884C\u76F8\u7B49\u6AA2\u6E2C\uFF09,\u6216\u8005\u5E36\u6709\u4EE5\u4E0B\u9996\u78BC\u7684\u6578\u4F4D:=\u3001>\u3001>=\u3001<\u6216<=,\u9019\u4E9B\u689D\u4EF6\u5C07\u5206\u5225\u7528\u65BC\u6AA2\u67E5\u7BC4\u570D\u4E2D\u7684\u5132\u5B58\u683C\u662F\u5426\u7B49\u65BC\u3001\u5927\u65BC\u3001\u5927\u65BC\u7B49\u65BC\u3001\u5C0F\u65BC\u3001\u5C0F\u65BC\u7B49\u65BC\u689D\u4EF6\u503C\u3002',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RADIANS',\r\n        't': 0,\r\n        'd': '\u5C07\u4EE5\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F49\u63DB\u70BA\u5F27\u5EA6\u3002',\r\n        'a': '\u5C07\u4EE5\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F49\u63DB\u70BA\u5F27\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u89D2\u5EA6',\r\n            'detail' : '\u8981\u5F9E\u5EA6\u8F49\u63DB\u70BA\u5F27\u5EA6\u7684\u89D2\u5EA6\u3002',\r\n            'example': '180',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RAND',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u4ECB\u65BC0\u548C1\u4E4B\u9593\uFF08\u5305\u62EC0\u4F46\u4E0D\u5305\u62EC1\uFF09\u7684\u4E82\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u4ECB\u65BC0\u548C1\u4E4B\u9593\uFF08\u5305\u62EC0\u4F46\u4E0D\u5305\u62EC1\uFF09\u7684\u4E82\u6578\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'COUNTUNIQUE',\r\n        't': 0,\r\n        'd': '\u8A08\u7B97\u4E00\u5217\u6307\u5B9A\u503C\u548C\u7BC4\u570D\u4E2D\u4E0D\u91CD\u8907\u6578\u503C\u7684\u500B\u6578\u3002',\r\n        'a': '\u8A08\u7B97\u4E00\u5217\u6307\u5B9A\u503C\u548C\u7BC4\u570D\u4E2D\u4E0D\u91CD\u8907\u6578\u503C\u7684\u500B\u6578\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8981\u6AA2\u67E5\u5176\u662F\u5426\u552F\u4E00\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A1:C100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u6AA2\u67E5\u662F\u5426\u552F\u4E00\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DEGREES',\r\n        't': 0,\r\n        'd': '\u5C07\u4EE5\u5F27\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F49\u63DB\u70BA\u5EA6\u3002',\r\n        'a': '\u5C07\u4EE5\u5F27\u5EA6\u8868\u793A\u7684\u89D2\u5EA6\u503C\u8F49\u63DB\u70BA\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u89D2\u5EA6',\r\n            'detail' : '\u8981\u5F9E\u5F27\u5EA6\u8F49\u63DB\u70BA\u5EA6\u7684\u89D2\u5EA6\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ERFC',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u4E92\u88DC\u9AD8\u65AF\u8AA4\u5DEE\u51FD\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u4E92\u88DC\u9AD8\u65AF\u8AA4\u5DEE\u51FD\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'z',\r\n            'detail' : '\u8981\u70BA\u5176\u8A08\u7B97\u4E92\u88DC\u9AD8\u65AF\u8AA4\u5DEE\u51FD\u6578\u7684\u6578\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EVEN',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u5076\u6574\u6578\u3002',\r\n        'a': '\u5C07\u6578\u503C\u5411\u4E0A\u53D6\u6574\u70BA\u6700\u63A5\u8FD1\u7684\u5076\u6574\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5411\u4E0A\u53D6\u6574\u7684\u6578\u503C,\u53D6\u6574\u503C\u70BA\u5927\u65BC\u6B64\u503C\u7684\u6700\u63A5\u8FD1\u7684\u5076\u6578\u3002\\n\\n\u5982\u679C\u503C\u70BA\u8CA0\u6578,\u5247\u5C07\u5176\u53D6\u6574\u70BA\u7D55\u5C0D\u503C\u5927\u65BC\u8A72\u503C\u7684\u76F8\u9130\u8CA0\u5076\u6578\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EXP',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6B50\u62C9\u6578e\uFF08~2.718\uFF09\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'a': '\u8FD4\u56DE\u6B50\u62C9\u6578e\uFF08~2.718\uFF09\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u6307\u6578',\r\n            'detail' : '\u6307\u5B9Ae\u7684\u81EA\u4E58\u5E42\u6B21\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FACT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u968E\u4E58\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u968E\u4E58\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u4E26\u8FD4\u56DE\u5176\u968E\u4E58\u7684\u6578\u4F4D\u6216\u5C0D\u6578\u4F4D\uFF08\u6240\u5728\u5132\u5B58\u683C\uFF09\u7684\u5F15\u7528\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FACTDOUBLE',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\"\u96D9\u968E\u4E58\"\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\"\u96D9\u968E\u4E58\"\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u4E26\u8FD4\u56DE\u5176\u96D9\u968E\u4E58\u7684\u6578\u4F4D\u6216\u5C0D\u6578\u4F4D\uFF08\u6240\u5728\u5132\u5B58\u683C\uFF09\u7684\u5F15\u7528\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PI',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5E36\u670914\u4F4D\u5C0F\u6578\u7684PI\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5E36\u670914\u4F4D\u5C0F\u6578\u7684PI\u503C\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'FLOOR',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u503C\u5411\u4E0B\u53D6\u6574\u70BA\u6307\u5B9A\u56E0\u6578\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6578\u500D\u3002',\r\n        'a': '\u5C07\u6578\u503C\u5411\u4E0B\u53D6\u6574\u70BA\u6307\u5B9A\u56E0\u6578\u7684\u6700\u63A5\u8FD1\u7684\u6574\u6578\u500D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5411\u4E0B\u820D\u5165\u70BA\u56E0\u6578\u7684\u6700\u63A5\u8FD1\u6574\u6578\u500D\u7684\u6578\u503C\u3002',\r\n            'example': '23.25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u56E0\u6578',\r\n            'detail' : '\u8981\u5C07\u503C\u820D\u5165\u5230\u6B64\u6578\u7684\u6574\u6578\u500D\u3002\\n\\n\u56E0\u6578\u4E0D\u5F97\u70BA0\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GCD',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u6216\u591A\u500B\u6574\u6578\u7684\u6700\u5927\u516C\u7D04\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u6216\u591A\u500B\u6574\u6578\u7684\u6700\u5927\u516C\u7D04\u6578\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8981\u5728\u67E5\u627E\u6700\u5927\u516C\u7D04\u6578\u7684\u8A08\u7B97\u4E2D\u6AA2\u67E5\u5176\u56E0\u6578\u7684\u7B2C\u4E00\u9805\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u6C42\u6700\u5927\u516C\u7D04\u6578\u6642\u8981\u8003\u616E\u5176\u56E0\u6578\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '96',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANDBETWEEN',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4ECB\u65BC\u5169\u500B\u6574\u6578\u4E4B\u9593\uFF08\u5305\u62EC\u9019\u5169\u500B\u6574\u6578\uFF09\u7684\u4E82\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4ECB\u65BC\u5169\u500B\u6574\u6578\u4E4B\u9593\uFF08\u5305\u62EC\u9019\u5169\u500B\u6574\u6578\uFF09\u7684\u4E82\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u4E0B\u754C',\r\n            'detail' : '\u96A8\u6A5F\u503C\u7BC4\u570D\u7684\u4E0B\u754C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4E0A\u754C',\r\n            'detail' : '\u96A8\u6A5F\u503C\u7BC4\u570D\u7684\u4E0A\u754C\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUND',\r\n        't': 0,\r\n        'd': '\u5C07\u6578\u4F4D\u56DB\u6368\u4E94\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u6578\u4F4D\u56DB\u6368\u4E94\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u56DB\u6368\u4E94\u5165\u7684\u6578\u4F4D\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4F4D\u6578',\r\n            'detail' : '\u8981\u9032\u884C\u56DB\u6368\u4E94\u5165\u904B\u7B97\u7684\u4F4D\u6578\u3002\\n\\n\u4F4D\u6578\u53EF\u4EE5\u53D6\u8CA0\u503C,\u5728\u9019\u7A2E\u60C5\u6CC1\u4E0B\u6703\u5C07\u503C\u7684\u5C0F\u6578\u9EDE\u5DE6\u5074\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUNDDOWN',\r\n        't': 0,\r\n        'd': '\u671D\u8457\u96F6\u7684\u65B9\u5411\u5C07\u6578\u4F4D\u9032\u884C\u5411\u4E0B\u820D\u5165\u3002',\r\n        'a': '\u671D\u8457\u96F6\u7684\u65B9\u5411\u5C07\u6578\u4F4D\u9032\u884C\u5411\u4E0B\u820D\u5165\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u9700\u8981\u5411\u4E0B\u820D\u5165\u7684\u4EFB\u610F\u5BE6\u6578\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4F4D\u6578',\r\n            'detail' : '\u8981\u901A\u904E\u820D\u5165\u9054\u5230\u7684\u5C0F\u6578\u4F4D\u6578\u3002\\n\\n\u4F4D\u6578\u53EF\u4EE5\u53D6\u8CA0\u503C,\u5728\u9019\u7A2E\u60C5\u6CC1\u4E0B\u6703\u5C07\u503C\u7684\u5C0F\u6578\u9EDE\u5DE6\u5074\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ROUNDUP',\r\n        't': 0,\r\n        'd': '\u671D\u8457\u9060\u96E20\uFF08\u96F6\uFF09\u7684\u65B9\u5411\u5C07\u6578\u4F4D\u9032\u884C\u5411\u4E0A\u820D\u5165\u3002',\r\n        'a': '\u671D\u8457\u9060\u96E20\uFF08\u96F6\uFF09\u7684\u65B9\u5411\u5C07\u6578\u4F4D\u9032\u884C\u5411\u4E0A\u820D\u5165\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5C07\u5176\u820D\u5165\u70BA\u4F4D\u6578\u4F4D\u6578\u4F4D\u7684\u503C,\u59CB\u7D42\u5411\u4E0A\u820D\u5165\u3002',\r\n            'example': '99.44',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4F4D\u6578',\r\n            'detail' : '\u8981\u901A\u904E\u820D\u5165\u9054\u5230\u7684\u5C0F\u6578\u4F4D\u6578\u3002\\n\\n\u4F4D\u6578\u53EF\u4EE5\u53D6\u8CA0\u503C,\u5728\u9019\u7A2E\u60C5\u6CC1\u4E0B\u6703\u5C07\u503C\u7684\u5C0F\u6578\u9EDE\u5DE6\u5074\u90E8\u5206\u820D\u5165\u5230\u6307\u5B9A\u7684\u4F4D\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SERIESSUM',\r\n        't': 0,\r\n        'd': '\u7D66\u5B9A\u53C3\u6578x\u3001n\u3001m\u548Ca,\u8FD4\u56DE\u5E42\u7D1A\u6578\u7684\u548Ca1xn + a2x\uFF08n+m\uFF09+\u2026+ aix\uFF08n+\uFF08i-1\uFF09m\uFF09,\u5176\u4E2Di\u70BA\u7BC4\u570Da\u4E2D\u7684\u9805\u6578\u3002',\r\n        'a': '\u7D66\u5B9A\u53C3\u6578x\u3001n\u3001m\u548Ca',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u5E42\u7D1A\u6578\u7684\u8F38\u5165\u503C\u3002\u96A8\u76F8\u61C9\u7684\u8FD1\u4F3C\u985E\u578B\u800C\u8B8A,\u6709\u53EF\u80FD\u70BA\u89D2\u5EA6\u3001\u6307\u6578\u6216\u5176\u4ED6\u4E00\u4E9B\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'n',\r\n            'detail' : '\u5728\u5E42\u7D1A\u6578\u4E2Dx\u7684\u521D\u59CB\u81EA\u4E58\u5E42\u6B21\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'm',\r\n            'detail' : 'x\u7684\u5E42\u6B21\u4E2D\u7684\u9644\u52A0\u589E\u91CF\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'a',\r\n            'detail' : '\u5305\u542B\u5E42\u7D1A\u6578\u4FC2\u6578\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': '{FACT(0)',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SIGN',\r\n        't': 0,\r\n        'd': '\u7D66\u5B9A\u8F38\u5165\u6578\u503C,\u5982\u679C\u70BA\u8CA0\u8FD4\u56DE-1\uFF1B\u5982\u679C\u70BA\u6B63\u8FD4\u56DE1\uFF1B\u5982\u679C\u70BA\u96F6\u5247\u8FD4\u56DE0\u3002',\r\n        'a': '\u7D66\u5B9A\u8F38\u5165\u6578\u503C',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u7B26\u865F\u7684\u6578\u503C\u3002',\r\n            'example': '-42',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SIN',\r\n        't': 0,\r\n        'd': '\u7D66\u5B9A\u89D2\u5EA6\uFF08\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09,\u8FD4\u56DE\u5176\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u7D66\u5B9A\u89D2\u5EA6\uFF08\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u89D2\u5EA6',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u6B63\u5F26\u503C\u7684\u89D2\u5EA6,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SINH',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u5BE6\u6578\u7684\u96D9\u66F2\u6B63\u5F26\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u96D9\u66F2\u6B63\u5F26\u503C\u7684\u5BE6\u6578\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SQRT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u6B63\u6578\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u6B63\u6578\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u6B63\u5E73\u65B9\u6839\u7684\u6578\u503C\u3002\\n\\n\u503C\u5FC5\u9808\u70BA\u6B63\u6578\uFF1B\u5982\u679C\u70BA\u8CA0,SQRT\u5C07\u8FD4\u56DE#NUM\uFF01\u932F\u8AA4\u3002',\r\n            'example': '9',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SQRTPI',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DEPI\u8207\u7D66\u5B9A\u6B63\u6578\u4E58\u7A4D\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'a': '\u8FD4\u56DEPI\u8207\u7D66\u5B9A\u6B63\u6578\u4E58\u7A4D\u7684\u6B63\u5E73\u65B9\u6839\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u5C07\u5176\u8207PI\u76F8\u4E58\u4E26\u8FD4\u56DE\u8A72\u4E58\u7A4D\u7684\u5E73\u65B9\u6839\u7684\u6578\u503C\\n\\n\u503C\u5FC5\u9808\u70BA\u6B63\u6578\uFF1B\u5982\u679C\u70BA\u8CA0\u6578,SQRTPI\u5C07\u8FD4\u56DE#NUM\uFF01\u932F\u8AA4\u3002',\r\n            'example': '9',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GAMMALN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u4F3D\u746A\u51FD\u6578\u7684\u4EE5e\uFF08\u6B50\u62C9\u6578\uFF09\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u4F3D\u746A\u51FD\u6578\u7684\u4EE5e\uFF08\u6B50\u62C9\u6578\uFF09\u70BA\u5E95\u7684\u5C0D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u4F3D\u746A\u51FD\u6578\u7684\u8F38\u5165\u503C\u3002\u8FD4\u56DE\u7684\u5C07\u662F\u4F3D\u746A\uFF08\u503C\uFF09\u7684\u81EA\u7136\u5C0D\u6578\u3002\\n\\n\u503C\u5FC5\u9808\u70BA\u6B63\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COS',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u89D2\u5EA6\u7684\u4F59\u5F26\u503C\uFF08\u89D2\u5EA6\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u89D2\u5EA6\u7684\u4F59\u5F26\u503C\uFF08\u89D2\u5EA6\u4EE5\u5F27\u5EA6\u8868\u793A\uFF09\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u89D2\u5EA6',\r\n            'detail' : '\u8981\u53D6\u5176\u4F59\u5F26\u503C\u7684\u89D2\u5EA6,\u4EE5\u5F27\u5EA6\u8868\u793A\u3002',\r\n            'example': 'PI()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TRUNC',\r\n        't': 0,\r\n        'd': '\u9664\u6307\u5B9A\u6709\u6548\u4F4D\u4E4B\u5916\u7684\u90E8\u5206,\u53D6\u6578\u64DA\u7684\u6307\u5B9A\u6709\u6548\u4F4D\u3002',\r\n        'a': '\u9664\u6307\u5B9A\u6709\u6548\u4F4D\u4E4B\u5916\u7684\u90E8\u5206',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : '\u503C',\r\n            'detail' : '\u8981\u622A\u53D6\u7684\u6578\u64DA\u3002',\r\n            'example': '3.141592654',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4F4D\u6578',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u5C0F\u6578\u9EDE\u53F3\u5074\u8981\u4FDD\u7559\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u4F4D\u6578\u5927\u65BC\u503C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5C07\"\u503C\"\u539F\u6A23\u8FD4\u56DE\u3002\\n\\n\u4F4D\u6578\u53EF\u4EE5\u53D6\u8CA0\u503C,\u5728\u9019\u7A2E\u60C5\u6CC1\u4E0B\u6703\u5C07\u5C0F\u6578\u9EDE\u5DE6\u5074\u6307\u5B9A\u4F4D\u6578\u7684\u503C\u66F4\u6539\u70BA\u96F6\u3002\u5C0F\u6578\u9EDE\u53F3\u5074\u7684\u6240\u6709\u4F4D\u6578\u90FD\u6703\u88AB\u6368\u68C4\u3002\u5982\u679C\u503C\u7684\u6240\u6709\u4F4D\u90FD\u88AB\u66F4\u6539\u70BA\u96F6,\u5247TRUNC\u6703\u8FD4\u56DE0\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUOTIENT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u4EE5\u4E00\u500B\u6578\u9664\u4EE5\u53E6\u4E00\u500B\u6578\u6240\u5F97\u7684\u7D50\u679C,\u4E0D\u5305\u542B\u9918\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5\u4E00\u500B\u6578\u9664\u4EE5\u53E6\u4E00\u500B\u6578\u6240\u5F97\u7684\u7D50\u679C',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u88AB\u9664\u6578',\r\n            'detail' : '\u8981\u88AB\u9664\u7684\u6578\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u9664\u6578',\r\n            'detail' : '\u7528\u65BC\u9664\u5176\u4ED6\u6578\u7684\u6578\u503C\u3002\\n\\n\u9664\u6578\u4E0D\u5F97\u70BA0',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'POWER',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u6307\u5B9A\u6B21\u5E42\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u5E95\u6578',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u6307\u6578\u6B21\u5E42\u7684\u6578\u503C\u3002\\n\\n\u5982\u679C\u5E95\u6578\u70BA\u8CA0,\u5247\u6307\u6578\u5FC5\u9808\u70BA\u6574\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6307\u6578',\r\n            'detail' : '\u6307\u5B9A\u5E95\u6578\u7684\u81EA\u4E58\u5E42\u6B21\u503C\u3002',\r\n            'example': '0.5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SUMIFS',\r\n        't': 0,\r\n        'd': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u4E4B\u548C\u3002',\r\n        'a': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u4E4B\u548C\u3002',\r\n        'm': [3, 257],\r\n        'p': [{\r\n            'name'   : '\u6C42\u548C\u7BC4\u570D',\r\n            'detail' : '\u8981\u5C0D\u5176\u6C42\u548C\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u689D\u4EF6\u7BC4\u570D1',\r\n            'detail' : '\u8981\u5728\u54EA\u500B\u7BC4\u570D\u5167\u6AA2\u67E5\u689D\u4EF61\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u689D\u4EF61',\r\n            'detail' : '\u8981\u61C9\u7528\u65BC\u689D\u4EF6\u7BC4\u570D1\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u689D\u4EF6\u7BC4\u570D2,\u689D\u4EF62\u2026',\r\n            'detail' : '[ \u53EF\u9078 ] - \u8981\u6AA2\u67E5\u7684\u5176\u4ED6\u7BC4\u570D\u548C\u689D\u4EF6\u3002',\r\n            'example': ' C1:C10',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTIFS',\r\n        't': 1,\r\n        'd': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u4E2D\u7684\u5132\u5B58\u683C\u6578\u91CF\u3002',\r\n        'a': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u4E2D\u7684\u5132\u5B58\u683C\u6578\u91CF\u3002',\r\n        'm': [2, 256],\r\n        'p': [{\r\n            'name'   : '\u689D\u4EF6\u7BC4\u570D1',\r\n            'detail' : '\u8981\u5728\u54EA\u500B\u7BC4\u570D\u5167\u6AA2\u67E5\u689D\u4EF61\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u689D\u4EF61',\r\n            'detail' : '\u8981\u61C9\u7528\u65BC\u689D\u4EF6\u7BC4\u570D1\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u689D\u4EF6\u7BC4\u570D2,\u689D\u4EF62\u2026',\r\n            'detail' : '[ \u53EF\u9078 ] - \u8981\u6AA2\u67E5\u7684\u5176\u4ED6\u7BC4\u570D\u548C\u689D\u4EF6,\u53EF\u91CD\u8907\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PRODUCT',\r\n        't': 0,\r\n        'd': '\u8FD4\u56DE\u5C07\u4E00\u7D44\u6578\u76F8\u4E58\u6240\u5F97\u7684\u7D50\u679C\u3002',\r\n        'a': '\u8FD4\u56DE\u5C07\u4E00\u7D44\u6578\u76F8\u4E58\u6240\u5F97\u7684\u7D50\u679C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u4E58\u65781',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u4E58\u7A4D\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u4E58\u65782 ... \u4E58\u657830',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u76F8\u4E58\u7684\u5176\u4ED6\u6578\u503C',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HARMEAN',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u8ABF\u548C\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u8ABF\u548C\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HYPGEOMDIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8D85\u5E7E\u4F55\u5206\u4F48\u3002\u5982\u679C\u5DF2\u77E5\u6A23\u672C\u91CF\u3001\u7E3D\u9AD4\u6210\u529F\u6B21\u6578\u548C\u7E3D\u9AD4\u5927\u5C0F,\u5247 HYPGEOM.DIST \u8FD4\u56DE\u6A23\u672C\u53D6\u5F97\u5DF2\u77E5\u6210\u529F\u6B21\u6578\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u8D85\u5E7E\u4F55\u5206\u4F48\u3002',\r\n        'm': [5, 5],\r\n        'p': [{\r\n            'name'   : 'Sample_s',\r\n            'detail' : '\u6A23\u672C\u4E2D\u6210\u529F\u7684\u6B21\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'Number_sample',\r\n            'detail' : '\u6A23\u672C\u91CF\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'Population_s',\r\n            'detail' : '\u7E3D\u9AD4\u4E2D\u6210\u529F\u7684\u6B21\u6578\u3002',\r\n            'example': '20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'Number_pop',\r\n            'detail' : '\u7E3D\u9AD4\u5927\u5C0F\u3002',\r\n            'example': '40',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679Ccumulative\u70BATRUE\uFF08\uFF09,\u5247HYPGEOM.DIST\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'INTERCEPT',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78\u65B9\u7A0B\u76F4\u7DDA\u8207 Y \u8EF8\u7684\u76F8\u4EA4\u9EDE\uFF08x=0\uFF09\u7684y\u503C\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78\u65B9\u7A0B\u76F4\u7DDA\u8207 Y \u8EF8\u7684\u76F8\u4EA4\u9EDE\uFF08x=0\uFF09\u7684y\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'KURT',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u5CED\u5EA6,\u8A72\u540D\u984D\u8A13\u793A\u6578\u64DA\u96C6\uFF08\u5206\u4F48\uFF09\u7684\u5F62\u614B,\u5C24\u5176\u662F\u8A72\u5F62\u614B\u7684\u9661\u5CED\u7A0B\u5EA6\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u5CED\u5EA6',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6578\u64DA\u96C6\u4E2D\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LARGE',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7B2C n \u500B\u6700\u5927\u5143\u7D20,n \u7531\u7528\u6236\u6307\u5B9A\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7B2C n \u500B\u6700\u5927\u5143\u7D20',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'n',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7684\u5143\u7D20\u7684\u6392\u884C\u4F4D\u7F6E\uFF08\u5F9E\u5927\u5230\u5C0F\u9806\u5E8F\uFF09\u3002\\n\\n\u4F8B\u5982,\u5C07n\u8A2D\u70BA4\u5C07\u4F7FLARGE\u8FD4\u56DE\u6578\u64DA\u4E2D\u6392\u540D\u7B2C4\u7684\u6700\u5927\u5143\u7D20\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STDEVA',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u6A19\u6E96\u5DEE,\u5C07\u6587\u5B57\u53D6\u503C\u70BA0\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u6A19\u6E96\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2,\u2026',\r\n            'detail' : '[\u53EF\u9078] - \u6A23\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STDEVP',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u6A19\u6E96\u5DEE\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u6A19\u6E96\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6578\u64DA\u96C6\u4E2D\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GEOMEAN',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u5E7E\u4F55\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u5E7E\u4F55\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANK_EQ',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u5B58\u5728\u591A\u9805,\u5247\u8FD4\u56DE\u5176\u4E2D\u7684\u6700\u9AD8\u6392\u540D\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u5B58\u5728\u591A\u9805,\u5247\u8FD4\u56DE\u5176\u4E2D\u7684\u6700\u9AD8\u6392\u540D\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u6392\u540D\u7684\u503C\u3002',\r\n            'example': 'A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'ref',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'order',\r\n            'detail' : '[\u53EF\u9078-\u9ED8\u8A8D\u70BA\u6309\u964D\u5E8F\uFF08FALSE\uFF08\uFF09\uFF09] - \u8981\u6309\u6607\u51AA\u9084\u662F\u6309\u964D\u5E8F\u8003\u616E\"data\"\u4E2D\u7684\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANK_AVG',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u5B58\u5728\u591A\u9805,\u5247\u8FD4\u56DE\u9019\u4E9B\u9805\u6392\u540D\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u7684\u6392\u540D\u3002\u5982\u679C\u76F8\u540C\u7684\u503C\u5728\u6578\u64DA\u96C6\u4E2D\u5B58\u5728\u591A\u9805,\u5247\u8FD4\u56DE\u9019\u4E9B\u9805\u6392\u540D\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u6392\u540D\u7684\u503C\u3002',\r\n            'example': 'A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'ref',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'order',\r\n            'detail' : '[\u53EF\u9078-\u9ED8\u8A8D\u70BA\u6309\u964D\u5E8F\uFF08FALSE\uFF08\uFF09\uFF09] - \u8981\u6309\u6607\u51AA\u9084\u662F\u6309\u964D\u5E8F\u8003\u616E\"data\"\u4E2D\u7684\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTRANK_EXC',\r\n        't': 1,\r\n        'd': '\u4EE5\u767E\u5206\u6578\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7D66\u5B9A\u6578\u64DA\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,\u4E0D\u5305\u62EC\u5169\u7AEF\u503C\uFF09\u3002',\r\n        'a': '\u4EE5\u767E\u5206\u6578\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7D66\u5B9A\u6578\u64DA\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,\u4E0D\u5305\u62EC\u5169\u7AEF\u503C\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'data',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'significance',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA3] - \u8981\u5728\u8A08\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTRANK_INC',\r\n        't': 1,\r\n        'd': '\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7D66\u5B9A\u6578\u64DA\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,\u5305\u62EC\u5169\u7AEF\u503C\uFF09\u3002',\r\n        'a': '\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8FD4\u56DE\u6307\u5B9A\u503C\u5728\u7D66\u5B9A\u6578\u64DA\u96C6\u4E2D\u7684\u767E\u5206\u6BD4\u6392\u540D\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,\u5305\u62EC\u5169\u7AEF\u503C\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'data',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\u3002',\r\n            'example': ' A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'significance',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA3] - \u8981\u5728\u8A08\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FORECAST',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78,\u8A08\u7B97\u6307\u5B9A x \u7684\u9810\u671F y \u503C\u3002',\r\n        'a': '\u57FA\u65BC\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : 'x\u8EF8\u4E0A\u7528\u65BC\u9810\u6E2C\u7684\u503C\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FISHERINV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6578\u503C\u7684 Fisher \u9006\u8B8A\u63DB\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6578\u503C\u7684 Fisher \u9006\u8B8A\u63DB\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'y',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176Fisher\u9006\u8B8A\u63DB\u7684\u6578\u503C\u3002',\r\n            'example': '0.962',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FISHER',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6578\u503C\u7684 Fisher \u8B8A\u63DB\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6578\u503C\u7684 Fisher \u8B8A\u63DB\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176Fisher\u8B8A\u63DB\u7684\u6578\u503C\u3002',\r\n            'example': '0.962',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MODE_SNGL',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u51FA\u73FE\u6B21\u6578\u6700\u591A\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u51FA\u73FE\u6B21\u6578\u6700\u591A\u7684\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u6A21\u5F0F\u6642\u8981\u6AA2\u67E5\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u6A21\u5F0F\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'WEIBULL_DIST',\r\n        't': 1,\r\n        'd': '\u7D66\u5B9A\u5F62\u72C0\u548C\u5C3A\u5EA6,\u8FD4\u56DE\u97CB\u4F2F\u5206\u4F48\u51FD\u6578\uFF08\u6216\u97CB\u4F2F\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF09\u7684\u503C\u3002',\r\n        'a': '\u7D66\u5B9A\u5F62\u72C0\u548C\u5C3A\u5EA6',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : 'WEIBULL \u5206\u4F48\u51FD\u6578\u7684\u8F38\u5165\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'alpha',\r\n            'detail' : 'Weibull \u5206\u4F48\u51FD\u6578\u7684\u5F62\u72C0\u53C3\u6578\u3002\\n\\n alpha\u503C\u5FC5\u9808\u5927\u65BC0\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'beta',\r\n            'detail' : 'Weibull \u5206\u4F48\u51FD\u6578\u7684\u5C3A\u5EA6\u53C3\u6578\u3002\\n\\n beta\u503C\u5FC5\u9808\u5927\u65BC0\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : 'TRUE\uFF08\uFF09\u8868\u793A\u4F7F\u7528\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578,FALSE\uFF08\uFF09\u5247\u8868\u793A\u4F7F\u7528\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u6578\u503C\u7684\u500B\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u6578\u503C\u7684\u500B\u6578\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u6578\u6642\u8981\u6AA2\u67E5\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u6578\u6642\u8981\u6AA2\u67E5\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COUNTA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u503C\u7684\u6578\u91CF\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u503C\u7684\u6578\u91CF\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u6578\u6642\u8981\u6AA2\u67E5\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u6578\u6642\u8981\u6AA2\u67E5\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVEDEV',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u8207\u6578\u64DA\u96C6\u5E73\u5747\u503C\u4E4B\u9593\u7684\u504F\u5DEE\u5927\u5C0F\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u8207\u6578\u64DA\u96C6\u5E73\u5747\u503C\u4E4B\u9593\u7684\u504F\u5DEE\u5927\u5C0F\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6A23\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGE',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u7B97\u8853\u5E73\u5747\u503C,\u5C0D\u6587\u5B57\u5FFD\u7565\u4E0D\u8A08\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u7B97\u8853\u5E73\u5747\u503C',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u5E73\u5747\u503C\u6642\u7528\u5230\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u5E73\u5747\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u7B97\u8853\u5E73\u5747\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u7B97\u8853\u5E73\u5747\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u5E73\u5747\u503C\u6642\u7528\u5230\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u5E73\u5747\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BINOM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u4E00\u5143\u4E8C\u9805\u5F0F\u5206\u4F48\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u5143\u4E8C\u9805\u5F0F\u5206\u4F48\u7684\u6982\u7387\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'number_s',\r\n            'detail' : '\u8A66\u9A57\u7684\u6210\u529F\u6B21\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'trials',\r\n            'detail' : '\u7368\u7ACB\u6AA2\u9A57\u7684\u6B21\u6578\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'probability_s',\r\n            'detail' : '\u4EFB\u4E00\u7D66\u5B9A\u6AA2\u9A57\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.005',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u662F\u5426\u4F7F\u7528\u4E8C\u9805\u5F0F\u7D2F\u7A4D\u5206\u4F48\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BINOM_INV',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u7D2F\u7A4D\u4E8C\u9805\u5F0F\u5206\u4F48\u5927\u65BC\u6216\u7B49\u65BC\u6307\u5B9A\u689D\u4EF6\u7684\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8A08\u7B97\u7D2F\u7A4D\u4E8C\u9805\u5F0F\u5206\u4F48\u5927\u65BC\u6216\u7B49\u65BC\u6307\u5B9A\u689D\u4EF6\u7684\u6700\u5C0F\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'trials',\r\n            'detail' : '\u8C9D\u52AA\u5229\u8A66\u9A57\u6B21\u6578\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'probability_s',\r\n            'detail' : '\u4EFB\u4E00\u6B21\u7D66\u5B9A\u6AA2\u9A57\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.005',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'alpha',\r\n            'detail' : '\u671F\u671B\u7684\u81E8\u754C\u6982\u7387\u3002',\r\n            'example': '0.8',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONFIDENCE_NORM',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u5E38\u6001\u5206\u914D\u7684\u7F6E\u4FE1\u5340\u9593\u7684\u4E00\u534A\u5BEC\u5EA6\u3002',\r\n        'a': '\u8A08\u7B97\u5E38\u6001\u5206\u914D\u7684\u7F6E\u4FE1\u5340\u9593\u7684\u4E00\u534A\u5BEC\u5EA6\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'alpha',\r\n            'detail' : '\u7528\u4F86\u8A08\u7B97\u7F6E\u4FE1\u6C34\u51C6\u7684\u986F\u8457\u6027\u6C34\u51C6\u3002\\n\\n\u7F6E\u4FE1\u6C34\u51C6\u7B49\u65BC100*\uFF081 - alpha\uFF09%,\u4EA6\u5373,\u5982\u679C alpha \u70BA0.05,\u5247\u7F6E\u4FE1\u6C34\u51C6\u70BA 95%\u3002',\r\n            'example': '0.05',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : '\u6578\u64DA\u5340\u57DF\u7684\u7E3D\u9AD4\u6A19\u6E96\u5DEE\u3002',\r\n            'example': '1.6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'size',\r\n            'detail' : '\u6A23\u672C\u7E3D\u91CF\u7684\u5927\u5C0F\u3002',\r\n            'example': '250',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CORREL',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u7D66\u5B9A\u6578\u64DA\u96C6\u7684\u76AE\u723E\u905C\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578 r\u3002',\r\n        'a': '\u8A08\u7B97\u7D66\u5B9A\u6578\u64DA\u96C6\u7684\u76AE\u723E\u905C\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578 r\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COVARIANCE_P',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u7E3D\u9AD4\u5354\u65B9\u5DEE\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u7E3D\u9AD4\u5354\u65B9\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COVARIANCE_S',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u6A23\u672C\u5354\u65B9\u5DEE\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u64DA\u96C6\u7684\u6A23\u672C\u5354\u65B9\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEVSQ',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u5176\u504F\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u5176\u504F\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6A23\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EXPON_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5E36\u6709\u6307\u5B9A Lambda \u548C\u6307\u5B9A\u503C\u7684\u6307\u6578\u5206\u4F48\u51FD\u6578\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5E36\u6709\u6307\u5B9A Lambda \u548C\u6307\u5B9A\u503C\u7684\u6307\u6578\u5206\u4F48\u51FD\u6578\u7684\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u6307\u6578\u5206\u4F48\u51FD\u6578\u7684\u8F38\u5165\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'lambda',\r\n            'detail' : '\u7528\u65BC\u6307\u5B9A\u6307\u6578\u5206\u4F48\u51FD\u6578\u7684 lambda \u503C\u3002',\r\n            'example': '0.5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u662F\u5426\u4F7F\u7528\u6307\u6578\u7D2F\u7A4D\u5206\u4F48\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEIF',\r\n        't': 1,\r\n        'd': '\u6839\u64DA\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u6839\u64DA\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'criteria_range',\r\n            'detail' : '\u8981\u5C0D\u5176\u6AA2\u67E5 criterion \u7684\u7BC4\u570D\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'criterion',\r\n            'detail' : '\u8981\u61C9\u7528\u65BCcriteria_range\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002\\n\\n\u7B49\u65BC:\"\u6587\u5B57\" \u6216 1 \u6216 \"=\u6587\u5B57\" \u6216 \"=1\"\\n\\n\u5927\u65BC:\">1\"\\n\\n\u5927\u65BC\u7B49\u65BC:\">=1\"\\n\\n\u5C0F\u65BC:\"<1\"\\n\\n\u5C0F\u65BC\u7B49\u65BC:\"<=1\"\\n\\n\u4E0D\u7B49\u65BC:\"<>1\"\u6216\"<>\u6587\u5B57\"',\r\n            'example': '\">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'average_range',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u8A08\u7B97\u5E73\u5747\u503C\u7684\u7BC4\u570D\u3002\u5982\u679C\u672A\u63D0\u4F9B\u6B64\u53C3\u6578,\u5247\u6539\u7528criteria_range\u4F86\u8A08\u7B97\u5E73\u5747\u503C\u3002',\r\n            'example': 'B1:B10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'AVERAGEIFS',\r\n        't': 1,\r\n        'd': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u6839\u64DA\u591A\u9805\u689D\u4EF6\u8FD4\u56DE\u7BC4\u570D\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name'   : 'average_range',\r\n            'detail' : '\u8981\u8A08\u7B97\u5E73\u5747\u503C\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A1:A10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'criteria_range1',\r\n            'detail' : '\u8981\u5C0D\u5176\u6AA2\u67E5 criterion1 \u7684\u7BC4\u570D\u3002',\r\n            'example': ' B1:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'criterion1',\r\n            'detail' : '\u8981\u61C9\u7528\u65BCcriteria_range1\u7684\u6A21\u5F0F\u6216\u6E2C\u8A66\u689D\u4EF6\u3002',\r\n            'example': ' \">20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'criteria_range2, criterion2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u6AA2\u67E5\u7684\u5176\u4ED6\u7BC4\u570D\u548C\u689D\u4EF6\u3002',\r\n            'example': ' C1:C10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'PERMUT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u53EF\u5F9E\u6578\u4F4D\u5C0D\u8C61\u4E2D\u9078\u64C7\u7684\u7D66\u5B9A\u6578\u76EE\u5C0D\u8C61\u7684\u6392\u5217\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u53EF\u5F9E\u6578\u4F4D\u5C0D\u8C61\u4E2D\u9078\u64C7\u7684\u7D66\u5B9A\u6578\u76EE\u5C0D\u8C61\u7684\u6392\u5217\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8868\u793A\u5C0D\u8C61\u500B\u6578\u7684\u6574\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'number_chosen',\r\n            'detail' : '\u8868\u793A\u6BCF\u500B\u6392\u5217\u4E2D\u5C0D\u8C61\u500B\u6578\u7684\u6574\u6578\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TRIMMEAN',\r\n        't': 1,\r\n        'd': '\u5728\u6392\u9664\u6578\u64DA\u96C6\u9AD8\u4F4E\u5169\u7AEF\u7684\u90E8\u5206\u6578\u64DA\u4E4B\u5F8C\u8A08\u7B97\u6240\u5F97\u7684\u5E73\u5747\u503C\u3002',\r\n        'a': '\u5728\u6392\u9664\u6578\u64DA\u96C6\u9AD8\u4F4E\u5169\u7AEF\u7684\u90E8\u5206\u6578\u64DA\u4E4B\u5F8C\u8A08\u7B97\u6240\u5F97\u7684\u5E73\u5747\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA',\r\n            'detail' : '\u5305\u542B\u76F8\u95DC\u6578\u64DA\u96C6\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : '\u6392\u9664\u6BD4\u4F8B',\r\n            'detail' : '\u8981\u5F9E\u6578\u64DA\u96C6\u7684\u6975\u503C\u90E8\u5206\u6392\u9664\u7684\u6578\u64DA\u5360\u6578\u64DA\u96C6\u7684\u6BD4\u4F8B\u3002\\n\\n\u6392\u9664\u6BD4\u4F8B\u5FC5\u9808\u5927\u65BC\u7B49\u65BC0\u4E14\u5C0F\u65BC1\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTILE_EXC',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u7D44\u7684 K \u767E\u5206\u9EDE\u503C,K \u4ECB\u65BC0\u52301\u4E4B\u9593,\u4E0D\u542B0\u82071\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u7D44\u7684 K \u767E\u5206\u9EDE\u503C,K \u4ECB\u65BC0\u52301\u4E4B\u9593,\u4E0D\u542B0\u82071\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u5B9A\u7FA9\u76F8\u5C0D\u4F4D\u7F6E\u7684\u6578\u7D44\u6216\u6578\u64DA\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'k',\r\n            'detail' : '0 \u5230 1 \u4E4B\u9593\u7684\u767E\u5206\u9EDE\u503C,\u4E0D\u5305\u542B 0 \u548C 1\u3002',\r\n            'example': '0.25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PERCENTILE_INC',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u7D44\u7684 K \u767E\u5206\u9EDE\u503C,K \u4ECB\u65BC 0 \u5230 1 \u4E4B\u9593,\u5305\u542B 0 \u8207 1\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u7D44\u7684 K \u767E\u5206\u9EDE\u503C,K \u4ECB\u65BC 0 \u5230 1 \u4E4B\u9593,\u5305\u542B 0 \u8207 1\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u5B9A\u7FA9\u76F8\u5C0D\u4F4D\u7F6E\u7684\u6578\u7D44\u6216\u6578\u64DA\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'k',\r\n            'detail' : '0 \u5230 1 \u4E4B\u9593\u7684\u767E\u5206\u9EDE\u503C,\u5305\u542B 0 \u548C 1\u3002',\r\n            'example': '0.25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PEARSON',\r\n        't': 1,\r\n        'd': '\u56DE\u76AE\u723E\u751F\uFF08Pearson\uFF09\u4E58\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578 r\u3002',\r\n        'a': '\u56DE\u76AE\u723E\u751F\uFF08Pearson\uFF09\u4E58\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578 r\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_S_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6A19\u6E96\u6B63\u614B\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002\u8A72\u5206\u4F48\u7684\u5E73\u5747\u503C\u70BA0,\u6A19\u6E96\u5DEE\u70BA1\u3002',\r\n        'a': '\u8FD4\u56DE\u6A19\u6E96\u6B63\u614B\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002\u8A72\u5206\u4F48\u7684\u5E73\u5747\u503C\u70BA0,\u6A19\u6E96\u5DEE\u70BA1\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'probability',\r\n            'detail' : '\u5C0D\u61C9\u65BC\u5E38\u6001\u5206\u914D\u7684\u6982\u7387\u3002',\r\n            'example': '0.75',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_S_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6A19\u6E96\u5E38\u6001\u5206\u914D\u51FD\u6578\uFF08\u8A72\u5206\u4F48\u7684\u5E73\u5747\u503C\u70BA0,\u6A19\u6E96\u5DEE\u70BA1\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u6A19\u6E96\u5E38\u6001\u5206\u914D\u51FD\u6578\uFF08\u8A72\u5206\u4F48\u7684\u5E73\u5747\u503C\u70BA0,\u6A19\u6E96\u5DEE\u70BA1\uFF09\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'z',\r\n            'detail' : '\u9700\u8981\u8A08\u7B97\u5176\u5206\u4F48\u7684\u6578\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE\u7684\u6B63\u614B\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE\u7684\u6B63\u614B\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'probability',\r\n            'detail' : '\u5C0D\u61C9\u65BC\u5E38\u6001\u5206\u914D\u7684\u6982\u7387\u3002',\r\n            'example': '0.75',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : '\u5206\u4F48\u7684\u7B97\u8853\u5E73\u5747\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : '\u5206\u4F48\u7684\u6A19\u6E96\u5DEE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NORM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE\u7684\u5E38\u6001\u5206\u914D\u51FD\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE\u7684\u5E38\u6001\u5206\u914D\u51FD\u6578\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u9700\u8981\u8A08\u7B97\u5176\u5206\u4F48\u7684\u6578\u503C\u3002',\r\n            'example': '2.4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : '\u5206\u4F48\u7684\u7B97\u8853\u5E73\u5747\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : '\u5206\u4F48\u7684\u6A19\u6E96\u5DEE\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NEGBINOM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8CA0\u4E8C\u9805\u5F0F\u5206\u4F48\u3002',\r\n        'a': '\u8FD4\u56DE\u8CA0\u4E8C\u9805\u5F0F\u5206\u4F48\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'number_f',\r\n            'detail' : '\u8981\u985E\u6BD4\u7684\u5931\u6557\u6B21\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'number_s',\r\n            'detail' : '\u8981\u985E\u6BD4\u7684\u6210\u529F\u6B21\u6578\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'probability_s',\r\n            'detail' : '\u4EFB\u4E00\u6B21\u7D66\u5B9A\u6AA2\u9A57\u7684\u6210\u529F\u6982\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'MINA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5C0F\u6578\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5C0F\u6578\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u6700\u5C0F\u503C\u6642\u6240\u7528\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u6700\u5C0F\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MIN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5C0F\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u6700\u5C0F\u503C\u6642\u6240\u7528\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u6700\u5C0F\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MEDIAN',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u4E2D\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u4E2D\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u503C\u6642\u6240\u7528\u7684\u7B2C\u4E00\u500B\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u4E2D\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MAXA',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5927\u6578\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5927\u6578\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u6700\u5927\u503C\u6642\u6240\u7528\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u6700\u5927\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MAX',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5927\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u6578\u64DA\u96C6\u4E2D\u7684\u6700\u5927\u503C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u8A08\u7B97\u6700\u5927\u503C\u6642\u6240\u7528\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2',\r\n            'detail' : '[\u53EF\u9078] - \u5728\u8A08\u7B97\u6700\u5927\u503C\u6642\u8981\u8003\u616E\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOGNORM_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE x \u7684\u5C0D\u6578\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002',\r\n        'a': '\u8FD4\u56DE x \u7684\u5C0D\u6578\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u7684\u53CD\u51FD\u6578\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'probability',\r\n            'detail' : '\u8207\u5C0D\u6578\u5206\u4F48\u76F8\u95DC\u7684\u6982\u7387,\u4ECB\u65BC0\u82071\u4E4B\u9593\uFF08\u4E0D\u542B0\u82071\uFF09\u3002',\r\n            'example': '0.4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : 'ln(x) \u7684\u5E73\u5747\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : 'ln(x) \u7684\u6A19\u6E96\u5DEE,\u6B63\u6578\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'LOGNORM_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE x \u7684\u5C0D\u6578\u5206\u4F48\u51FD\u6578\u3002',\r\n        'a': '\u8FD4\u56DE x \u7684\u5C0D\u6578\u5206\u4F48\u51FD\u6578\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u7528\u4F86\u8A08\u7B97\u51FD\u6578\u7684\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : 'ln(x) \u7684\u5E73\u5747\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : 'ln(x) \u7684\u6A19\u6E96\u5DEE,\u6B63\u6578\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'Z_TEST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE z \u6AA2\u9A57\u7684\u55AE\u5C3E P \u503C\u3002',\r\n        'a': '\u8FD4\u56DE z \u6AA2\u9A57\u7684\u55AE\u5C3E P \u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u7528\u4F86\u6AA2\u9A57 x \u7684\u6578\u7D44\u6216\u6578\u64DA\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u6E2C\u8A66\u7684\u503C\u3002',\r\n            'example': 'B2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'sigma',\r\n            'detail' : '[\u53EF\u9078] - \u7E3D\u9AD4\uFF08\u5DF2\u77E5\uFF09\u6A19\u6E96\u5DEE\u3002\u5982\u679C\u7701\u7565,\u5247\u4F7F\u7528\u6A23\u672C\u6A19\u6E96\u5DEE\u3002',\r\n            'example': '3',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PROB',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5340\u57DF\u4E2D\u7684\u6578\u503C\u843D\u5728\u6307\u5B9A\u5340\u9593\u5167\u7684\u6982\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5340\u57DF\u4E2D\u7684\u6578\u503C\u843D\u5728\u6307\u5B9A\u5340\u9593\u5167\u7684\u6982\u7387\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'x_range',\r\n            'detail' : '\u5177\u6709\u5404\u81EA\u76F8\u61C9\u6982\u7387\u503C\u7684 x \u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'A3:A6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'prob_range',\r\n            'detail' : '\u8207 x_range \u4E2D\u7684\u503C\u76F8\u95DC\u806F\u7684\u4E00\u7D44\u6982\u7387\u503C\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'lower_limit',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u6982\u7387\u7684\u6578\u503C\u4E0B\u754C\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'upper_limit',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA\u4E0B\u754C] - \u8981\u8A08\u7B97\u5176\u6982\u7387\u7684\u53EF\u9078\u6578\u503C\u4E0A\u754C\u3002\\n\\n\u5982\u679C\u7701\u7565\u4E0A\u754C,PROB\u5247\u8A08\u7B97\u96A8\u6A5F\u9078\u53D6\u76F8\u61C9\u503C\u7684\u6B21\u6578\u6070\u597D\u7B49\u65BC\u4E0B\u754C\u7684\u6982\u7387\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUARTILE_EXC',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC 0 \u5230 1 \u4E4B\u9593\uFF08\u4E0D\u5305\u62EC 0 \u548C 1\uFF09\u7684\u767E\u5206\u9EDE\u503C\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u56DB\u5206\u4F4D\u6578\u3002',\r\n        'a': '\u57FA\u65BC 0 \u5230 1 \u4E4B\u9593\uFF08\u4E0D\u5305\u62EC 0 \u548C 1\uFF09\u7684\u767E\u5206\u9EDE\u503C\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u56DB\u5206\u4F4D\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6578\u503C\u7684\u6578\u7D44\u6216\u6578\u5B57\u578B\u5132\u5B58\u683C\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'quart',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7B2C\u5E7E\u500B\u56DB\u5206\u4F4D\u503C\u3002\\n\\n1\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u9760\u8FD1\u7B2C\u4E00\u500B\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0825%\u6A19\u8A18\uFF09\u3002\\n\\n2\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u63A5\u8FD1\u4E2D\u503C\u7684\u503C\uFF0850%\u6A19\u8A18\uFF09\u3002\\n\\n3\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u63A5\u8FD1\u7B2C\u4E09\u500B\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0875%\u6A19\u8A18\uFF09\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'QUARTILE_INC',\r\n        't': 1,\r\n        'd': '\u6839\u64DA 0 \u5230 1 \u4E4B\u9593\u7684\u767E\u5206\u9EDE\u503C\uFF08\u5305\u542B 0 \u548C 1\uFF09\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u56DB\u5206\u4F4D\u6578\u3002',\r\n        'a': '\u6839\u64DA 0 \u5230 1 \u4E4B\u9593\u7684\u767E\u5206\u9EDE\u503C\uFF08\u5305\u542B 0 \u548C 1\uFF09\u8FD4\u56DE\u6578\u64DA\u96C6\u7684\u56DB\u5206\u4F4D\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6578\u503C\u7684\u6578\u7D44\u6216\u6578\u5B57\u578B\u5132\u5B58\u683C\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'quart',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7B2C\u5E7E\u500B\u56DB\u5206\u4F4D\u503C\u3002\\n\\n0\u8FD4\u56DE\u6578\u64DA\u4E2D\u7684\u6700\u5C0F\u503C\uFF080%\u6A19\u8A18\uFF09\u3002\\n\\n1\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u9760\u8FD1\u7B2C\u4E00\u500B\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0825%\u6A19\u8A18\uFF09\u3002\\n\\n2\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u63A5\u8FD1\u4E2D\u503C\u7684\u503C\uFF0850%\u6A19\u8A18\uFF09\u3002\\n\\n3\u8FD4\u56DE\u6578\u64DA\u4E2D\u6700\u63A5\u8FD1\u7B2C\u4E09\u500B\u56DB\u5206\u4F4D\u503C\u7684\u503C\uFF0875%\u6A19\u8A18\uFF09\u3002\\n\\n4\u8FD4\u56DE\u6578\u64DA\u4E2D\u7684\u6700\u5927\u503C\uFF08100%\u6A19\u8A18\uFF09\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'POISSON_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6CCA\u677E\u5206\u5E03\u3002',\r\n        'a': '\u8FD4\u56DE\u6CCA\u677E\u5206\u5E03\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u4E8B\u4EF6\u6578\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : '\u671F\u671B\u503C\u3002\u975E\u8CA0\u6578',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u4E00 \u908F\u8F2F\u503C,\u78BA\u5B9A\u6240\u8FD4\u56DE\u7684\u6982\u7387\u5206\u4F48\u7684\u5F62\u5F0F\u3002\\n\\n\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u8FD4\u56DE\u767C\u751F\u7684\u96A8\u6A5F\u4E8B\u4EF6\u6578\u5728\u96F6\uFF08\u542B\u96F6\uFF09\u548Cx\uFF08\u542Bx\uFF09\u4E4B\u9593\u7684\u7D2F\u7A4D\u6CCA\u677E\u6982\u7387\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u767C\u751F\u7684\u4E8B\u4EF6\u6578\u6B63\u597D\u662Fx\u7684\u6CCA\u677E\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RSQ',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u76AE\u723E\u751F(Pearson)\u4E58\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578r\u7684\u5E73\u65B9\u3002',\r\n        'a': '\u8FD4\u56DE\u76AE\u723E\u751F(Pearson)\u4E58\u7A4D\u77E9\u76F8\u95DC\u4FC2\u6578r\u7684\u5E73\u65B9\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B78\u751F\u7684\u5DE6\u5C3E t \u5206\u4F48\u3002',\r\n        'a': '\u8FD4\u56DE\u5B78\u751F\u7684\u5DE6\u5C3E t \u5206\u4F48\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : 'T-\u5206\u4F48\u51FD\u6578\u7684\u8F38\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom',\r\n            'detail' : '\u81EA\u7531\u5EA6\u6578\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'tails',\r\n            'detail' : '\u51B3\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\\n\\n\u5982\u679Ccumulative\u70BATRUE\uFF08\uFF09,\u5247HYPGEOM.DIST\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\uFF1B\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09,\u5247\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST_2T',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B78\u751F\u7684\u96D9\u5C3E t \u5206\u4F48\u3002',\r\n        'a': '\u8FD4\u56DE\u5B78\u751F\u7684\u96D9\u5C3E t \u5206\u4F48\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : 'T-\u5206\u4F48\u51FD\u6578\u7684\u8F38\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom',\r\n            'detail' : '\u81EA\u7531\u5EA6\u6578\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_DIST_RT',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B78\u751F\u7684\u53F3\u5C3E t \u5206\u4F48\u3002',\r\n        'a': '\u8FD4\u56DE\u5B78\u751F\u7684\u53F3\u5C3E t \u5206\u4F48\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : 'T-\u5206\u4F48\u51FD\u6578\u7684\u8F38\u5165\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom',\r\n            'detail' : '\u81EA\u7531\u5EA6\u6578\u503C\u3002',\r\n            'example': '30',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_INV',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B78\u751F\u7684 t \u5206\u4F48\u7684\u5DE6\u5C3E\u53CD\u51FD\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u5B78\u751F\u7684 t \u5206\u4F48\u7684\u5DE6\u5C3E\u53CD\u51FD\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'probability',\r\n            'detail' : '\u8207\u5B78\u751F\u7684 t \u5206\u4F48\u76F8\u95DC\u7684\u6982\u7387\u3002\\n\\n\u5FC5\u9808\u5927\u65BC 0 \u4E14\u5C0F\u65BC 1\u3002',\r\n            'example': '0.35',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'deg_freedom',\r\n            'detail' : '\u81EA\u7531\u5EA6\u6578\u503C\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u53C3\u6578\u4E0D\u662F\u6574\u6578,\u5C07\u622A\u53D6\u5176\u6574\u6578\u90E8\u5206\u3002\\n\\n\u5FC5\u9808\u5927\u65BC\u7B49\u65BC1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_INV_2T',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5B78\u751F t \u5206\u4F48\u7684\u96D9\u5C3E\u53CD\u51FD\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u5B78\u751F t \u5206\u4F48\u7684\u96D9\u5C3E\u53CD\u51FD\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'probability',\r\n            'detail' : '\u8207\u5B78\u751F\u7684t\u5206\u4F48\u76F8\u95DC\u7684\u6982\u7387\u3002\\n\\n\u5FC5\u9808\u5927\u65BC 0 \u4E14\u5C0F\u65BC 1\u3002',\r\n            'example': '0.35',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'deg_freedom',\r\n            'detail' : '\u81EA\u7531\u5EA6\u6578\u503C\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u53C3\u6578\u4E0D\u662F\u6574\u6578,\u5C07\u622A\u53D6\u5176\u6574\u6578\u90E8\u5206\u3002\\n\\n\u5FC5\u9808\u5927\u65BC\u7B49\u65BC1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'T_TEST',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u8207t-\u6AA2\u9A57\u76F8\u95DC\u7684\u6982\u7387\u3002\u7528\u65BC\u5224\u65B7\u5169\u500B\u6A23\u672C\u662F\u5426\u53EF\u80FD\u662F\u51FA\u81EA\u5E73\u5747\u503C\u76F8\u540C\u7684\u5169\u500B\u6A23\u672C\u7E3D\u9AD4\u3002',\r\n        'a': '\u8FD4\u56DE\u8207t-\u6AA2\u9A57\u76F8\u95DC\u7684\u6982\u7387\u3002\u7528\u65BC\u5224\u65B7\u5169\u500B\u6A23\u672C\u662F\u5426\u53EF\u80FD\u662F\u51FA\u81EA\u5E73\u5747\u503C\u76F8\u540C\u7684\u5169\u500B\u6A23\u672C\u7E3D\u9AD4\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'array1',\r\n            'detail' : '\u5C07\u7528\u65BCt\u6AA2\u9A57\u7684\u7B2C\u4E00\u500B\u6578\u64DA\u6A23\u672C\u6216\u7B2C\u4E00\u7D44\u5132\u5B58\u683C\u3002',\r\n            'example': 'A1:A4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'array2',\r\n            'detail' : '\u5C07\u7528\u65BCt\u6AA2\u9A57\u7684\u7B2C\u4E8C\u500B\u6578\u64DA\u6A23\u672C\u6216\u7B2C\u4E8C\u7D44\u5132\u5B58\u683C\u3002',\r\n            'example': 'B1:B4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'tails',\r\n            'detail' : '\u6307\u5B9A\u5206\u4F48\u7684\u5C3E\u6578\u3002\\n\\n\u5982\u679C\u70BA 1:\u4F7F\u7528\u55AE\u5C3E\u5206\u4F48\u3002\\n\\n\u5982\u679C\u70BA 2:\u4F7F\u7528\u96D9\u5C3E\u5206\u4F48\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '\u6307\u5B9At\u6AA2\u9A57\u7684\u985E\u578B\u3002\\n\\n\u5982\u679C\u70BA 1:\u57F7\u884C\u914D\u5C0D\u6AA2\u9A57\u3002\\n\\n\u5982\u679C\u70BA 2:\u57F7\u884C\u96D9\u6A23\u672C\u7B49\u65B9\u5DEE\uFF08\u540C\u65B9\u5DEE\uFF09\u6AA2\u9A57\u3002\\n\\n\u5982\u679C\u70BA 3:\u57F7\u884C\u96D9\u6A23\u672C\u4E0D\u7B49\u65B9\u5DEE\uFF08\u5F02\u65B9\u5DEE\uFF09\u6AA2\u9A57\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'F_DIST',\r\n        't': 1,\r\n        'd': '\u7D66\u5B9A\u8F38\u5165\u503C x,\u8A08\u7B97\u5169\u500B\u6578\u64DA\u96C6\u7684\u5DE6\u5C3E F \u6982\u7387\u5206\u4F48\uFF08\u5DEE\u5F02\u7A0B\u5EA6\uFF09\u3002\u6B64\u5206\u4F48\u4E5F\u7A31\u70BA Fisher-Snedecor \u5206\u4F48\u6216Snedecor F \u5206\u4F48\u3002',\r\n        'a': '\u7D66\u5B9A\u8F38\u5165\u503C x',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u7528\u4F86\u8A08\u7B97\u51FD\u6578\u7684\u503C\u3002',\r\n            'example': '15.35',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom1',\r\n            'detail' : '\u5206\u5B50\u81EA\u7531\u5EA6\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom2',\r\n            'detail' : '\u5206\u6BCD\u81EA\u7531\u5EA6\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cumulative',\r\n            'detail' : '\u7528\u65BC\u78BA\u5B9A\u51FD\u6578\u5F62\u5F0F\u7684\u908F\u8F2F\u503C\u3002\u9810\u8A2D\u503C\u70BA FALSE\u3002\\n\\n\u5982\u679C\u70BA TRUE\uFF08\uFF09:F.DIST\u5C07\u8FD4\u56DE\u7D2F\u7A4D\u5206\u4F48\u51FD\u6578\u503C\u3002\\n\\n\u5982\u679C\u70BAFALSE\uFF08\uFF09:F.DIST\u5C07\u8FD4\u56DE\u6982\u7387\u5BC6\u5EA6\u51FD\u6578\u503C\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'F_DIST_RT',\r\n        't': 1,\r\n        'd': '\u7D66\u5B9A\u8F38\u5165x,\u8A08\u7B97\u5169\u500B\u6578\u64DA\u96C6\u7684\u53F3\u5C3EF\u6982\u7387\u5206\u4F48\uFF08\u5DEE\u5F02\u7A0B\u5EA6\uFF09\u3002\u6B64\u5206\u4F48\u4E5F\u7A31\u70BAFisher-Snedecor\u5206\u4F48\u6216Snedecor F\u5206\u4F48\u3002',\r\n        'a': '\u7D66\u5B9A\u8F38\u5165 x',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u7528\u4F86\u8A08\u7B97\u51FD\u6578\u7684\u503C\u3002',\r\n            'example': '15.35',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom1',\r\n            'detail' : '\u5206\u5B50\u81EA\u7531\u5EA6\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'degrees_freedom2',\r\n            'detail' : '\u5206\u6BCD\u81EA\u7531\u5EA6\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VAR_P',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u65B9\u5DEE\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u65B9\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6578\u64DA\u96C6\u4E2D\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, \u2026',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VAR_S',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u65B9\u5DEE\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u8A08\u7B97\u65B9\u5DEE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, \u2026',\r\n            'detail' : '[\u53EF\u9078] - \u6A23\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VARA',\r\n        't': 1,\r\n        'd': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE,\u5C06\u6587\u672C\u53D6\u503C\u4E3A0\u3002',\r\n        'a': '\u57FA\u4E8E\u6837\u672C\u8BA1\u7B97\u65B9\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'value2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6A23\u672C\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'VARPA',\r\n        't': 1,\r\n        'd': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u65B9\u5DEE,\u5C07\u6587\u5B57\u53D6\u503C\u70BA0\u3002',\r\n        'a': '\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u65B9\u5DEE',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6A23\u672C\u4E2D\u7684\u7B2C\u4E00\u9805\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u6578\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STEYX',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u901A\u904E\u7DDA\u6027\u56DE\u6B78\u6CD5\u9810\u6E2C\u6BCF\u500B x \u7684 y \u503C\u6642\u6240\u7522\u751F\u7684\u6A19\u6E96\u8AA4\u5DEE\u3002',\r\n        'a': '\u8FD4\u56DE\u901A\u904E\u7DDA\u6027\u56DE\u6B78\u6CD5\u9810\u6E2C\u6BCF\u500B x \u7684 y \u503C\u6642\u6240\u7522\u751F\u7684\u6A19\u6E96\u8AA4\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'STANDARDIZE',\r\n        't': 1,\r\n        'd': '\u7D66\u5B9A\u5206\u4F48\u7684\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE,\u8A08\u7B97\u4E00\u500B\u96A8\u6A5F\u8B8A\u6578\u6B63\u614B\u5316\u7684\u76F8\u61C9\u503C\u3002',\r\n        'a': '\u7D66\u5B9A\u5206\u4F48\u7684\u5E73\u5747\u503C\u548C\u6A19\u6E96\u5DEE,\u8A08\u7B97\u4E00\u500B\u96A8\u6A5F\u8B8A\u6578\u6B63\u614B\u5316\u7684\u76F8\u61C9\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'x',\r\n            'detail' : '\u8981\u6B63\u614B\u5316\u7684\u96A8\u6A5F\u8B8A\u6578\u503C\u3002',\r\n            'example': '96',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'mean',\r\n            'detail' : '\u5206\u4F48\u7684\u5E73\u5747\u503C\u3002',\r\n            'example': '80',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'standard_dev',\r\n            'detail' : '\u5206\u4F48\u7684\u6A19\u6E96\u5DEE\u3002',\r\n            'example': '6.7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SMALL',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u7B2Ck\u500B\u6700\u5C0F\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u64DA\u96C6\u4E2D\u7684\u7B2Ck\u500B\u6700\u5C0F\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u9700\u8981\u627E\u5230\u7B2Ck\u500B\u6700\u5C0F\u503C\u7684\u6578\u7D44\u6216\u6578\u503C\u6578\u64DA\u5340\u57DF\u3002',\r\n            'example': 'A2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'k',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7684\u6578\u64DA\u5728\u6578\u7D44\u6216\u6578\u64DA\u5340\u57DF\u88CF\u7684\u4F4D\u7F6E\uFF08\u5F9E\u5C0F\u5230\u5927\uFF09\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SLOPE',\r\n        't': 1,\r\n        'd': '\u8A08\u7B97\u901A\u904E\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78\u5F97\u5230\u7684\u76F4\u7DDA\u7684\u659C\u7387\u3002',\r\n        'a': '\u8A08\u7B97\u901A\u904E\u6578\u64DA\u96C6\u7684\u7DDA\u6027\u56DE\u6B78\u5F97\u5230\u7684\u76F4\u7DDA\u7684\u659C\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : '\u6578\u64DA_y',\r\n            'detail' : '\u4EE3\u8868\u56E0\u8B8A\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u6578\u64DA_x',\r\n            'detail' : '\u4EE3\u8868\u5F15\u6578\u6578\u64DA\u6578\u7D44\u6216\u77E9\u9663\u7684\u7BC4\u570D\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SKEW',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u5206\u4F48\u7684\u504F\u659C\u5EA6\u3002\u504F\u659C\u5EA6\u8868\u660E\u5206\u4F48\u76F8\u5C0D\u65BC\u5E73\u5747\u503C\u7684\u4E0D\u5C0D\u7A31\u7A0B\u5EA6\u3002\u6B63\u504F\u659C\u5EA6\u8868\u660E\u5206\u4F48\u7684\u4E0D\u5C0D\u7A31\u5C3E\u90E8\u8DA8\u5411\u65BC\u66F4\u591A\u6B63\u503C\u3002\u8CA0\u504F\u659C\u5EA6\u8868\u660E\u5206\u4F48\u7684\u4E0D\u5C0D\u7A31\u5C3E\u90E8\u8DA8\u5411\u65BC\u66F4\u591A\u8CA0\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u5206\u4F48\u7684\u504F\u659C\u5EA6\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6578\u64DA\u96C6\u4E2D\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'SKEW_P',\r\n        't': 1,\r\n        'd': '\u8FD4\u56DE\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u7684\u5206\u4F48\u4E0D\u5C0D\u7A31\u5EA6:\u8868\u660E\u5206\u4F48\u76F8\u5C0D\u65BC\u5E73\u5747\u503C\u7684\u4E0D\u5C0D\u7A31\u7A0B\u5EA6\u3002',\r\n        'a': '\u8FD4\u56DE\u57FA\u65BC\u6A23\u672C\u7E3D\u9AD4\u7684\u5206\u4F48\u4E0D\u5C0D\u7A31\u5EA6:\u8868\u660E\u5206\u4F48\u76F8\u5C0D\u65BC\u5E73\u5747\u503C\u7684\u4E0D\u5C0D\u7A31\u7A0B\u5EA6\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : '\u503C1',\r\n            'detail' : '\u6578\u64DA\u96C6\u4E2D\u7684\u7B2C\u4E00\u500B\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u503C2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u96C6\u4E2D\u5305\u542B\u7684\u5176\u4ED6\u503C\u6216\u7BC4\u570D\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'VLOOKUP',\r\n        't': 2,\r\n        'd': '\u7E31\u5411\u67E5\u627E\u3002\u5728\u7BC4\u570D\u7684\u7B2C\u4E00\u5217\u4E2D\u81EA\u4E0A\u800C\u4E0B\u8490\u7D22\u67D0\u500B\u9375\u503C,\u4E26\u8FD4\u56DE\u6240\u627E\u5230\u7684\u884C\u4E2D\u6307\u5B9A\u5132\u5B58\u683C\u7684\u503C\u3002',\r\n        'a': '\u7E31\u5411\u67E5\u627E\u3002\u5728\u7BC4\u570D\u7684\u7B2C\u4E00\u5217\u4E2D\u81EA\u4E0A\u800C\u4E0B\u8490\u7D22\u67D0\u500B\u9375\u503C',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : '\u8490\u7D22\u9375\u503C',\r\n            'detail' : '\u8981\u8490\u7D22\u7684\u503C,\u5982 42\u3001\"Cats\" \u6216 I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7BC4\u570D',\r\n            'detail' : '\u8981\u9032\u884C\u8490\u7D22\u7684\u7BC4\u570D\u3002VLOOKUP \u5C07\u5728\u8A72\u7BC4\u570D\u7684\u7B2C\u4E00\u5217\u4E2D\u8490\u7D22\u8490\u7D22\u9375\u503C\u4E2D\u6307\u5B9A\u7684\u9375\u503C\u3002',\r\n            'example': 'A2:B26',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7D22\u5F15',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7684\u503C\u7684\u5217\u7D22\u5F15,\u7BC4\u570D\u4E2D\u7684\u7B2C\u4E00\u5217\u7DE8\u865F\u70BA1\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u4E0D\u662F\u4ECB\u65BC1\u548C\u7BC4\u570D\u4E2D\u7684\u5217\u6578\u4E4B\u9593,\u5C07\u8FD4\u56DE#VALUE\uFF01\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u5DF2\u6392\u5E8F',\r\n            'detail' : '[\u9810\u8A2D\u503C\u70BATRUE()] -\u8A13\u793A\u8981\u8490\u7D22\u7684\u5217\uFF08\u6307\u5B9A\u7BC4\u570D\u7684\u7B2C\u4E00\u5217\uFF09\u662F\u5426\u5DF2\u6392\u5E8F\u3002\u5927\u591A\u6578\u60C5\u51B5\u4E0B,\u5EFA\u8B70\u8A2D\u70BAFALSE\uFF08\uFF09\u3002\\n\\n\u5EFA\u8B70\u5C07\u5DF2\u6392\u5E8F\u8A2D\u70BAFALSE\u3002\u5982\u679C\u8A2D\u70BAFALSE,\u5C07\u8FD4\u56DE\u5B8C\u5168\u5339\u914D\u9805\u3002\u5982\u679C\u5B58\u5728\u591A\u500B\u5339\u914D\u503C,\u5C07\u8FD4\u56DE\u627E\u5230\u7684\u7B2C\u4E00\u500B\u503C\u5C0D\u61C9\u7684\u5132\u5B58\u683C\u7684\u5167\u5BB9,\u5982\u679C\u627E\u4E0D\u5230\u5339\u914D\u503C,\u5247\u8FD4\u56DE#N/A\u3002\\n\\n\u5982\u679C\u5C07\u5DF2\u6392\u5E8F\u8A2D\u70BATRUE\u6216\u7701\u7565,\u5C07\u8FD4\u56DE\uFF08\u5C0F\u65BC\u6216\u7B49\u65BC\u8490\u7D22\u9375\u503C\u7684\uFF09\u6700\u63A5\u8FD1\u7684\u5339\u914D\u9805\u3002\u5982\u679C\u8490\u7D22\u7684\u5217\u4E2D\u6240\u6709\u7684\u503C\u5747\u5927\u65BC\u8490\u7D22\u9375\u503C,\u5247\u8FD4\u56DE#N/A\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HLOOKUP',\r\n        't': 2,\r\n        'd': '\u6A6B\u5411\u67E5\u627E\u3002\u5728\u7BC4\u570D\u7684\u7B2C\u4E00\u884C\u4E2D\u8490\u7D22\u67D0\u500B\u9375\u503C,\u4E26\u8FD4\u56DE\u6240\u627E\u5230\u7684\u5217\u4E2D\u6307\u5B9A\u5132\u5B58\u683C\u7684\u503C\u3002',\r\n        'a': '\u6A6B\u5411\u67E5\u627E\u3002\u5728\u7BC4\u570D\u7684\u7B2C\u4E00\u884C\u4E2D\u8490\u7D22\u67D0\u500B\u9375\u503C',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : '\u8490\u7D22\u9375\u503C',\r\n            'detail' : '\u8981\u8490\u7D22\u7684\u503C\u3002\u4F8B\u5982,42\u3001\"Cats\"\u6216I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7BC4\u570D',\r\n            'detail' : '\u8981\u9032\u884C\u8490\u7D22\u7684\u7BC4\u570D\u3002\u5C07\u5728\u8A72\u7BC4\u570D\u7684\u7B2C\u4E00\u884C\u4E2D\u8490\u7D22\u5728\u8490\u7D22\u9375\u503C\u4E2D\u6307\u5B9A\u7684\u9375\u503C\u3002',\r\n            'example': 'A2:Z6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7D22\u5F15',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7684\u503C\u7684\u884C\u7D22\u5F15,\u7BC4\u570D\u4E2D\u7684\u7B2C\u4E00\u884C\u7DE8\u865F\u70BA1\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u4E0D\u662F\u4ECB\u65BC1\u548C\u7BC4\u570D\u4E2D\u7684\u884C\u6578\u4E4B\u9593,\u5C07\u8FD4\u56DE#VALUE\uFF01\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u5DF2\u6392\u5E8F',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE()] - \u8A13\u793A\u8981\u8490\u7D22\u7684\u884C\uFF08\u6307\u5B9A\u7BC4\u570D\u7684\u7B2C\u4E00\u884C\uFF09\u662F\u5426\u5DF2\u6392\u5E8F\u3002\\n\\n\u5982\u679C\u5C07\u5DF2\u6392\u5E8F\u8A2D\u70BATRUE\u6216\u7701\u7565,\u5C07\u8FD4\u56DE\u6700\u63A5\u8FD1\u7684\u5339\u914D\u503C\uFF08\u5C0F\u65BC\u6216\u7B49\u65BC\u8490\u7D22\u9375\u503C\uFF09\u3002\u5982\u679C\u5728\u8490\u7D22\u7684\u884C\u4E2D\u6240\u6709\u7684\u503C\u5747\u5927\u65BC\u8490\u7D22\u9375\u503C,\u5247\u8FD4\u56DE#N/A\u3002\\n\\n\u5982\u679C\u5C07\u5DF2\u6392\u5E8F\u8A2D\u70BATRUE\u6216\u5C07\u5176\u7701\u7565,\u800C\u7BC4\u570D\u7684\u9996\u884C\u4E26\u975E\u8655\u65BC\u5DF2\u6392\u5E8F\u72C0\u614B,\u5247\u8FD4\u56DE\u503C\u53EF\u80FD\u6703\u662F\u932F\u8AA4\u7684\u3002\\n\\n\u5982\u679C\u5C07\u5DF2\u6392\u5E8F\u8A2D\u70BAFALSE,\u5247\u50C5\u8FD4\u56DE\u5B8C\u5168\u5339\u914D\u3002\u5982\u679C\u5B58\u5728\u591A\u500B\u5339\u914D\u503C,\u5C07\u8FD4\u56DE\u8207\u627E\u5230\u7684\u7B2C\u4E00\u500B\u503C\u5C0D\u61C9\u7684\u5132\u5B58\u683C\u7684\u5167\u5BB9,\u5982\u679C\u627E\u4E0D\u5230\u5339\u914D\u503C\u5247\u8FD4\u56DE#N/A\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LOOKUP',\r\n        't': 2,\r\n        'd': '\u5728\u884C\u6216\u5217\u4E2D\u67E5\u627E\u76F8\u61C9\u9375,\u4E26\u5C07\u76F8\u61C9\u5132\u5B58\u683C\u7684\u503C\u8FD4\u56DE\u5230\u8207\u8490\u7D22\u884C\u6216\u5217\u6240\u5728\u4F4D\u7F6E\u76F8\u540C\u7684\u7D50\u679C\u7BC4\u570D\u4E2D\u3002',\r\n        'a': '\u5728\u884C\u6216\u5217\u4E2D\u67E5\u627E\u76F8\u61C9\u9375',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : '\u8490\u7D22\u9375\u503C',\r\n            'detail' : '\u8981\u5728\u884C\u6216\u5217\u4E2D\u8490\u7D22\u7684\u503C\u3002\u4F8B\u5982,42\u3001\"Cats\" \u6216 I24\u3002',\r\n            'example': '10003',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u641C\u7D22\u7BC4\u570D | \u641C\u7D22\u7D50\u679C\u6578\u7D44',\r\n            'detail' : '\u4F7F\u7528LOOKUP\u7684\u4E00\u7A2E\u65B9\u6CD5\u662F\u7D66\u5B9A\u55AE\u884C\u6216\u55AE\u5217\u5F62\u5F0F\u7684\u641C\u7D22\u7BC4\u570D\u9032\u884C\u8490\u7D22\u67E5\u627E,\u9019\u7A2E\u7BA1\u9053\u8981\u7528\u5230\u53E6\u4E00\u500B\u53C3\u6578\u7D50\u679C\u7BC4\u570D\u3002\u53E6\u4E00\u7A2E\u7BA1\u9053\u662F\u5C07\u9019\u5169\u500B\u53C3\u6578\u5408\u4F75\u70BA\u4E00\u500B\u641C\u7D22\u7D50\u679C\u6578\u7D44,\u5176\u4E2D\u7B2C\u4E00\u884C\u6216\u7B2C\u4E00\u5217\u7528\u65BC\u8490\u7D22,\u4E26\u5C07\u8FD4\u56DE\u503C\u653E\u5728\u8A72\u6578\u7D44\u7684\u6700\u5F8C\u4E00\u884C\u6216\u6700\u5F8C\u4E00\u5217\u4E2D\u3002',\r\n            'example': 'A1:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7D50\u679C\u7BC4\u570D',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7528\u65BC\u5B58\u653E\u8FD4\u56DE\u7D50\u679C\u7684\u7BC4\u570D\u3002\u8FD4\u56DE\u503C\u5C0D\u61C9\u65BC\u5728\u641C\u7D22\u7BC4\u570D\u4E2D\u627E\u5230\u8490\u7D22\u9375\u503C\u7684\u4F4D\u7F6E\u3002\u6B64\u7BC4\u570D\u5FC5\u9808\u50C5\u70BA\u55AE\u884C\u6216\u55AE\u5217,\u800C\u5982\u679C\u60A8\u4F7F\u7528\u7684\u662F\u641C\u7D22\u7D50\u679C\u6578\u7D44\u7BA1\u9053,\u5247\u4E0D\u61C9\u63D0\u4F9B\u6B64\u53C3\u6578\u3002',\r\n            'example': 'B1:B100',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ADDRESS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u5B57\u4E32\u5F62\u5F0F\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u4E32\u5F62\u5F0F\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'm': [2, 5],\r\n        'p': [{\r\n            'name'   : 'row_num',\r\n            'detail' : '\u4E00\u500B\u6578\u503C,\u6307\u5B9A\u8981\u5728\u5132\u5B58\u683C\u5F15\u7528\u4E2D\u4F7F\u7528\u7684\u884C\u865F\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'column_num',\r\n            'detail' : '\u4E00\u500B\u6578\u503C,\u6307\u5B9A\u8981\u5728\u5132\u5B58\u683C\u5F15\u7528\u4E2D\u4F7F\u7528\u7684\u5217\u865F\uFF08\u800C\u975E\u540D\u7A31\uFF09\u3002A\u5217\u7684\u7DE8\u865F\u70BA1\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'abs_num',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA1] - \u4E00\u500B\u6578\u503C,\u6307\u5B9A\u8981\u8FD4\u56DE\u7684\u53C3\u8003\u985E\u578B\u3002\\n\\n1\u8868\u793A\u884C\u5217\u5747\u63A1\u7528\u7D55\u5C0D\u503C\uFF08\u4F8B\u5982$A$1\uFF09\uFF1B\\n\\n2\u8868\u793A\u63A1\u7528\u7D55\u5C0D\u884C\u865F,\u76F8\u5C0D\u5217\u6A19\uFF08\u4F8B\u5982A$1\uFF09\uFF1B\\n\\n3\u8868\u793A\u63A1\u7528\u76F8\u5C0D\u884C\u865F,\u7D55\u5C0D\u5217\u6A19\uFF08\u4F8B\u5982$A1\uFF09\uFF1B\\n\\n4\u8868\u793A\u884C\u5217\u5747\u63A1\u7528\u76F8\u5C0D\u503C\uFF08\u4F8B\u5982A1\uFF09\u3002',\r\n            'example': '4',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'A1',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u5E03\u6797\u503C,\u8A13\u793A\u63A1\u7528A1\u6A19\u8A18\u5F62\u5F0F\uFF08TRUE\uFF09\u9084\u662FR1C1\u6A19\u8A18\u5F62\u5F0F\uFF08FALSE\uFF09\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'sheet_text',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u9810\u8A2D] - \u7528\u65BC\u6307\u5B9A\u5730\u5740\u6240\u6307\u5411\u7684\u5DE5\u4F5C\u8868\u540D\u7A31\u3002',\r\n            'example': '\"Sheet2\"',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'INDIRECT',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u4EE5\u5B57\u4E32\u6307\u5B9A\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5\u5B57\u4E32\u6307\u5B9A\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'ref_text',\r\n            'detail' : '\u4EE5\u5E36\u5F15\u865F\u7684\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n            'example': '\"Sheet2!\"&B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'A1',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u5E03\u6797\u503C,\u8A13\u793A\u63A1\u7528A1\u6A19\u8A18\u5F62\u5F0F\uFF08TRUE\uFF09\u9084\u662FR1C1\u6A19\u8A18\u5F62\u5F0F\uFF08FALSE\uFF09\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ROW',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u5132\u5B58\u683C\u7684\u884C\u865F',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u5132\u5B58\u683C\u7684\u884C\u865F',\r\n        'm': [0, 1],\r\n        'p': [{\r\n            'name'   : 'reference',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA\u6B64\u516C\u5F0F\u6240\u5728\u7684\u5132\u5B58\u683C] - \u8981\u8FD4\u56DE\u5176\u884C\u865F\u7684\u5132\u5B58\u683C\u3002\\n\\n\u5982\u679C\u5132\u5B58\u683C\u5F15\u7528\u6307\u5411\u7684\u7BC4\u570D\u5176\u5BEC\u5EA6\u5927\u65BC\u4E00\u500B\u5132\u5B58\u683C,\u800C\u6B64\u516C\u5F0F\u4E0D\u662F\u7528\u4F5C\u6578\u7D44\u516C\u5F0F\u7684,\u9019\u6642\u6703\u50C5\u8FD4\u56DE\u5132\u5B58\u683C\u5F15\u7528\u4E2D\u9996\u884C\u7684\u7DE8\u865F\u503C\u3002',\r\n            'example': 'A9',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ROWS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6578\u7D44\u6216\u7BC4\u570D\u4E2D\u7684\u884C\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6578\u7D44\u6216\u7BC4\u570D\u4E2D\u7684\u884C\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u884C\u6578\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A9:A62',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COLUMN',\r\n        't': 2,\r\n        'd': '\u6309\u7167 `A=1` \u7684\u898F\u5247\u8FD4\u56DE\u6307\u5B9A\u5132\u5B58\u683C\u7684\u5217\u865F\u3002',\r\n        'a': '\u6309\u7167 `A=1` \u7684\u898F\u5247\u8FD4\u56DE\u6307\u5B9A\u5132\u5B58\u683C\u7684\u5217\u865F\u3002',\r\n        'm': [0, 1],\r\n        'p': [{\r\n            'name'   : 'reference',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA\u5305\u542B\u6B64\u516C\u5F0F\u7684\u5132\u5B58\u683C] - \u8981\u8FD4\u56DE\u5176\u5217\u865F\u7684\u5132\u5B58\u683C\u3002A\u5217\u5C0D\u61C9\u7684\u7DE8\u865F\u70BA1\u3002\\n\\n\u5982\u679C\u5132\u5B58\u683C\u5F15\u7528\u662F\u5BEC\u5EA6\u8D85\u904E\u4E00\u500B\u5132\u5B58\u683C\u7684\u7BC4\u570D,\u800C\u6B64\u516C\u5F0F\u4E0D\u662F\u4F5C\u70BA\u6578\u7D44\u516C\u5F0F\u4F86\u4F7F\u7528\u7684,\u56D9\u6B64\u5C07\u8FD4\u56DE\u5132\u5B58\u683C\u5F15\u7528\u4E2D\u7684\u7B2C\u4E00\u5217\u7684\u4F4D\u7F6E\u3002',\r\n            'example': 'A9',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'COLUMNS',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6578\u7D44\u6216\u7BC4\u570D\u4E2D\u7684\u5217\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6578\u7D44\u6216\u7BC4\u570D\u4E2D\u7684\u5217\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u5217\u6578\u7684\u7BC4\u570D\u3002',\r\n            'example': 'A9:W62',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OFFSET',\r\n        't': 2,\r\n        'd': '\u7D66\u5B9A\u67D0\u7BC4\u570D\u7684\u8D77\u59CB\u5132\u5B58\u683C\u5F15\u7528\u4EE5\u53CA\u8A72\u7BC4\u570D\u6DB5\u84CB\u7684\u884C\u5217\u6578\u91CF,\u8FD4\u56DE\u8A72\u7BC4\u570D\u7684\u5F15\u7528\u3002',\r\n        'a': '\u7D66\u5B9A\u67D0\u7BC4\u570D\u7684\u8D77\u59CB\u5132\u5B58\u683C\u5F15\u7528\u4EE5\u53CA\u8A72\u7BC4\u570D\u6DB5\u84CB\u7684\u884C\u5217\u6578\u91CF,\u8FD4\u56DE\u8A72\u7BC4\u570D\u7684\u5F15\u7528\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name'   : 'reference',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u884C\u5217\u504F\u79FB\u91CF\u7684\u8D77\u9EDE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'rows',\r\n            'detail' : '\u8981\u504F\u79FB\u7684\u884C\u6578\u3002\\n\\n\u884C\u504F\u79FB\u91CF\u5FC5\u9808\u662F\u6574\u6578,\u4F46\u4E5F\u53EF\u4EE5\u662F\u8CA0\u6578\u3002\u5982\u679C\u63D0\u4F9B\u7684\u53C3\u6578\u5E36\u6709\u5C0F\u6578,\u5C0F\u6578\u90E8\u5206\u5C07\u88AB\u622A\u53BB\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cols',\r\n            'detail' : '\u8981\u504F\u79FB\u7684\u5217\u6578\u3002\\n\\n\u5217\u504F\u79FB\u91CF\u5FC5\u9808\u662F\u6574\u6578,\u4F46\u4E5F\u53EF\u4EE5\u662F\u8CA0\u6578\u3002\u5982\u679C\u63D0\u4F9B\u7684\u53C3\u6578\u5E36\u6709\u5C0F\u6578,\u5C0F\u6578\u90E8\u5206\u5C07\u88AB\u622A\u53BB\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'height',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u5F9E\u504F\u79FB\u76EE\u6A19\u958B\u59CB\u8FD4\u56DE\u7684\u7BC4\u570D\u7684\u9AD8\u5EA6\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'width',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u5F9E\u504F\u79FB\u76EE\u6A19\u958B\u59CB\u8FD4\u56DE\u7684\u7BC4\u570D\u7684\u5BEC\u5EA6\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MATCH',\r\n        't': 2,\r\n        'd': '\u5728\u5132\u5B58\u683C\u4E2D\u8490\u7D22\u6307\u5B9A\u9805,\u7136\u5F8C\u8FD4\u56DE\u8A72\u9805\u5728\u5132\u5B58\u683C\u5340\u57DF\u4E2D\u7684\u76F8\u5C0D\u4F4D\u7F6E\u3002',\r\n        'a': '\u5728\u5132\u5B58\u683C\u4E2D\u8490\u7D22\u6307\u5B9A\u9805,\u7136\u5F8C\u8FD4\u56DE\u8A72\u9805\u5728\u5132\u5B58\u683C\u5340\u57DF\u4E2D\u7684\u76F8\u5C0D\u4F4D\u7F6E\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'lookup_value',\r\n            'detail' : '\u8981\u5728 lookup_array \u4E2D\u5339\u914D\u7684\u503C\u3002',\r\n            'example': '\"Sunday\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'lookup_array',\r\n            'detail' : '\u8981\u8490\u7D22\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\\n\\n\u5982\u679C\u6240\u7528\u7684\u7BC4\u570D\u7684\u9AD8\u5EA6\u548C\u5BEC\u5EA6\u5747\u5927\u65BC1,MATCH\u5C07\u8FD4\u56DE#N/A\uFF01\u3002',\r\n            'example': 'A2:A9',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'match_type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA1] - \u8981\u63A1\u7528\u7684\u8490\u7D22\u7BA1\u9053\u3002\\n\\n1\u70BA\u9ED8\u8A8D\u985E\u578B,\u6B64\u6642MATCH\u6703\u5047\u8A2D\u7BC4\u570D\u5DF2\u6309\u6607\u51AA\u6392\u5E8F,\u4E26\u8FD4\u56DE\u5C0F\u65BC\u7B49\u65BC\u8490\u7D22\u9375\u503C\u7684\u6700\u5927\u503C\u3002\\n\\n0\u8868\u793A\u5B8C\u5168\u5339\u914D,\u5728\u7BC4\u570D\u672A\u6392\u5E8F\u7684\u60C5\u51B5\u4E0B\u9700\u8981\u4F7F\u7528\u6B64\u7BA1\u9053\u3002\\n\\n-1\u8B93MATCH\u5047\u8A2D\u7BC4\u570D\u662F\u6309\u964D\u5E8F\u6392\u5E8F\u7684,\u4E26\u8FD4\u56DE\u5927\u65BC\u7B49\u65BC\u8490\u7D22\u9375\u503C\u7684\u6700\u5C0F\u503C\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INDEX',\r\n        't': 2,\r\n        'd': '\u8FD4\u56DE\u8868\u683C\u6216\u4E2D\u7684\u5143\u7D20\u503C,\u6B64\u5143\u7D20\u7531\u884C\u865F\u548C\u5217\u865F\u7684\u7D22\u5F15\u503C\u7D66\u5B9A\u3002',\r\n        'a': '\u8FD4\u56DE\u8868\u683C\u6216\u4E2D\u7684\u5143\u7D20\u503C,\u6B64\u5143\u7D20\u7531\u884C\u865F\u548C\u5217\u865F\u7684\u7D22\u5F15\u503C\u7D66\u5B9A\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u5132\u5B58\u683C\u5340\u57DF\u6216\u6578\u7D44\u5E38\u6578\u3002',\r\n            'example': 'A1:C20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'row_num',\r\n            'detail' : '\u9078\u64C7\u6578\u7D44\u4E2D\u7684\u67D0\u884C,\u51FD\u6578\u5F9E\u8A72\u884C\u8FD4\u56DE\u6578\u503C\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'column_num',\r\n            'detail' : '\u9078\u64C7\u6578\u7D44\u4E2D\u7684\u67D0\u5217,\u51FD\u6578\u5F9E\u8A72\u5217\u8FD4\u56DE\u6578\u503C\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'GETPIVOTDATA',\r\n        't': 2,\r\n        'd': '\u5F9E\u8207\u6307\u5B9A\u884C\u548C\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6578\u64DA\u900F\u8996\u9336\u4E2D\u9078\u53D6\u532F\u7E3D\u503C\u3002',\r\n        'a': '\u5F9E\u8207\u6307\u5B9A\u884C\u548C\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6578\u64DA\u900F\u8996\u9336\u4E2D\u9078\u53D6\u532F\u7E3D\u503C\u3002',\r\n        'm': [2, 254],\r\n        'p': [{\r\n            'name'   : 'data_field',\r\n            'detail' : '\u60A8\u60F3\u5F9E\u6578\u64DA\u900F\u8996\u9336\u4E2D\u7372\u53D6\u5176\u6578\u64DA\u7684\u503C\u540D\u7A31\u3002\\n\u503C\u540D\u7A31\u5FC5\u9808\u62EC\u5728\u5F15\u865F\u4E2D\u6216\u662F\u6307\u5411\u5305\u542B\u76F8\u95DC\u6587\u5B57\u7684\u4EFB\u4F55\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002\\n\u5982\u679C\u6709\u591A\u500B\u503C\u6B04\u4F4D,\u5247\u5FC5\u9808\u4F7F\u7528\u6578\u64DA\u900F\u8996\u9336\u4E2D\u986F\u793A\u7684\u78BA\u5207\u540D\u7A31\uFF08\u5982\"\u92B7\u552E\u7E3D\u984D\"\uFF09\u3002',\r\n            'example': '\"SUM of number of units\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'pivot_table',\r\n            'detail' : '\u76EE\u6A19\u6578\u64DA\u900F\u8996\u9336\u4E2D\u7684\u4EFB\u4F55\u5132\u5B58\u683C\u7684\u5F15\u7528\uFF08\u63A8\u85A6\u4F4D\u65BC\u9802\u89D2\u7684\u5132\u5B58\u683C\uFF09\u3002',\r\n            'example': \"'Pivot table'!A1\",\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'field1',\r\n            'detail' : '[\u53EF\u9078] - \u6E90\u6578\u64DA\u96C6\uFF08\u4E0D\u662F\u6578\u64DA\u900F\u8996\u9336\uFF09\u4E2D\u5217\u7684\u540D\u7A31\u3002',\r\n            'example': '\"division\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'item1',\r\n            'detail' : '[\u53EF\u9078] - \u6578\u64DA\u900F\u8996\u9336\u4E2D\u986F\u793A\u7684\u8207\u60A8\u8981\u6AA2\u7D22\u7684\u6B04\u4F4D\u540D\u7A311\u76F8\u5C0D\u61C9\u7684\u884C\u6216\u5217\u7684\u540D\u7A31\u3002',\r\n            'example': '\"east\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CHOOSE',\r\n        't': 2,\r\n        'd': '\u57FA\u65BC\u7D22\u5F15\u8FD4\u56DE\u9078\u9805\u6E05\u55AE\u4E2D\u7684\u5143\u7D20\u3002',\r\n        'a': '\u57FA\u65BC\u7D22\u5F15\u8FD4\u56DE\u9078\u9805\u6E05\u55AE\u4E2D\u7684\u5143\u7D20\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name'   : 'index_num',\r\n            'detail' : '\u6307\u5B9A\u8981\u8FD4\u56DE\u54EA\u4E00\u9805\u3002\\n\\n\u5982\u679C\u7D22\u5F15\u70BA\u96F6\u3001\u8CA0\u503C\u6216\u5927\u65BC\u63D0\u4F9B\u7684\u9078\u64C7\u6578\u91CF,\u5C07\u8FD4\u56DE#VALUE\uFF01\u932F\u8AA4\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'value1',\r\n            'detail' : '\u4E00\u9805\u53EF\u80FD\u7684\u8FD4\u56DE\u503C\u3002\u5FC5\u9808\u63D0\u4F9B\u3002\u53EF\u4EE5\u662F\u5132\u5B58\u683C\u5F15\u7528\u6216\u55AE\u7368\u7684\u503C\u3002',\r\n            'example': '\"A\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '[\u53EF\u9078] - \u5176\u4ED6\u53EF\u4EE5\u9078\u64C7\u7684\u503C\u3002\u9078\u64C7',\r\n            'example': '\"B\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HYPERLINK',\r\n        't': 2,\r\n        'd': '\u5728\u5132\u5B58\u683C\u5167\u5275\u5EFA\u4E00\u500B\u8D85\u9023\u7D50\u3002',\r\n        'a': '\u5728\u5132\u5B58\u683C\u5167\u5275\u5EFA\u4E00\u500B\u8D85\u9023\u7D50\u3002',\r\n        'p': [{\r\n            'name'   : '\u7DB2\u5740',\r\n            'detail' : '\u4EE5\u5F15\u865F\u62EC\u4F4F\u7684\u9023\u7D50\u4F4D\u7F6E\u7684\u5B8C\u6574\u7DB2\u5740,\u6216\u5C0D\u5305\u542B\u9019\u7A2E\u7DB2\u5740\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002\\n\\n\u50C5\u5141\u8A31\u67D0\u4E9B\u9023\u7D50\u985E\u578B\u3002\u5176\u4E2D\u5305\u62EC:http://\u3001https://\u3001mailto:\u3001aim:\u3001ftp://\u3001gopher://\u3001telnet://\u548Cnews://,\u660E\u78BA\u7981\u7528\u4F7F\u7528\u5176\u4ED6\u5354\u5B9A\u3002\u5982\u679C\u6307\u5B9A\u7684\u662F\u5176\u4ED6\u5354\u5B9A,\u5C07\u6703\u5728\u5132\u5B58\u683C\u4E2D\u986F\u793A\u9023\u7D50\u6A19\u7C64,\u4F46\u8A72\u6A19\u7C64\u4E0D\u6703\u4EE5\u9023\u7D50\u5F62\u5F0F\u5448\u73FE\u3002\\n\\n\u5982\u679C\u672A\u6307\u5B9A\u5354\u5B9A,\u5247\u5047\u8A2D\u4F7F\u7528http://,\u4E26\u5C07\u5176\u4F5C\u70BA\u7DB2\u5740\u7684\u9996\u78BC\u3002',\r\n            'example': '\"http://www.google.com/\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u9023\u7D50\u6A19\u7C64',\r\n            'detail' : '[\u53EF\u9078-\u9ED8\u8A8D\u70BA\u7DB2\u5740] - \u8981\u5728\u5132\u5B58\u683C\u4E2D\u4F5C\u70BA\u9023\u7D50\u986F\u793A\u7684\u6587\u5B57\uFF08\u7528\u5F15\u865F\u62EC\u8D77\u4F86\u7684\uFF09,\u6216\u8005\u6307\u5411\u5305\u542B\u9019\u7A2E\u6A19\u7C64\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002\\n\\n\u5982\u679C\u9023\u7D50\u6A19\u7C64\u662F\u6307\u5411\u67D0\u500B\u7A7A\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5982\u679C\u7DB2\u5740\u6709\u6548,\u5C31\u5C07\u5176\u4F5C\u70BA\u9023\u7D50\u986F\u793A,\u5426\u5247\u4F5C\u70BA\u7D14\u6587\u5B57\u986F\u793A\u3002\\n\\n\u5982\u679C\u9023\u7D50\u6A19\u7C64\u70BA\u7A7A\u5B57\u4E32\u5E38\u6578\uFF08\"\"\uFF09,\u6240\u5728\u5132\u5B58\u683C\u986F\u793A\u7684\u5167\u5BB9\u5C07\u70BA\u7A7A\u767D,\u4F46\u901A\u904E\u9EDE\u64CA\u8A72\u5132\u5B58\u683C\u6216\u8F49\u5165\u8A72\u5132\u5B58\u683C\u4ECD\u7136\u53EF\u4EE5\u8A2A\u554F\u9023\u7D50\u3002',\r\n            'example': '\"Google\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TIME',\r\n        't': 6,\r\n        'd': '\u5C07\u7D66\u5B9A\u7684\u5C0F\u6642\u3001\u5206\u9418\u548C\u79D2\u8F49\u63DB\u70BA\u6642\u9593\u3002',\r\n        'a': '\u5C07\u7D66\u5B9A\u7684\u5C0F\u6642\u3001\u5206\u9418\u548C\u79D2\u8F49\u63DB\u70BA\u6642\u9593\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : '\u5C0F\u6642',\r\n            'detail' : '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u9593\u7684\u6578\u4F4D,\u4EE3\u8868\u5C0F\u6642\u3002\\n\\n\u4EFB\u4F55\u5927\u65BC 23 \u7684\u503C\u90FD\u6703\u9664\u4EE524,\u9918\u6578\u5C07\u4F5C\u70BA\u5C0F\u6642\u503C\u3002',\r\n            'example': '11',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u5206\u9418',\r\n            'detail' : '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u9593\u7684\u6578\u4F4D,\u4EE3\u8868\u5206\u9418\u3002\\n\\n\u4EFB\u4F55\u5927\u65BC 59 \u7684\u503C\u5C07\u8F49\u63DB\u70BA\u5C0F\u6642\u548C\u5206\u9418\u3002',\r\n            'example': '40',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : '\u79D2',\r\n            'detail' : '0\uFF08\u96F6\uFF09\u5230 32767 \u4E4B\u9593\u7684\u6578\u4F4D,\u4EE3\u8868\u79D2\u3002\\n\\n\u4EFB\u4F55\u5927\u65BC 59 \u7684\u503C\u5C07\u8F49\u63DB\u70BA\u5C0F\u6642\u3001\u5206\u9418\u548C\u79D2\u3002',\r\n            'example': '59',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TIMEVALUE',\r\n        't': 6,\r\n        'd': '\u6309\u4E00\u592924\u5C0F\u6642\u8FD4\u56DE\u8A72\u6642\u9593\u7684\u5206\u6578\u8868\u793A\u3002',\r\n        'a': '\u6309\u4E00\u592924\u5C0F\u6642\u8FD4\u56DE\u8A72\u6642\u9593\u7684\u5206\u6578\u8868\u793A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'time_text',\r\n            'detail' : '\u7528\u65BC\u8868\u793A\u6642\u9593\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"2:15 PM\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EOMONTH',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u67D0\u500B\u6708\u4EFD\u6700\u5F8C\u4E00\u5929\u7684\u5E8F\u865F,\u8A72\u6708\u4EFD\u5728\u53E6\u4E00\u500B\u65E5\u671F\u4E4B\u524D\u6216\u4E4B\u5F8C\u7684\u6578\u500B\u6708\uFF08\u6708\u6578\u7531\u53C3\u6578\u6307\u5B9A\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u500B\u6708\u4EFD\u6700\u5F8C\u4E00\u5929\u7684\u5E8F\u865F',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7D50\u679C\u7684\u53C3\u7167\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'months',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7684\u8D77\u59CB\u65E5\u671F\u4E4B\u524D\uFF08\u8CA0\uFF09\u6216\u4E4B\u5F8C\uFF08\u6B63\uFF09\u7684\u6708\u6578\u3002\u8FD4\u56DE\u7684\u662F\u8A08\u7B97\u6240\u5F97\u6708\u4EFD\u7684\u6700\u5F8C\u90A3\u5929\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'EDATE',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u8868\u793A\u67D0\u500B\u65E5\u671F\u7684\u5E8F\u865F,\u8A72\u65E5\u671F\u5728\u53E6\u4E00\u500B\u65E5\u671F\u7684\u6578\u6708\u4E4B\u524D/\u4E4B\u5F8C\u3002',\r\n        'a': '\u8FD4\u56DE\u8868\u793A\u67D0\u500B\u65E5\u671F\u7684\u5E8F\u865F',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7D50\u679C\u7684\u53C3\u7167\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'months',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u7684\u8D77\u59CB\u65E5\u671F\u4E4B\u524D\uFF08\u8CA0\uFF09\u6216\u4E4B\u5F8C\uFF08\u6B63\uFF09\u7684\u6708\u6578\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SECOND',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u6642\u9593\u503C\u7684\u79D2\u6578\u3002\u79D2\u6578\u662F0\uFF08\u96F6\uFF09\u523059\u7BC4\u570D\u5167\u7684\u6574\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6642\u9593\u503C\u7684\u79D2\u6578\u3002\u79D2\u6578\u662F0\uFF08\u96F6\uFF09\u523059\u7BC4\u570D\u5167\u7684\u6574\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u6642\u9593',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u79D2\u9418\u90E8\u5206\u7684\u6642\u9593\u3002\u5FC5\u9808\u70BA\u4EE5\u4E0B\u503C\u4E4B\u4E00:\u6307\u5411\u5305\u542B\u65E5\u671F/\u6642\u9593\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u6642\u9593\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'MINUTE',\r\n        't': 6,\r\n        'd': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u6642\u9593\u7684\u5206\u9418\u90E8\u5206\u3002',\r\n        'a': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u6642\u9593\u7684\u5206\u9418\u90E8\u5206\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u6642\u9593',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u5206\u9418\u90E8\u5206\u7684\u6642\u9593\u3002\u5FC5\u9808\u70BA\u4EE5\u4E0B\u503C\u4E4B\u4E00:\u6307\u5411\u5305\u542B\u65E5\u671F/\u6642\u9593\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u6642\u9593\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HOUR',\r\n        't': 6,\r\n        'd': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u6642\u9593\u7684\u5C0F\u6642\u90E8\u5206\u3002',\r\n        'a': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u6642\u9593\u7684\u5C0F\u6642\u90E8\u5206\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : '\u6642\u9593',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u5C0F\u6642\u90E8\u5206\u7684\u6642\u9593\u3002\u5FC5\u9808\u70BA\u4EE5\u4E0B\u503C\u4E4B\u4E00:\u6307\u5411\u5305\u542B\u65E5\u671F/\u6642\u9593\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F/\u6642\u9593\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'TIME(11',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NOW',\r\n        't': 6,\r\n        'd': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u7576\u524D\u65E5\u671F\u548C\u6642\u9593\u3002',\r\n        'a': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u7576\u524D\u65E5\u671F\u548C\u6642\u9593\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'NETWORKDAYS',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u7684\u6642\u9593\u6BB5\u958B\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'end_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u7684\u6642\u9593\u6BB5\u7D50\u675F\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'holidays',\r\n            'detail' : '[\u53EF\u9078] - \u4E00\u500B\u7BC4\u570D\u6216\u6578\u7D44\u5E38\u6578,\u5176\u4E2D\u5305\u542B\u4F5C\u70BA\u7BC0\u5047\u65E5\u7684\u65E5\u671F\u5E8F\u865F\u3002\\n\\n\u5728\u7BC0\u5047\u65E5\u6578\u7D44\u4E2D\u63D0\u4F9B\u7684\u503C\u5FC5\u9808\u662F\u65E5\u671F\u5E8F\u865F\u503C\uFF08\u4F8B\u5982\u7531N\u6240\u8FD4\u56DE\u7684\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982\u7531DATE\u3001DATEVALUE\u6216TO_DATE\u8FD4\u56DE\u7684\u503C\uFF09\u3002\u7531\u7BC4\u570D\u6307\u5B9A\u7684\u503C\u61C9\u8A72\u662F\u6A19\u6E96\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6578\u503C\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NETWORKDAYS_INTL',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u7684\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\uFF08\u6392\u9664\u6307\u5B9A\u7684\u9031\u672B\u548C\u7BC0\u5047\u65E5\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u7684\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\uFF08\u6392\u9664\u6307\u5B9A\u7684\u9031\u672B\u548C\u7BC0\u5047\u65E5\uFF09\u3002',\r\n        'm': [2, 4],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u7684\u6642\u9593\u6BB5\u958B\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'end_date',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u6DE8\u5DE5\u4F5C\u65E5\u5929\u6578\u7684\u6642\u9593\u6BB5\u7D50\u675F\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'weekend',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] - \u7528\u65BC\u8868\u793A\u54EA\u4E9B\u5929\u70BA\u9031\u672B\u7684\u6578\u4F4D\u6216\u5B57\u4E32\u3002\\n\u5B57\u4E32\u7BA1\u9053:\u53EF\u4EE5\u4F7F\u7528\u75310\u548C1\u7D44\u6210\u7684\u5B57\u4E32\u4F86\u6307\u5B9A\u9031\u672B,\u4E32\u4E2D\u7684\u7B2C\u4E00\u500B\u6578\u4F4D\u5B57\u5143\u4EE3\u8868\u9031\u4E00,\u6700\u5F8C\u4E00\u500B\u5247\u4EE3\u8868\u5468\u65E5\u3002\u96F6\u8868\u793A\u9019\u4E00\u5929\u662F\u5DE5\u4F5C\u65E5,1 \u8868\u793A\u9019\u4E00\u5929\u70BA\u9031\u672B\u3002\u4F8B\u5982,\"0000011\"\u8868\u793A\u5C07\u9031\u516D\u548C\u5468\u65E5\u4F5C\u70BA\u9031\u672B\u3002\\n\u6578\u4F4D\u7BA1\u9053:\u9019\u7A2E\u7BA1\u9053\u4E0D\u4F7F\u7528\u4E0A\u8FF0\u5B57\u4E32\u5F62\u5F0F,\u800C\u662F\u4F7F\u7528\u4E00\u500B\u6578\u4F4D\u30021 =\u9031\u516D/\u5468\u65E5\u70BA\u9031\u672B,2 =\u5468\u65E5/\u9031\u4E00\u70BA\u9031\u672B,\u4F9D\u6B64\u985E\u63A8\u52477 =\u9031\u4E94/\u9031\u516D\u300211 =\u5468\u65E5\u70BA\u552F\u4E00\u9031\u672B,12 =\u9031\u4E00\u70BA\u552F\u4E00\u9031\u672B,\u4F9D\u6B64\u985E\u63A8\u524717 =\u9031\u516D\u70BA\u552F\u4E00\u9031\u672B\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'holidays',\r\n            'detail' : '[\u53EF\u9078] - \u9019\u662F\u4E00\u500B\u7BC4\u570D\u6216\u6578\u7D44\u5E38\u6578,\u5176\u4E2D\u5305\u542B\u4F5C\u70BA\u7BC0\u5047\u65E5\u7684\u65E5\u671F\u3002\\n\u5728\u7BC0\u5047\u65E5\u6578\u7D44\u5167\u63D0\u4F9B\u7684\u503C\u5FC5\u9808\u70BA\u65E5\u671F\u5E8F\u6578\u503C\uFF08\u4F8B\u5982N\u7684\u8FD4\u56DE\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982DATE\u3001DATEVALUE\u6216TO_DATE\u7684\u8FD4\u56DE\u503C\uFF09\u3002\u7531\u7BC4\u570D\u6307\u5B9A\u7684\u503C\u61C9\u8A72\u662F\u6A19\u6E96\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6578\u503C\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ISOWEEKNUM',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u65E5\u671F\u5728\u5168\u5E74\u4E2D\u7684 ISO \u5468\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u65E5\u671F\u5728\u5168\u5E74\u4E2D\u7684 ISO \u5468\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'date',\r\n            'detail' : '\u7528\u65BC\u65E5\u671F\u548C\u6642\u9593\u8A08\u7B97\u7684\u65E5\u671F-\u6642\u9593\u7A0B\u5F0F\u78BC\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WEEKNUM',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u7684\u5468\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u7684\u5468\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'serial_number',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u4F4D\u65BC\u7B2C\u5E7E\u5468\u7684\u65E5\u671F,\u5FC5\u9808\u662F\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'return_type',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1 ] - \u4EE3\u8868\u4E00\u5468\u8D77\u59CB\u65E5\u7684\u6578\u4F4D,\u7CFB\u7D71\u4E5F\u4F7F\u7528\u8A72\u6578\u4F4D\u4F86\u78BA\u5B9A\u4E00\u5E74\u7684\u7B2C\u4E00\u5468\uFF081=\u5468\u65E5,2=\u9031\u4E00\uFF09\u3002',\r\n            'example': '7',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'WEEKDAY',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u6578\u4F4D,\u5C0D\u61C9\u65BC\u7D66\u5B9A\u65E5\u671F\u6240\u5728\u7684\u661F\u671F\u5E7E\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u6578\u4F4D,\u5C0D\u61C9\u65BC\u7D66\u5B9A\u65E5\u671F\u6240\u5728\u7684\u661F\u671F\u5E7E\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'serial_number',\r\n            'detail' : '\u8981\u70BA\u5176\u78BA\u5B9A\u661F\u671F\u5E7E\u7684\u65E5\u671F\u3002\u5FC5\u9808\u662F\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'return_type',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] -\u4EE5\u6578\u4F4D\u8A13\u793A\u4F7F\u7528\u54EA\u7A2E\u7DE8\u865F\u9806\u5E8F\u4F86\u8868\u793A\u661F\u671F\u5E7E\u3002\u9ED8\u8A8D\u60C5\u51B5\u4E0B,\u6309\u661F\u671F\u65E5\uFF08= 1\uFF09\u958B\u59CB\u8A08\u7B97\u3002\\n\\n\u5982\u679C\u985E\u578B\u70BA1,\u5247\u661F\u671F\u503C\u5C07\u5F9E\u661F\u671F\u65E5\u958B\u59CB\u7B97\u8D77,\u4E26\u4E14\u661F\u671F\u65E5\u7684\u503C\u70BA1,\u56D9\u6B64\u661F\u671F\u516D\u7684\u503C\u5C31\u662F7\u3002\\n\\n\u5982\u679C\u985E\u578B\u70BA2,\u5247\u661F\u671F\u503C\u5C07\u5F9E\u661F\u671F\u4E00\u958B\u59CB\u7B97\u8D77,\u4E26\u4E14\u661F\u671F\u4E00\u7684\u503C\u70BA1,\u56D9\u6B64\u661F\u671F\u65E5\u7684\u503C\u5C31\u662F7\u3002\\n\\n\u5982\u679C\u985E\u578B\u70BA3,\u5247\u661F\u671F\u503C\u5C07\u5F9E\u661F\u671F\u4E00\u7B97\u8D77,\u4E26\u4E14\u661F\u671F\u4E00\u7684\u503C\u70BA0,\u56D9\u6B64\u661F\u671F\u65E5\u7684\u503C\u5C31\u662F6\u3002',\r\n            'example': '7',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DAY',\r\n        't': 6,\r\n        'd': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u6240\u5728\u7684\u7576\u6708\u5E7E\u865F\u3002',\r\n        'a': '\u4EE5\u6578\u4F4D\u683C\u5F0F\u8FD4\u56DE\u7279\u5B9A\u65E5\u671F\u6240\u5728\u7684\u7576\u6708\u5E7E\u865F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'serial_number',\r\n            'detail' : '\u8981\u5F9E\u4E2D\u9078\u53D6\u5177\u9AD4\u5E7E\u865F\u7684\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DAYS',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'end_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7D50\u675F\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': '2011-3-15',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'start_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u958B\u59CB\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': '2011-2-1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DAYS360',\r\n        't': 6,\r\n        'd': '\u6309\u7167\u6BCF\u5E74360\u5929,\u8FD4\u56DE\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5DEE\uFF08\u7528\u65BC\u8A08\u7B97\u5229\u606F\uFF09\u3002',\r\n        'a': '\u6309\u7167\u6BCF\u5E74360\u5929,\u8FD4\u56DE\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5DEE\uFF08\u7528\u65BC\u8A08\u7B97\u5229\u606F\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u958B\u59CB\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'end_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7D50\u675F\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'method',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BAFALSE\uFF08\uFF09] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\nFALSE -\u63A1\u7528\u7F8E\u570B\uFF08NASD\uFF09\u65B9\u6CD5\u6642,\u5982\u679C\u8D77\u59CB\u65E5\u671F\u70BA\u67D0\u6708\u7684\u6700\u5F8C\u4E00\u5929,\u70BA\u4FBF\u65BC\u8A08\u7B97,\u6703\u5C07\u8D77\u59CB\u65E5\u671F\u7684\u7576\u6708\u5E7E\u865F\u66F4\u6539\u70BA30\u3002\u6B64\u5916,\u5982\u679C\u7D50\u675F\u65E5\u671F\u662F\u6240\u5728\u6708\u4EFD\u7684\u6700\u5F8C\u4E00\u5929,\u800C\u4E14\u8D77\u59CB\u65E5\u671F\u5728\u5176\u6240\u5728\u6708\u768430\u865F\u4E4B\u524D,\u5247\u5C07\u7D50\u675F\u65E5\u671F\u66F4\u6539\u70BA\u7D50\u675F\u65E5\u671F\u4E4B\u5F8C\u90A3\u500B\u6708\u7684\u7B2C\u4E00\u5929,\u5426\u5247\u5C07\u7D50\u675F\u65E5\u671F\u66F4\u6539\u70BA\u8A72\u6708\u768430\u865F\u3002\\n\\nTRUE -\u63A1\u7528\u6B50\u6D32\u65B9\u6CD5\u6642,\u6703\u5C07\u6240\u6709\u65E5\u671F\u572831\u865F\u7684\u8D77\u59CB\u65E5\u671F\u6216\u7D50\u675F\u65E5\u671F\u66F4\u6539\u70BA\u7576\u6708\u768430\u865F\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DATE',\r\n        't': 6,\r\n        'd': '\u5C07\u63D0\u4F9B\u7684\u5E74\u3001\u6708\u3001\u65E5\u8F49\u63DB\u70BA\u65E5\u671F\u3002',\r\n        'a': '\u5C07\u63D0\u4F9B\u7684\u5E74\u3001\u6708\u3001\u65E5\u8F49\u63DB\u70BA\u65E5\u671F\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'year',\r\n            'detail' : '\u65E5\u671F\u7684\u5E74\u4EFD\u90E8\u5206,\u5305\u542B\u4E00\u5230\u56DB\u4F4D\u6578\u4F4D\u3002\\n\\n\u4ECB\u65BC0\uFF08\u96F6\uFF09\u5230 1899 \u4E4B\u9593,\u6703\u5C07\u8A72\u503C\u8207 1900 \u76F8\u52A0\u4F86\u8A08\u7B97\u5E74\u4EFD\uFF1B\\n\\n\u4ECB\u65BC 1900 \u5230 9999 \u4E4B\u9593,\u5C07\u4F7F\u7528\u8A72\u6578\u503C\u4F5C\u70BA\u5E74\u4EFD\uFF1B\\n\\n\u5C0F\u65BC0\u6216\u5927\u65BC\u7B49\u65BC 10000,\u8FD4\u56DE\u932F\u8AA4\u503C#NUM\uFF01\u3002',\r\n            'example': '1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'month',\r\n            'detail' : '\u65E5\u671F\u7684\u6708\u4EFD\u90E8\u5206,\u4E00\u500B\u6B63\u6574\u6578\u6216\u8CA0\u6574\u6578\u3002\\n\\n\u5982\u679C month \u5927\u65BC 12,\u5247 month \u6703\u5C07\u8A72\u6708\u4EFD\u6578\u8207\u6307\u5B9A\u5E74\u4E2D\u7684\u7B2C\u4E00\u500B\u6708\u76F8\u52A0\u3002\\n\\n\u5982\u679C month \u5C0F\u65BC 1,month \u5247\u5F9E\u6307\u5B9A\u5E74\u4EFD\u7684\u4E00\u6708\u4EFD\u958B\u59CB\u905E\u6E1B\u8A72\u6708\u4EFD\u6578,\u7136\u5F8C\u518D\u52A0\u4E0A 1 \u500B\u6708\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'day',\r\n            'detail' : '\u65E5\u671F\u7684\u65E5\u90E8\u5206,\u4E00\u500B\u6B63\u6574\u6578\u6216\u8CA0\u6574\u6578\u3002\\n\\n\u5982\u679C day \u5927\u65BC\u6708\u4E2D\u6307\u5B9A\u7684\u5929\u6578,\u5247 day \u6703\u5C07\u5929\u6578\u8207\u8A72\u6708\u4E2D\u7684\u7B2C\u4E00\u5929\u76F8\u52A0\u3002\\n\\n\u5982\u679C day \u5C0F\u65BC1,\u5247 day \u5F9E\u6307\u5B9A\u6708\u4EFD\u7684\u7B2C\u4E00\u5929\u958B\u59CB\u905E\u6E1B\u8A72\u5929\u6578,\u7136\u5F8C\u518D\u52A0\u4E0A 1 \u5929\u3002',\r\n            'example': '20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DATEVALUE',\r\n        't': 6,\r\n        'd': '\u5C07\u63D0\u4F9B\u7684\u65E5\u671F\u5B57\u4E32\u8F49\u63DB\u70BA\u65E5\u671F\u7684\u5E8F\u865F\u3002',\r\n        'a': '\u5C07\u63D0\u4F9B\u7684\u65E5\u671F\u5B57\u4E32\u8F49\u63DB\u70BA\u65E5\u671F\u7684\u5E8F\u865F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'date_text',\r\n            'detail' : '\u8868\u793A\u65E5\u671F\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"1969-7-20\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DATEDIF',\r\n        't': 6,\r\n        'd': '\u8A08\u7B97\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\u3001\u6708\u6578\u6216\u5E74\u6578\u3002',\r\n        'a': '\u8A08\u7B97\u5169\u500B\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\u3001\u6708\u6578\u6216\u5E74\u6578\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : '\u8D77\u59CB\u65E5\u671F',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u958B\u59CB\u65E5\u671F\u3002\u5FC5\u9808\u662F\u5C0D\u5305\u542BDATE\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DEDATE\u985E\u578B\u7684\u51FD\u6578\u6216\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7D50\u675F\u65E5\u671F',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7D50\u675F\u65E5\u671F\u3002\u5FC5\u9808\u662F\u5C0D\u5305\u542BDATE\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DEDATE\u985E\u578B\u7684\u51FD\u6578\u6216\u6578\u4F4D\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u7D44\u7E54',\r\n            'detail' : '\u6642\u9593\u7D44\u7E54\u7684\u7E2E\u5BEB\u6587\u5B57\u3002\u4F8B\u5982\"M\"\u4EE3\u8868\u6708\u3002\u6709\u6548\u503C\u5305\u62EC:\"Y\"\u3001\"M\"\u3001\"D\"\u3001\"MD\"\u3001\"YM\"\u548C\"YD\"\u3002\\n\\n\"Y\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u6574\u5E74\u6578\u3002\\n\\n\"M\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u6574\u6708\u6578\u3002\\n\\n\"D\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\u3002\\n\\n\"MD\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\uFF08\u4E0D\u8A08\u6574\u6708\u6578\uFF09\u3002\\n\\n\"YM\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u6574\u6708\u6578\uFF08\u4E0D\u8A08\u6574\u5E74\u6578\uFF09\u3002\\n\\n\"YD\":\u8FD4\u56DE\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578\uFF08\u5047\u8A2D\u8D77\u59CB\u65E5\u671F\u548C\u7D50\u675F\u65E5\u671F\u7684\u9593\u9694\u4E0D\u8D85\u904E\u4E00\u5E74\uFF09\u3002',\r\n            'example': '16)',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WORKDAY',\r\n        't': 6,\r\n        'd': '\u6307\u5B9A\u5DE5\u4F5C\u65E5\u5929\u6578,\u8A08\u7B97\u7D50\u675F\u65E5\u671F\u3002',\r\n        'a': '\u6307\u5B9A\u5DE5\u4F5C\u65E5\u5929\u6578,\u8A08\u7B97\u7D50\u675F\u65E5\u671F\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u8A08\u7B97\u7684\u958B\u59CB\u65E5\u671F\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'days',\r\n            'detail' : 'start_date\u4E4B\u524D\u6216\u4E4B\u5F8C\u4E0D\u542B\u9031\u672B\u53CA\u7BC0\u5047\u65E5\u7684\u5929\u6578\u3002\\n\\n\u70BA\u6B63\u503C\u5C07\u751F\u6210\u672A\u4F86\u65E5\u671F\uFF1B\\n\\n\u70BA\u8CA0\u503C\u751F\u6210\u904E\u53BB\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'holidays',\r\n            'detail' : '[\u53EF\u9078] - \u4E00\u500B\u7BC4\u570D\u6216\u6578\u7D44\u5E38\u6578,\u5176\u4E2D\u5305\u542B\u4F5C\u70BA\u7BC0\u5047\u65E5\u7684\u65E5\u671F\u5E8F\u865F\u3002\\n\\n\u5728\u7BC0\u5047\u65E5\u6578\u7D44\u4E2D\u63D0\u4F9B\u7684\u503C\u5FC5\u9808\u662F\u65E5\u671F\u5E8F\u865F\u503C\uFF08\u4F8B\u5982\u7531N\u6240\u8FD4\u56DE\u7684\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982\u7531DATE\u3001DATEVALUE\u6216TO_DATE\u8FD4\u56DE\u7684\u503C\uFF09\u3002\u7531\u7BC4\u570D\u6307\u5B9A\u7684\u503C\u61C9\u8A72\u662F\u6A19\u6E96\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6578\u503C\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'WORKDAY_INTL',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u7684\u82E5\u5E72\u500B\u5DE5\u4F5C\u65E5\u4E4B\u524D\u6216\u4E4B\u5F8C\u7684\u65E5\u671F\u7684\u5E8F\u865F\uFF08\u4F7F\u7528\u81EA\u5B9A\u7FA9\u9031\u672B\u53C3\u6578\uFF09\u3002 ',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u7684\u82E5\u5E72\u500B\u5DE5\u4F5C\u65E5\u4E4B\u524D\u6216\u4E4B\u5F8C\u7684\u65E5\u671F\u7684\u5E8F\u865F\uFF08\u4F7F\u7528\u81EA\u5B9A\u7FA9\u9031\u672B\u53C3\u6578\uFF09\u3002 ',\r\n        'm': [2, 4],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u958B\u59CB\u65E5\u671F\uFF08\u5C07\u88AB\u622A\u5C3E\u53D6\u6574\uFF09\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'days',\r\n            'detail' : 'start_date\u4E4B\u524D\u6216\u4E4B\u5F8C\u7684\u5DE5\u4F5C\u65E5\u7684\u5929\u6578\u3002\\n\\n\u6B63\u503C\u8868\u793A\u672A\u4F86\u65E5\u671F\uFF1B\\n\\n\u8CA0\u503C\u8868\u793A\u904E\u53BB\u65E5\u671F\uFF1B\\n\\n\u96F6\u503C\u8868\u793A\u958B\u59CB\u65E5\u671F\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'weekend',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA1] - \u7528\u65BC\u8868\u793A\u54EA\u4E9B\u5929\u70BA\u9031\u672B\u7684\u6578\u4F4D\u6216\u5B57\u4E32\u3002\\n\u5B57\u4E32\u7BA1\u9053:\u53EF\u4EE5\u4F7F\u7528\u75310\u548C1\u7D44\u6210\u7684\u5B57\u4E32\u4F86\u6307\u5B9A\u9031\u672B,\u4E32\u4E2D\u7684\u7B2C\u4E00\u500B\u6578\u4F4D\u5B57\u5143\u4EE3\u8868\u9031\u4E00,\u6700\u5F8C\u4E00\u500B\u5247\u4EE3\u8868\u5468\u65E5\u3002\u96F6\u8868\u793A\u9019\u4E00\u5929\u662F\u5DE5\u4F5C\u65E5,1\u8868\u793A\u9019\u4E00\u5929\u70BA\u9031\u672B\u3002\u4F8B\u5982,\"0000011\"\u8868\u793A\u5C07\u9031\u516D\u548C\u5468\u65E5\u4F5C\u70BA\u9031\u672B\u3002\\n\u6578\u4F4D\u7BA1\u9053:\u9019\u7A2E\u7BA1\u9053\u4E0D\u4F7F\u7528\u4E0A\u8FF0\u5B57\u4E32\u5F62\u5F0F,\u800C\u662F\u4F7F\u7528\u4E00\u500B\u6578\u4F4D\u30021 =\u9031\u516D/\u5468\u65E5\u70BA\u9031\u672B,2 =\u5468\u65E5/\u9031\u4E00\u70BA\u9031\u672B,\u4F9D\u6B64\u985E\u63A8\u52477 =\u9031\u4E94/\u9031\u516D\u300211 =\u5468\u65E5\u70BA\u552F\u4E00\u9031\u672B,12 =\u9031\u4E00\u70BA\u552F\u4E00\u9031\u672B,\u4F9D\u6B64\u985E\u63A8\u524717 =\u9031\u516D\u70BA\u552F\u4E00\u9031\u672B\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'holidays',\r\n            'detail' : '[\u53EF\u9078] - \u9019\u662F\u4E00\u500B\u7BC4\u570D\u6216\u6578\u7D44\u5E38\u6578,\u5176\u4E2D\u5305\u542B\u4F5C\u70BA\u7BC0\u5047\u65E5\u7684\u65E5\u671F\u3002\\n\u5728\u7BC0\u5047\u65E5\u6578\u7D44\u5167\u63D0\u4F9B\u7684\u503C\u5FC5\u9808\u70BA\u65E5\u671F\u5E8F\u6578\u503C\uFF08\u4F8B\u5982N\u7684\u8FD4\u56DE\u503C\uFF09\u6216\u65E5\u671F\u503C\uFF08\u4F8B\u5982DATE\u3001DATEVALUE\u6216TO_DATE\u7684\u8FD4\u56DE\u503C\uFF09\u3002\u7531\u7BC4\u570D\u6307\u5B9A\u7684\u503C\u61C9\u8A72\u662F\u6A19\u6E96\u7684\u65E5\u671F\u503C\u6216\u65E5\u671F\u5E8F\u6578\u503C\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'YEAR',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u5C0D\u61C9\u65BC\u67D0\u500B\u65E5\u671F\u7684\u5E74\u4EFD\u3002Year\u4F5C\u70BA 1900 - 9999 \u4E4B\u9593\u7684\u6574\u6578\u8FD4\u56DE\u3002',\r\n        'a': '\u8FD4\u56DE\u5C0D\u61C9\u65BC\u67D0\u500B\u65E5\u671F\u7684\u5E74\u4EFD\u3002Year\u4F5C\u70BA 1900 - 9999 \u4E4B\u9593\u7684\u6574\u6578\u8FD4\u56DE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'serial_number',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u5E74\u4EFD\u7684\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'YEARFRAC',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE start_date \u548C end_date \u4E4B\u9593\u7684\u5929\u6578\u5360\u5168\u5E74\u5929\u6578\u7684\u767E\u5206\u6BD4\u3002',\r\n        'a': '\u8FD4\u56DE start_date \u548C end_date \u4E4B\u9593\u7684\u5929\u6578\u5360\u5168\u5E74\u5929\u6578\u7684\u767E\u5206\u6BD4\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'start_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u958B\u59CB\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'end_date',\r\n            'detail' : '\u8A08\u7B97\u4E2D\u8981\u4F7F\u7528\u7684\u7D50\u675F\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': '7',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8981\u4F7F\u7528\u7684\u65E5\u8A08\u6578\u57FA\u6E96\u985E\u578B\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '16)',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TODAY',\r\n        't': 6,\r\n        'd': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u7576\u524D\u65E5\u671F\u3002',\r\n        'a': '\u4EE5\u65E5\u671F\u503C\u683C\u5F0F\u8FD4\u56DE\u7576\u524D\u65E5\u671F\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'MONTH',\r\n        't': 6,\r\n        'd': '\u8FD4\u56DE\u65E5\u671F\uFF08\u4EE5\u5E8F\u5217\u6578\u8868\u793A\uFF09\u4E2D\u7684\u6708\u4EFD\u3002\u6708\u4EFD\u662F\u4ECB\u65BC1\uFF08\u4E00\u6708\uFF09\u523012\uFF08\u5341\u4E8C\u6708\uFF09\u4E4B\u9593\u7684\u6574\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u65E5\u671F\uFF08\u4EE5\u5E8F\u5217\u6578\u8868\u793A\uFF09\u4E2D\u7684\u6708\u4EFD\u3002\u6708\u4EFD\u662F\u4ECB\u65BC1\uFF08\u4E00\u6708\uFF09\u523012\uFF08\u5341\u4E8C\u6708\uFF09\u4E4B\u9593\u7684\u6574\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'serial_number',\r\n            'detail' : '\u8981\u5F9E\u4E2D\u9078\u53D6\u6708\u4EFD\u7684\u65E5\u671F\u3002\u5FC5\u9808\u662F\u4EE5\u4E0B\u4E00\u7A2E:\u5C0D\u5305\u542B\u65E5\u671F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3001\u8FD4\u56DE\u65E5\u671F\u985E\u578B\u7684\u51FD\u6578\u6216\u8005\u6578\u4F4D\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EFFECT',\r\n        't': 8,\r\n        'd': '\u6839\u64DA\u540D\u7FA9\u5229\u7387\u53CA\u6BCF\u5E74\u7684\u8907\u5229\u8A08\u606F\u671F\u6578\u4F86\u8A08\u7B97\u5BE6\u969B\u5E74\u5229\u7387\u3002',\r\n        'a': '\u6839\u64DA\u540D\u7FA9\u5229\u7387\u53CA\u6BCF\u5E74\u7684\u8907\u5229\u8A08\u606F\u671F\u6578\u4F86\u8A08\u7B97\u5BE6\u969B\u5E74\u5229\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'nominal_rate',\r\n            'detail' : '\u6BCF\u5E74\u7684\u540D\u7FA9\u5229\u7387\u3002',\r\n            'example': '0.99',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'npery',\r\n            'detail' : '\u6BCF\u5E74\u7684\u8907\u5229\u8A08\u7B97\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLAR',\r\n        't': 12,\r\n        'd': '\u5C07\u6578\u4F4D\u683C\u5F0F\u8A2D\u5B9A\u70BA\u8207\u8A9E\u8A00\u5340\u57DF\u76F8\u5C0D\u61C9\u7684\u8CA8\u5E63\u683C\u5F0F\u3002',\r\n        'a': '\u5C07\u6578\u4F4D\u683C\u5F0F\u8A2D\u5B9A\u70BA\u8207\u8A9E\u8A00\u5340\u57DF\u76F8\u5C0D\u61C9\u7684\u8CA8\u5E63\u683C\u5F0F\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8A2D\u5B9A\u683C\u5F0F\u7684\u503C\u3002',\r\n            'example': '1.2351',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'decimals',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA2] - \u8981\u986F\u793A\u7684\u5C0F\u6578\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u9019\u662F\u8CA0\u6578,\u5247\u5C07\u6578\u4F4D\u56DB\u6368\u4E94\u5165\u5230\u5C0F\u6578\u9EDE\u5DE6\u5074\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLARDE',\r\n        't': 8,\r\n        'd': '\u5C07\u4EE5\u6574\u6578\u90E8\u5206\u548C\u5206\u6578\u90E8\u5206\u8F49\u63DB\u70BA\u4EE5\u5C0F\u6578\u90E8\u5206\u8868\u793A\u7684\u91D1\u984D\u6578\u4F4D',\r\n        'a': '\u5C07\u4EE5\u6574\u6578\u90E8\u5206\u548C\u5206\u6578\u90E8\u5206\u8F49\u63DB\u70BA\u4EE5\u5C0F\u6578\u90E8\u5206\u8868\u793A\u7684\u91D1\u984D\u6578\u4F4D',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'fractional_dollar',\r\n            'detail' : '\u4EE5\u6574\u6578\u90E8\u4EFD\u548C\u5206\u6578\u90E8\u5206\u8868\u793A\u7684\u6578\u4F4D,\u7528\u5C0F\u6578\u9EDE\u9694\u958B\u3002',\r\n            'example': '100.10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fraction',\r\n            'detail' : '\u7528\u4F5C\u5206\u6578\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6578\u3002',\r\n            'example': '32',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DOLLARFR',\r\n        't': 8,\r\n        'd': '\u5C07\u5C0F\u6578\u8F49\u63DB\u70BA\u5206\u6578\u8868\u793A\u7684\u91D1\u984D\u6578\u4F4D\u3002',\r\n        'a': '\u5C07\u5C0F\u6578\u8F49\u63DB\u70BA\u5206\u6578\u8868\u793A\u7684\u91D1\u984D\u6578\u4F4D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'decimal_dollar',\r\n            'detail' : '\u5C0F\u6578\u3002',\r\n            'example': '100.125',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fraction',\r\n            'detail' : '\u7528\u4F5C\u5206\u6578\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6578\u3002',\r\n            'example': '32',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DB',\r\n        't': 8,\r\n        'd': '\u4F7F\u7528\u56FA\u5B9A\u9918\u984D\u905E\u6E1B\u6CD5,\u8FD4\u56DE\u6307\u5B9A\u671F\u9593\u5167\u67D0\u9805\u56FA\u5B9A\u8CC7\u7522\u7684\u6298\u820A\u503C\u3002',\r\n        'a': '\u4F7F\u7528\u56FA\u5B9A\u9918\u984D\u905E\u6E1B\u6CD5,\u8FD4\u56DE\u6307\u5B9A\u671F\u9593\u5167\u67D0\u9805\u56FA\u5B9A\u8CC7\u7522\u7684\u6298\u820A\u503C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'cost',\r\n            'detail' : '\u8CC7\u7522\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'salvage',\r\n            'detail' : '\u6298\u820A\u672B\u5C3E\u6642\u7684\u503C\uFF08\u6709\u6642\u4E5F\u7A31\u70BA\u8CC7\u7522\u6B98\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'life',\r\n            'detail' : '\u8CC7\u7522\u7684\u6298\u820A\u671F\u6578\uFF08\u6709\u6642\u4E5F\u7A31\u4F5C\u8CC7\u7522\u7684\u4F7F\u7528\u58FD\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'period',\r\n            'detail' : '\u5728\u4F7F\u7528\u671F\u9650\u5167\u8981\u8A08\u7B97\u6298\u820A\u7684\u6298\u820A\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'month',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA12] - \u6298\u820A\u7B2C\u4E00\u5E74\u4E2D\u7684\u6708\u6578\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DDB',\r\n        't': 8,\r\n        'd': '\u7528\u96D9\u500D\u9918\u984D\u905E\u6E1B\u6CD5,\u8FD4\u56DE\u6307\u5B9A\u671F\u9593\u5167\u67D0\u9805\u56FA\u5B9A\u8CC7\u7522\u7684\u6298\u820A\u503C\u3002',\r\n        'a': '\u7528\u96D9\u500D\u9918\u984D\u905E\u6E1B\u6CD5,\u8FD4\u56DE\u6307\u5B9A\u671F\u9593\u5167\u67D0\u9805\u56FA\u5B9A\u8CC7\u7522\u7684\u6298\u820A\u503C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'cost',\r\n            'detail' : '\u8D44\u4EA7\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'salvage',\r\n            'detail' : '\u6298\u820A\u672B\u5C3E\u6642\u7684\u503C\uFF08\u6709\u6642\u4E5F\u7A31\u70BA\u8CC7\u7522\u6B98\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'life',\r\n            'detail' : '\u8CC7\u7522\u7684\u6298\u820A\u671F\u6578\uFF08\u6709\u6642\u4E5F\u7A31\u4F5C\u8CC7\u7522\u7684\u4F7F\u7528\u58FD\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'period',\r\n            'detail' : '\u5728\u4F7F\u7528\u671F\u9650\u5167\u8981\u8A08\u7B97\u6298\u820A\u7684\u6298\u820A\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'factor',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA2] - \u6298\u820A\u7684\u905E\u6E1B\u4FC2\u6578\u3002',\r\n            'example': '2.25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RATE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5E74\u91D1\u6BCF\u671F\u7684\u5229\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5E74\u91D1\u6BCF\u671F\u7684\u5229\u7387\u3002',\r\n        'm': [3, 6],\r\n        'p': [{\r\n            'name'   : 'nper',\r\n            'detail' : '\u5E74\u91D1\u7684\u4ED8\u6B3E\u7E3D\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pmt',\r\n            'detail' : '\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u984D,\u5728\u5E74\u91D1\u9031\u671F\u5167\u4E0D\u80FD\u66F4\u6539\u3002',\r\n            'example': '-100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C\u5373\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u7576\u524D\u503C\u7684\u7E3D\u548C\u3002',\r\n            'example': '400',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'guess',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0.1] - \u9810\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CUMPRINC',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u6295\u8CC7\u5728\u591A\u500B\u4ED8\u6B3E\u671F\u5167\u7684\u7D2F\u8A08\u672C\u91D1\u511F\u9084\u984D\u3002',\r\n        'a': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u6295\u8CC7\u5728\u591A\u500B\u4ED8\u6B3E\u671F\u5167\u7684\u7D2F\u8A08\u672C\u91D1\u511F\u9084\u984D\u3002',\r\n        'm': [6, 6],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u7E3D\u4ED8\u6B3E\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u5E74\u91D1\u7684\u73FE\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'start_period',\r\n            'detail' : '\u958B\u59CB\u7D2F\u8A08\u8A08\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u865F\u3002\\n\\n\u9996\u671F\u5FC5\u9808\u5927\u65BC\u7B49\u65BC1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'end_period',\r\n            'detail' : '\u7D50\u675F\u7D2F\u8A08\u8A08\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u865F\u3002\\n\\n\u672B\u671F\u5FC5\u9808\u5927\u65BC\u9996\u671F\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPNUM',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u7D50\u7B97\u65E5\u548C\u5230\u671F\u65E5\u4E4B\u9593\u7684\u4ED8\u606F\u6B21\u6578\uFF0C\u5411\u4E0A\u820D\u5165\u5230\u6700\u8FD1\u7684\u6574\u6578',\r\n        'a': '\u8FD4\u56DE\u5728\u7D50\u7B97\u65E5\u548C\u5230\u671F\u65E5\u4E4B\u9593\u7684\u4ED8\u606F\u6B21\u6578\uFF0C\u5411\u4E0A\u820D\u5165\u5230\u6700\u8FD1\u7684\u6574\u6578',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': '02',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SYD',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u6307\u5B9A\u671F\u9593\u5167\u8CC7\u7522\u6309\u5E74\u9650\u7E3D\u548C\u6298\u820A\u6CD5\u8A08\u7B97\u7684\u6298\u820A\u3002',\r\n        'a': '\u8FD4\u56DE\u5728\u6307\u5B9A\u671F\u9593\u5167\u8CC7\u7522\u6309\u5E74\u9650\u7E3D\u548C\u6298\u820A\u6CD5\u8A08\u7B97\u7684\u6298\u820A\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'cost',\r\n            'detail' : '\u8CC7\u7522\u539F\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'salvage',\r\n            'detail' : '\u6298\u820A\u672B\u5C3E\u6642\u7684\u503C\uFF08\u6709\u6642\u4E5F\u7A31\u70BA\u8CC7\u7522\u6B98\u503C\uFF09\u3002',\r\n            'example': '50',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'life',\r\n            'detail' : '\u8CC7\u7522\u7684\u6298\u820A\u671F\u6578\uFF08\u6709\u6642\u4E5F\u7A31\u4F5C\u8CC7\u7522\u7684\u4F7F\u7528\u58FD\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'period',\r\n            'detail' : '\u5728\u4F7F\u7528\u671F\u9650\u5167\u8981\u8A08\u7B97\u6298\u820A\u7684\u6298\u820A\u671F\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLEQ',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u8CBC\u73FE\u7387\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u7B49\u6548\u5E74\u5316\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u65BC\u8CBC\u73FE\u7387\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u7B49\u6548\u5E74\u5316\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u50B5\u5238\u7684\u7D50\u7B97\u65E5\u671F,\u6B64\u65E5\u671F\u70BA\u50B5\u5238\u767C\u884C\u5F8C\u4EA4\u4ED8\u7D66\u8CB7\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u50B5\u5238\u7684\u5230\u671F\u6216\u7D50\u675F\u65E5\u671F,\u5C4A\u6642\u53EF\u5C07\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u50F9\u503C\u8D16\u56DE\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'discount',\r\n            'detail' : '\u50B5\u5238\u8CFC\u8CB7\u6642\u7684\u8CBC\u73FE\u7387\u3002',\r\n            'example': '2)',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLYIELD',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u50F9\u683C\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u65BC\u50F9\u683C\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u50B5\u5238\u7684\u7D50\u7B97\u65E5\u671F,\u6B64\u65E5\u671F\u70BA\u50B5\u5238\u767C\u884C\u5F8C\u4EA4\u4ED8\u7D66\u8CB7\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u50B5\u5238\u7684\u5230\u671F\u6216\u7D50\u675F\u65E5\u671F,\u5C4A\u6642\u53EF\u5C07\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u50F9\u503C\u8D16\u56DE\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'pr',\r\n            'detail' : '\u50B5\u5238\u7684\u8CFC\u8CB7\u50F9\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'TBILLPRICE',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u8CBC\u73FE\u7387\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u50F9\u683C\u3002',\r\n        'a': '\u57FA\u65BC\u8CBC\u73FE\u7387\u8A08\u7B97\u7F8E\u570B\u653F\u5E9C\u77ED\u671F\u50B5\u5238\u7684\u50F9\u683C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u50B5\u5238\u7684\u7D50\u7B97\u65E5\u671F,\u6B64\u65E5\u671F\u70BA\u50B5\u5238\u767C\u884C\u5F8C\u4EA4\u4ED8\u7D66\u8CB7\u5BB6\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u50B5\u5238\u7684\u5230\u671F\u6216\u7D50\u675F\u65E5\u671F,\u5C4A\u6642\u53EF\u5C07\u5176\u4EE5\u9762\u503C\u6216\u7968\u9762\u50F9\u503C\u8D16\u56DE\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'discount',\r\n            'detail' : '\u50B5\u5238\u8CFC\u8CB7\u6642\u7684\u8CBC\u73FE\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PV',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u5E74\u91D1\u6295\u8CC7\u7684\u73FE\u503C\u3002',\r\n        'a': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u5E74\u91D1\u6295\u8CC7\u7684\u73FE\u503C\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u5E74\u91D1\u7684\u4ED8\u6B3E\u7E3D\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pmt',\r\n            'detail' : '\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u984D,\u5728\u5E74\u91D1\u9031\u671F\u5167\u4E0D\u80FD\u66F4\u6539\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': 'D2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ACCRINT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u8B49\u5238\u7684\u61C9\u8A08\u5229\u606F\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u8B49\u5238\u7684\u61C9\u8A08\u5229\u606F\u3002',\r\n        'm': [6, 8],\r\n        'p': [{\r\n            'name'   : 'issue',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u767C\u884C\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'first_interest',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u9996\u6B21\u8A08\u606F\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'rate',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'par',\r\n            'detail' : '\u8B49\u5238\u7684\u7968\u9762\u503C\u3002',\r\n            'example': '10000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\"\u6B50\u6D3230/360\"\u65B9\u6CD5\"-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'calc_method',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u6307\u5B9A\u7576\u7D50\u7B97\u65E5\u671F\u665A\u65BC\u9996\u6B21\u8A08\u606F\u65E5\u671F\u6642\u7528\u65BC\u8A08\u7B97\u7E3D\u61C9\u8A08\u5229\u606F\u7684\u65B9\u6CD5\u3002\\n\\n\u5982\u679C\u503C\u70BATRUE,\u5247\u8FD4\u56DE\u5F9E\u767C\u884C\u65E5\u5230\u7D50\u7B97\u65E5\u7684\u7E3D\u61C9\u8A08\u5229\u606F\u3002\\n\\n\u5982\u679C\u503C\u70BAFALSE,\u5247\u8FD4\u56DE\u5F9E\u9996\u6B21\u8A08\u606F\u65E5\u5230\u7D50\u7B97\u65E5\u7684\u61C9\u8A08\u5229\u606F\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ACCRINTM',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5728\u5230\u671F\u65E5\u652F\u4ED8\u5229\u606F\u7684\u6709\u50F9\u8B49\u5238\u7684\u61C9\u8A08\u5229\u606F\u3002',\r\n        'a': '\u8FD4\u56DE\u5728\u5230\u671F\u65E5\u652F\u4ED8\u5229\u606F\u7684\u6709\u50F9\u8B49\u5238\u7684\u61C9\u8A08\u5229\u606F\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'issue',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u767C\u884C\u65E5\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002',\r\n            'example': 'DATE(1969',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'rate',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'par',\r\n            'detail' : '\u8B49\u5238\u7684\u7968\u9762\u503C\u3002',\r\n            'example': '1000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYBS',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5F9E\u4ED8\u606F\u671F\u958B\u59CB\u5230\u7D50\u7B97\u65E5\u7684\u5929\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u5F9E\u4ED8\u606F\u671F\u958B\u59CB\u5230\u7D50\u7B97\u65E5\u7684\u5929\u6578\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYS',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u7D50\u7B97\u65E5\u6240\u5728\u7684\u4ED8\u606F\u671F\u7684\u5929\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u7D50\u7B97\u65E5\u6240\u5728\u7684\u4ED8\u606F\u671F\u7684\u5929\u6578\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] -\u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPDAYSNC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5F9E\u7D50\u7B97\u65E5\u5230\u4E0B\u4E00\u7968\u606F\u652F\u4ED8\u65E5\u4E4B\u9593\u7684\u5929\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u5F9E\u7D50\u7B97\u65E5\u5230\u4E0B\u4E00\u7968\u606F\u652F\u4ED8\u65E5\u4E4B\u9593\u7684\u5929\u6578\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5  - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPNCD',\r\n        't': 8,\r\n        'd': '\u8A08\u7B97\u7D50\u7B97\u65E5\u4E4B\u5F8C\u7684\u4E0B\u4E00\u7968\u606F\u6216\u5229\u606F\u6D3E\u767C\u65E5\u671F\u3002',\r\n        'a': '\u8A08\u7B97\u7D50\u7B97\u65E5\u4E4B\u5F8C\u7684\u4E0B\u4E00\u7968\u606F\u6216\u5229\u606F\u6D3E\u767C\u65E5\u671F\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '01)',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': 'DATE(2019',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COUPPCD',\r\n        't': 8,\r\n        'd': '\u8A08\u7B97\u7D50\u7B97\u65E5\u4E4B\u524D\u7684\u6700\u5F8C\u4E00\u500B\u7968\u606F\u6216\u5229\u606F\u652F\u4ED8\u65E5\u3002',\r\n        'a': '\u8A08\u7B97\u7D50\u7B97\u65E5\u4E4B\u524D\u7684\u6700\u5F8C\u4E00\u500B\u7968\u606F\u6216\u5229\u606F\u652F\u4ED8\u65E5\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4 \u3002',\r\n            'example': '01)',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': 'DATE(2019',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FV',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u5E74\u91D1\u6295\u8CC7\u7684\u672A\u4F86\u50F9\u503C\u3002',\r\n        'a': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u5E74\u91D1\u6295\u8CC7\u7684\u672A\u4F86\u50F9\u503C\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u5E74\u91D1\u7684\u4ED8\u6B3E\u7E3D\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pmt',\r\n            'detail' : '\u5404\u671F\u6240\u61C9\u652F\u4ED8\u7684\u91D1\u984D,\u5728\u6574\u500B\u5E74\u91D1\u671F\u9593\u4FDD\u6301\u4E0D\u8B8A\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0 ] - \u73FE\u503C,\u6216\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u7684\u7576\u524D\u503C\u7684\u7D2F\u7A4D\u548C\u3002',\r\n            'example': '400',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0 ] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'FVSCHEDULE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u61C9\u7528\u4E00\u7CFB\u5217\u8907\u5229\u7387\u8A08\u7B97\u7684\u521D\u59CB\u672C\u91D1\u7684\u672A\u4F86\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u61C9\u7528\u4E00\u7CFB\u5217\u8907\u5229\u7387\u8A08\u7B97\u7684\u521D\u59CB\u672C\u91D1\u7684\u672A\u4F86\u503C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'principal',\r\n            'detail' : '\u73FE\u503C\u3002',\r\n            'example': '10000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'schedule',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u672C\u91D1\u8907\u5229\u7684\u4E00\u7D44\u5229\u7387\u3002\\n\\n\u5229\u7387\u9336\u5FC5\u9808\u662F\u7BC4\u570D\u6216\u6578\u7D44,\u5176\u4E2D\u5305\u542B\u8981\u7528\u65BC\u8A08\u7B97\u8907\u5229\u7684\u4E00\u7D44\u5229\u7387\u3002\u9019\u4E9B\u5229\u7387\u503C\u61C9\u8A72\u4EE5\u5341\u9032\u4F4D\u5C0F\u6578\u5F62\u5F0F\u8868\u793A,\u6216\u8005\u4F7F\u7528UNARY_PERCENT\u4EE5\u767E\u5206\u6BD4\u5F62\u5F0F\u8868\u793A,\u5373\u8868\u793A\u70BA0.09\u6216UNARY_PERCENT\uFF089\uFF09,\u800C\u4E0D\u8981\u8868\u793A\u70BA9\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }]\r\n    }, {\r\n        'n': 'YIELD',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u652F\u4ED8\u5229\u606F\u7684\u50B5\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u652F\u4ED8\u5229\u606F\u7684\u50B5\u5238\u7684\u6536\u76CA\u7387\u3002',\r\n        'm': [6, 7],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'rate',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.057',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pr',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u6E05\u511F\u50F9\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'YIELDDISC',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u50F9\u683C\u8A08\u7B97\u6298\u50F9\u767C\u884C\u7684\uFF08\u4E0D\u5E36\u606F\uFF09\u50B5\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n        'a': '\u57FA\u65BC\u50F9\u683C\u8A08\u7B97\u6298\u50F9\u767C\u884C\u7684\uFF08\u4E0D\u5E36\u606F\uFF09\u50B5\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'pr',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n            'example': '95',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u6E05\u511F\u50F9\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NOMINAL',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u7D66\u5B9A\u7684\u5BE6\u969B\u5229\u7387\u548C\u5E74\u8907\u5229\u671F\u6578,\u8FD4\u56DE\u540D\u7FA9\u5E74\u5229\u7387\u3002',\r\n        'a': '\u57FA\u65BC\u7D66\u5B9A\u7684\u5BE6\u969B\u5229\u7387\u548C\u5E74\u8907\u5229\u671F\u6578,\u8FD4\u56DE\u540D\u7FA9\u5E74\u5229\u7387\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'effect_rate',\r\n            'detail' : '\u6BCF\u5E74\u7684\u5BE6\u969B\u5229\u7387\u3002',\r\n            'example': '0.85',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'npery',\r\n            'detail' : '\u6BCF\u5E74\u7684\u8907\u5229\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'XIRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7D44\u4E0D\u4E00\u5B9A\u5B9A\u671F\u767C\u751F\u7684\u73FE\u91D1\u6D41\u7684\u5167\u90E8\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7D44\u4E0D\u4E00\u5B9A\u5B9A\u671F\u767C\u751F\u7684\u73FE\u91D1\u6D41\u7684\u5167\u90E8\u6536\u76CA\u7387\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'values',\r\n            'detail' : '\u5176\u4E2D\u542B\u6709\u6295\u8CC7\u76F8\u95DC\u6536\u76CA\u6216\u652F\u51FA\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002\\n\\n\u73FE\u91D1\u6D41\u6578\u984D\u4E2D\u5FC5\u9808\u81F3\u5C11\u5305\u542B\u4E00\u9805\u8CA0\u7684\u548C\u4E00\u9805\u6B63\u7684\u73FE\u91D1\u6D41\u91D1\u984D\u624D\u80FD\u8A08\u7B97\u56DE\u5831\u7387\u3002',\r\n            'example': 'B2:B25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'dates',\r\n            'detail' : '\u8207\u73FE\u91D1\u6D41\u6578\u984D\u53C3\u6578\u4E2D\u7684\u73FE\u91D1\u6D41\u5C0D\u61C9\u7684\u65E5\u671F\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'C2:C25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'guess',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0.1] - \u5C0D\u5167\u90E8\u56DE\u5831\u7387\u7684\u4F30\u7B97\u503C\u3002',\r\n            'example': '250',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MIRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7CFB\u5217\u5B9A\u671F\u73FE\u91D1\u6D41\u7684\u4FEE\u6539\u5F8C\u5167\u90E8\u6536\u76CA\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7CFB\u5217\u5B9A\u671F\u73FE\u91D1\u6D41\u7684\u4FEE\u6539\u5F8C\u5167\u90E8\u6536\u76CA\u7387\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'values',\r\n            'detail' : '\u5176\u4E2D\u542B\u6709\u6295\u8CC7\u76F8\u95DC\u6536\u76CA\u6216\u652F\u51FA\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002\\n\\n\u73FE\u91D1\u6D41\u6578\u984D\u4E2D\u5FC5\u9808\u81F3\u5C11\u5305\u542B\u4E00\u9805\u8CA0\u7684\u548C\u4E00\u9805\u6B63\u7684\u73FE\u91D1\u6D41\u91D1\u984D\u624D\u80FD\u8A08\u7B97\u56DE\u5831\u7387\u3002',\r\n            'example': 'A2:A25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'finance_rate',\r\n            'detail' : '\u73FE\u91D1\u6D41\u4E2D\u4F7F\u7528\u7684\u8CC7\u91D1\u652F\u4ED8\u7684\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'reinvest_rate',\r\n            'detail' : '\u5C07\u73FE\u91D1\u6D41\u518D\u6295\u8CC7\u7684\u6536\u76CA\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IRR',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u7531\u503C\u4E2D\u7684\u6578\u4F4D\u8868\u793A\u7684\u4E00\u7CFB\u5217\u73FE\u91D1\u6D41\u7684\u5167\u90E8\u6536\u76CA\u7387\u3002 ',\r\n        'a': '\u8FD4\u56DE\u7531\u503C\u4E2D\u7684\u6578\u4F4D\u8868\u793A\u7684\u4E00\u7CFB\u5217\u73FE\u91D1\u6D41\u7684\u5167\u90E8\u6536\u76CA\u7387\u3002 ',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'values',\r\n            'detail' : '\u5176\u4E2D\u542B\u6709\u6295\u8CC7\u76F8\u95DC\u6536\u76CA\u6216\u652F\u51FA\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002\\n\\n\u73FE\u91D1\u6D41\u6578\u984D\u4E2D\u5FC5\u9808\u81F3\u5C11\u5305\u542B\u4E00\u9805\u8CA0\u7684\u548C\u4E00\u9805\u6B63\u7684\u73FE\u91D1\u6D41\u91D1\u984D\u624D\u80FD\u8A08\u7B97\u56DE\u5831\u7387\u3002',\r\n            'example': 'A2:A25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'guess',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0.1] - \u5167\u90E8\u6536\u76CA\u7387\u7684\u4F30\u503C\u3002',\r\n            'example': '200',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NPV',\r\n        't': 8,\r\n        'd': '\u4F7F\u7528\u8CBC\u73FE\u7387\u548C\u4E00\u7CFB\u5217\u672A\u4F86\u652F\u51FA\uFF08\u8CA0\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u4F86\u8A08\u7B97\u4E00\u9805\u6295\u8CC7\u7684\u6DE8\u73FE\u503C\u3002',\r\n        'a': '\u4F7F\u7528\u8CBC\u73FE\u7387\u548C\u4E00\u7CFB\u5217\u672A\u4F86\u652F\u51FA\uFF08\u8CA0\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u4F86\u8A08\u7B97\u4E00\u9805\u6295\u8CC7\u7684\u6DE8\u73FE\u503C\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u67D0\u4E00\u671F\u9593\u7684\u8CBC\u73FE\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'value1',\r\n            'detail' : '\u7B2C\u4E00\u7B46\u652F\u51FA\uFF08\u8CA0\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u3002',\r\n            'example': '200',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2, ...',\r\n            'detail' : '[\u53EF\u9078] - \u5176\u4ED6\u652F\u51FA\uFF08\u8CA0\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\u3002',\r\n            'example': '250',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'XNPV',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u7D44\u73FE\u91D1\u6D41\u7684\u6DE8\u73FE\u503C,\u9019\u4E9B\u73FE\u91D1\u6D41\u4E0D\u4E00\u5B9A\u5B9A\u671F\u767C\u751F\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u7D44\u73FE\u91D1\u6D41\u7684\u6DE8\u73FE\u503C,\u9019\u4E9B\u73FE\u91D1\u6D41\u4E0D\u4E00\u5B9A\u5B9A\u671F\u767C\u751F\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u61C9\u7528\u65BC\u73FE\u91D1\u6D41\u7684\u8CBC\u73FE\u7387\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'values',\r\n            'detail' : '\u8207dates\u4E2D\u7684\u652F\u4ED8\u6642\u9593\u76F8\u5C0D\u61C9\u7684\u4E00\u7CFB\u5217\u73FE\u91D1\u6D41\u3002',\r\n            'example': 'B2:B25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'dates',\r\n            'detail' : '\u8207\u73FE\u91D1\u6D41\u652F\u4ED8\u76F8\u5C0D\u61C9\u7684\u652F\u4ED8\u65E5\u671F\u9336\u3002',\r\n            'example': 'C2:C25',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }]\r\n    }, {\r\n        'n': 'CUMIPMT',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u6295\u8CC7\u5728\u4E00\u7CFB\u5217\u4ED8\u6B3E\u671F\u5167\u7684\u7D2F\u8A08\u5229\u606F\u3002',\r\n        'a': '\u57FA\u65BC\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387,\u8A08\u7B97\u6295\u8CC7\u5728\u4E00\u7CFB\u5217\u4ED8\u6B3E\u671F\u5167\u7684\u7D2F\u8A08\u5229\u606F\u3002',\r\n        'm': [6, 6],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5229\u606F\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u7E3D\u4ED8\u6B3E\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'start_period',\r\n            'detail' : '\u958B\u59CB\u7D2F\u8A08\u8A08\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u865F\u3002\\n\\n\u9996\u671F\u5FC5\u9808\u5927\u65BC\u7B49\u65BC1\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'end_period',\r\n            'detail' : '\u7D50\u675F\u7D2F\u8A08\u8A08\u7B97\u7684\u4ED8\u6B3E\u671F\u5E8F\u865F\u3002\\n\\n\u672B\u671F\u5FC5\u9808\u5927\u65BC\u9996\u671F\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PMT',\r\n        't': 8,\r\n        'd': '\u7528\u65BC\u6839\u64DA\u56FA\u5B9A\u4ED8\u6B3E\u984D\u548C\u56FA\u5B9A\u5229\u7387\u8A08\u7B97\u8CB8\u6B3E\u7684\u4ED8\u6B3E\u984D\u3002',\r\n        'a': '\u7528\u65BC\u6839\u64DA\u56FA\u5B9A\u4ED8\u6B3E\u984D\u548C\u56FA\u5B9A\u5229\u7387\u8A08\u7B97\u8CB8\u6B3E\u7684\u4ED8\u6B3E\u984D\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u8CB8\u6B3E\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u8A72\u9805\u8CB8\u6B3E\u7684\u4ED8\u6B3E\u7E3D\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C,\u6216\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u984D\u73FE\u5728\u6240\u503C\u7684\u7E3D\u984D,\u4E5F\u53EB\u672C\u91D1\u3002',\r\n            'example': ' 100000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': 'D2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IPMT',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u7BA1\u9053,\u8FD4\u56DE\u7D66\u5B9A\u671F\u6578\u5167\u5C0D\u6295\u8CC7\u7684\u5229\u606F\u511F\u9084\u984D\u3002',\r\n        'a': '\u57FA\u65BC\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u7BA1\u9053,\u8FD4\u56DE\u7D66\u5B9A\u671F\u6578\u5167\u5C0D\u6295\u8CC7\u7684\u5229\u606F\u511F\u9084\u984D\u3002',\r\n        'm': [4, 6],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'per',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u5176\u5229\u606F\u6578\u984D\u7684\u671F\u6578,\u5FC5\u9808\u57281\u5230nper\u4E4B\u9593\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u5E74\u91D1\u7684\u4ED8\u6B3E\u7E3D\u671F\u6578\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C,\u6216\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u7684\u7576\u524D\u503C\u7684\u7D2F\u7A4D\u548C\u3002',\r\n            'example': '80000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': 'E2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PPMT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6839\u64DA\u5B9A\u671F\u56FA\u5B9A\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\u800C\u5B9A\u7684\u6295\u8CC7\u5728\u5DF2\u77E5\u671F\u9593\u5167\u7684\u672C\u91D1\u511F\u4ED8\u984D\u3002',\r\n        'a': '\u8FD4\u56DE\u6839\u64DA\u5B9A\u671F\u56FA\u5B9A\u4ED8\u6B3E\u548C\u56FA\u5B9A\u5229\u7387\u800C\u5B9A\u7684\u6295\u8CC7\u5728\u5DF2\u77E5\u671F\u9593\u5167\u7684\u672C\u91D1\u511F\u4ED8\u984D\u3002',\r\n        'm': [4, 6],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'per',\r\n            'detail' : '\u6307\u5B9A\u671F\u6578,\u8A72\u503C\u5FC5\u9808\u5728 1 \u5230 nper \u7BC4\u570D\u5167\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'nper',\r\n            'detail' : '\u5E74\u91D1\u7684\u4ED8\u6B3E\u7E3D\u671F\u6578\u3002',\r\n            'example': '3*12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C\u5373\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u7576\u524D\u503C\u7684\u7E3D\u548C\u3002',\r\n            'example': '100000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'INTRATE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B8C\u5168\u6295\u8CC7\u578B\u8B49\u5238\u7684\u5229\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u5B8C\u5168\u6295\u8CC7\u578B\u8B49\u5238\u7684\u5229\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'investment',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u6295\u8CC7\u984D\u3002',\r\n            'example': '100000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u5230\u671F\u6642\u7684\u514C\u63DB\u503C\u3002',\r\n            'example': '101200',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICE',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u5B9A\u671F\u4ED8\u606F\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'm': [6, 7],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'rate',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.057',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'yld',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.065',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u6E05\u511F\u50F9\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICEDISC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6298\u50F9\u767C\u884C\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u6298\u50F9\u767C\u884C\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'discount',\r\n            'detail' : '\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\u3002',\r\n            'example': '0.0525',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u6E05\u511F\u50F9\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'PRICEMAT',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5230\u671F\u4ED8\u606F\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'a': '\u8FD4\u56DE\u5230\u671F\u4ED8\u606F\u7684\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'issue',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u767C\u884C\u65E5\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'rate',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u5728\u767C\u884C\u65E5\u7684\u5229\u7387\u3002',\r\n            'example': '0.061',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'yld',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.061',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'RECEIVED',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u6B21\u6027\u4ED8\u606F\u7684\u6709\u50F9\u8B49\u5238\u5230\u671F\u6536\u56DE\u7684\u91D1\u984D\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u6B21\u6027\u4ED8\u606F\u7684\u6709\u50F9\u8B49\u5238\u5230\u671F\u6536\u56DE\u7684\u91D1\u984D\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'investment',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u6295\u8CC7\u984D\u3002',\r\n            'example': '10000000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'discount',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u8CBC\u73FE\u7387\u3002',\r\n            'example': '0.0575',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DISC',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u6709\u50F9\u8B49\u5238\u7684\u8CBC\u73FE\u7387\u3002',\r\n        'a': '\u8FD4\u56DE\u6709\u50F9\u8B49\u5238\u7684\u8CBC\u73FE\u7387\u3002',\r\n        'm': [4, 5],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'pr',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u50F9\u683C\uFF08\u6309\u9762\u503C\u70BA\uFFE5100\u8A08\u7B97\uFF09\u3002',\r\n            'example': '97.975',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'redemption',\r\n            'detail' : '\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684\u6E05\u511F\u50F9\u503C\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '12',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'NPER',\r\n        't': 8,\r\n        'd': '\u57FA\u65BC\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u7BA1\u9053,\u8FD4\u56DE\u67D0\u9805\u6295\u8CC7\u7684\u7E3D\u671F\u6578\u3002',\r\n        'a': '\u57FA\u65BC\u56FA\u5B9A\u5229\u7387\u53CA\u7B49\u984D\u5206\u671F\u4ED8\u6B3E\u7BA1\u9053,\u8FD4\u56DE\u67D0\u9805\u6295\u8CC7\u7684\u7E3D\u671F\u6578\u3002',\r\n        'm': [3, 5],\r\n        'p': [{\r\n            'name'   : 'rate',\r\n            'detail' : '\u5404\u671F\u5229\u7387\u3002',\r\n            'example': '0.12',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pmt',\r\n            'detail' : '\u5404\u671F\u6240\u61C9\u652F\u4ED8\u7684\u91D1\u984D,\u5728\u6574\u500B\u5E74\u91D1\u671F\u9593\u4FDD\u6301\u4E0D\u8B8A\u3002',\r\n            'example': '500',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'pv',\r\n            'detail' : '\u73FE\u503C,\u6216\u4E00\u7CFB\u5217\u672A\u4F86\u4ED8\u6B3E\u7684\u7576\u524D\u503C\u7684\u7D2F\u7A4D\u548C\u3002',\r\n            'example': '40000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'fv',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u672A\u4F86\u503C,\u6216\u5728\u6700\u5F8C\u4E00\u6B21\u4ED8\u6B3E\u5F8C\u5E0C\u671B\u5F97\u5230\u7684\u73FE\u91D1\u9918\u984D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'type',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BA0] - \u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u6642\u9593\u662F\u5728\u671F\u521D\u9084\u662F\u671F\u672B\u3002\\n\\n0\u8868\u793A\u671F\u672B\uFF1B\\n\\n1\u8868\u793A\u671F\u521D\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SLN',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u671F\u9593\u5167\u7684\u8CC7\u7522\u7684\u76F4\u7DDA\u6298\u820A\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u671F\u9593\u5167\u7684\u8CC7\u7522\u7684\u76F4\u7DDA\u6298\u820A\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'cost',\r\n            'detail' : '\u8CC7\u7522\u539F\u503C\u3002',\r\n            'example': '300000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'salvage',\r\n            'detail' : '\u6298\u820A\u672B\u5C3E\u6642\u7684\u503C\uFF08\u6709\u6642\u4E5F\u7A31\u70BA\u8CC7\u7522\u6B98\u503C\uFF09\u3002',\r\n            'example': '75000',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'life',\r\n            'detail' : '\u8CC7\u7522\u7684\u6298\u820A\u671F\u6578\uFF08\u6709\u6642\u4E5F\u7A31\u4F5C\u8CC7\u7522\u7684\u4F7F\u7528\u58FD\u547D\uFF09\u3002',\r\n            'example': '10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DURATION',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5047\u8A2D\u9762\u503C\uFFE5100\u7684\u5B9A\u671F\u4ED8\u606F\u6709\u50F9\u8B49\u5238\u7684\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'a': '\u8FD4\u56DE\u5047\u8A2D\u9762\u503C\uFFE5100\u7684\u5B9A\u671F\u4ED8\u606F\u6709\u50F9\u8B49\u5238\u7684\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'coupon',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'yld',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MDURATION',\r\n        't': 8,\r\n        'd': '\u8FD4\u56DE\u5047\u8A2D\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684Macauley\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'a': '\u8FD4\u56DE\u5047\u8A2D\u9762\u503C\uFFE5100\u7684\u6709\u50F9\u8B49\u5238\u7684Macauley\u4FEE\u6B63\u671F\u9650\u3002',\r\n        'm': [5, 6],\r\n        'p': [{\r\n            'name'   : 'settlement',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u7D50\u7B97\u65E5\u3002\u6709\u50F9\u8B49\u5238\u7D50\u7B97\u65E5\u662F\u5728\u767C\u884C\u65E5\u4E4B\u5F8C,\u6709\u50F9\u8B49\u5238\u8CE3\u7D66\u8CFC\u8CB7\u8005\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'maturity',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5230\u671F\u65E5\u3002\u5230\u671F\u65E5\u662F\u6709\u50F9\u8B49\u5238\u6709\u6548\u671F\u622A\u6B62\u6642\u7684\u65E5\u671F\u3002',\r\n            'example': 'DATE(2010',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'coupon',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\u3002',\r\n            'example': '0.08',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'yld',\r\n            'detail' : '\u6709\u50F9\u8B49\u5238\u7684\u5E74\u6536\u76CA\u7387\u3002',\r\n            'example': '0.09',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'frequency',\r\n            'detail' : '\u5E74\u4ED8\u606F\u6B21\u6578\u3002\\n\\n\u5982\u679C\u6309\u5E74\u652F\u4ED8,frequency = 1\uFF1B\\n\\n\u6309\u534A\u5E74\u671F\u652F\u4ED8,frequency = 2\uFF1B\\n\\n\u6309\u5B63\u652F\u4ED8,frequency = 4\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'basis',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u8A13\u793A\u8981\u4F7F\u7528\u54EA\u7A2E\u5929\u6578\u8A08\u7B97\u65B9\u6CD5\u3002\\n\\n0\u8868\u793A\"\u7F8E\u570B\uFF08NASD\uFF0930/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u6309\u7167\u7F8E\u570B\u5168\u570B\u8B49\u5238\u4EA4\u6613\u5546\u5354\u6703\u6A19\u6E96,\u5047\u8A2D\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929,\u4E26\u5C0D\u6240\u8F38\u5165\u7684\u6708\u672B\u65E5\u671F\u9032\u884C\u5177\u9AD4\u8ABF\u6574\u3002\\n\\n1\u8868\u793A\"\u5BE6\u969B/\u5BE6\u969B\"\u65B9\u6CD5-\u6B64\u65B9\u6CD5\u8A08\u7B97\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u548C\u6240\u6D89\u53CA\u7684\u5E74\u4EFD\u4E2D\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97\u3002\u6B64\u65B9\u6CD5\u7528\u65BC\u7F8E\u570B\u9577\u671F\u50B5\u5238,\u4E5F\u662F\u5728\u975E\u8CA1\u7D93\u7528\u9014\u65B9\u9762\u4F7F\u7528\u6700\u591A\u7684\u65B9\u6CD5\u3002\\n\\n2\u8868\u793A\"\u5BE6\u969B/360\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97, \u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA360\u5929\u3002\\n\\n3\u8868\u793A\"\u5BE6\u969B/365\"\u65B9\u6CD5 - \u6B64\u65B9\u6CD5\u57FA\u65BC\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u5BE6\u969B\u5929\u6578\u9032\u884C\u8A08\u7B97,\u4F46\u5047\u5B9A\u6BCF\u5E74\u70BA365\u5929\u3002\\n\\n4\u8868\u793A\"\u6B50\u6D3230 / 360\"\u65B9\u6CD5-\u985E\u4F3C\u65BC0,\u6B64\u65B9\u6CD5\u57FA\u65BC\u6BCF\u670830\u5929\u3001\u6BCF\u5E74360\u5929\u9032\u884C\u8A08\u7B97,\u4F46\u6309\u7167\u6B50\u6D32\u91D1\u878D\u6163\u4F8B\u5C0D\u6708\u672B\u65E5\u671F\u9032\u884C\u8ABF\u6574\u3002',\r\n            'example': '0',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2DEC',\r\n        't': 9,\r\n        'd': '\u5C07\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768410\u4F4D\u4E8C\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5C0D\u65BC\u6B64\u51FD\u6578,\u6700\u5927\u7684\u6B63\u6578\u8F38\u5165\u503C\u70BA0111111111,\u6700\u5C0F\u7684\u8CA0\u6578\u8F38\u5165\u503C\u70BA1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u4E8C\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,BIN2DEC\uFF08100\uFF09\u548CBIN2DEC\uFF08\"100\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA4\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2HEX',\r\n        't': 9,\r\n        'd': '\u5C07\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768410\u4F4D\u4E8C\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5C0D\u65BC\u6B64\u51FD\u6578,\u6700\u5927\u7684\u6B63\u6578\u8F38\u5165\u503C\u70BA0111111111,\u6700\u5C0F\u7684\u8CA0\u6578\u8F38\u5165\u503C\u70BA1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u4E8C\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,BIN2HEX\uFF0811111\uFF09\u548CBIN2HEX\uFF08\"11111\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA1F\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] -\u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\u4F8B\u5982,BIN2HEX\uFF08\"11111\",8\uFF09\u6240\u5F97\u7684\u7D50\u679C\u503C\u70BA0000001F\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u5927\u65BC\u7B49\u65BC1000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'BIN2OCT',\r\n        't': 9,\r\n        'd': '\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'a': '\u4E8C\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u5E36\u7B26\u865F\u768410\u4F4D\u4E8C\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u5C0D\u65BC\u6B64\u51FD\u6578,\u6700\u5927\u7684\u6B63\u6578\u8F38\u5165\u503C\u70BA0111111111,\u6700\u5C0F\u7684\u8CA0\u6578\u8F38\u5165\u503C\u70BA1000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u4E8C\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,BIN2OCT\uFF0811111\uFF09\u548CBIN2OCT\uFF08\"11111\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA37\u3002',\r\n            'example': '101',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\u4F8B\u5982,BIN2OCT\uFF08\"11111\"\uFF09\u5F97\u5230\u7684\u7D50\u679C\u503C\u70BA00000037\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u5927\u65BC\u7B49\u65BC1000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2BIN',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u5341\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5C0D\u65BC\u6B64\u51FD\u6578,\u6700\u5927\u7684\u6B63\u6578\u8F38\u5165\u503C\u70BA511,\u6700\u5C0F\u7684\u8CA0\u6578\u8F38\u5165\u503C\u70BA-512\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,DEC2BIN\uFF08199\uFF09\u548CDEC2BIN\uFF08\"199\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA11000111\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5341\u9032\u4F4D\u6578\u70BA\u8CA0\u6578,\u5247\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2HEX',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u5341\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA549755813887,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA-549755814888\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,DEC2HEX\uFF08100\uFF09\u548CDEC2HEX\uFF08\"100\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA64\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5341\u9032\u4F4D\u6578\u70BA\u8CA0\u6578,\u5247\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'DEC2OCT',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'a': '\u5C07\u5341\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u5341\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA536870911,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA-53687092\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5341\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u9032\u4F4D\u6578,\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,DEC2OCT\uFF08199\uFF09\u548CDEC2OCT\uFF08\"199\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA307\u3002',\r\n            'example': '100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] -\u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5341\u9032\u4F4D\u6578\u70BA\u8CA0\u6578,\u5247\u5FFD\u7565\u6B64\u503C \u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2BIN',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768440\u4F4D\u5341\u516D\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA1FF,\u6700\u5C0F\u8CA0\u6578\u503C\u70BAFFFFFFFE00\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u516D\u9032\u4F4D\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,HEX2BIN\uFF08199\uFF09\u548CHEX2BIN\uFF08\"199\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA110011001\u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u5927\u65BC\u7B49\u65BC8000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2DEC',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768440\u4F4D\u5341\u516D\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA7fffffffff,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA8000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u516D\u9032\u4F4D\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,HEX2DEC\uFF08199\uFF09\u548CHEX2DEC\uFF08\"199\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA409 \u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'HEX2OCT',\r\n        't': 9,\r\n        'd': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'a': '\u5C07\u5341\u516D\u9032\u4F4D\u6578\u8F49\u63DB\u70BA\u516B\u9032\u5236\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u5E36\u7B26\u865F\u768440\u4F4D\u5341\u516D\u9032\u4F4D\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA1FFFFFFF,\u6700\u5C0F\u8CA0\u6578\u503C\u70BAFFE0000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u662F\u6709\u6548\u7684\u5341\u516D\u9032\u4F4D\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,HEX2OCT\uFF08199\uFF09\u548CHEX2OCT\uFF08\"199\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA631\u3002',\r\n            'example': '\"f3\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u7D66\u5B9A\u7684\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u5927\u65BC\u7B49\u65BC8000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2BIN',\r\n        't': 9,\r\n        'd': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u4E8C\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u4E8C\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768430\u4F4D\u516B\u9032\u5236\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA777,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA7777777000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u662F\u6709\u6548\u7684\u516B\u9032\u5236\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,OCT2BIN\uFF08177\uFF09\u548COCT2BIN\uFF08\"177\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA1111111\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u7D66\u5B9A\u7684\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u5927\u65BC\u7B49\u65BC4000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2DEC',\r\n        't': 9,\r\n        'd': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5341\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768430\u4F4D\u516B\u9032\u5236\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684ba\u9032\u5236\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA3777777777,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA4000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u662F\u6709\u6548\u7684\u516B\u9032\u5236\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,OCT2DEC\uFF08177\uFF09\u548COCT2DEC\uFF08\"177\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA127\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'OCT2HEX',\r\n        't': 9,\r\n        'd': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'a': '\u5C07\u516B\u9032\u5236\u6578\u8F49\u63DB\u70BA\u5341\u516D\u9032\u4F4D\u6578\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5E36\u7B26\u865F\u7684\u5341\u516D\u9032\u4F4D\u6578\u7684\u5E36\u7B26\u865F\u768430\u4F4D\u516B\u9032\u5236\u6578\u503C\uFF08\u4EE5\u5B57\u4E32\u5F62\u5F0F\u63D0\u4F9B\uFF09\u3002\\n\\n\u5E36\u7B26\u865F\u7684ba\u9032\u5236\u6578\u7684\u6700\u9AD8\u4F4D\u662F\u7B26\u865F\u4F4D\uFF1B\u4E5F\u5C31\u662F\u8AAA,\u8CA0\u6578\u662F\u4EE5\u4E8C\u7684\u88DC\u6578\u5F62\u5F0F\u8868\u793A\u7684\u3002\\n\\n\u6B64\u51FD\u6578\u53EF\u63A5\u53D7\u7684\u6700\u5927\u6B63\u6578\u503C\u70BA3777777777,\u6700\u5C0F\u8CA0\u6578\u503C\u70BA4000000000\u3002\\n\\n\u5982\u679C\u6240\u63D0\u4F9B\u7684\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u662F\u6709\u6548\u7684\u516B\u9032\u5236\u6578,\u51FD\u6578\u6703\u81EA\u52D5\u5C07\u5176\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u5B57\u4E32\u8F38\u5165\u3002\u4F8B\u5982,OCT2HEX\uFF08177\uFF09\u548COCT2HEX\uFF08\"177\"\uFF09\u5F97\u51FA\u7684\u7D50\u679C\u76F8\u540C,\u5747\u70BA7F\u3002',\r\n            'example': '37',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'places',\r\n            'detail' : '[ \u53EF\u9078 ] - \u7D50\u679C\u4E2D\u8981\u78BA\u4FDD\u7684\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u8A2D\u5B9A\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u7D50\u679C\u4E2D\u7684\u6709\u6548\u4F4D\u6578,\u5247\u5728\u7D50\u679C\u7684\u5DE6\u5074\u586B\u51450,\u4F7F\u7E3D\u6709\u6548\u4F4D\u6578\u9054\u5230\u6709\u6548\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u7684\u6700\u9AD8\u4F4D\u70BA1,\u5247\u5FFD\u7565\u6B64\u503C\uFF1B\u5373\u7576\u7D66\u5B9A\u7684\u5E36\u7B26\u865F\u7684\u516B\u9032\u5236\u6578\u5927\u65BC\u7B49\u65BC4000000000\u6642\u5FFD\u7565\u6B64\u503C\u3002',\r\n            'example': '8',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'COMPLEX',\r\n        't': 9,\r\n        'd': '\u5C07\u5BE6\u4FC2\u6578\u53CA\u865B\u4FC2\u6578\u8F49\u63DB\u70BA x+yi \u6216 x+yj \u5F62\u5F0F\u7684\u8907\u6578\u3002',\r\n        'a': '\u5C07\u5BE6\u4FC2\u6578\u53CA\u865B\u4FC2\u6578\u8F49\u63DB\u70BA x+yi \u6216 x+yj \u5F62\u5F0F\u7684\u8907\u6578\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'real_num',\r\n            'detail' : '\u8907\u6578\u7684\u5BE6\u4FC2\u6578\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'i_num',\r\n            'detail' : '\u8907\u6578\u7684\u865B\u4FC2\u6578\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'suffix',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA\"i\"] - \u8907\u6578\u4E2D\u865B\u4FC2\u6578\u7684\u5C3E\u78BC\u3002',\r\n            'example': '\"j\"',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangestring'\r\n        }]\r\n    }, {\r\n        'n': 'IMREAL',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u5BE6\u4FC2\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u5BE6\u4FC2\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'inumber',\r\n            'detail' : '\u9700\u8981\u8A08\u7B97\u5176\u5BE6\u4FC2\u6578\u7684\u8907\u6578\u3002',\r\n            'example': '\"4+5i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMAGINARY',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u865B\u4FC2\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u865B\u4FC2\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'inumber',\r\n            'detail' : '\u9700\u8981\u8A08\u7B97\u5176\u865B\u4FC2\u6578\u7684\u8907\u6578\u3002',\r\n            'example': '\"4+5i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMCONJUGATE',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u5171\u8EDB\u8907\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u5171\u8EDB\u8907\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'inumber',\r\n            'detail' : '\u9700\u8981\u8A08\u7B97\u5176\u5171\u8EDB\u6578\u7684\u8907\u6578\u3002',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMABS',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u7D55\u5C0D\u503C\uFF08\u6A21\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u8907\u6578\u7684\u7D55\u5C0D\u503C\uFF08\u6A21\uFF09\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'inumber',\r\n            'detail' : '\u8981\u8A08\u7B97\u5176\u7D55\u5C0D\u503C\u7684\u8907\u6578\u3002',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'DELTA',\r\n        't': 9,\r\n        'd': '\u6AA2\u9A57\u5169\u500B\u503C\u662F\u5426\u76F8\u7B49\u3002\u5982\u679C number1=number2,\u5247\u8FD4\u56DE1\uFF1B\u5426\u5247\u8FD4\u56DE0\u3002',\r\n        'a': '\u6AA2\u9A57\u5169\u500B\u503C\u662F\u5426\u76F8\u7B49\u3002\u5982\u679C number1=number2,\u5247\u8FD4\u56DE1\uFF1B\u5426\u5247\u8FD4\u56DE0\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'number1',\r\n            'detail' : '\u7B2C\u4E00\u500B\u6578\u4F4D\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'number2',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA0] - \u7B2C\u4E8C\u500B\u6578\u4F4D\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'IMSUM',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u500B\u8907\u6578\u7684\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u500B\u8907\u6578\u7684\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'inumber1',\r\n            'detail' : '\u8981\u76F8\u52A0\u7684\u7B2C\u4E00\u500B\u8907\u6578',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'inumber2, \u2026',\r\n            'detail' : '[\u53EF\u9078] -\u8981\u8207\u503C1\u76F8\u52A0\u7684\u5176\u4ED6\u8907\u6578',\r\n            'example': '\"5-3i\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMSUB',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u5169\u500B\u8907\u6578\u7684\u5DEE\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u5169\u500B\u8907\u6578\u7684\u5DEE\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'inumber1',\r\n            'detail' : '\u5F9E\uFF08\u8907\uFF09\u6578\u4E2D\u51CF\u53BB inumber2\u3002',\r\n            'example': '\"6+5i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'inumber2',\r\n            'detail' : '\u5F9E inumber1 \u4E2D\u51CF\uFF08\u8907\uFF09\u6578\u3002',\r\n            'example': '\"2+3i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMPRODUCT',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u500B\u8907\u6578\u7684\u4E58\u7A4D\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684 1 \u81F3 255 \u500B\u8907\u6578\u7684\u4E58\u7A4D\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'inumber1',\r\n            'detail' : '\u7528\u65BC\u8A08\u7B97\u4E58\u7A4D\u7684\u7B2C\u4E00\u500B\u8907\u6578',\r\n            'example': '\"3+4i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'inumber2, \u2026',\r\n            'detail' : '[\u53EF\u9078] -\u8981\u76F8\u4E58\u7684\u5176\u4ED6\u8907\u6578\u3002',\r\n            'example': '\"5-3i\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IMDIV',\r\n        't': 9,\r\n        'd': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u5169\u500B\u8907\u6578\u7684\u5546\u3002',\r\n        'a': '\u8FD4\u56DE\u4EE5 x+yi \u6216 x+yj \u6587\u672C\u683C\u5F0F\u8868\u793A\u7684\u5169\u500B\u8907\u6578\u7684\u5546\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'inumber1',\r\n            'detail' : '\u8907\u6578\u5206\u5B50\u6216\u88AB\u9664\u6578\u3002',\r\n            'example': '\"11+16i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'inumber2',\r\n            'detail' : '\u8907\u6578\u5206\u6BCD\u6216\u9664\u6578\u3002',\r\n            'example': '\"3+2i\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NOT',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u67D0\u500B\u908F\u8F2F\u503C\u7684\u76F8\u53CD\u503C-\"NOT\uFF08TRUE\uFF08\uFF09\uFF09\"\u5C07\u8FD4\u56DEFALSE\uFF1B\"NOT\uFF08FALSE\uFF08\uFF09\uFF09\"\u5C07\u8FD4\u56DETRUE\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u500B\u908F\u8F2F\u503C\u7684\u76F8\u53CD\u503C-\"NOT\uFF08TRUE\uFF08\uFF09\uFF09\"\u5C07\u8FD4\u56DEFALSE\uFF1B\"NOT\uFF08FALSE\uFF08\uFF09\uFF09\"\u5C07\u8FD4\u56DETRUE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'logical',\r\n            'detail' : '\u8A08\u7B97\u7D50\u679C\u70BATRUE\u6216FALSE\u7684\u4EFB\u4F55\u503C\u6216\u904B\u7B97\u5F0F\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'TRUE',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u908F\u8F2F\u503C TRUE\u3002',\r\n        'a': '\u8FD4\u56DE\u908F\u8F2F\u503C TRUE\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'FALSE',\r\n        't': 10,\r\n        'd': '\u8FD4\u56DE\u908F\u8F2F\u503C FALSE\u3002',\r\n        'a': '\u8FD4\u56DE\u908F\u8F2F\u503C FALSE\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'AND',\r\n        't': 10,\r\n        'd': '\u6240\u6709\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BATRUE\u6642,\u8FD4\u56DETRUE\uFF1B\u53EA\u8981\u6709\u4E00\u500B\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BAFALSE,\u5373\u8FD4\u56DEFALSE\u3002',\r\n        'a': '\u6240\u6709\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BATRUE\u6642,\u8FD4\u56DETRUE\uFF1B\u53EA\u8981\u6709\u4E00\u500B\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BAFALSE,\u5373\u8FD4\u56DEFALSE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'logical1',\r\n            'detail' : '\u8981\u6E2C\u8A66\u7684\u7B2C\u4E00\u500B\u689D\u4EF6,\u5176\u8A08\u7B97\u7D50\u679C\u53EF\u4EE5\u70BATRUE\u6216FALSE\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'logical2,...',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u6E2C\u8A66\u7684\u5176\u4ED6\u689D\u4EF6,\u5176\u8A08\u7B97\u7D50\u679C\u53EF\u4EE5\u70BATRUE\u6216FALSE,\u6700\u591A\u53EF\u5305\u542B255\u500B\u689D\u4EF6\u3002',\r\n            'example': 'A3 = \"bar\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IFERROR',\r\n        't': 10,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u4E0D\u662F\u932F\u8AA4\u503C,\u5C31\u8FD4\u56DE\u7B2C\u4E00\u500B\u53C3\u6578\uFF1B\u5426\u5247,\u8FD4\u56DE\u7B2C\u4E8C\u500B\u53C3\u6578\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u4E0D\u662F\u932F\u8AA4\u503C',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u6AA2\u67E5\u662F\u5426\u5B58\u5728\u932F\u8AA4\u7684\u53C3\u6578\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value_if_error',\r\n            'detail' : '\u516C\u5F0F\u7684\u8A08\u7B97\u7D50\u679C\u932F\u8AA4\u6642\u8FD4\u56DE\u7684\u503C\u3002\u8A08\u7B97\u4EE5\u4E0B\u932F\u8AA4\u985E\u578B:#N/A\u3001#VALUE\uFF01\u3001#REF\uFF01\u3001#DIV/0\uFF01\u3001#NUM\uFF01\u3001#NAME\uFF1F\u6216#NULL\uFF01\u3002',\r\n            'example': '\"Error in cell A1\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'IF',\r\n        't': 10,\r\n        'd': '\u7576\u908F\u8F2F\u904B\u7B97\u5F0F\u7684\u503C\u70BATRUE\u6642\u8FD4\u56DE\u4E00\u500B\u503C,\u800C\u7576\u5176\u70BAFALSE\u6642\u8FD4\u56DE\u53E6\u4E00\u500B\u503C\u3002',\r\n        'a': '\u7576\u908F\u8F2F\u904B\u7B97\u5F0F\u7684\u503C\u70BATRUE\u6642\u8FD4\u56DE\u4E00\u500B\u503C,\u800C\u7576\u5176\u70BAFALSE\u6642\u8FD4\u56DE\u53E6\u4E00\u500B\u503C\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'logical_test',\r\n            'detail' : '\u4E00\u500B\u904B\u7B97\u5F0F\u6216\u5C0D\u5305\u542B\u904B\u7B97\u5F0F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u8A72\u904B\u7B97\u5F0F\u4EE3\u8868\u67D0\u7A2E\u908F\u8F2F\u503C\uFF08\u5373TRUE\u6216FALSE\uFF09\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value_if_true',\r\n            'detail' : '\u7576\u908F\u8F2F\u904B\u7B97\u5F0F\u70BATRUE\u6642\u7684\u8FD4\u56DE\u503C\u3002',\r\n            'example': '\"A2 is foo\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value_if_false',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u70BA\u7A7A\u767D] - \u7576\u908F\u8F2F\u904B\u7B97\u5F0F\u7B49\u65BCFALSE\u6642\u7684\u51FD\u6578\u8FD4\u56DE\u503C\u3002',\r\n            'example': '\"A2 was false\"',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'OR',\r\n        't': 10,\r\n        'd': '\u53EA\u8981\u6709\u4E00\u500B\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BATRUE\u6642,\u8FD4\u56DETRUE\uFF1B\u6240\u6709\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BAFALSE,\u5373\u8FD4\u56DEFALSE\u3002',\r\n        'a': '\u53EA\u8981\u6709\u4E00\u500B\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BATRUE\u6642,\u8FD4\u56DETRUE\uFF1B\u6240\u6709\u53C3\u6578\u7684\u8A08\u7B97\u7D50\u679C\u70BAFALSE,\u5373\u8FD4\u56DEFALSE\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'logical1',\r\n            'detail' : '\u8981\u6E2C\u8A66\u7684\u7B2C\u4E00\u500B\u689D\u4EF6,\u5176\u8A08\u7B97\u7D50\u679C\u53EF\u4EE5\u70BATRUE\u6216FALSE\u3002',\r\n            'example': 'A2 = \"foo\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : '\u908F\u8F2F\u904B\u7B97\u5F0F2',\r\n            'detail' : '[\u53EF\u9078] - \u5176\u4ED6\u904B\u7B97\u5F0F\u6216\u5C0D\u5305\u542B\u904B\u7B97\u5F0F\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u9019\u4E9B\u904B\u7B97\u5F0F\u4EE3\u8868\u67D0\u7A2E\u908F\u8F2F\u503C\uFF08\u5373TRUE\u6216FALSE\uFF09\u6216\u8005\u53EF\u4EE5\u5F37\u5236\u8F49\u63DB\u70BA\u908F\u8F2F\u503C\u3002',\r\n            'example': ' A3 = \"bar\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'NE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u4E0D\u76F8\u7B49,\u5247\u8FD4\u56DE\"TRUE\"\uFF1B\u5426\u5247\u8FD4\u56DE\"FALSE\"\u3002\u76F8\u7576\u65BC\"<>\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u4E0D\u76F8\u7B49,\u5247\u8FD4\u56DE\"TRUE\"\uFF1B\u5426\u5247\u8FD4\u56DE\"FALSE\"\u3002\u76F8\u7576\u65BC\"<>\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u7B2C\u4E00\u500B\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u8981\u6AA2\u67E5\u662F\u5426\u8207 value1 \u4E0D\u76F8\u7B49\u7684\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'EQ',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u76F8\u7B49,\u5247\u8FD4\u56DE\"TRUE\"\uFF1B\u5426\u5247\u8FD4\u56DE\"FALSE\"\u3002\u76F8\u7576\u65BC\"=\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u6307\u5B9A\u7684\u503C\u76F8\u7B49,\u5247\u8FD4\u56DE\"TRUE\"\uFF1B\u5426\u5247\u8FD4\u56DE\"FALSE\"\u3002\u76F8\u7576\u65BC\"=\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u7B2C\u4E00\u500B\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u8981\u6AA2\u67E5\u662F\u5426\u8207value1\u76F8\u7B49\u7684\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'GT',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u56B4\u683C\u5927\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC' > '\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u56B4\u683C\u5927\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC' > '\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u8981\u6E2C\u8A66\u5176\u662F\u5426\u5927\u65BC value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'GTE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u5927\u65BC\u6216\u7B49\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\">=\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u5927\u65BC\u6216\u7B49\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\">=\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5927\u4E8E\u7B49\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LT',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u56B4\u683C\u5C0F\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\"<\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u56B4\u683C\u5C0F\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\"<\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5C0F\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'LTE',\r\n        't': 11,\r\n        'd': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u5C0F\u65BC\u6216\u7B49\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\"<=\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u5982\u679C\u7B2C\u4E00\u500B\u53C3\u6578\u5C0F\u65BC\u6216\u7B49\u65BC\u7B2C\u4E8C\u500B\uFF0C\u5247\u8FD4\u56DETRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002\u76F8\u7576\u65BC\"<=\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u8981\u6D4B\u8BD5\u5176\u662F\u5426\u5C0F\u4E8E\u7B49\u4E8E value2 \u7684\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'ADD',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u6578\u503C\u4E4B\u548C\u3002\u76F8\u7576\u65BC\"+\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u6578\u503C\u4E4B\u548C\u3002\u76F8\u7576\u65BC\"+\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u7B2C\u4E00\u500B\u52A0\u6578\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u52A0\u6578\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'MINUS',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u6578\u503C\u4E4B\u5DEE\u3002\u76F8\u7576\u65BC\"-\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u6578\u503C\u4E4B\u5DEE\u3002\u76F8\u7576\u65BC\"-\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u88AB\u6E1B\u6578,\u5373\u8981\u5C0D\u5176\u8A08\u51CF\u7684\u6578\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u6E1B\u6578,\u5373\u8981\u5F9Evalue1\u4E2D\u51CF\u9664\u7684\u6578\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'MULTIPLY',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u6578\u7684\u4E58\u7A4D\u3002\u76F8\u7576\u65BC\"*\"\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u6578\u7684\u4E58\u7A4D\u3002\u76F8\u7576\u65BC\"*\"\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u7B2C\u4E00\u500B\u4E58\u6578\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u4E58\u6578\u3002',\r\n            'example': 'B2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'DIVIDE',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u53C3\u6578\u76F8\u9664\u6240\u5F97\u7684\u7D50\u679C\u3002\u76F8\u7576\u65BC`/`\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u53C3\u6578\u76F8\u9664\u6240\u5F97\u7684\u7D50\u679C\u3002\u76F8\u7576\u65BC`/`\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : '\u8981\u88AB\u9664\u7684\u6578\u503C\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            },\r\n        {\r\n            'name'   : 'value2',\r\n            'detail' : '\u7528\u65BC\u9664\u5176\u4ED6\u6578\u7684\u6578\u503C\u3002\\n\\n\u9664\u6578\u4E0D\u5F97\u70BA0\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONCAT',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u503C\u7684\u4E32\u806F\u3002\u76F8\u7576\u65BC`&`\u904B\u7B97\u5B50\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u503C\u7684\u4E32\u806F\u3002\u76F8\u7576\u65BC`&`\u904B\u7B97\u5B50\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value1',\r\n            'detail' : 'value2 \u5C07\u9644\u65BC\u5176\u5F8C\u7684\u503C\u3002',\r\n            'example': '\"de\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'value2',\r\n            'detail' : '\u8981\u9644\u65BC value1 \u4E4B\u5F8C\u7684\u503C\u3002',\r\n            'example': '\"mystify\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'UNARY_PERCENT',\r\n        't': 11,\r\n        'd': '\u8FD4\u56DE\u6309\u767E\u5206\u6BD4\u89E3\u91CB\u7684\u6578\u503C\u3002\u4F8B\u5982,\"UNARY_PERCENT\uFF08100\uFF09\"\u7B49\u65BC1\u3002',\r\n        'a': '\u8FD4\u56DE\u6309\u767E\u5206\u6BD4\u89E3\u91CB\u7684\u6578\u503C\u3002\u4F8B\u5982,\"UNARY_PERCENT\uFF08100\uFF09\"\u7B49\u65BC1\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u4F5C\u70BA\u767E\u5206\u6BD4\u89E3\u91CB\u7684\u6578\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'CONCATENATE',\r\n        't': 12,\r\n        'd': '\u5C07\u5169\u500B\u6216\u591A\u500B\u6587\u5B57\u5B57\u4E32\u806F\u63A5\u70BA\u4E00\u500B\u5B57\u4E32\u3002',\r\n        'a': '\u5C07\u5169\u500B\u6216\u591A\u500B\u6587\u5B57\u5B57\u4E32\u806F\u63A5\u70BA\u4E00\u500B\u5B57\u4E32\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'text1',\r\n            'detail' : '\u521D\u59CB\u5B57\u4E32\u3002',\r\n            'example': '\"Super\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            },\r\n        {\r\n            'name'   : 'text2\u2026',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u6309\u9806\u5E8F\u9023\u63A5\u5728\u4E00\u8D77\u7684\u5176\u4ED6\u5B57\u4E32\u3002',\r\n            'example': '\"calla\"',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CODE',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5B57\u4E32\u4E2D\u9996\u5B57\u5143\u7684Unicode\u6620\u5C04\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u6240\u63D0\u4F9B\u7684\u5B57\u4E32\u4E2D\u9996\u5B57\u5143\u7684Unicode\u6620\u5C04\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u9996\u5B57\u5143\u7684Unicode\u6620\u5C04\u503C\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"a\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'CHAR',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u7576\u524DUnicode\u7DE8\u78BC\u8868,\u5C07\u6578\u4F4D\u8F49\u63DB\u70BA\u5C0D\u61C9\u7684\u5B57\u5143\u3002',\r\n        'a': '\u6309\u7167\u7576\u524DUnicode\u7DE8\u78BC\u8868,\u5C07\u6578\u4F4D\u8F49\u63DB\u70BA\u5C0D\u61C9\u7684\u5B57\u5143\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u4ECB\u65BC1\u5230255\u4E4B\u9593\u7684\u6578\u4F4D\u3002',\r\n            'example': '97',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'ARABIC',\r\n        't': 12,\r\n        'd': '\u5C07\u7F85\u99AC\u6578\u5B57\u8F49\u63DB\u70BA\u963F\u62C9\u4F2F\u6578\u5B57\u3002',\r\n        'a': '\u5C07\u7F85\u99AC\u6578\u5B57\u8F49\u63DB\u70BA\u963F\u62C9\u4F2F\u6578\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8F49\u63DB\u683C\u5F0F\u7684\u7F85\u99AC\u6578\u5B57',\r\n            'example': '\"XIV\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n        }, {\r\n        'n': 'ROMAN',\r\n        't': 12,\r\n        'd': '\u5C07\u6578\u4F4D\u683C\u5F0F\u8A2D\u5B9A\u70BA\u7F85\u99AC\u6578\u5B57\u5F62\u5F0F\u3002',\r\n        'a': '\u5C07\u6578\u4F4D\u683C\u5F0F\u8A2D\u5B9A\u70BA\u7F85\u99AC\u6578\u5B57\u5F62\u5F0F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u8A2D\u5B9A\u683C\u5F0F\u7684\u6578\u4F4D,\u4ECB\u65BC1\u52303999\u4E4B\u9593\uFF08\u5305\u62EC\u9019\u5169\u500B\u6578\u4F4D\uFF09\u3002',\r\n            'example': '499',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n        }, {\r\n        'n': 'REGEXEXTRACT',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u898F\u5247\u904B\u7B97\u5F0F\u9078\u53D6\u5339\u914D\u7684\u5B50\u4E32\u3002',\r\n        'a': '\u6309\u7167\u898F\u5247\u904B\u7B97\u5F0F\u9078\u53D6\u5339\u914D\u7684\u5B50\u4E32\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8F38\u5165\u6587\u5B57\u3002',\r\n            'example': '\"Needle in a haystack\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'regular_expression',\r\n            'detail' : '\u6B64\u51FD\u6578\u5C07\u8FD4\u56DE\u6587\u5B57\u4E2D\u7B26\u5408\u6B64\u904B\u7B97\u5F0F\u7684\u7B2C\u4E00\u500B\u5B50\u4E32\u3002',\r\n            'example': '\".e{2}dle\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n        }, {\r\n        'n': 'REGEXMATCH',\r\n        't': 12,\r\n        'd': '\u5224\u65B7\u4E00\u6BB5\u6587\u5B57\u662F\u5426\u8207\u898F\u5247\u904B\u7B97\u5F0F\u76F8\u5339\u914D\u3002',\r\n        'a': '\u5224\u65B7\u4E00\u6BB5\u6587\u5B57\u662F\u5426\u8207\u898F\u5247\u904B\u7B97\u5F0F\u76F8\u5339\u914D\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u7528\u898F\u5247\u904B\u7B97\u5F0F\u6E2C\u8A66\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'regular_expression',\r\n            'detail' : '\u7528\u4F86\u6E2C\u8A66\u6587\u5B57\u7684\u898F\u5247\u904B\u7B97\u5F0F\u3002',\r\n            'example': '\"S.r\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'REGEXREPLACE',\r\n        't': 12,\r\n        'd': '\u4F7F\u7528\u898F\u5247\u904B\u7B97\u5F0F\u5C07\u6587\u5B57\u5B57\u4E32\u4E2D\u7684\u4E00\u90E8\u5206\u66FF\u63DB\u70BA\u5176\u4ED6\u6587\u5B57\u5B57\u4E32\u3002',\r\n        'a': '\u4F7F\u7528\u898F\u5247\u904B\u7B97\u5F0F\u5C07\u6587\u5B57\u5B57\u4E32\u4E2D\u7684\u4E00\u90E8\u5206\u66FF\u63DB\u70BA\u5176\u4ED6\u6587\u5B57\u5B57\u4E32\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u5C0D\u5176\u5C40\u90E8\u9032\u884C\u66FF\u63DB\u64CD\u4F5C\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'regular_expression',\r\n            'detail' : '\u898F\u5247\u904B\u7B97\u5F0F\u3002text\u4E2D\u6240\u6709\u5339\u914D\u7684\u5BE6\u4F8B\u90FD\u5C07\u88AB\u66FF\u63DB\u3002',\r\n            'example': '\"S.*d\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'replacement',\r\n            'detail' : '\u8981\u63D2\u5165\u5230\u539F\u6709\u6587\u5B57\u4E2D\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Bed\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'T',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u672C\u683C\u5F0F\u7684\u5B57\u4E32\u53C3\u6578\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u672C\u683C\u5F0F\u7684\u5B57\u4E32\u53C3\u6578\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u6587\u5B57\u7684\u53C3\u6578\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6587\u5B57,T\u5C07\u8FD4\u56DE\u503C\u672C\u8EAB\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6307\u5411\u5305\u542B\u6587\u5B57\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,T\u5C07\u8FD4\u56DE\u503C\u4E2D\u7684\u5167\u5BB9\u3002\\n\\n\u5982\u679C\u503C\u70BA\u932F\u8AA4\u503C\u6216\u5305\u542B\u932F\u8AA4\u503C\u7684\u5132\u5B58\u683C,T\u5C07\u8FD4\u56DE\u8A72\u932F\u8AA4\u503C\u3002\\n\\n\u5C0D\u65BC\u6240\u6709\u5176\u4ED6\u60C5\u51B5,T\u5C07\u8FD4\u56DE\u7A7A\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'FIXED',\r\n        't': 12,\r\n        'd': '\u4EE5\u56FA\u5B9A\u7684\u5C0F\u6578\u4F4D\u6578\u8A2D\u5B9A\u6578\u4F4D\u7684\u683C\u5F0F\u3002',\r\n        'a': '\u4EE5\u56FA\u5B9A\u7684\u5C0F\u6578\u4F4D\u6578\u8A2D\u5B9A\u6578\u4F4D\u7684\u683C\u5F0F\u3002',\r\n        'm': [1, 3],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u8981\u9032\u884C\u820D\u5165\u4E26\u8F49\u63DB\u70BA\u6587\u5B57\u7684\u6578\u4F4D\u3002',\r\n            'example': '3.141592653',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'decimals',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA2] - \u7D50\u679C\u4E2D\u8981\u986F\u793A\u7684\u5C0F\u6578\u4F4D\u6578\u3002\\n\\n\u5982\u679C\u6578\u503C\u7684\u6709\u6548\u4F4D\u6578\u5C0F\u65BC\u5C0F\u6578\u4F4D\u6578,\u5C07\u4EE5\u96F6\u586B\u5145\u3002\u5982\u679C\u6578\u503C\u7684\u6709\u6548\u4F4D\u6578\u5927\u65BC\u5C0F\u6578\u4F4D\u6578,\u5247\u5C07\u5176\u820D\u5165\u5230\u6240\u9700\u7684\u5C0F\u6578\u4F4D\u6578\u800C\u4E0D\u662F\u5C07\u5176\u622A\u65B7\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'no_commas',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BAFALSE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u5982\u679C\u70BATRUE\uFF08\uFF09,\u5247\u6703\u7981\u6B62FIXED\u5728\u8FD4\u56DE\u7684\u6587\u5B57\u4E2D\u5305\u542B\u9017\u865F\u3002',\r\n            'example': 'FALSE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'FIND',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u5340\u5206\u5927\u5C0F\u5BEB\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u5340\u5206\u5927\u5C0F\u5BEB\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'find_text',\r\n            'detail' : '\u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u67E5\u627E\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"n\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'within_text',\r\n            'detail' : '\u8981\u5728\u5176\u4E2D\u8490\u7D22\u8490\u7D22\u5B57\u4E32\u7684\u9996\u6B21\u51FA\u73FE\u4F4D\u7F6E\u7684\u6587\u5B57\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'start_num',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] - \u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u958B\u59CB\u8490\u7D22\u7684\u5B57\u5143\u4F4D\u7F6E\u3002',\r\n            'example': '14',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'FINDB',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u67D0\u500B\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u6BCF\u500B\u96D9\u4F4D\u5143\u7D44\u5B57\u5143\u5360\u5169\u500B\u4F4D\u7F6E\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u67D0\u500B\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u6BCF\u500B\u96D9\u4F4D\u5143\u7D44\u5B57\u5143\u5360\u5169\u500B\u4F4D\u7F6E\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'find_text',\r\n            'detail' : '\u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u67E5\u627E\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"\u65B0\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'within_text',\r\n            'detail' : '\u8981\u5728\u5176\u4E2D\u8490\u7D22\u8490\u7D22\u5B57\u4E32\u7684\u9996\u6B21\u51FA\u73FE\u4F4D\u7F6E\u7684\u6587\u5B57\u3002',\r\n            'example': '\"\u8FB2\u66C6\u65B0\u5E74\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'start_num',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] - \u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u958B\u59CB\u8490\u7D22\u7684\u5B57\u5143\u4F4D\u7F6E\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'JOIN',\r\n        't': 12,\r\n        'd': '\u5C07\u4E00\u500B\u6216\u591A\u500B\u4F7F\u7528\u6307\u5B9A\u5B9A\u754C\u7B26\u7684\u4E00\u7DAD\u6578\u7D44\u7684\u5143\u7D20\u9023\u63A5\u5230\u4E00\u8D77\u3002',\r\n        'a': '\u5C07\u4E00\u500B\u6216\u591A\u500B\u4F7F\u7528\u6307\u5B9A\u5B9A\u754C\u7B26\u7684\u4E00\u7DAD\u6578\u7D44\u7684\u5143\u7D20\u9023\u63A5\u5230\u4E00\u8D77\u3002',\r\n        'm': [2, 255],\r\n        'p': [{\r\n            'name'   : 'separator',\r\n            'detail' : '\u7F6E\u65BC\u76F8\u4E92\u9023\u63A5\u7684\u503C\u4E4B\u9593\u7684\u5B57\u5143\u6216\u5B57\u4E32\u3002\\n\\n\u5B9A\u754C\u7B26\u53EF\u4EE5\u70BA\u7A7A,\u4F8B\u5982JOIN\uFF08,{1,2,3}\uFF09\u3002',\r\n            'example': '\"and-a\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'array1',\r\n            'detail' : '\u8981\u4F7F\u7528\u5B9A\u754C\u7B26\u9023\u63A5\u7684\u4E00\u500B\u6216\u591A\u500B\u503C\u3002',\r\n            'example': '{1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'array2,\u2026',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u4F7F\u7528\u5B9A\u754C\u7B26\u9023\u63A5\u7684\u5176\u4ED6\u503C\u6216\u6578\u7D44\u3002',\r\n            'example': '2',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'LEFT',\r\n        't': 12,\r\n        'd': '\u5F9E\u6587\u5B57\u5B57\u4E32\u7684\u7B2C\u4E00\u500B\u5B57\u5143\u958B\u59CB\u8FD4\u56DE\u6307\u5B9A\u500B\u6578\u7684\u5B57\u5143\u3002',\r\n        'a': '\u5F9E\u6587\u5B57\u5B57\u4E32\u7684\u7B2C\u4E00\u500B\u5B57\u5143\u958B\u59CB\u8FD4\u56DE\u6307\u5B9A\u500B\u6578\u7684\u5B57\u5143\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u5305\u542B\u8981\u9078\u53D6\u7684\u5B57\u5143\u7684\u6587\u5B57\u5B57\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'num_chars',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] - \u6307\u5B9A\u8981\u7531LEFT\u9078\u53D6\u7684\u5B57\u5143\u7684\u6578\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'RIGHT',\r\n        't': 12,\r\n        'd': '\u6839\u64DA\u6240\u6307\u5B9A\u7684\u5B57\u5143\u6578\u8FD4\u56DE\u6587\u5B57\u5B57\u4E32\u4E2D\u6700\u5F8C\u4E00\u500B\u6216\u591A\u500B\u5B57\u5143\u3002',\r\n        'a': '\u6839\u64DA\u6240\u6307\u5B9A\u7684\u5B57\u5143\u6578\u8FD4\u56DE\u6587\u5B57\u5B57\u4E32\u4E2D\u6700\u5F8C\u4E00\u500B\u6216\u591A\u500B\u5B57\u5143\u3002',\r\n        'm': [1, 2],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u5305\u542B\u8981\u9078\u53D6\u7684\u5B57\u5143\u7684\u6587\u5B57\u5B57\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'num_chars',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1] - \u6307\u5B9A\u8981\u7531RIGHT\u9078\u53D6\u7684\u5B57\u5143\u7684\u6578\u91CF\u3002',\r\n            'example': '2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'MID',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u5B57\u5B57\u4E32\u4E2D\u5F9E\u6307\u5B9A\u4F4D\u7F6E\u958B\u59CB\u7684\u7279\u5B9A\u6578\u76EE\u7684\u5B57\u5143\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u5B57\u5B57\u4E32\u4E2D\u5F9E\u6307\u5B9A\u4F4D\u7F6E\u958B\u59CB\u7684\u7279\u5B9A\u6578\u76EE\u7684\u5B57\u5143\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u5305\u542B\u8981\u9078\u53D6\u7684\u5B57\u5143\u7684\u6587\u5B57\u5B57\u4E32\u3002',\r\n            'example': '\"get this\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'start_num',\r\n            'detail' : '\u8981\u5F9E\u5B57\u4E32\u4E2D\u958B\u59CB\u9078\u53D6\u7684\u4F4D\u7F6E\u3002\u5B57\u4E32\u4E2D\u7B2C\u4E00\u500B\u5B57\u5143\u7684\u7D22\u5F15\u70BA1\u3002',\r\n            'example': '5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'num_chars',\r\n            'detail' : '\u6307\u5B9A\u8981\u7531MID\u9078\u53D6\u7684\u5B57\u5143\u7684\u6578\u91CF\u3002\\n\\n\u5982\u679C\u9078\u53D6\u7684\u5B57\u5143\u6578\u5C1A\u4E0D\u8DB3\u9078\u53D6\u9577\u5EA6\u500B\u5B57\u5143\u6642\u5C31\u5230\u9054\u4E86\u5B57\u4E32\u5C3E\u90E8,\u5247MID\u8FD4\u56DE\u5F9E\u958B\u59CB\u4F4D\u7F6E\u5230\u5B57\u4E32\u5C3E\u90E8\u7684\u5B57\u5143\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'LEN',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u7D66\u5B9A\u5B57\u4E32\u7684\u9577\u5EA6\u3002',\r\n        'a': '\u8FD4\u56DE\u7D66\u5B9A\u5B57\u4E32\u7684\u9577\u5EA6\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u9577\u5EA6\u7684\u5B57\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'LENB',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6587\u5B57\u4E2D\u6240\u5305\u542B\u7684\u5B57\u5143\u6578\u3002\u8207\u96D9\u4F4D\u5143\u7D44\u5B57\u5143\u96C6\uFF08DBCS\uFF09\u4E00\u8D77\u4F7F\u7528\u3002',\r\n        'a': '\u8FD4\u56DE\u6587\u5B57\u4E2D\u6240\u5305\u542B\u7684\u5B57\u5143\u6578\u3002\u8207\u96D9\u4F4D\u5143\u7D44\u5B57\u5143\u96C6\uFF08DBCS\uFF09\u4E00\u8D77\u4F7F\u7528\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8FD4\u56DE\u5176\u4F4D\u5143\u7D44\u6578\u7684\u5B57\u4E32\u3002\uFF08\u4E00\u500B\u6F22\u5B57\u70BA\u5169\u500B\u4F4D\u5143\u7D44\u6578\uFF09',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'LOWER',\r\n        't': 12,\r\n        'd': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F49\u63DB\u70BA\u5C0F\u5BEB\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F49\u63DB\u70BA\u5C0F\u5BEB\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5C0F\u5BEB\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"LOREM IPSUM\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'UPPER',\r\n        't': 12,\r\n        'd': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F49\u63DB\u70BA\u5927\u5BEB\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u7684\u5B57\u6BCD\u8F49\u63DB\u70BA\u5927\u5BEB\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u5927\u5BEB\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"lorem ipsum\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'EXACT',\r\n        't': 12,\r\n        'd': '\u6BD4\u8F03\u5169\u500B\u5B57\u4E32\u662F\u5426\u76F8\u540C\u3002',\r\n        'a': '\u6BD4\u8F03\u5169\u500B\u5B57\u4E32\u662F\u5426\u76F8\u540C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'text1',\r\n            'detail' : '\u8981\u6BD4\u8F03\u7684\u7B2C\u4E00\u500B\u5B57\u4E32\u3002',\r\n            'example': 'A1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'text2',\r\n            'detail' : '\u8981\u6BD4\u8F03\u7684\u7B2C\u4E8C\u500B\u5B57\u4E32\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'REPLACE',\r\n        't': 12,\r\n        'd': '\u5C07\u6587\u5B57\u5B57\u4E32\u7684\u4E00\u90E8\u5206\u66FF\u63DB\u70BA\u5176\u4ED6\u6587\u5B57\u5B57\u4E32\u3002',\r\n        'a': '\u5C07\u6587\u5B57\u5B57\u4E32\u7684\u4E00\u90E8\u5206\u66FF\u63DB\u70BA\u5176\u4ED6\u6587\u5B57\u5B57\u4E32\u3002',\r\n        'm': [4, 4],\r\n        'p': [{\r\n            'name'   : 'old_text',\r\n            'detail' : '\u8981\u5C0D\u5176\u5C40\u90E8\u9032\u884C\u66FF\u63DB\u64CD\u4F5C\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Spreadsheets\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'start_num',\r\n            'detail' : '\u958B\u59CB\u9032\u884C\u66FF\u63DB\u64CD\u4F5C\u7684\u4F4D\u7F6E\uFF08\u6587\u5B57\u958B\u982D\u4F4D\u7F6E\u70BA1\uFF09\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'num_chars',\r\n            'detail' : '\u8981\u5728\u6587\u5B57\u4E2D\u66FF\u63DB\u7684\u5B57\u5143\u500B\u6578\u3002',\r\n            'example': '6',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'new_text',\r\n            'detail' : '\u8981\u63D2\u5165\u5230\u539F\u6709\u6587\u5B57\u4E2D\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Bed\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'REPT',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u6307\u5B9A\u6587\u5B57\u7684\u591A\u6B21\u91CD\u8907\u3002',\r\n        'a': '\u8FD4\u56DE\u6307\u5B9A\u6587\u5B57\u7684\u591A\u6B21\u91CD\u8907\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u91CD\u8907\u7684\u5B57\u5143\u6216\u5B57\u4E32\u3002',\r\n            'example': '\"ha\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'number_times',\r\n            'detail' : '\u8981\u91CD\u8907\u7684\u6587\u5B57\u8981\u5728\u8FD4\u56DE\u503C\u4E2D\u51FA\u73FE\u7684\u6B21\u6578\u3002\\n\\n\u6700\u5927\u91CD\u8907\u6B21\u6578\u70BA100\u3002\u5373\u4F7F\u91CD\u8907\u6B21\u6578\u5927\u65BC100,REPT\u4E5F\u50C5\u5C07\u76F8\u61C9\u6587\u5B57\u91CD\u8907100\u6B21\u3002',\r\n            'example': '4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'SEARCH',\r\n        't': 12,\r\n        'd': '\u8FD4\u56DE\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u4E0D\u5340\u5206\u5927\u5C0F\u5BEB\uFF09\u3002',\r\n        'a': '\u8FD4\u56DE\u5B57\u4E32\u5728\u6587\u5B57\u4E2D\u9996\u6B21\u51FA\u73FE\u7684\u4F4D\u7F6E\uFF08\u4E0D\u5340\u5206\u5927\u5C0F\u5BEB\uFF09\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'find_text',\r\n            'detail' : '\u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u67E5\u627E\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"n\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'within_text',\r\n            'detail' : '\u8981\u5728\u5176\u4E2D\u8490\u7D22\u8490\u7D22\u5B57\u4E32\u7684\u9996\u6B21\u51FA\u73FE\u4F4D\u7F6E\u7684\u6587\u5B57\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'start_num',\r\n            'detail' : '[\u53EF\u9078-\u9810\u8A2D\u503C\u70BA1 ] - \u8981\u5728\u8981\u8490\u7D22\u7684\u6587\u5B57\u4E2D\u958B\u59CB\u8490\u7D22\u7684\u5B57\u5143\u4F4D\u7F6E\u3002',\r\n            'example': '14',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'SUBSTITUTE',\r\n        't': 12,\r\n        'd': '\u5728\u6587\u5B57\u5B57\u4E32\u4E2D\u7528new_text\u66FF\u63DBold_text\u3002',\r\n        'a': '\u5728\u6587\u5B57\u5B57\u4E32\u4E2D\u7528new_text\u66FF\u63DBold_text\u3002',\r\n        'm': [3, 4],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u9700\u8981\u66FF\u63DB\u5176\u4E2D\u5B57\u5143\u7684\u6587\u5B57,\u6216\u5C0D\u542B\u6709\u6587\u5B57\uFF08\u9700\u8981\u66FF\u63DB\u5176\u4E2D\u5B57\u5143\uFF09\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002',\r\n            'example': '\"search for it\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'old_text',\r\n            'detail' : '\u9700\u8981\u66FF\u63DB\u7684\u6587\u5B57\u3002',\r\n            'example': '\"search for\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'new_text',\r\n            'detail' : '\u7528\u65BC\u66FF\u63DBold_text\u7684\u6587\u5B57\u3002',\r\n            'example': '\"Google\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'instance_num',\r\n            'detail' : '[\u53EF\u9078] - \u6307\u5B9A\u8981\u7528new_text\u66FF\u63DBold_text\u7684\u4E8B\u4EF6\u3002\u5982\u679C\u6307\u5B9A\u4E86instance_num,\u5247\u53EA\u6709\u6EFF\u8DB3\u8981\u6C42\u7684old_text\u88AB\u66FF\u63DB\u3002\u5426\u5247,\u6587\u5B57\u4E2D\u51FA\u73FE\u7684\u6240\u6709old_text\u90FD\u6703\u66F4\u6539\u70BAnew_text\u3002',\r\n            'example': '3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'CLEAN',\r\n        't': 12,\r\n        'd': '\u79FB\u9664\u6587\u5B57\u4E2D\u7684\u4E0D\u53EF\u5217\u5370ASCII\u5B57\u5143\u5F8C\u5C07\u5176\u8FD4\u56DE\u3002',\r\n        'a': '\u79FB\u9664\u6587\u5B57\u4E2D\u7684\u4E0D\u53EF\u5217\u5370ASCII\u5B57\u5143\u5F8C\u5C07\u5176\u8FD4\u56DE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u79FB\u9664\u5176\u4E2D\u4E0D\u53EF\u5217\u5370\u5B57\u5143\u7684\u6587\u5B57\u3002',\r\n            'example': '\"AF\"&amp;CHAR\uFF0831\uFF09',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'TEXT',\r\n        't': 12,\r\n        'd': '\u6309\u7167\u6307\u5B9A\u683C\u5F0F\u5C07\u6578\u4F4D\u8F49\u63DB\u70BA\u6587\u5B57\u3002',\r\n        'a': '\u6309\u7167\u6307\u5B9A\u683C\u5F0F\u5C07\u6578\u4F4D\u8F49\u63DB\u70BA\u6587\u5B57\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8A2D\u5B9A\u683C\u5F0F\u7684\u6578\u4F4D\u3001\u65E5\u671F\u6216\u6642\u9593\u3002',\r\n            'example': '1.23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'format_text',\r\n            'detail' : '\u4EE5\u62EC\u5F27\u62EC\u8D77\u4F86\u7684\u6A21\u5F0F\u4E32,\u5C07\u6309\u8A72\u6A21\u5F0F\u8A2D\u5B9A\u6578\u4F4D\u7684\u683C\u5F0F\u3002\\n\\n0\u8868\u793A\u5728\u6578\u503C\u4F4D\u6578\u5C11\u65BC\u683C\u5F0F\u6307\u5B9A\u7684\u4F4D\u6578\u6642\u5FC5\u5B9A\u4EE5\u96F6\u586B\u5145\u3002\u4F8B\u5982,TEXT\uFF0812.3,\u201C000.00\"\uFF09\u5C07\u8FD4\u56DE012.30\u3002\u7576\u6578\u503C\u7684\u5C0F\u6578\u4F4D\u6578\u8D85\u904E\u6A21\u5F0F\u6307\u5B9A\u7684\u5C0F\u6578\u4F4D\u6578\u6642,\u56DB\u6368\u4E94\u5165\u70BA\u6307\u5B9A\u7684\u5C0F\u6578\u4F4D\u6578\u3002\u4F8B\u5982,TEXT\uFF0812.305,\u201C00.00\"\uFF09\u5C07\u8FD4\u56DE12.31\u3002\\n\\n#\u985E\u4F3C\u65BC0,\u4F46\u4E26\u4E0D\u662F\u5728\u5C0F\u6578\u9EDE\u7684\u5169\u5074\u90FD\u4EE5\u96F6\u586B\u5145\u3002\u4F8B\u5982,TEXT\uFF0812.3,\u201C###.##\"\uFF09\u5C07\u8FD4\u56DE12.3\u3002',\r\n            'example': '\"$0.00\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'TRIM',\r\n        't': 12,\r\n        'd': '\u5220\u9664\u6307\u5B9A\u5B57\u4E32\u524D\u5F8C\u7684\u7A7A\u683C\u3002',\r\n        'a': '\u5220\u9664\u6307\u5B9A\u5B57\u4E32\u524D\u5F8C\u7684\u7A7A\u683C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u4FEE\u526A\u7684\u5B57\u4E32\u6216\u6307\u5411\u5305\u542B\u8A72\u5B57\u4E32\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002',\r\n            'example': '\"lorem ipsum\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n                }]\r\n            }, {\r\n        'n': 'VALUE',\r\n        't': 12,\r\n        'd': '\u5C07\u53EF\u8B58\u5225\u7684\u4EFB\u4F55\u65E5\u671F\u3001\u6642\u9593\u6216\u6578\u4F4D\u683C\u5F0F\u7684\u5B57\u4E32\u8F49\u63DB\u70BA\u6578\u4F4D\u3002',\r\n        'a': '\u5C07\u53EF\u8B58\u5225\u7684\u4EFB\u4F55\u65E5\u671F\u3001\u6642\u9593\u6216\u6578\u4F4D\u683C\u5F0F\u7684\u5B57\u4E32\u8F49\u63DB\u70BA\u6578\u4F4D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u5305\u542B\u8981\u8F49\u63DB\u7684\u503C\u7684\u5B57\u4E32\u3002',\r\n            'example': '\"123\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n                }]\r\n            }, {\r\n        'n': 'PROPER',\r\n        't': 12,\r\n        'd': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u6BCF\u500B\u55AE\u8A5E\u7684\u9996\u5B57\u6BCD\u8F49\u70BA\u5927\u5BEB\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u5B57\u4E32\u4E2D\u6BCF\u500B\u55AE\u8A5E\u7684\u9996\u5B57\u6BCD\u8F49\u70BA\u5927\u5BEB\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'text',\r\n            'detail' : '\u8981\u8F49\u63DB\u7684\u6587\u5B57,\u5176\u4E2D\u6BCF\u500B\u55AE\u8A5E\u7684\u9996\u5B57\u6BCD\u90FD\u5C07\u8F49\u70BA\u5927\u5BEB,\u6240\u6709\u5176\u4ED6\u5B57\u6BCD\u5247\u8F49\u70BA\u5C0F\u5BEB\u3002',\r\n            'example': '\"united states\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n                }]\r\n    }, {\r\n        'n': 'CONVERT',\r\n        't': 13,\r\n        'd': '\u5C07\u6578\u4F4D\u5F9E\u4E00\u7A2E\u5EA6\u91CF\u7CFB\u7D71\u8F49\u63DB\u70BA\u53E6\u4E00\u7A2E\u5EA6\u91CF\u7CFB\u7D71\u3002',\r\n        'a': '\u5C07\u6578\u4F4D\u5F9E\u4E00\u7A2E\u5EA6\u91CF\u7CFB\u7D71\u8F49\u63DB\u70BA\u53E6\u4E00\u7A2E\u5EA6\u91CF\u7CFB\u7D71\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'number',\r\n            'detail' : '\u662F\u4EE5from_unit\u70BA\u7D44\u7E54\u7684\u9700\u8981\u9032\u884C\u8F49\u63DB\u7684\u6578\u503C\u3002',\r\n            'example': '5.1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'from_unit',\r\n            'detail' : '\u662F\u6578\u503C\u7684\u7D44\u7E54\u3002',\r\n            'example': '\"g\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'to_unit',\r\n            'detail' : '\u662F\u7D50\u679C\u7684\u7D44\u7E54\u3002',\r\n            'example': '\"kg\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'SUMX2MY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u7684\u5E73\u65B9\u5DEE\u4E4B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u7684\u5E73\u65B9\u5DEE\u4E4B\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array_x',\r\n            'detail' : '\u7B2C\u4E00\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'array_y',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'SUMX2PY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u7684\u5E73\u65B9\u548C\u4E4B\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u7684\u5E73\u65B9\u548C\u4E4B\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array_x',\r\n            'detail' : '\u7B2C\u4E00\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'array_y',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'SUMXMY2',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u4E4B\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u6578\u7D44\u4E2D\u5C0D\u61C9\u6578\u503C\u4E4B\u5DEE\u7684\u5E73\u65B9\u548C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array_x',\r\n            'detail' : '\u7B2C\u4E00\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'A2:A100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'array_y',\r\n            'detail' : '\u7B2C\u4E8C\u500B\u6578\u7D44\u6216\u6578\u503C\u5340\u57DF\u3002',\r\n            'example': 'B2:B100',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'TRANSPOSE',\r\n        't': 14,\r\n        'd': '\u5C07\u6578\u7D44\u6216\u5132\u5B58\u683C\u7BC4\u570D\u7684\u884C\u5217\u8F49\u7F6E\u3002',\r\n        'a': '\u5C07\u6578\u7D44\u6216\u5132\u5B58\u683C\u7BC4\u570D\u7684\u884C\u5217\u8F49\u7F6E\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u5C07\u5176\u884C\u5217\u4E92\u63DB\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': '{1,2}',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'TREND',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u7DDA\u6027\u8DA8\u52E2\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u7DDA\u6027\u8DA8\u52E2\u503C\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'known_y',\r\n            'detail' : '\u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b \u4E2D\u5DF2\u77E5\u7684y\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D,\u5247known_x\u7684\u7DAD\u6578\u5FC5\u9808\u8207\u4E4B\u76F8\u540C,\u6216\u8005\u7701\u7565\u6B64\u53C3\u6578\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'known_x',\r\n            'detail' : '[\u53EF\u9078-\u9ED8\u8A8D\u8A72\u6578\u7D44\u70BA{1,2,3,\u2026},\u5176\u5927\u5C0F\u8207known_y\u76F8\u540C] -\u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b \u4E2D\u5DF2\u77E5\u7684\u53EF\u9078x\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'new_x',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u8207known_x\u76F8\u540C] - \u9700\u8981\u51FD\u6578TREND\u8FD4\u56DE\u5C0D\u61C9y\u503C\u7684\u65B0x\u503C\u3002',\r\n            'example': 'A11:A13',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'const',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u5C07\u5E38\u6578b\u5F37\u5236\u8A2D\u70BA0\u3002\\n\\nTRUE\uFF08\uFF09\u8868\u793Ab\u5C07\u6309\u6B63\u5E38\u8A08\u7B97\uFF1B\\n\\nFALSE\uFF08\uFF09\u8868\u793Ab\u5C07\u88AB\u8A2D\u70BA0\uFF08\u96F6\uFF09,m \u5C07\u88AB\u8ABF\u6574\u4EE5\u4F7Fy = mx\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'FREQUENCY',\r\n        't': 14,\r\n        'd': '\u8A08\u7B97\u6578\u503C\u5728\u67D0\u500B\u5340\u57DF\u5167\u7684\u51FA\u73FE\u983B\u7387,\u7136\u5F8C\u8FD4\u56DE\u4E00\u500B\u5782\u76F4\u6578\u7D44\u3002',\r\n        'a': '\u8A08\u7B97\u6578\u503C\u5728\u67D0\u500B\u5340\u57DF\u5167\u7684\u51FA\u73FE\u983B\u7387,\u7136\u5F8C\u8FD4\u56DE\u4E00\u500B\u5782\u76F4\u6578\u7D44\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'data_array',\r\n            'detail' : '\u8981\u5C0D\u5176\u983B\u7387\u9032\u884C\u8A08\u6578\u7684\u4E00\u7D44\u6578\u503C\u6216\u5C0D\u9019\u7D44\u6578\u503C\u7684\u5F15\u7528\u3002',\r\n            'example': 'A2:A40',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'bins_array',\r\n            'detail' : '\u8981\u5C07data_array\u4E2D\u7684\u503C\u63D2\u5165\u5230\u7684\u9593\u9694\u6578\u7D44\u6216\u5C0D\u9593\u9694\u7684\u5F15\u7528\u3002\\n\\n\u70BA\u6E05\u6670\u8D77\u898B,\u61C9\u5C07\u985E\u5225\u6392\u5E8F,\u4F46\u5982\u679C\u672A\u6392\u5E8F,FREQUENCY\u6703\u5728\u5167\u90E8\u5C0D\u9019\u4E9B\u6307\u5B9A\u7684\u503C\u9032\u884C\u6392\u5E8F\u4E26\u8FD4\u56DE\u6B63\u78BA\u7D50\u679C\u3002',\r\n            'example': 'B2:B5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'GROWTH',\r\n        't': 14,\r\n        'd': '\u4F7F\u7528\u73FE\u6709\u6578\u64DA\u8A08\u7B97\u9810\u6E2C\u7684\u6307\u6578\u7B49\u6BD4\u3002',\r\n        'a': '\u4F7F\u7528\u73FE\u6709\u6578\u64DA\u8A08\u7B97\u9810\u6E2C\u7684\u6307\u6578\u7B49\u6BD4\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'known_y',\r\n            'detail' : '\u95DC\u4FC2\u904B\u7B97\u5F0Fy = b*m^x \u4E2D\u5DF2\u77E5\u7684y\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6578\u64DA_y\u70BA\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D,\u5247\u5DF2\u77E5\u6578\u64DA_x\u7684\u7DAD\u6578\u5FC5\u9808\u8207\u4E4B\u76F8\u540C,\u6216\u8005\u7701\u7565\u6B64\u53C3\u6578\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6578\u64DA_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,\u5DF2\u77E5\u6578\u64DA_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679C\u5DF2\u77E5\u6578\u64DA_y\u70BA\u55AE\u884C,\u5247\u5C07\u5DF2\u77E5\u6578\u64DA_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BC\u5DF2\u77E5\u6578\u64DA_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'known_x',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u8A72\u6578\u7D44\u70BA{1,2,3,\u2026},\u5176\u5927\u5C0F\u8207known_y\u76F8\u540C] - \u95DC\u4FC2\u904B\u7B97\u5F0Fy = b*m^x \u4E2D\u5DF2\u77E5\u7684\u53EF\u9078x\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679C\u5DF2\u77E5\u6578\u64DA_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,\u5DF2\u77E5\u6578\u64DA_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679C\u5DF2\u77E5\u6578\u64DA_y\u70BA\u55AE\u884C,\u5247\u5C07\u5DF2\u77E5\u6578\u64DA_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BC\u5DF2\u77E5\u6578\u64DA_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'new_x',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u8207known_x\u76F8\u540C] - \u9700\u8981\u51FD\u6578GROWTH\u8FD4\u56DE\u5C0D\u61C9y\u503C\u7684\u65B0x\u503C\u3002',\r\n            'example': 'A11:A13',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'const',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u5C07\u5E38\u6578b\u5F37\u5236\u8A2D\u70BA1\u3002\\n\\nTRUE\uFF08\uFF09\u8868\u793Ab\u5C07\u6309\u6B63\u5E38\u8A08\u7B97\uFF1B\\n\\nFALSE\uFF08\uFF09\u8868\u793Ab\u5C07\u88AB\u8A2D\u70BA1,m\u5C07\u88AB\u8ABF\u6574\u4EE5\u4F7Fy = m^x\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'LINEST',\r\n        't': 14,\r\n        'd': '\u53EF\u901A\u904E\u4F7F\u7528\u6700\u5C0F\u4E8C\u4E58\u6CD5\u8A08\u7B97\u8207\u73FE\u6709\u6578\u64DA\u6700\u4F73\u64EC\u5408\u7684\u76F4\u7DDA,\u4F86\u8A08\u7B97\u67D0\u76F4\u7DDA\u7684\u7D71\u8A08\u503C,\u7136\u5F8C\u8FD4\u56DE\u63CF\u8FF0\u6B64\u76F4\u7DDA\u7684\u6578\u7D44\u3002',\r\n        'a': '\u53EF\u901A\u904E\u4F7F\u7528\u6700\u5C0F\u4E8C\u4E58\u6CD5\u8A08\u7B97\u8207\u73FE\u6709\u6578\u64DA\u6700\u4F73\u64EC\u5408\u7684\u76F4\u7DDA,\u4F86\u8A08\u7B97\u67D0\u76F4\u7DDA\u7684\u7D71\u8A08\u503C,\u7136\u5F8C\u8FD4\u56DE\u63CF\u8FF0\u6B64\u76F4\u7DDA\u7684\u6578\u7D44\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'known_y',\r\n            'detail' : '\u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b \u4E2D\u5DF2\u77E5\u7684y\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D,\u5247known_x\u7684\u7DAD\u6578\u5FC5\u9808\u8207\u4E4B\u76F8\u540C,\u6216\u8005\u7701\u7565\u6B64\u53C3\u6578\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'known_x',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u8A72\u6578\u7D44\u70BA{1,2,3,\u2026},\u5176\u5927\u5C0F\u8207known_y\u76F8\u540C] - \u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b\u4E2D\u5DF2\u77E5\u7684\u53EF\u9078x\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'const',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u5C07\u5E38\u6578b\u5F37\u5236\u8A2D\u70BA0\u3002\\n\\nTRUE\uFF08\uFF09\u8868\u793Ab\u5C07\u6309\u6B63\u5E38\u8A08\u7B97\uFF1B\\n\\nFALSE\uFF08\uFF09\u8868\u793Ab\u5C07\u88AB\u8A2D\u70BA0\uFF08\u96F6\uFF09,m\u5C07\u88AB\u8ABF\u6574\u4EE5\u4F7Fy = mx\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'stats',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BAFALSE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u8FD4\u56DE\u9644\u52A0\u56DE\u6B78\u7D71\u8A08\u503C\u3002\\n\\n\u5982\u679C\u8A73\u7D30\u70BATRUE,\u9664\u4E86\u5C0D\u61C9\u65BC\u6BCF\u500B\u5F15\u6578\u7684\u4E00\u7D44\u7DDA\u6027\u4FC2\u6578\u548Cy\u622A\u8DDD\u4E4B\u5916,LINEST\u9084\u8FD4\u56DE\u4EE5\u4E0B\u8CC7\u8A0A:\\n\\n\u6BCF\u9805\u4FC2\u6578\u548C\u622A\u8DDD\u7684\u6A19\u6E96\u8AA4\u5DEE\u3001\\n\\n\u9650\u5B9A\u4FC2\u6578\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,1\u8868\u793A\u5B8C\u5168\u76F8\u95DC\uFF09\u3001\\n\\n\u56E0\u8B8A\u6578\u503C\u7684\u6A19\u51C6\u8AA4\u5DEE\u3001\\n\\nF\u7D71\u8A08\u6216F\u89C0\u6E2C\u503C,\u8A13\u793A\u6240\u89C0\u6E2C\u5230\u7684\u56E0\u8B8A\u6578\u548C\u5F15\u6578\u8B8A\u6578\u4E4B\u9593\u7684\u95DC\u4FC2\u662F\u96A8\u6A5F\u7684\u9084\u662F\u7DDA\u6027\u7684\u3001\\n\\n\u81EA\u7531\u5EA6,\u7528\u65BC\u5728\u53C3\u7167\u9336\u4E2D\u67E5\u627EF\u7D71\u8A08\u503C\u4EE5\u4F30\u7B97\u53EF\u4FE1\u5EA6\u3001\\n\\n\u56DE\u6B78\u5E73\u65B9\u548C,\u4EE5\u53CA\\n\\n\u6B98\u5DEE\u5E73\u65B9\u548C\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'LOGEST',\r\n        't': 14,\r\n        'd': '\u5728\u56DE\u6B78\u5206\u6790\u4E2D,\u8A08\u7B97\u6700\u7B26\u5408\u6578\u64DA\u7684\u6307\u6578\u56DE\u6B78\u64EC\u5408\u66F2\u7DDA,\u4E26\u8FD4\u56DE\u63CF\u8FF0\u8A72\u66F2\u7DDA\u7684\u6578\u503C\u6578\u7D44\u3002',\r\n        'a': '\u5728\u56DE\u6B78\u5206\u6790\u4E2D,\u8A08\u7B97\u6700\u7B26\u5408\u6578\u64DA\u7684\u6307\u6578\u56DE\u6B78\u64EC\u5408\u66F2\u7DDA,\u4E26\u8FD4\u56DE\u63CF\u8FF0\u8A72\u66F2\u7DDA\u7684\u6578\u503C\u6578\u7D44\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'known_y',\r\n            'detail' : '\u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b \u4E2D\u5DF2\u77E5\u7684y\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D,\u5247known_x\u7684\u7DAD\u6578\u5FC5\u9808\u8207\u4E4B\u76F8\u540C,\u6216\u8005\u7701\u7565\u6B64\u53C3\u6578\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'B2:B10',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'known_x',\r\n            'detail' : '[\u53EF\u9078 - \u9ED8\u8A8D\u8A72\u6578\u7D44\u70BA{1,2,3,\u2026},\u5176\u5927\u5C0F\u8207known_y\u76F8\u540C] - \u95DC\u4FC2\u904B\u7B97\u5F0Fy = mx + b\u4E2D\u5DF2\u77E5\u7684\u53EF\u9078x\u503C\u96C6\u5408\u3002\\n\\n\u5982\u679Cknown_y\u70BA\u4E00\u7DAD\u6578\u7D44\u6216\u7BC4\u570D,known_x\u5247\u53EF\u4EE3\u8868\u4E8C\u7DAD\u9663\u5217\u6216\u7BC4\u570D\u4E2D\u7684\u591A\u500B\u5F15\u6578\u3002\u4E5F\u5C31\u662F\u8AAA,\u5982\u679Cknown_y\u70BA\u55AE\u884C,\u5247\u5C07known_x\u4E2D\u7684\u6BCF\u884C\u89E3\u91CB\u70BA\u5404\u81EA\u7368\u7ACB\u7684\u503C,\u985E\u4F3C\u60C5\u51B5\u4E5F\u9069\u7528\u65BCknown_y\u70BA\u55AE\u5217\u7684\u60C5\u51B5\u3002',\r\n            'example': 'A2:A10',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'const',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BATRUE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u5C07\u5E38\u6578b\u5F37\u5236\u8A2D\u70BA0\u3002\\n\\nTRUE\uFF08\uFF09\u8868\u793Ab\u5C07\u6309\u6B63\u5E38\u8A08\u7B97\uFF1B\\n\\nFALSE\uFF08\uFF09\u8868\u793Ab\u5C07\u88AB\u8A2D\u70BA0\uFF08\u96F6\uFF09,m\u5C07\u88AB\u8ABF\u6574\u4EE5\u4F7Fy = mx\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'stats',\r\n            'detail' : '[\u53EF\u9078 - \u9810\u8A2D\u503C\u70BAFALSE\uFF08\uFF09] - \u4E00\u500B\u908F\u8F2F\u503C,\u7528\u65BC\u6307\u5B9A\u662F\u5426\u8FD4\u56DE\u9644\u52A0\u56DE\u6B78\u7D71\u8A08\u503C\u3002\\n\\n\u5982\u679C\u8A73\u7D30\u70BATRUE,\u5247\u9664\u4E86\u70BA\u6BCF\u500B\u5F15\u6578\u548C\u4FC2\u6578b\u8FD4\u56DE\u4E00\u7D44\u6307\u6578\u503C\u4E4B\u5916,LOGEST\u9084\u5C07\u8FD4\u56DE\u4EE5\u4E0B\u6578\u64DA:\\n\\n\u6BCF\u9805\u6307\u6578\u548C\u4FC2\u6578\u7684\u6A19\u6E96\u8AA4\u5DEE\u3001\\n\\n\u9650\u5B9A\u4FC2\u6578\uFF08\u4ECB\u65BC0\u548C1\u4E4B\u9593,1\u8868\u793A\u5B8C\u5168\u76F8\u95DC\uFF09\u3001\\n\\n\u56E0\u8B8A\u6578\u503C\u7684\u6A19\u51C6\u8AA4\u5DEE\u3001\\n\\nF\u7D71\u8A08\u6216F\u89C0\u6E2C\u503C,\u8A13\u793A\u6240\u89C0\u6E2C\u5230\u7684\u56E0\u8B8A\u6578\u548C\u5F15\u6578\u4E4B\u9593\u7684\u95DC\u4FC2\u662F\u96A8\u6A5F\u7684\u9084\u662F\u6307\u6578\u7684\u3001\\n\\n\u81EA\u7531\u5EA6-\u7528\u65BC\u5728\u53C3\u7167\u9336\u4E2D\u67E5\u627EF\u7D71\u8A08\u503C\u4EE5\u4F30\u7B97\u53EF\u4FE1\u5EA6\u3001\\n\\n\u56DE\u6B78\u5E73\u65B9\u548C,\u4EE5\u53CA\\n\\n\u6B98\u5DEE\u5E73\u65B9\u548C\u3002',\r\n            'example': 'TRUE\uFF08\uFF09',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'MDETERM',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u4E00\u500B\u6578\u7D44\u7684\u77E9\u9663\u884C\u5217\u5F0F\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u4E00\u500B\u6578\u7D44\u7684\u77E9\u9663\u884C\u5217\u5F0F\u7684\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u884C\u6578\u548C\u5217\u6578\u76F8\u7B49\u7684\u6578\u503C\u6578\u7D44\u3002',\r\n            'example': 'A1:D4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'MINVERSE',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u6578\u7D44\u4E2D\u5B58\u5132\u7684\u77E9\u9663\u7684\u9006\u77E9\u9663\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u7D44\u4E2D\u5B58\u5132\u7684\u77E9\u9663\u7684\u9006\u77E9\u9663\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u884C\u6578\u548C\u5217\u6578\u76F8\u7B49\u7684\u6578\u503C\u6578\u7D44\u3002',\r\n            'example': 'A1:D4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'MMULT',\r\n        't': 14,\r\n        'd': '\u8FD4\u56DE\u5169\u500B\u6578\u7D44\u7684\u77E9\u9663\u4E58\u7A4D\u3002\u7D50\u679C\u77E9\u9663\u7684\u884C\u6578\u8207array1\u7684\u884C\u6578\u76F8\u540C,\u77E9\u9663\u7684\u5217\u6578\u8207array2\u7684\u5217\u6578\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u5169\u500B\u6578\u7D44\u7684\u77E9\u9663\u4E58\u7A4D\u3002\u7D50\u679C\u77E9\u9663\u7684\u884C\u6578\u8207array1\u7684\u884C\u6578\u76F8\u540C,\u77E9\u9663\u7684\u5217\u6578\u8207array2\u7684\u5217\u6578\u76F8\u540C\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'array1',\r\n            'detail' : '\u8981\u9032\u884C\u77E9\u9663\u4E58\u6CD5\u904B\u7B97\u7684\u7B2C\u4E00\u500B\u77E9\u9663\u6578\u7D44\u3002\\n\\narray1\u5217\u6578\u5FC5\u9808\u8207array2\u7684\u884C\u6578\u76F8\u540C',\r\n            'example': 'A1:B3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'array2',\r\n            'detail' : '\u8981\u9032\u884C\u77E9\u9663\u4E58\u6CD5\u904B\u7B97\u7684\u7B2C\u4E8C\u500B\u77E9\u9663\u6578\u7D44\u3002\\n\\narray2\u7684\u884C\u6578\u5FC5\u9808\u8207array1\u5217\u6578\u76F8\u540C',\r\n            'example': 'C1:F2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'SUMPRODUCT',\r\n        't': 14,\r\n        'd': '\u5728\u7D66\u5B9A\u7684\u5E7E\u7D44\u6578\u7D44\u4E2D,\u5C07\u6578\u7D44\u9593\u5C0D\u61C9\u7684\u5143\u7D20\u76F8\u4E58,\u4E26\u8FD4\u56DE\u4E58\u7A4D\u4E4B\u548C\u3002',\r\n        'a': '\u5728\u7D66\u5B9A\u7684\u5E7E\u7D44\u6578\u7D44\u4E2D,\u5C07\u6578\u7D44\u9593\u5C0D\u61C9\u7684\u5143\u7D20\u76F8\u4E58,\u4E26\u8FD4\u56DE\u4E58\u7A4D\u4E4B\u548C\u3002',\r\n        'm': [1, 255],\r\n        'p': [{\r\n            'name'   : 'array1',\r\n            'detail' : '\u5176\u76F8\u61C9\u5143\u7D20\u9700\u8981\u9032\u884C\u76F8\u4E58\u4E26\u6C42\u548C\u7684\u7B2C\u4E00\u500B\u6578\u7D44\u53C3\u6578\u3002',\r\n            'example': 'A2:C5',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }, {\r\n            'name'   : 'array2',\r\n            'detail' : '[\u53EF\u9078] - \u5176\u76F8\u61C9\u5143\u7D20\u9700\u8981\u9032\u884C\u76F8\u4E58\u4E26\u6C42\u548C\u7684\u5176\u5B83\u6578\u7D44\u53C3\u6578\u3002',\r\n            'example': 'D2:F5',\r\n            'require': 'o',\r\n            'repeat' : 'y',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'ISFORMULA',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u516C\u5F0F\u662F\u5426\u4F4D\u65BC\u5F15\u7528\u7684\u5132\u5B58\u683C\u4E2D\u3002',\r\n        'a': '\u6AA2\u67E5\u516C\u5F0F\u662F\u5426\u4F4D\u65BC\u5F15\u7528\u7684\u5132\u5B58\u683C\u4E2D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'cell',\r\n            'detail' : '\u8981\u6AA2\u67E5\u662F\u5426\u5B58\u5728\u516C\u5F0F\u7684\u5132\u5B58\u683C\u3002\\n\\n\u5982\u679C cell \u70BA\u5305\u542B\u516C\u5F0F\u7684\u5132\u5B58\u683C,\u5247 ISFORMULA \u5C07\u8FD4\u56DETRUE\u3002\u5982\u679C cell \u70BA\u76F8\u61C9\u5132\u5B58\u683C\u7BC4\u570D,\u5247\u7576\u8A72\u7BC4\u570D\u5167\u7684\u9996\u500B\u5132\u5B58\u683C\u5305\u542B\u516C\u5F0F\u6642,\u7CFB\u7D71\u6703\u8FD4\u56DETRUE\u3002\u5982\u679C\u662F\u4EFB\u4F55\u5176\u4ED6\u503C,\u7CFB\u7D71\u90FD\u5C07\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'CELL',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u6709\u95DC\u5132\u5B58\u683C\u7684\u683C\u5F0F\u3001\u4F4D\u7F6E\u6216\u5167\u5BB9\u7684\u8CC7\u8A0A\u3002',\r\n        'a': '\u8FD4\u56DE\u6709\u95DC\u5132\u5B58\u683C\u7684\u683C\u5F0F\u3001\u4F4D\u7F6E\u6216\u5167\u5BB9\u7684\u8CC7\u8A0A\u3002',\r\n        'm': [2, 2],\r\n        'p': [{\r\n            'name'   : 'info_type',\r\n            'detail' : '\u4E00\u500B\u6587\u5B57\u503C,\u6307\u5B9A\u8981\u8FD4\u56DE\u7684\u5132\u5B58\u683C\u8CC7\u8A0A\u7684\u985E\u578B\u3002',\r\n            'example': '\"type\"',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'reference',\r\n            'detail' : '\u9700\u8981\u5176\u76F8\u95DC\u8CC7\u8A0A\u7684\u5132\u5B58\u683C\u3002',\r\n            'example': 'C2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'NA',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u932F\u8AA4\u503C#N/A\u3002',\r\n        'a': '\u8FD4\u56DE\u932F\u8AA4\u503C#N/A\u3002',\r\n        'm': [0, 0],\r\n        'p': []\r\n    }, {\r\n        'n': 'ERROR_TYPE',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u8207\u5176\u4ED6\u5132\u5B58\u683C\u4E2D\u7684\u932F\u8AA4\u503C\u76F8\u5C0D\u61C9\u7684\u6578\u4F4D\u3002',\r\n        'a': '\u8FD4\u56DE\u8207\u5176\u4ED6\u5132\u5B58\u683C\u4E2D\u7684\u932F\u8AA4\u503C\u76F8\u5C0D\u61C9\u7684\u6578\u4F4D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'error_val',\r\n            'detail' : '\u7528\u65BC\u67E5\u627E\u932F\u8AA4\u865F\u7684\u5132\u5B58\u683C,\u96D6\u7136\u60A8\u4E5F\u53EF\u4EE5\u76F4\u63A5\u63D0\u4F9B\u932F\u8AA4\u503C\u3002',\r\n            'example': 'A3',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISBLANK',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u6240\u5F15\u7528\u7684\u5132\u5B58\u683C\u662F\u5426\u70BA\u7A7A\u3002',\r\n        'a': '\u6AA2\u67E5\u6240\u5F15\u7528\u7684\u5132\u5B58\u683C\u662F\u5426\u70BA\u7A7A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u5C0D\u8981\u6AA2\u67E5\u5176\u662F\u5426\u70BA\u7A7A\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528\u3002\\n\\n\u5982\u679C\u662F\u7A7A\u5132\u5B58\u683C,\u5247TRUE\uFF1B\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'ISERR',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA#N/A\u4EE5\u5916\u7684\u932F\u8AA4\u503C\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA#N/A\u4EE5\u5916\u7684\u932F\u8AA4\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA#N/A\u4EE5\u5916\u7684\u932F\u8AA4\u985E\u578B\u7684\u503C\u3002\\n\\n\u5982\u679C\u503C\u662F\u9664#N/A\u4E4B\u5916\u7684\u4EFB\u4F55\u932F\u8AA4\uFF08\u5305\u62EC#DIV/0\uFF01\u3001#NAME\uFF1F\u3001#NULL\uFF01\u3001#NUM\uFF01\u3001#VALUE\uFF01\u548C#REF\uFF01\uFF09,ISERR\u5C07\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISERROR',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u932F\u8AA4\u503C\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u932F\u8AA4\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u932F\u8AA4\u985E\u578B\u7684\u503C\u3002\\n\\n\u53EA\u8981\u503C\u662F\u67D0\u7A2E\u932F\u8AA4\u503C\uFF08\u5305\u62EC#DIV/0\uFF01\u3001#N/A\u3001#NAME\uFF1F\u3001#NULL\uFF01\u3001#NUM\uFF01\u3001#VALUE\uFF01\u548C#REF\uFF01\uFF09,ISERROR\u5C31\u6703\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISLOGICAL',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662FTRUE\u9084\u662FFALSE\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662FTRUE\u9084\u662FFALSE\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u70BA\u908F\u8F2F TRUE \u9084\u662F\u908F\u8F2F FALSE \u7684\u503C\u3002\\n\\n*\u5982\u679C\u503C\u70BATRUE\u6216FALSE,\u6216\u70BA\u6307\u5411\u503C\u70BATRUE\u6216FALSE\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,ISLOGICAL\u5C07\u8FD4\u56DETRUE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISNA',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u932F\u8AA4\u503C#N/A\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u932F\u8AA4\u503C#N/A\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8207\u932F\u8AA4\u503C#N/A\u9032\u884C\u6BD4\u8F03\u7684\u503C\u3002\\n\\n*\u5982\u679C\u503C\u70BA#N/A\u6216\u6307\u5411\u5305\u542B#N/A\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247ISNA\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'ISNONTEXT',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u975E\u6587\u5B57\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u975E\u6587\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u6AA2\u67E5\u7684\u6587\u5B57\u3002\\n\\n*\u5982\u679C\u53C3\u6578\u70BA\u6587\u5B57\u503C\u6216\u6307\u5411\u5305\u542B\u6587\u5B57\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,ISNONTEXT\u5C07\u8FD4\u56DEFALSE,\u5426\u5247\u8FD4\u56DETRUE\u3002\\n\\n\u7576\u503C\u70BA\u6307\u5411\u7A7A\u5132\u5B58\u683C\u7684\u5F15\u7528\u6642,ISNONTEXT\u6703\u8FD4\u56DETRUE\u3002\\n\\n\u7576\u503C\u70BA\u7A7A\u5B57\u4E32\u6642,ISNONTEXT\u5C07\u8FD4\u56DEFALSE,\u56E0\u70BA\u7A7A\u4E32\u88AB\u8996\u4F5C\u6587\u5B57\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISNUMBER',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6578\u4F4D\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6578\u4F4D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u6578\u4F4D\u7684\u503C\u3002\\n\\n*\u5982\u679C\u53C3\u6578\u70BA\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u4F4D\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,ISNUMBER\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'ISREF',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6709\u6548\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6709\u6548\u7684\u5132\u5B58\u683C\u5F15\u7528\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u5132\u5B58\u683C\u5F15\u7528\u7684\u503C\u3002\\n\\n*\u5982\u679C\u53C3\u6578\u662F\u6709\u6548\u7684\u5132\u5B58\u683C\u5F15\u7528,ISREF\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'ISTEXT',\r\n        't': 15,\r\n        'd': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6587\u5B57\u3002',\r\n        'a': '\u6AA2\u67E5\u67D0\u500B\u503C\u662F\u5426\u70BA\u6587\u5B57\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u9A57\u8B49\u5176\u662F\u5426\u70BA\u6587\u5B57\u7684\u503C\u3002\\n\\n\u5982\u679C\u53C3\u6578\u70BA\u6587\u5B57\u503C\u6216\u6307\u5411\u5305\u542B\u6587\u5B57\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,ISTEXT\u5C07\u8FD4\u56DETRUE,\u5426\u5247\u8FD4\u56DEFALSE\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'TYPE',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u6578\u503C\u7684\u985E\u578B\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u503C\u7684\u985E\u578B\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u78BA\u5B9A\u5176\u985E\u578B\u7684\u6578\u64DA\u3002\\n\\n\u6578\u4F4D\u8FD4\u56DE1\uFF1B\\n\\n\u6587\u5B57\u8FD4\u56DE2\uFF1B\\n\\n\u908F\u8F2F\u503C\u8FD4\u56DE4\uFF1B\\n\\n\u932F\u8AA4\u503C\u8FD4\u56DE16\uFF1B\\n\\n\u6578\u7D44\u8FD4\u56DE64\uFF1B',\r\n            'example': 'C4',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'N',\r\n        't': 15,\r\n        'd': '\u8FD4\u56DE\u8F49\u5316\u70BA\u6578\u503C\u5F8C\u7684\u503C\u3002',\r\n        'a': '\u8FD4\u56DE\u8F49\u5316\u70BA\u6578\u503C\u5F8C\u7684\u503C\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u6578\u4F4D\u7684\u53C3\u6578\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6578\u4F4D,\u5247\u8FD4\u56DE\u8A72\u6578\u4F4D\u3002\\n\\n\u5982\u679C\u503C\u70BA\u65E5\u671F,\u5247\u8FD4\u56DE\u8A72\u65E5\u671F\u7684\u5E8F\u865F\u3002\\n\\n\u5982\u679C\u503C\u70BATRUE,\u5247\u8FD4\u56DE1\u3002\\n\\n\u5982\u679C\u503C\u70BAFALSE,\u5247\u8FD4\u56DE0\u3002\\n\\n\u5982\u679C\u503C\u70BA\u932F\u8AA4\u503C,\u5247\u8FD4\u56DE\u932F\u8AA4\u503C\u3002\\n\\n\u5982\u679C\u503C\u70BA\u5176\u4ED6\u503C,\u5247\u8FD4\u56DE0\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n    }, {\r\n        'n': 'TO_DATE',\r\n        't': 16,\r\n        'd': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u65E5\u671F\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u65E5\u671F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u65E5\u671F\u7684\u53C3\u6578\u6216\u5176\u5132\u5B58\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,TO_DATE\u6703\u5C07\u503C\u8F49\u63DB\u70BA\u76F8\u61C9\u7684\u65E5\u671F\u4E26\u8FD4\u56DE,\u503C\u4EE3\u8868\u5F9E\u5341\u4E8C\u670830\u65E5\u5230\u5C0D\u61C9\u7684\u65E5\u671F\u4E4B\u9593\u7684\u5929\u6578,\\n\\n\u8CA0\u503C\u8868\u793A\u5C0D\u61C9\u7684\u65E5\u671F\u5728\u5341\u4E8C\u670830\u65E5\u4E4B\u524D,\u800C\u5C0F\u6578\u503C\u5247\u4EE3\u8868\u4E00\u5929\u4E2D\u5F9E\u5348\u591C\u7B97\u8D77\u7684\u6642\u9593\u3002\\n\u5982\u679C\u503C\u4E0D\u662F\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247TO_DATE\u5C07\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '25405',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'TO_PURE_NUMBER',\r\n        't': 16,\r\n        'd': '\u5C07\u7D66\u5B9A\u7684\u65E5\u671F/\u6642\u9593\u3001\u767E\u5206\u6BD4\u3001\u8CA8\u5E63\u91D1\u984D\u6216\u5176\u4ED6\u683C\u5F0F\u7684\u6578\u503C\u8F49\u63DB\u70BA\u4E0D\u5E36\u683C\u5F0F\u7684\u7D14\u6578\u4F4D\u3002',\r\n        'a': '\u5C07\u7D66\u5B9A\u7684\u65E5\u671F/\u6642\u9593\u3001\u767E\u5206\u6BD4\u3001\u8CA8\u5E63\u91D1\u984D\u6216\u5176\u4ED6\u683C\u5F0F\u7684\u6578\u503C\u8F49\u63DB\u70BA\u4E0D\u5E36\u683C\u5F0F\u7684\u7D14\u6578\u4F4D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u7D14\u6578\u4F4D\u7684\u53C3\u6578\u6216\u5176\u5132\u5B58\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6578\u4F4D\u6216\u6307\u5411\u5305\u542B\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,TO_PURE_NUMBER\u5C07\u4EE5\u4E0D\u5E36\u4EFB\u4F55\u683C\u5F0F\u8207\u89E3\u91CB\u7684\u5F62\u5F0F\u8FD4\u56DE\u503C\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247TO_PERCENT\u5C07\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '50%',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'TO_TEXT',\r\n        't': 16,\r\n        'd': '\u5C07\u7D66\u5B9A\u7684\u6578\u4F4D\u503C\u8F49\u63DB\u70BA\u6587\u672C\u683C\u5F0F\u3002',\r\n        'a': '\u5C07\u7D66\u5B9A\u7684\u6578\u4F4D\u503C\u8F49\u63DB\u70BA\u6587\u672C\u683C\u5F0F\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u6587\u5B57\u7684\u53C3\u6578\u6216\u5176\u5132\u5B58\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6578\u4F4D\u6216\u6307\u5411\u5305\u542B\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,TO_TEXT\u5C07\u8FD4\u56DE\u5B57\u4E32\u5F62\u5F0F\u7684\u503C,\u4E26\u4FDD\u6301\u73FE\u6709\u683C\u5F0F\u3002\u5373\u539F\u70BA\u8CA8\u5E63\u7684\u4ECD\u70BA\u8CA8\u5E63,\u539F\u70BA\u5341\u9032\u4F4D\u6578\u7684\u4ECD\u70BA\u5341\u9032\u4F4D\u6578,\u539F\u70BA\u767E\u5206\u6BD4\u7684\u4ECD\u70BA\u767E\u5206\u6BD4,\u539F\u70BA\u65E5\u671F\u7684\u4ECD\u70BA\u65E5\u671F\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247TO_TEXT\u5C07\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': '24',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }]\r\n        }, {\r\n        'n': 'TO_DOLLARS',\r\n        't': 16,\r\n        'd': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u7F8E\u5143\u91D1\u984D\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u7F8E\u5143\u91D1\u984D\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u7F8E\u5143\u91D1\u984D\u7684\u53C3\u6578\u6216\u5176\u5132\u5B58\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247TO_DOLLARS\u5C07\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n    }, {\r\n        'n': 'TO_PERCENT',\r\n        't': 16,\r\n        'd': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u767E\u5206\u6BD4\u3002',\r\n        'a': '\u5C07\u6307\u5B9A\u7684\u6578\u4F4D\u8F49\u63DB\u70BA\u767E\u5206\u6BD4\u3002',\r\n        'm': [1, 1],\r\n        'p': [{\r\n            'name'   : 'value',\r\n            'detail' : '\u8981\u8F49\u63DB\u70BA\u767E\u5206\u6BD4\u7684\u53C3\u6578\u6216\u5176\u5132\u5B58\u683C\u5F15\u7528\u3002\\n\\n\u5982\u679C\u503C\u70BA\u6578\u4F4D\u6216\u6307\u5411\u5305\u542B\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,TO_PERCENT\u6703\u4EE51 = 100%\u70BA\u6A19\u6E96,\u5C07\u503C\u8F49\u63DB\u70BA\u767E\u5206\u6BD4\u3002\\n\\n\u5982\u679C\u503C\u4E0D\u662F\u6578\u4F4D\u6216\u6307\u5411\u5167\u5BB9\u70BA\u6578\u503C\u7684\u5132\u5B58\u683C\u7684\u5F15\u7528,\u5247TO_PERCENT\u5C07\u5728\u4E0D\u505A\u4EFB\u4F55\u4FEE\u6539\u7684\u60C5\u51B5\u4E0B\u8FD4\u56DE\u503C\u3002',\r\n            'example': 'A2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n            }]\r\n        }, {\r\n        'n': 'DGET',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u5F9E\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5217\u4E2D\u9078\u53D6\u7B26\u5408\u6307\u5B9A\u689D\u4EF6\u7684\u55AE\u500B\u503C\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u5F9E\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5217\u4E2D\u9078\u53D6\u7B26\u5408\u6307\u5B9A\u689D\u4EF6\u7684\u55AE\u500B\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DMAX',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5927\u6578\u4F4D\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5927\u6578\u4F4D\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n    }, {\r\n        'n': 'DMIN',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5C0F\u6578\u4F4D\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6700\u5C0F\u6578\u4F4D\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DAVERAGE',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u5C0D\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u503C\u6C42\u5E73\u5747\u503C\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u5C0D\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u503C\u6C42\u5E73\u5747\u503C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DCOUNT',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u5305\u542B\u6578\u4F4D\u7684\u5132\u5B58\u683C\u7684\u500B\u6578\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u5305\u542B\u6578\u4F4D\u7684\u5132\u5B58\u683C\u7684\u500B\u6578\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n    }, {\r\n        'n': 'DCOUNTA',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u975E\u7A7A\u5132\u5B58\u683C\u7684\u500B\u6578\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u975E\u7A7A\u5132\u5B58\u683C\u7684\u500B\u6578\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DPRODUCT',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u503C\u7684\u4E58\u7A4D\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u503C\u7684\u4E58\u7A4D\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DSTDEV',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u4E00\u500B\u6A23\u672C\u4F30\u7B97\u51FA\u7684\u7E3D\u9AD4\u6A19\u6E96\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u4E00\u500B\u6A23\u672C\u4F30\u7B97\u51FA\u7684\u7E3D\u9AD4\u6A19\u6E96\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n    }, {\r\n        'n': 'DSTDEVP',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u51FA\u7684\u7E3D\u9AD4\u6A19\u6E96\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u6A23\u672C\u7E3D\u9AD4\u8A08\u7B97\u51FA\u7684\u7E3D\u9AD4\u6A19\u6E96\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n    }, {\r\n        'n': 'DSUM',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4E4B\u548C\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5217\u8868\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4E4B\u548C\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DVAR',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u4E00\u500B\u6A23\u672C\u4F30\u7B97\u51FA\u7684\u7E3D\u9AD4\u65B9\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u8FD4\u56DE\u5229\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u4F5C\u70BA\u4E00\u500B\u6A23\u672C\u4F30\u7B97\u51FA\u7684\u7E3D\u9AD4\u65B9\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n        }, {\r\n        'n': 'DVARP',\r\n        't': 17,\r\n        'd': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u901A\u904E\u4F7F\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u8A08\u7B97\u6A23\u672C\u7E3D\u9AD4\u7684\u6A23\u672C\u7E3D\u9AD4\u65B9\u5DEE\u3002',\r\n        'a': '\u4F7F\u7528SQL\u5F0F\u67FB\u8A62,\u901A\u904E\u4F7F\u7528\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u4E2D\u6EFF\u8DB3\u6307\u5B9A\u689D\u4EF6\u7684\u8A18\u9304\u6B04\u4F4D\uFF08\u5217\uFF09\u4E2D\u7684\u6578\u4F4D\u8A08\u7B97\u6A23\u672C\u7E3D\u9AD4\u7684\u6A23\u672C\u7E3D\u9AD4\u65B9\u5DEE\u3002',\r\n        'm': [3, 3],\r\n        'p': [{\r\n            'name'   : 'database',\r\n            'detail' : '\u69CB\u6210\u6E05\u55AE\u6216\u8CC7\u6599\u5EAB\u7684\u5132\u5B58\u683C\u5340\u57DF,\u6E05\u55AE\u7684\u7B2C\u4E00\u884C\u5305\u542B\u6BCF\u4E00\u5217\u7684\u6A19\u7C64\u3002',\r\n            'example': 'A2:F20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }, {\r\n            'name'   : 'field',\r\n            'detail' : '\u6307\u5B9Adatabase\u4E2D\u7684\u54EA\u4E00\u5217\u5305\u542B\u8981\u9078\u53D6\u548C\u7528\u65BC\u8A08\u7B97\u7684\u503C\u3002\\n\\nfield\u53EF\u4EE5\u662F\u8207database\u7B2C\u4E00\u884C\u4E2D\u67D0\u500B\u5217\u6A19\u984C\u5C0D\u61C9\u7684\u6587\u5B57\u6A19\u7C64,\u4E5F\u53EF\u4EE5\u662F\u6307\u5B9A\u76F8\u95DC\u5217\u7684\u6578\u4F4D\u7D22\u5F15,\u7B2C\u4E00\u5217\u7684\u7D22\u5F15\u503C\u70BA1\u3002',\r\n            'example': 'G2',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n            }, {\r\n            'name'   : 'criteria',\r\n            'detail' : '\u5305\u542B\u6240\u6307\u5B9A\u689D\u4EF6\u7684\u5132\u5B58\u683C\u5340\u57DF\u3002\u8A08\u7B97\u4E4B\u524D\u5C07\u4F7F\u7528\u9019\u4E9B\u689D\u4EF6\u4F86\u904E\u6FFEdatabase\u4E2D\u7684\u503C\u3002',\r\n            'example': 'A22:D23',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n            }]\r\n    }, {\r\n        \"n\": \"AGE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u5E74\u9F61\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u5E74\u9F61\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": \"A1\",\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u622A\u6B62\u65E5\u671F\",\r\n            \"example\": '\"2017-10-01\"',\r\n            \"detail\" : \"\u5E74\u9F61\u8A08\u7B97\u7684\u622A\u6B62\u65E5\u671F\u6216\u7BC4\u570D,\u9ED8\u8A8D\u70BA\u7576\u65E5\u3002\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedatetime\"\r\n        }]\r\n    },\r\n    // SEX_BY_IDCARD\r\n    {\r\n        \"n\": \"SEX_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u6027\u5225\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u6027\u5225\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // BIRTHDAY_BY_IDCARD\r\n    {\r\n        \"n\": \"BIRTHDAY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u751F\u65E5\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u751F\u65E5\u3002\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u751F\u65E5\u683C\u5F0F\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u65E5\u671F\u985E\u578B,\u9ED8\u8A8D0:[1900/01/01],1:[1900-01-01],2:[1900\u5E741\u67081\u65E5]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // PROVINCE_BY_IDCARD\r\n    {\r\n        \"n\": \"PROVINCE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u7C4D\u8CAB\u7684\u7701\u4EFD\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u7C4D\u8CAB\u7684\u7701\u4EFD\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // CITY_BY_IDCARD\r\n    {\r\n        \"n\": \"CITY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u7C4D\u8CAB\u7684\u90FD\u5E02\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u7C4D\u8CAB\u7684\u90FD\u5E02\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // STAR_BY_IDCARD\r\n    {\r\n        \"n\": \"STAR_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u661F\u5EA7\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u661F\u5EA7\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // ANIMAL_BY_IDCARD\r\n    {\r\n        \"n\": \"ANIMAL_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u6839\u64DA\u4E2D\u570B\u8EAB\u4EFD\u8B49\u865F\u8A08\u7B97\u51FA\u751F\u8096\uFF08\u9F20\u3001\u725B\u3001\u864E\u3001\u5154\u2026\uFF09\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u6839\u64DA\u8EAB\u4EFD\u8B49\u865F\u5F97\u5230\u751F\u8096\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // ISIDCARD\r\n    {\r\n        \"n\": \"ISIDCARD\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u9A57\u8B49\u8EAB\u4EFD\u8B49\u7684\u683C\u5F0F\u662F\u5426\u6B63\u78BA\u3002\u652F\u630115\u4F4D\u621618\u4F4D\u8EAB\u4EFD\u8B49\",\r\n        \"a\": \"\u9A57\u8B49\u8EAB\u4EFD\u8B49\u683C\u5F0F\u6B63\u78BA\u6027\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u8EAB\u4EFD\u8B49\u865F\",\r\n            \"example\": '\"31033519900101XXXX\"',\r\n            \"detail\" : \"15\u4F4D\u6216\u800518\u4F4D\u7684\u8EAB\u4EFD\u8B49\u865F\u6216\u7BC4\u570D\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    // DM_TEXT_CUTWORD\r\n    {\r\n        \"n\": \"DM_TEXT_CUTWORD\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u6587\u5B57\u5206\u8A5E\u3002\u628A\u4E00\u9023\u4E32\u6587\u5B57\u6298\u958B\u70BA\u4E00\u7CFB\u5217\u55AE\u7368\u8A5E\u8A9E\",\r\n        \"a\": \"\u4E2D\u6587\u6587\u5B57\u5206\u8A5E\u3002\",\r\n        \"m\": [1, 2],\r\n        \"p\": [{\r\n            \"name\"   : \"\u6587\u5B57\",\r\n            \"example\": '\"\u6211\u4F86\u5230\u5317\u4EAC\u6E05\u83EF\u5927\u5B78\"',\r\n            \"detail\" : \"\u4EFB\u610F\u9700\u8981\u5206\u8A5E\u7684\u6587\u5B57\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u5206\u8A5E\u6A21\u5F0F\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9ED8\u8A8D\u70BA0[\u7CBE\u78BA\u6A21\u5F0F]\uFF0C1[\u5168\u6A21\u5F0F]\uFF0C2[\u641C\u5C0B\u5F15\u64CE\u6A21\u5F0F]\u3002\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DM_TEXT_TFIDF\r\n    {\r\n        \"n\": \"DM_TEXT_TFIDF\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u63A1\u7528tf-idf\u7B97\u704B\u9032\u884C\u95DC\u9375\u5B57\u9078\u53D6\u3002\u5F9E\u4E00\u9023\u4E32\u6587\u5B57\u4E2D\u8B58\u5225\u95DC\u9375\u5B57\",\r\n        \"a\": \"tf-idf\u95DC\u9375\u5B57\u8B58\u5225\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u6587\u5B57\",\r\n            \"example\": '\"\u6211\u4F86\u5230\u5317\u4EAC\u6E05\u83EF\u5927\u5B78\"',\r\n            \"detail\" : \"\u4EFB\u610F\u9700\u8981\u5206\u8A5E\u7684\u6587\u5B57\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u95DC\u9375\u5B57\u500B\u6578\",\r\n            \"example\": '20',\r\n            \"detail\" : \"\u7B97\u704B\u8FD4\u56DE\u7684\u95DC\u9375\u5B57\u500B\u6578\uFF0C\u9ED8\u8A8D20\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }, {\r\n            \"name\"   : \"\u8A9E\u6599\u5EAB\",\r\n            \"example\": '1',\r\n            \"detail\" : \"\u9078\u64C7\u7279\u5B9A\u9818\u57DF\u7684\u8A9E\u6599\u5EAB\uFF0C\u9ED8\u8A8D0[\u901A\u7528]\uFF0C1[\u91D1\u878D]\uFF0C2[\u91AB\u7642]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DM_TEXT_TEXTRANK\r\n    {\r\n        \"n\": \"DM_TEXT_TEXTRANK\",\r\n        \"t\": \"4\",\r\n        \"d\": \"\u63A1\u7528TextRank\u7B97\u704B\u9032\u884C\u95DC\u9375\u5B57\u9078\u53D6\u3002\u5F9E\u4E00\u9023\u4E32\u6587\u5B57\u4E2D\u8B58\u5225\u95DC\u9375\u5B57\",\r\n        \"a\": \"TextRank\u95DC\u9375\u5B57\u8B58\u5225\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u6587\u5B57\",\r\n            \"example\": '\"\u6211\u4F86\u5230\u5317\u4EAC\u6E05\u83EF\u5927\u5B78\"',\r\n            \"detail\" : \"\u4EFB\u610F\u9700\u8981\u5206\u8A5E\u7684\u6587\u5B57\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u95DC\u9375\u5B57\u500B\u6578\",\r\n            \"example\": '20',\r\n            \"detail\" : \"\u7B97\u704B\u8FD4\u56DE\u7684\u95DC\u9375\u5B57\u500B\u6578\uFF0C\u9ED8\u8A8D20\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }, {\r\n            \"name\"   : \"\u8A9E\u6599\u5EAB\",\r\n            \"example\": '1',\r\n            \"detail\" : \"\u9078\u64C7\u7279\u5B9A\u9818\u57DF\u7684\u8A9E\u6599\u5EAB\uFF0C\u9ED8\u8A8D0[\u901A\u7528]\uFF0C1[\u91D1\u878D]\uFF0C2[\u91AB\u7642]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_CLOSE\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_CLOSE\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6536\u76E4\u50F9\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6536\u76E4\u50F9\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8A8D\u70BA\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_OPEN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_OPEN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u958B\u76E4\u50F9\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u958B\u76E4\u50F9\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8A8D\u70BA\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_MAX\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MAX\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6700\u9AD8\u50F9\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6700\u9AD8\u50F9\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8A8D\u70BA\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_MIN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MIN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6700\u4F4E\u50F9\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6700\u4F4E\u50F9\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5,\u9ED8\u8BA4\u4E3A\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_VOLUMN\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_VOLUMN\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6210\u4EA4\u91CF\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6210\u4EA4\u91CF\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8A8D\u70BA\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // DATA_CN_STOCK_AMOUNT\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_AMOUNT\",\r\n        \"t\": \"5\",\r\n        \"d\": \"\u6839\u64DA\u80A1\u7968\u4EE3\u78BC\u548C\u65E5\u671F\uFF0C\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6210\u4EA4\u984D\u3002\",\r\n        \"a\": \"\u8FD4\u56DEA\u80A1\u5C0D\u61C9\u80A1\u7968\u6210\u4EA4\u984D\u3002\",\r\n        \"m\": [1, 3],\r\n        \"p\": [{\r\n            \"name\"   : \"\u80A1\u7968\u4EE3\u78BC\",\r\n            \"example\": '\"000001\"',\r\n            \"detail\" : \"6\u4F4D\u80A1\u7968\u4EE3\u78BC\uFF0C\u5FC5\u586B\u9805\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }, {\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '2015-01-08',\r\n            \"detail\" : \"\u80A1\u7968\u7684\u4EA4\u6613\u65E5\uFF0C\u9ED8\u8A8D\u70BA\u6700\u65B0\u4EA4\u6613\u65E5\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangedate\"\r\n        }, {\r\n            \"name\"   : \"\u8907\u6B0A\u9664\u6B0A\",\r\n            \"example\": '0',\r\n            \"detail\" : \"\u9078\u64C7\u80A1\u7968\u7684\u9664\u6B0A\u8907\u6B0A\u985E\u578B\uFF0C\u9ED8\u8A8D0[\u524D\u8907\u6B0A]\uFF0C1[\u539F\u59CB\u50F9\u683C]\uFF0C2[\u5F8C\u8907\u6B0A]\",\r\n            \"require\": \"o\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangenumber\"\r\n        }]\r\n    },\r\n    // ISDATE\r\n    {\r\n        \"n\": \"ISDATE\",\r\n        \"t\": \"6\",\r\n        \"d\": \"\u9A57\u8B49\u65E5\u671F\u7684\u683C\u5F0F\u662F\u5426\u6B63\u78BA\u3002\u652F\u6301\u591A\u7A2E\u65E5\u671F\u683C\u5F0F\",\r\n        \"a\": \"\u9A57\u8B49\u65E5\u671F\u683C\u5F0F\u6B63\u78BA\u6027\u3002\",\r\n        \"m\": [1, 1],\r\n        \"p\": [{\r\n            \"name\"   : \"\u65E5\u671F\",\r\n            \"example\": '\"1990-01-01\"',\r\n            \"detail\" : \"\u65E5\u671F\u503C,\u4F8B\u59821990/01/01, 1990\u5E741\u67081\u65E5\u7B49\u3002\",\r\n            \"require\": \"m\",\r\n            \"repeat\" : \"n\",\r\n            \"type\"   : \"rangeall\"\r\n        }]\r\n    },\r\n    //sparklines\u51FD\u6570,\u7EBF\u56FE\r\n    {\r\n        \"n\": \"LINESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u6298\u7DDA\u5716sparklines\uFF0C\u7528\u65BC\u63CF\u8FF0\u6578\u64DA\u7684\u9023\u7E8C\u8D70\u52E2\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u6298\u7DDA\u5716\",\r\n        \"m\": [1, 8],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C{1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\"   : \"\u7DDA\u689D\u984F\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            // {\r\n            //     \"name\": \"\u586B\u5145\u984F\u8272\",\r\n            //     \"example\": '#CCF3F4',\r\n            //     \"detail\": \"\u5F62\u6210\u9762\u79EF\u56FE,\u540C\u7EBF\u6761\u984F\u8272\u914D\u7F6E,\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            //lineWidth\r\n            {\r\n                \"name\"   : \"\u7DDA\u689D\u7C97\u7D30\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u6298\u7DDA\u5716\u7DDA\u6BB5\u7C97\u7D30\uFF0C\u9ED8\u8A8D\u70BA1px\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //normalRangeMin\u548CnormalRangeMax\u8BBE\u4E3A\u76F8\u540C\u7684\u503C,min\u3001max\u3001avg\u3001median\u9700\u8981\u8BA1\u7B97\r\n            {\r\n                \"name\"   : \"\u8F14\u52A9\u7DDA\",\r\n                \"example\": 'avg',\r\n                \"detail\" : \"\u4E00\u689D\u6A6B\u7DDA\uFF0C\u53EF\u4EE5\u662Fmin\u3001max\u3001avg\u3001median\u3001\u7BC4\u570D\u6216\u81EA\u5B9A\u7FA9\u6578\u503C\uFF0C\u9ED8\u8A8D0\u7121\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //normalRangeColor\r\n            {\r\n                \"name\"   : \"\u8F14\u52A9\u7DDA\u984F\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\" : \"\u8F14\u52A9\u7DDA\u7684\u984F\u8272\u8A2D\u5B9A\uFF0C\u540C\u7DDA\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //maxSpotColor\r\n            {\r\n                \"name\"   : \"\u6700\u5927\u503C\u6A19\u8B58\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u6A19\u8B58\u7DDA\u5716\u6700\u5927\u503C\uFF0C\u540C\u7DDA\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D0\u4E0D\u986F\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //minSpotColor\r\n            {\r\n                \"name\"   : \"\u6700\u5C0F\u503C\u6A19\u8B58\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u6A19\u8B58\u7DDA\u5716\u6700\u5C0F\u503C\uFF0C\u540C\u7DDA\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D0\u4E0D\u986F\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //spotRadius\r\n            {\r\n                \"name\"   : \"\u6A19\u8B58\u5927\u5C0F\",\r\n                \"example\": '1.5',\r\n                \"detail\" : \"\u6700\u5927\u503C\u548C\u6700\u5C0F\u503C\u7684\u6A19\u8B58\u5927\u5C0F\u8A2D\u5B9A\uFF0C\u9ED8\u8A8D\u70BA1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u9762\u79EF\u56FE\r\n    {\r\n        \"n\": \"AREASPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u9762\u7A4D\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u6578\u64DA\u7684\u9023\u7E8C\u7D2F\u7A4D\u503C\u8D70\u52E2\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u9762\u7A4D\u5716\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C{1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\"   : \"\u7DDA\u689D\u984F\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //fillColor\r\n            {\r\n                \"name\"   : \"\u586B\u5145\u984F\u8272\",\r\n                \"example\": '#CCF3F4',\r\n                \"detail\" : \"\u5F62\u6210\u9762\u7A4D\u5716\uFF0C\u540C\u7DDA\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D0\u4E0D\u986F\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //lineWidth\r\n            {\r\n                \"name\"   : \"\u7DDA\u689D\u7C97\u7D30\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u6298\u7DDA\u5716\u7DDA\u6BB5\u7C97\u7D30\uFF0C\u9ED8\u8A8D\u70BA1px\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //normalRangeMin\u548CnormalRangeMax\u8BBE\u4E3A\u76F8\u540C\u7684\u503C,min\u3001max\u3001avg\u3001median\u9700\u8981\u8BA1\u7B97\r\n            {\r\n                \"name\"   : \"\u8F14\u52A9\u7DDA\",\r\n                \"example\": 'avg',\r\n                \"detail\" : \"\u4E00\u689D\u6A6B\u7DDA\uFF0C\u53EF\u4EE5\u662Fmin\u3001max\u3001avg\u3001median\u3001\u7BC4\u570D\u6216\u81EA\u5B9A\u7FA9\u6578\u503C\uFF0C\u9ED8\u8A8D0\u7121\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //normalRangeColor\r\n            {\r\n                \"name\"   : \"\u8F14\u52A9\u7DDA\u984F\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\" : \"\u8F14\u52A9\u7DDA\u7684\u984F\u8272\u8A2D\u5B9A\uFF0C\u540C\u7DDA\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n            // //maxSpotColor\r\n            // {\r\n            //     \"name\": \"\u6700\u5927\u503C\u6807\u8BC6\",\r\n            //     \"example\": '#fc5c5c',\r\n            //     \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5927\u503C,\u540C\u7EBF\u6761\u984F\u8272\u914D\u7F6E,\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            // //minSpotColor\r\n            // {\r\n            //     \"name\": \"\u6700\u5C0F\u503C\u6807\u8BC6\",\r\n            //     \"example\": '#fc5c5c',\r\n            //     \"detail\": \"\u6807\u8BC6\u7EBF\u56FE\u6700\u5927\u503C,\u540C\u7EBF\u6761\u984F\u8272\u914D\u7F6E,\u9ED8\u8BA40\u4E0D\u663E\u793A\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // },\r\n            // //spotRadius\r\n            // {\r\n            //     \"name\": \"\u6807\u8BC6\u5927\u5C0F\",\r\n            //     \"example\": '1.5',\r\n            //     \"detail\": \"\u6700\u5927\u503C\u548C\u6700\u5C0F\u503C\u7684\u6807\u8BC6\u5927\u5C0F\u8BBE\u7F6E,\u9ED8\u8BA4\u4E3A1.5\",\r\n            //     \"require\": \"o\",\r\n            //     \"repeat\": \"n\",\r\n            //     \"type\": \"rangeall\"\r\n            // }\r\n        ]\r\n    },\r\n    //sparklines\u67F1\u72B6\u56FE\r\n    {\r\n        \"n\": \"COLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u5782\u76F4\u67F1\u72C0\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u96E2\u6563\u6578\u64DA\u4E4B\u9593\u7684\u5927\u5C0F\u60C5\u51B5\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u5782\u76F4\u67F1\u72C0\u5716\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C{1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u9593\u9694\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u67F1\u689D\u4E4B\u9593\u7684\u9593\u9694\u8DDD\u96E2\uFF0C\u9ED8\u8A8D\u70BA1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barColor\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\"   : \"\u8CA0\u5411\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8CA0\u5411\u67F1\u689D\u984F\u8272\u8A2D\u5B9A\uFF0C\u4EE3\u8868\u8CA0\u503C\u7684\u984F\u8272\uFF0C\u540C\u67F1\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\"   : \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\" : \"\u67F1\u5716\u6700\u5927\u503C\uFF0C\u7528\u65BC\u898F\u7BC4\u67F1\u5716\u9577\u5EA6\uFF0C\u9ED8\u8A8D\u70BA\u81EA\u52D5\u8A08\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\"   : \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u55AE\u7368\u8A2D\u5B9A\u6BCF\u500B\u67F1\u689D\u7684\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u591A\u500B\uFF0C\u652F\u6301\u5169\u7A2E\u683C\u5F0F:1\u984F\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u500B\u67F1\u7684\u984F\u8272\u662F\u9ED1\u8272\uFF1B2\u6578\u503C\u7BC4\u570D:\u984F\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6578\u503C\u70BA-2\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C0:5:#000\u8868\u793A\u6578\u503C0-5\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C\u9ED8\u8A8D\u70BA\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7D2F\u79EF\u67F1\u72B6\u56FE\r\n    {\r\n        \"n\": \"STACKCOLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u7D2F\u7A4D\u5782\u76F4\u67F1\u72C0\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u96E2\u6563\u6578\u64DA\u591A\u500B\u7DAD\u5EA6\u7684\u6578\u503C\u5927\u5C0F\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u7D2F\u7A4D\u5782\u76F4\u67F1\u72C0\u5716\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20\uFF0C{1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //stackconfig\r\n            {\r\n                \"name\"   : \"\u6309\u5217\u5806\u7A4D\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u5982\u679C\u9700\u8981\u6309\u884C\u5806\u7A4D\u5247\u672C\u9805\u8A2D\u70BAfalse\u62160\uFF0C\u9ED8\u8A8D\u70BA\u662F1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u9593\u9694\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u67F1\u689D\u4E4B\u9593\u7684\u9593\u9694\u8DDD\u96E2\uFF0C\u9ED8\u8A8D\u70BA1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\"   : \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\" : \"\u7D2F\u7A4D\u67F1\u5716\u6700\u5927\u503C\uFF0C\u7528\u65BC\u898F\u7BC4\u67F1\u5716\u9577\u5EA6\uFF0C\u9ED8\u8A8D\u70BA\u81EA\u52D5\u8A08\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //stackedBarColor\r\n            {\r\n                \"name\"   : \"\u7D2F\u7A4D\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u55AE\u7368\u8A2D\u5B9A\u6BCF\u500B\u7DAD\u5EA6\u7684\u67F1\u689D\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u70BAA1:A10\u7B49\u7BC4\u570D\uFF0C\u9ED8\u8A8D\u70BA#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u6761\u5F62\u56FE\r\n    {\r\n        \"n\": \"BARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u6A6B\u5411\u689D\u5F62\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u96E2\u6563\u6578\u64DA\u4E4B\u9593\u7684\u5927\u5C0F\u60C5\u51B5\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u6A6B\u5411\u689D\u5F62\u5716\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u9593\u9694\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u67F1\u689D\u4E4B\u9593\u7684\u9593\u9694\u8DDD\u96E2\uFF0C\u9ED8\u8A8D\u70BA1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barColor\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\"   : \"\u8CA0\u5411\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8CA0\u5411\u67F1\u689D\u984F\u8272\u8A2D\u5B9A\uFF0C\u4EE3\u8868\u8CA0\u503C\u7684\u984F\u8272\uFF0C\u540C\u67F1\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\"   : \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\" : \"\u67F1\u5716\u6700\u5927\u503C\uFF0C\u7528\u65BC\u898F\u7BC4\u67F1\u5716\u9577\u5EA6\uFF0C\u9ED8\u8A8D\u70BA\u81EA\u52D5\u8A08\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\"   : \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u55AE\u7368\u8A2D\u5B9A\u6BCF\u500B\u67F1\u689D\u7684\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u591A\u500B\uFF0C\u652F\u6301\u5169\u7A2E\u683C\u5F0F:1\u984F\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u500B\u67F1\u7684\u984F\u8272\u662F\u9ED1\u8272\uFF1B2\u6578\u503C\u7BC4\u570D:\u984F\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6578\u503C\u70BA-2\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C0:5:#000\u8868\u793A\u6578\u503C0-5\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C\u9ED8\u8A8D\u70BA\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7D2F\u79EF\u6761\u5F62\u56FE\r\n    {\r\n        \"n\": \"STACKBARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u7D2F\u7A4D\u6A6B\u5411\u689D\u5F62\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u96E2\u6563\u6578\u64DA\u591A\u500B\u7DAD\u5EA6\u7684\u6578\u503C\u5927\u5C0F\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u7D2F\u7A4D\u6A6B\u5411\u689D\u5F62\u5716\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //stackconfig\r\n            {\r\n                \"name\"   : \"\u6309\u5217\u5806\u7A4D\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u5982\u679C\u9700\u8981\u6309\u884C\u5806\u7A4D\u5247\u672C\u9805\u8A2D\u70BAfalse\u62160\uFF0C\u9ED8\u8A8D\u70BA\u662F1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u9593\u9694\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u67F1\u689D\u4E4B\u9593\u7684\u9593\u9694\u8DDD\u96E2\uFF0C\u9ED8\u8A8D\u70BA1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //chartRangeMax\r\n            {\r\n                \"name\"   : \"\u6700\u5927\u503C\",\r\n                \"example\": '100',\r\n                \"detail\" : \"\u7D2F\u7A4D\u67F1\u5716\u6700\u5927\u503C\uFF0C\u7528\u65BC\u898F\u7BC4\u67F1\u5716\u9577\u5EA6\uFF0C\u9ED8\u8A8D\u70BA\u81EA\u52D5\u8A08\u7B97false\u3001auto\u3001null\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //stackedBarColor\r\n            {\r\n                \"name\"   : \"\u7D2F\u7A4D\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u55AE\u7368\u8A2D\u5B9A\u6BCF\u500B\u7DAD\u5EA6\u7684\u67F1\u689D\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u70BAA1:A10\u7B49\u7BC4\u570D\uFF0C\u9ED8\u8A8D\u70BA#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u79BB\u6563\u56FE\r\n    {\r\n        \"n\": \"DISCRETESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u96E2\u6563\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u96E2\u6563\u6578\u64DA\u8D70\u52E2\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u96E2\u6563\u5716\",\r\n        \"m\": [1, 4],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //thresholdValue\r\n            {\r\n                \"name\"   : \"\u5206\u5272\u95BE\u503C\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u96E2\u6563\u5716\u67F1\u5F62\u984F\u8272\u7684\u5340\u5206\uFF0C\u4F8B\u5982:\u8A72\u503C\u70BA0\uFF0C\u5247\u5927\u65BC0\u70BA\u85CD\u8272\uFF0C\u5C0F\u65BC0\u70BA\u7D05\u8272\uFF0C\u9ED8\u8A8D\u70BA0\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //lineColor\r\n            {\r\n                \"name\"   : \"\u95BE\u503C\u4EE5\u4E0A\u984F\u8272\",\r\n                \"example\": '#2ec7c9',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //thresholdColor\r\n            {\r\n                \"name\"   : \"\u95BE\u503C\u4EE5\u4E0B\u984F\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u95BE\u503C\u4EE5\u4E0B\u67F1\u689D\u984F\u8272\u8A2D\u5B9A\uFF0C\u540C\u95BE\u503C\u4EE5\u4E0A\u984F\u8272\uFF0C\u9ED8\u8A8D#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u4E09\u6001\u56FE\r\n    {\r\n        \"n\": \"TRISTATESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u4E09\u614B\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u4E09\u7A2E\u614B\u52E2\u7684\u8D70\u52E2\u4F8B\u5982\u52DD\u8CA0\u5E73\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u4E09\u614B\u5716\",\r\n        \"m\": [1, 6],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //barSpacing\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u9593\u9694\",\r\n                \"example\": '1',\r\n                \"detail\" : \"\u67F1\u689D\u4E4B\u9593\u7684\u9593\u9694\u8DDD\u96E2\uFF0C\u9ED8\u8A8D\u70BA1\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //posBarColor\r\n            {\r\n                \"name\"   : \"\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#fc5c5c',\r\n                \"detail\" : \"\u7DDA\u5716\u7684\u7DDA\u689D\u984F\u8272\uFF0C\u53EF\u4EE5\u662F\u5426\u500B\u7BC4\u570DA1\u3001\u8272\u9336\u7D22\u5F15\u6578\u503C\u6216\u8005\u5177\u9AD4\u984F\u8272\u503C\uFF0C\u8A2D\u5B9A\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u652F\u6301regx\u3001rgb\u3001rgba\u7B49\u3002\u9ED8\u8A8D#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //negBarColor\r\n            {\r\n                \"name\"   : \"\u8D1F\u5411\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8CA0\u5411\u67F1\u689D\u984F\u8272\u8A2D\u5B9A\uFF0C\u4EE3\u8868\u8CA0\u503C\u7684\u984F\u8272\uFF0C\u540C\u67F1\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //zeroBarColor\r\n            {\r\n                \"name\"   : \"\u96F6\u503C\u67F1\u689D\u984F\u8272\",\r\n                \"example\": '#999',\r\n                \"detail\" : \"\u96F6\u503C\u67F1\u689D\u984F\u8272\u8A2D\u5B9A\uFF0C\u4EE3\u88680\u503C\u984F\u8272\uFF0C\u540C\u67F1\u689D\u984F\u8272\u914D\u5BD8\uFF0C\u9ED8\u8A8D#999\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //colorMap\r\n            {\r\n                \"name\"   : \"\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u55AE\u7368\u8A2D\u5B9A\u6BCF\u500B\u67F1\u689D\u7684\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u591A\u500B\uFF0C\u652F\u6301\u5169\u7A2E\u683C\u5F0F:1\u984F\u8272\u4F8B\u5982#000\uFF0C\u4EE3\u8868\u7B2C\u4E00\u500B\u67F1\u7684\u984F\u8272\u662F\u9ED1\u8272\uFF1B2\u6578\u503C\u7BC4\u570D:\u984F\u8272\uFF0C\u4F8B\u5982-2:#000\u8868\u793A\u6578\u503C\u70BA-2\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C0-5:#000\u8868\u793A\u6578\u503C0-5\u7684\u67F1\u70BA\u9ED1\u8272\uFF0C\u9ED8\u8A8D\u70BA\u7A7A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u997C\u56FE\r\n    {\r\n        \"n\": \"PIESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u9905\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u6578\u64DA\u5360\u6BD4\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u9905\u5716\",\r\n        \"m\": [1, 5],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //offset\r\n            {\r\n                \"name\"   : \"\u65CB\u8F49\u89D2\u5EA6\",\r\n                \"example\": '0',\r\n                \"detail\" : \"\u9905\u5716\u7684\u65CB\u8F49\u89D2\u5EA6\uFF0C\u9ED8\u8A8D\u70BA0\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //borderWidth\r\n            {\r\n                \"name\"   : \"\u9905\u5716\u908A\u6846\",\r\n                \"example\": '0',\r\n                \"detail\" : \"\u9905\u5716\u908A\u6846\u5927\u5C0F\uFF0C\u9ED8\u8A8D\u70BA\u71210\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //borderColor\r\n            {\r\n                \"name\"   : \"\u908A\u6846\u984F\u8272\",\r\n                \"example\": '#000',\r\n                \"detail\" : \"\u9905\u5716\u908A\u6846\u984F\u8272\uFF0C\u9ED8\u8A8D\u70BA#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //sliceColors\r\n            {\r\n                \"name\"   : \"\u9905\u5716\u8272\u677F\",\r\n                \"example\": '#97b552',\r\n                \"detail\" : \"\u8ABF\u8272\u677F\u53EF\u4EE5\u8A2D\u5B9A\u5207\u7247\u7684\u984F\u8272\uFF0C\u53EF\u8A2D\u5B9A\u70BAA1:A10\u7B49\u7BC4\u570D\uFF0C\u9ED8\u8A8D\u70BA#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7BB1\u7EBF\u56FE\r\n    {\r\n        \"n\": \"BOXSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u7BB1\u7DDA\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u6578\u64DA\u96C6\u7684\u7D71\u8A08\u5206\u4F48\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u7BB1\u7DDA\u5716\",\r\n        \"m\": [1, 4],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u7BC4\u570D\",\r\n                \"example\": 'A1:A20',\r\n                \"detail\" : \"\u6578\u64DA\u7BC4\u570D,\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1:A20, {1,2,3,4,5}\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //outlierIQR,\u5982\u679C\u4E3A0\u6216false\u5219showOutliers\u8BBE\u4E3Afalse,\u5426\u5219\u4E3Atrue\r\n            {\r\n                \"name\"   : \"\u96E2\u7FA4\u9EDE\u6BD4\u4F8B\",\r\n                \"example\": '1.5',\r\n                \"detail\" : \"\u96E2\u7FA4\u9EDE\u7684\u95BE\u503C\u7BC4\u570D\uFF0C\u5982\u679C\u70BA0\u6216false\u5247\u4E0D\u986F\u793A\uFF0C\u9ED8\u8A8D\u70BA1.5\u500D\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //target\r\n            {\r\n                \"name\"   : \"\u76EE\u6A19\u9EDE\u503C\",\r\n                \"example\": '10',\r\n                \"detail\" : \"\u7BB1\u7DDA\u5716\u4E0A\u7684\u76EE\u6A19\u503C\u8A2D\u5B9A\uFF0C\u9ED8\u8A8D\u70BAfalse\u4E0D\u986F\u793A\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //spotRadius\r\n            {\r\n                \"name\"   : \"\u6578\u64DA\u9EDE\u5927\u5C0F\",\r\n                \"example\": '1.5',\r\n                \"detail\" : \"\u76EE\u6A19\u9EDE\u548C\u96E2\u7FA4\u9EDE\u7684\u534A\u5F91\u5927\u5C0F\u8A2D\u5B9A\uFF0C\u9ED8\u8A8D\u70BA1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u5B50\u5F39\u56FE\r\n    {\r\n        \"n\": \"BULLETSPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u751F\u6210\u5D4C\u5165\u5728\u5132\u5B58\u683C\u5167\u7684\u5B50\u5F48\u5716sparklines\uFF0C\u4E00\u822C\u7528\u65BC\u63CF\u8FF0\u4EFB\u52D9\u9054\u6210\u7387\",\r\n        \"a\": \"\u751F\u6210\u5132\u5B58\u683C\u5B50\u5F48\u5716\",\r\n        \"m\": [2, 3],\r\n        \"p\": [\r\n            //\u76EE\u6807data1\r\n            {\r\n                \"name\"   : \"\u76EE\u6A19\",\r\n                \"example\": '10',\r\n                \"detail\" : \"\u9054\u6210\u7684\u76EE\u6A19\u503C\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1\uFF0C100\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //\u76EE\u524D\u8FBE\u6210data2\r\n            {\r\n                \"name\"   : \"\u5BE6\u969B\u5B8C\u6210\",\r\n                \"example\": '8',\r\n                \"detail\" : \"\u73FE\u6642\u5B8C\u6210\u503C\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1\uFF0C100\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"n\",\r\n                \"type\"   : \"rangeall\"\r\n            },\r\n            //\u5BF9\u6BD4\u503Cdatax\r\n            {\r\n                \"name\"   : \"\u5C0D\u6BD4\u503C\",\r\n                \"example\": '12',\r\n                \"detail\" : \"\u5C0D\u6BD4\u503C\uFF0C\u4F8B\u5982\u8D85\u984D\u3001\u6700\u4F4E\u3001\u7372\u734E\u5E95\u7DDA\u7B49\uFF0C\u6578\u503C\u624D\u80FD\u88AB\u6709\u6548\u8A08\u7B97\uFF0C\u4F8B\u5982A1\uFF0C100\u7B49\u3002\u53EF\u4EE5\u8A2D\u5B9A\u6700\u591A9\u500B\u5C0D\u6BD4\u503C\",\r\n                \"require\": \"o\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //sparklines\u7EC4\u5408\u56FE,\u652F\u6301\u591A\u500B\u7C7B\u578B\u7684\u56FE\u753B\u5728\u540C\u4E00\u500B\u5355\u5143\u683C\r\n    {\r\n        \"n\": \"COMPOSESPLINES\",\r\n        \"t\": \"3\",\r\n        \"d\": \"\u652F\u6301\u591A\u500B\u985E\u578B\u7684\u5716\u756B\u5728\u540C\u4E00\u500B\u5132\u5B58\u683C\uFF0C\u6BCF\u500B\u53C3\u6578\u4EE3\u8868\u4E00\u500Bsparklines\u5716\",\r\n        \"a\": \"\u7D44\u5408sparklines\u5716\u5230\u4E00\u500B\u5132\u5B58\u683C\",\r\n        \"m\": [1, 1],\r\n        \"p\": [\r\n            //data\r\n            {\r\n                \"name\"   : \"\u5716\u8A2D\u5B9A\",\r\n                \"example\": 'PIESPLINES(A1:A20)',\r\n                \"detail\" : \"sparklines\u5716\u8A2D\u5B9A\uFF0C\u4F8B\u5982A1:A20\uFF0C\u4E00\u500B\u5B8C\u6210\u7684\u9905\u5716\u3001\u7DDA\u5716\u8A2D\u5B9A\u7B49\u3002\",\r\n                \"require\": \"m\",\r\n                \"repeat\" : \"y\",\r\n                \"type\"   : \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    //\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\r\n    {\r\n        'n': 'SORT',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE\u6578\u7D44\u4E2D\u5143\u7D20\u7684\u6392\u5E8F\u6578\u7D44\u3002\u8FD4\u56DE\u7684\u6578\u7D44\u8207\u63D0\u4F9B\u7684\u6578\u7D44\u53C3\u6578\u5F62\u72C0\u76F8\u540C\u3002',\r\n        'a': '\u8FD4\u56DE\u6578\u7D44\u4E2D\u5143\u7D20\u7684\u6392\u5E8F\u6578\u7D44\u3002\u8FD4\u56DE\u7684\u6578\u7D44\u8207\u63D0\u4F9B\u7684\u6578\u7D44\u53C3\u6578\u5F62\u72C0\u76F8\u540C\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u6392\u5E8F\u7684\u7BC4\u570D\u6216\u6578\u7D44\u3002',\r\n            'example': 'A2:A17',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'sort_index',\r\n            'detail' : '[\u53EF\u9078] - \u8868\u793A\u8981\u6392\u5E8F\u7684\u884C\u6216\u5217\u7684\u6578\u4F4D\u3002\uFF08\u9ED8\u8A8Drow1/col1\uFF09',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'sort_order',\r\n            'detail' : '[\u53EF\u9078] - \u8868\u793A\u6240\u9700\u6392\u5E8F\u9806\u5E8F\u7684\u6578\u4F4D\uFF1B1\u8868\u793A\u6607\u51AA\uFF08\u9ED8\u8A8D\uFF09\uFF0C-1\u8868\u793A\u964D\u5E8F\u3002',\r\n            'example': '-1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'by_col',\r\n            'detail' : '[\u53EF\u9078] - \u8868\u793A\u6240\u9700\u6392\u5E8F\u65B9\u5411\u7684\u908F\u8F2F\u503C\uFF1B\u6309\u884C\u6392\u5E8F\u70BAFALSE\uFF08\uFF09\uFF08\u9ED8\u8A8D\uFF09\uFF0C\u6309\u5217\u6392\u5E8F\u70BATRUE\uFF08\uFF09\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'FILTER',\r\n        't': '14',\r\n        'd': '\u57FA\u65BC\u4E00\u500B\u5E03\u6797\uFF08\u771F/\u5047\uFF09\u6578\u7D44\u904E\u6FFE\u4E00\u500B\u6578\u7D44\u3002',\r\n        'a': '\u57FA\u65BC\u4E00\u500B\u5E03\u6797\uFF08\u771F/\u5047\uFF09\u6578\u7D44\u904E\u6FFE\u4E00\u500B\u6578\u7D44\u3002',\r\n        'm': [2, 3],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u8981\u7BE9\u9078\u7684\u6578\u7D44\u6216\u7BC4\u570D\u3002',\r\n            'example': 'A5:D20',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'include',\r\n            'detail' : '\u5E03\u6797\u6578\u7D44\uFF0C\u5176\u9AD8\u5EA6\u6216\u5BEC\u5EA6\u8207\u6578\u7D44\u76F8\u540C',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'range'\r\n        }, {\r\n            'name'   : 'if_empty',\r\n            'detail' : '[\u53EF\u9078] - \u5982\u679C\u5305\u542B\u6578\u7D44\u4E2D\u7684\u6240\u6709\u503C\u90FD\u70BA\u7A7A\uFF08filter\u4E0D\u8FD4\u56DE\u4EFB\u4F55\u503C\uFF09\uFF0C\u5247\u8FD4\u56DE\u7684\u503C\u3002',\r\n            'example': '\"\"',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'UNIQUE',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE\u5217\u8868\u6216\u5340\u57DF\u4E2D\u7684\u552F\u4E00\u503C\u7684\u6E05\u55AE\u3002',\r\n        'a': '\u8FD4\u56DE\u5217\u8868\u6216\u5340\u57DF\u4E2D\u7684\u552F\u4E00\u503C\u7684\u6E05\u55AE\u3002',\r\n        'm': [1, 3],\r\n        'p': [{\r\n            'name'   : 'array',\r\n            'detail' : '\u5F9E\u5176\u8FD4\u56DE\u552F\u4E00\u503C\u7684\u6578\u7D44\u6216\u5340\u57DF\u3002',\r\n            'example': 'A2:B26',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'by_col',\r\n            'detail' : '[\u53EF\u9078] - \u908F\u8F2F\u503C\uFF0C\u8A13\u793A\u5982\u4F55\u6BD4\u8F03\uFF1B\u6309\u884C= FALSE\uFF08\uFF09\u6216\u7701\u7565\uFF1B\u6309\u5217= TRUE\uFF08\uFF09\u3002',\r\n            'example': 'TRUE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }, {\r\n            'name'   : 'occurs_once',\r\n            'detail' : '[\u53EF\u9078] - \u908F\u8F2F\u503C\uFF0C\u50C5\u8FD4\u56DE\u552F\u4E00\u503C\u4E2D\u51FA\u73FE\u4E00\u6B21= TRUE\uFF08\uFF09\uFF1B\u5305\u62EC\u6240\u6709\u552F\u4E00\u503C= FALSE\uFF08\uFF09\u6216\u7701\u7565\u3002',\r\n            'example': 'FALSE()',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangeall'\r\n        }]\r\n    }, {\r\n        'n': 'RANDARRAY',\r\n        't': '14',\r\n        'd': '\u8FD4\u56DE0\u52301\u4E4B\u9593\u7684\u96A8\u6A5F\u6578\u4F4D\u6578\u7D44\u3002',\r\n        'a': '\u8FD4\u56DE0\u52301\u4E4B\u9593\u7684\u96A8\u6A5F\u6578\u4F4D\u6578\u7D44',\r\n        'm': [0, 2],\r\n        'p': [{\r\n            'name'   : 'rows',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u8FD4\u56DE\u7684\u884C\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cols',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u8FD4\u56DE\u7684\u5217\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    }, {\r\n        'n': 'SEQUENCE',\r\n        't': '14',\r\n        'd': '\u751F\u6210\u6578\u4F4D\u5E8F\u5217\u7684\u6E05\u55AE\u3002',\r\n        'a': '\u751F\u6210\u6578\u4F4D\u5E8F\u5217\u7684\u6E05\u55AE\u3002',\r\n        'm': [1, 4],\r\n        'p': [{\r\n            'name'   : 'rows',\r\n            'detail' : '\u8981\u8FD4\u56DE\u7684\u884C\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'm',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'cols',\r\n            'detail' : '[\u53EF\u9078] - \u8981\u8FD4\u56DE\u7684\u5217\u6578\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'start',\r\n            'detail' : '[\u53EF\u9078] - \u5E8F\u5217\u4E2D\u7684\u7B2C\u4E00\u500B\u6578\u4F4D\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }, {\r\n            'name'   : 'step',\r\n            'detail' : '[\u53EF\u9078] -\u5E8F\u5217\u4E2D\u6BCF\u500B\u5E8F\u5217\u503C\u7684\u589E\u91CF\u3002',\r\n            'example': '1',\r\n            'require': 'o',\r\n            'repeat' : 'n',\r\n            'type'   : 'rangenumber'\r\n        }]\r\n    },{\r\n        'n': 'EVALUATE',\r\n        't': '3',\r\n        'd': '\u5C0D\u4EE5\u6587\u5B57\u8868\u793A\u7684\u516C\u5F0F\u6216\u8005\u8868\u9054\u5F0F\u6C42\u503C\uFF0C\u4E26\u8FD4\u56DE\u7D50\u679C\u3002',\r\n        'a': '\u6839\u64DA\u6587\u5B57\u516C\u5F0F\u6216\u8005\u8868\u9054\u5F0F\u6C42\u503C\u3002',\r\n        'm': [1, 1],\r\n        \"p\": [{\r\n            \"name\": \"\u516C\u5F0F\",\r\n            \"example\": '\"A1+5*2^2\"',\r\n            \"detail\": \"\u516C\u5F0F\u6216\u8868\u9054\u5F0F\",\r\n            \"require\": \"m\",\r\n            \"repeat\": \"n\",\r\n            \"type\": \"rangeall\"\r\n        }]\r\n    },\r\n    ],\r\n    toolbar: {\r\n        undo               : '\u64A4\u92B7',\r\n        redo               : '\u91CD\u505A',\r\n        paintFormat        : '\u683C\u5F0F\u5237',\r\n        currencyFormat     : '\u8CA8\u5E63\u683C\u5F0F',\r\n        percentageFormat   : '\u767E\u5206\u6BD4\u683C\u5F0F',\r\n        numberDecrease     : '\u51CF\u5C11\u5C0F\u6578\u4F4D\u6578',\r\n        numberIncrease     : '\u65B0\u589E\u5C0F\u6578\u4F4D\u6578',\r\n        moreFormats        : '\u66F4\u591A\u683C\u5F0F',\r\n        font               : '\u5B57\u9AD4',\r\n        fontSize           : '\u5B57\u578B\u5927\u5C0F',\r\n        bold               : '\u7C97\u9AD4\uFF08Ctrl+B\uFF09',\r\n        italic             : '\u659C\u9AD4\uFF08Ctrl+I\uFF09',\r\n        strikethrough      : '\u5220\u9664\u7DDA\uFF08Alt+Shift+5\uFF09',\r\n        underline          : '\u5E95\u7DDA',\r\n        textColor          : '\u6587\u5B57\u984F\u8272',\r\n        chooseColor        : '\u984F\u8272\u9078\u64C7',\r\n        resetColor         : '\u91CD\u7F6E\u984F\u8272',\r\n        customColor        : '\u81EA\u5B9A\u7FA9',\r\n        alternatingColors  : '\u4EA4\u66FF\u984F\u8272',\r\n        confirmColor       : '\u78BA\u5B9A\u984F\u8272',\r\n        cancelColor        : '\u53D6\u6D88',\r\n        collapse           : '\u6536\u8D77',\r\n        fillColor          : '\u5132\u5B58\u683C\u984F\u8272',\r\n        border             : '\u908A\u6846',\r\n        borderStyle        : '\u908A\u6846\u985E\u578B',\r\n        mergeCell          : '\u5408\u4F75\u5132\u5B58\u683C',\r\n        chooseMergeType    : '\u9078\u64C7\u5408\u4F75\u985E\u578B',\r\n        horizontalAlign    : '\u6C34\u51C6\u5C0D\u9F4A',\r\n        verticalAlign      : '\u5782\u76F4\u5C0D\u9F4A',\r\n        alignment          : '\u5C0D\u9F4A\u7BA1\u9053',\r\n        textWrap           : '\u6587\u5B57\u63DB\u884C',\r\n        textWrapMode       : '\u63DB\u884C\u7BA1\u9053',\r\n        textRotate         : '\u6587\u5B57\u65CB\u8F49',\r\n        textRotateMode     : '\u65CB\u8F49\u7BA1\u9053',\r\n        freezeTopRow       : '\u51CD\u7D50\u9996\u884C',\r\n        sortAndFilter      : '\u6392\u5E8F\u548C\u7BE9\u9078',\r\n        findAndReplace     : '\u67E5\u627E\u66FF\u63DB',\r\n        sum                : '\u6C42\u548C',\r\n        autoSum            : '\u81EA\u52D5\u6C42\u548C',\r\n        moreFunction       : '\u66F4\u591A\u51FD\u6578',\r\n        conditionalFormat  : '\u689D\u4EF6\u683C\u5F0F',\r\n        postil             : '\u6279\u8A3B',\r\n        pivotTable         : '\u6578\u64DA\u900F\u8996\u9336',\r\n        chart              : '\u5716\u8868',\r\n        screenshot         : '\u622A\u5716',\r\n        splitColumn        : '\u5206\u5217',\r\n        insertImage        : '\u63D2\u5165\u5716\u7247',\r\n        insertLink         : '\u63D2\u5165\u9023\u7D50',\r\n        dataVerification   : '\u6578\u64DA\u9A57\u8B49',\r\n        protection         : '\u4FDD\u8B77\u5DE5\u4F5C\u8868\u5167\u5BB9',\r\n        clearText          : '\u6E05\u9664\u984F\u8272\u9078\u64C7',\r\n        noColorSelectedText: '\u6C92\u6709\u984F\u8272\u88AB\u9078\u64C7',\r\n        toolMore           : '\u66F4\u591A',\r\n        toolLess           : '\u5C11\u65BC',\r\n        toolClose          : '\u6536\u8D77',\r\n        toolMoreTip        : '\u66F4\u591A\u529F\u80FD',\r\n        moreOptions        : '\u66F4\u591A\u9078\u9805',\r\n        cellFormat         : '\u8A2D\u5B9A\u5132\u5B58\u683C\u683C\u5F0F',\r\n        print              : '\u5217\u5370'\r\n    },\r\n    alternatingColors: {\r\n        applyRange        : '\u61C9\u7528\u7BC4\u570D',\r\n        selectRange       : '\u9078\u64C7\u61C9\u7528\u7BC4\u570D',\r\n        header            : '\u9801\u7709',\r\n        footer            : '\u9801\u8173',\r\n        errorInfo         : '\u4E0D\u80FD\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C,\u8ACB\u9078\u64C7\u55AE\u500B\u5340\u57DF,\u7136\u5F8C\u518D\u8A66',\r\n        textTitle         : '\u683C\u5F0F\u6A23\u5F0F',\r\n        custom            : '\u81EA\u5B9A\u7FA9',\r\n        close             : '\u95DC\u9589',\r\n        selectionTextColor: '\u9078\u64C7\u6587\u5B57\u984F\u8272',\r\n        selectionCellColor: '\u9078\u64C7\u5132\u5B58\u683C\u984F\u8272',\r\n        removeColor       : '\u79FB\u9664\u4EA4\u66FF\u984F\u8272',\r\n        colorShow         : '\u984F\u8272',\r\n        currentColor      : '\u7576\u524D\u984F\u8272',\r\n        tipSelectRange    : '\u8ACB\u9078\u64C7\u4EA4\u66FF\u984F\u8272\u61C9\u7528\u7BC4\u570D',\r\n        errorNoRange      : '\u60A8\u9078\u64C7\u7684\u61C9\u7528\u7BC4\u570D\u4E0D\u662F\u9078\u5340\uFF01',\r\n        errorExistColors  : '\u60A8\u9078\u64C7\u7684\u61C9\u7528\u7BC4\u570D\u5DF2\u5B58\u5728\u4EA4\u66FF\u984F\u8272\u4E14\u4E0D\u5C6C\u65BC\u4F60\u8981\u7DE8\u8F2F\u7684\u61C9\u7528\u7BC4\u570D\uFF01',\r\n    },\r\n    button: {\r\n        confirm: '\u78BA\u5B9A',\r\n        cancel : '\u53D6\u6D88',\r\n        close  : \"\u95DC\u9589\",\r\n        update : \"Update\",\r\n        delete : \"Delete\",\r\n        insert : \"\u65B0\u5EFA\",\r\n        prevPage: \"\u4E0A\u4E00\u9801\",\r\n        nextPage: \"\u4E0B\u4E00\u9801\",\r\n        total: \"\u7E3D\u5171\uFF1A\"\r\n    },\r\n    paint: {\r\n        start         : '\u683C\u5F0F\u5237\u958B\u555F',\r\n        end           : 'ESC\u9375\u9000\u51FA',\r\n        tipSelectRange: '\u8ACB\u9078\u64C7\u9700\u8981\u8907\u88FD\u683C\u5F0F\u7684\u5340\u57DF',\r\n        tipNotMulti   : '\u7121\u6CD5\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C',\r\n    },\r\n    format: {\r\n        moreCurrency : '\u66F4\u591A\u8CA8\u5E63\u683C\u5F0F',\r\n        moreDateTime : '\u66F4\u591A\u65E5\u671F\u8207\u6642\u9593\u683C\u5F0F',\r\n        moreNumber   : '\u66F4\u591A\u6578\u4F4D\u683C\u5F0F',\r\n        titleCurrency: '\u8CA8\u5E63\u683C\u5F0F',\r\n        decimalPlaces: '\u5C0F\u6578\u4F4D\u6578',\r\n        titleDateTime: '\u65E5\u671F\u8207\u6642\u9593\u683C\u5F0F',\r\n        titleNumber  : '\u6578\u4F4D\u683C\u5F0F'\r\n    },\r\n    info: {\r\n        detailUpdate: '\u65B0\u6253\u958B',\r\n        detailSave  : '\u5DF2\u6062\u5FA9\u672C\u5730\u7DE9\u5B58',\r\n        row         : '\u884C',\r\n        column      : '\u5217',\r\n        loading     : '\u6E32\u67D3\u4E2D\u00B7\u00B7\u00B7',\r\n\r\n        copy  : '\u526F\u672C',\r\n        return: '\u8FD4\u56DE',\r\n        rename: '\u91CD\u547D\u540D',\r\n        tips  : '\u8868\u683C\u91CD\u547D\u540D',\r\n        noName: '\u7121\u6A19\u984C\u7684\u8A66\u7B97\u8868',\r\n        wait  : '\u5F85\u66F4\u65B0',\r\n\r\n        add     : '\u6DFB\u52A0',\r\n        addLast : '\u5728\u5E95\u90E8\u6DFB\u52A0',\r\n        backTop : '\u56DE\u5230\u9802\u90E8',\r\n        pageInfo: '\u5171${total}\u689D,${totalPage}\u9801,\u7576\u524D\u5DF2\u986F\u793A${currentPage}\u9801',\r\n        nextPage: '\u4E0B\u4E00\u9801',\r\n\r\n        tipInputNumber     : '\u8ACB\u8F38\u5165\u6578\u4F4D',\r\n        tipInputNumberLimit: '\u65B0\u589E\u7BC4\u570D\u9650\u5236\u57281-100',\r\n\r\n        tipRowHeightLimit  : '\u884C\u9AD8\u5FC5\u9808\u57280 ~ 545\u4E4B\u9593',\r\n        tipColumnWidthLimit: '\u5217\u5BEC\u5FC5\u9808\u57280 ~ 2038\u4E4B\u9593',\r\n        pageInfoFull       : '\u5171${total}\u689D,${totalPage}\u9801,\u5DF2\u986F\u793A\u5168\u90E8\u6578\u64DA',\r\n    },\r\n    currencyDetail: {\r\n        RMB                             : '\u4EBA\u6C11\u5E63',\r\n        USdollar                        : '\u7F8E\u5143',\r\n        EUR                             : '\u6B50\u5143',\r\n        GBP                             : '\u82F1\u938A',\r\n        HK                              : '\u6E2F\u5143',\r\n        JPY                             : '\u65E5\u5143',\r\n        AlbanianLek                     : '\u963F\u723E\u5DF4\u5C3C\u4E9E\u5217\u514B',\r\n        AlgerianDinar                   : '\u963F\u723E\u53CA\u5229\u4E9E\u7B2C\u7D0D\u723E',\r\n        Afghani                         : '\u963F\u5BCC\u6C57\u5C3C',\r\n        ArgentinePeso                   : '\u963F\u6839\u5EF7\u6BD4\u7D22',\r\n        UnitedArabEmiratesDirham        : '\u963F\u62C9\u4F2F\u806F\u5408\u5927\u516C\u570B\u8FEA\u62C9\u59C6',\r\n        ArubanFlorin                    : '\u963F\u9B6F\u5DF4\u5F17\u7F85\u6797',\r\n        OmaniRial                       : '\u963F\u66FC\u88E1\u4E9E\u723E',\r\n        Azerbaijanimanat                : '\u963F\u585E\u62DC\u7586\u99AC\u7D0D\u7279',\r\n        EgyptianPound                   : '\u57C3\u53CA\u938A',\r\n        EthiopianBirr                   : '\u8863\u7D22\u6BD4\u4E9E\u6BD4\u723E',\r\n        AngolaKwanza                    : '\u5B89\u54E5\u62C9\u5BEC\u7D2E',\r\n        AustralianDollar                : '\u6FB3\u5927\u5229\u4E9E\u5143',\r\n        Patacas                         : '\u6FB3\u9580\u5143',\r\n        BarbadosDollar                  : '\u5DF4\u5DF4\u591A\u65AF\u5143',\r\n        PapuaNewGuineaKina              : '\u5DF4\u5E03\u4E9E\u65B0\u5E7E\u5167\u4E9E\u57FA\u90A3',\r\n        BahamianDollar                  : '\u5DF4\u54C8\u99AC\u5143',\r\n        PakistanRupee                   : '\u5DF4\u57FA\u65AF\u5766\u76E7\u6BD4',\r\n        ParaguayanGuarani               : '\u5DF4\u62C9\u572D\u74DC\u62C9\u5C3C',\r\n        BahrainiDinar                   : '\u5DF4\u6797\u7B2C\u7D0D\u723E',\r\n        PanamanianBalboa                : '\u5DF4\u62FF\u99AC\u5DF4\u6CE2\u4E9E',\r\n        Brazilianreal                   : '\u5DF4\u897F\u88CF\u4E9E\u4F0A',\r\n        Belarusianruble                 : '\u767D\u4FC4\u7F85\u65AF\u76E7\u5E03',\r\n        BermudianDollar                 : '\u767E\u6155\u5927\u5143',\r\n        BulgarianLev                    : '\u4FDD\u52A0\u5229\u4E9E\u5217\u5F17',\r\n        IcelandKrona                    : '\u51B0\u5CF6\u514B\u6717',\r\n        BosniaHerzegovinaConvertibleMark: '\u6CE2\u9ED1\u53EF\u514C\u63DB\u99AC\u514B',\r\n        PolishZloty                     : '\u6CE2\u862D\u8332\u7F85\u63D0',\r\n        Boliviano                       : '\u73BB\u5229\u7DAD\u4E9E\u8AFE',\r\n        BelizeDollar                    : '\u8C9D\u88E1\u65AF\u5143',\r\n        BotswanaPula                    : '\u6CE2\u5284\u90A3\u666E\u62C9',\r\n        NotDannuzhamu                   : '\u4E0D\u4E39\u52AA\u7D2E\u59C6',\r\n        BurundiFranc                    : '\u5E03\u9686\u8FEA\u6CD5\u90CE',\r\n        NorthKoreanWon                  : '\u671D\u9BAE\u5713',\r\n        DanishKrone                     : '\u4E39\u9EA5\u514B\u6717',\r\n        EastCaribbeanDollar             : '\u6771\u52A0\u52D2\u6BD4\u5143',\r\n        DominicaPeso                    : '\u591A\u660E\u5C3C\u52A0\u6BD4\u7D22',\r\n        RussianRuble                    : '\u4FC4\u570B\u76E7\u5E03',\r\n        EritreanNakfa                   : '\u5384\u5229\u5782\u4E9E\u7D0D\u514B\u6CD5',\r\n        CFAfranc                        : '\u975E\u6D32\u91D1\u878D\u5171\u540C\u9AD4\u6CD5\u90CE',\r\n        PhilippinePeso                  : '\u83F2\u5F8B\u8CD3\u6BD4\u7D22',\r\n        FijiDollar                      : '\u6590\u6FDF\u5143',\r\n        CapeVerdeEscudo                 : '\u4F5B\u5F97\u89D2\u57C3\u65AF\u5EAB\u591A',\r\n        FalklandIslandsPound            : '\u798F\u514B\u862D\u7FA4\u5CF6\u938A',\r\n        GambianDalasi                   : '\u5CA1\u6BD4\u4E9E\u9054\u62C9\u897F',\r\n        Congolesefranc                  : '\u525B\u679C\u6CD5\u90CE',\r\n        ColombianPeso                   : '\u54E5\u502B\u6BD4\u4E9E\u6BD4\u7D22',\r\n        CostaRicanColon                 : '\u54E5\u65AF\u5927\u9ECE\u52A0\u79D1\u6717',\r\n        CubanPeso                       : '\u53E4\u5DF4\u6BD4\u7D22',\r\n        Cubanconvertiblepeso            : '\u53E4\u5DF4\u53EF\u514C\u63DB\u6BD4\u7D22',\r\n        GuyanaDollar                    : '\u84CB\u4E9E\u90A3\u5143',\r\n        KazakhstanTenge                 : '\u54C8\u85A9\u514B\u5171\u548C\u570B\u5805\u6208',\r\n        Haitiangourde                   : '\u6D77\u5730\u53E4\u5FB7',\r\n        won                             : '\u97D3\u5143',\r\n        NetherlandsAntillesGuilder      : '\u8377\u5C6C\u5B89\u7684\u5217\u65AF\u76FE',\r\n        Honduraslempiras                : '\u6D2A\u90FD\u62C9\u65AF\u62C9\u502B\u76AE\u62C9',\r\n        DjiboutiFranc                   : '\u5409\u5E03\u63D0\u6CD5\u90CE',\r\n        KyrgyzstanSom                   : '\u5409\u723E\u5409\u65AF\u65AF\u5766\u7D22\u59C6',\r\n        GuineaFranc                     : '\u5E7E\u5167\u4E9E\u6CD5\u90CE',\r\n        CanadianDollar                  : '\u52A0\u62FF\u5927\u5143',\r\n        GhanaianCedi                    : '\u52A0\u7D0D\u585E\u5730',\r\n        Cambodianriel                   : '\u9AD8\u68C9\u745E\u723E',\r\n        CzechKoruna                     : '\u6377\u514B\u514B\u6717',\r\n        ZimbabweDollar                  : '\u8F9B\u5DF4\u5A01\u5143',\r\n        QatariRiyal                     : '\u5361\u5854\u723E\u88E1\u4E9E\u723E',\r\n        CaymanIslandsDollar             : '\u958B\u66FC\u7FA4\u5CF6\u5143',\r\n        Comorianfranc                   : '\u79D1\u6469\u7F85\u6CD5\u90CE',\r\n        KuwaitiDinar                    : '\u79D1\u5A01\u7279\u7B2C\u7D0D\u723E',\r\n        CroatianKuna                    : '\u514B\u7F85\u5730\u4E9E\u5EAB\u7D0D',\r\n        KenyanShilling                  : '\u80AF\u96C5\u5148\u4EE4',\r\n        LesothoLoti                     : '\u840A\u7D22\u6258\u6D1B\u8482',\r\n        LaoKip                          : '\u8001\u64BE\u57FA\u666E',\r\n        LebanesePound                   : '\u9ECE\u5DF4\u5AE9\u938A',\r\n        Lithuanianlitas                 : '\u7ACB\u9676\u5B9B\u7ACB\u7279',\r\n        LibyanDinar                     : '\u5229\u6BD4\u4E9E\u7B2C\u7D0D\u723E',\r\n        LiberianDollar                  : '\u5229\u6BD4\u4E9E\u5143',\r\n        RwandaFranc                     : '\u76E7\u5B89\u9054\u6CD5\u90CE',\r\n        RomanianLeu                     : '\u7F85\u99AC\u5C3C\u4E9E\u5217\u4F0A',\r\n        MalagasyAriary                  : '\u99AC\u62C9\u52A0\u897F\u963F\u88CF\u4E9E\u88CF',\r\n        MaldivianRufiyaa                : '\u746A\u5F8B\u5730\u592B\u62C9\u83F2\u4E9E',\r\n        MalawiKwacha                    : '\u99AC\u62C9\u5A01\u514B\u74E6\u67E5',\r\n        MalaysianRinggit                : '\u99AC\u4F86\u897F\u4E9E\u6797\u5409\u7279',\r\n        MacedoniawearingDinar           : '\u99AC\u5176\u9813\u6234\u7B2C\u7D0D\u723E',\r\n        MauritiusRupee                  : '\u6A21\u88E1\u897F\u65AF\u76E7\u6BD4',\r\n        MauritanianOuguiya              : '\u8305\u5229\u5854\u5C3C\u4E9E\u70CF\u5409\u4E9E',\r\n        MongolianTugrik                 : '\u8499\u53E4\u5716\u683C\u88E1\u514B',\r\n        BangladeshiTaka                 : '\u5B5F\u52A0\u62C9\u5854\u5361',\r\n        PeruvianNuevoSol                : '\u79D8\u9B6F\u65B0\u7D22\u723E',\r\n        MyanmarKyat                     : '\u7DEC\u7538\u958B\u4E9E\u7279',\r\n        MoldovanLeu                     : '\u83AB\u723E\u9054\u74E6\u5217\u4F0A',\r\n        MoroccanDirham                  : '\u6469\u6D1B\u54E5\u8FEA\u62C9\u59C6',\r\n        MozambiqueMetical               : '\u83AB\u4E09\u6BD4\u514B\u6885\u8482\u5361\u723E',\r\n        MexicanPeso                     : '\u58A8\u897F\u54E5\u6BD4\u7D22',\r\n        NamibianDollar                  : '\u7D0D\u7C73\u6BD4\u4E9E\u5143',\r\n        SouthAfricanRand                : '\u5357\u975E\u862D\u7279',\r\n        SouthSudanesePound              : '\u5357\u8607\u4E39\u938A',\r\n        NicaraguaCordoba                : '\u5C3C\u52A0\u62C9\u74DC\u79D1\u591A\u5DF4',\r\n        NepaleseRupee                   : '\u5C3C\u6CCA\u723E\u76E7\u6BD4',\r\n        NigerianNaira                   : '\u5948\u53CA\u5229\u4E9E\u5948\u62C9',\r\n        NorwegianKrone                  : '\u632A\u5A01\u514B\u6717',\r\n        GeorgianLari                    : '\u55AC\u6CBB\u4E9E\u62C9\u745E',\r\n        RMBOffshore                     : '\u4EBA\u6C11\u5E63\uFF08\u96E2\u5CB8\uFF09',\r\n        SwedishKrona                    : '\u745E\u5178\u514B\u6717',\r\n        SwissFranc                      : '\u745E\u58EB\u6CD5\u90CE',\r\n        SerbianDinar                    : '\u585E\u723E\u7DAD\u4E9E\u7B2C\u7D0D\u723E',\r\n        SierraLeone                     : '\u585E\u62C9\u91CC\u6602\u5229\u6602',\r\n        SeychellesRupee                 : '\u585E\u820C\u8033\u76E7\u6BD4',\r\n        SaudiRiyal                      : '\u6C99\u7279\u88E1\u4E9E\u723E',\r\n        SaoTomeDobra                    : '\u8056\u591A\u7F8E\u591A\u5E03\u62C9',\r\n        SaintHelenapound                : '\u8056\u8D6B\u502B\u90A3\u7FA4\u5CF6\u78C5',\r\n        SriLankaRupee                   : '\u65AF\u91CC\u862D\u5361\u76E7\u6BD4',\r\n        SwazilandLilangeni              : '\u53F2\u74E6\u6FDF\u862D\u88CF\u862D\u5409\u5C3C',\r\n        SudanesePound                   : '\u8607\u4E39\u938A',\r\n        Surinamesedollar                : '\u8607\u5229\u5357\u5143',\r\n        SolomonIslandsDollar            : '\u6240\u7F85\u9580\u7FA4\u5CF6\u5143',\r\n        SomaliShilling                  : '\u7D22\u99AC\u5229\u4E9E\u5148\u4EE4',\r\n        TajikistanSomoni                : '\u5854\u5409\u514B\u5171\u548C\u570B\u7D22\u83AB\u5C3C',\r\n        PacificFranc                    : '\u592A\u5E73\u6D0B\u6CD5\u90CE',\r\n        ThaiBaht                        : '\u6CF0\u570B\u9296',\r\n        TanzanianShilling               : '\u5766\u5C1A\u5C3C\u4E9E\u5148\u4EE4',\r\n        TonganPaanga                    : '\u6771\u52A0\u6F58\u52A0',\r\n        TrinidadandTobagoDollar         : '\u5343\u88E1\u9054\u6258\u8C9D\u54E5\u5143',\r\n        TunisianDinar                   : '\u7A81\u5C3C\u65AF\u7B2C\u7D0D\u723E',\r\n        TurkishLira                     : '\u571F\u8033\u5176\u91CC\u62C9',\r\n        VanuatuVatu                     : '\u74E6\u52AA\u963F\u5716\u74E6\u5716',\r\n        GuatemalanQuetzal               : '\u74DC\u5730\u99AC\u62C9\u683C\u67E5\u723E',\r\n        CommissionBolivar               : '\u59D4\u5167\u745E\u62C9\u535A\u5229\u74E6',\r\n        BruneiDollar                    : '\u6C76\u840A\u5143',\r\n        UgandanShilling                 : '\u70CF\u5E72\u9054\u5148\u4EE4',\r\n        UkrainianHryvnia                : '\u70CF\u514B\u862D\u683C\u88E1\u592B\u5C3C\u4E9E',\r\n        UruguayanPeso                   : '\u70CF\u62C9\u572D\u6BD4\u7D22',\r\n        Uzbekistansom                   : '\u70CF\u8332\u5225\u514B\u8607\u59C6',\r\n        WesternSamoaTala                : '\u85A9\u6469\u4E9E\u5854\u62C9',\r\n        SingaporeDollar                 : '\u65B0\u52A0\u5761\u5143',\r\n        NT                              : '\u65B0\u81FA\u5E63',\r\n        NewZealandDollar                : '\u65B0\u897F\u862D\u5143',\r\n        HungarianForint                 : '\u5308\u7259\u5229\u798F\u6797',\r\n        SyrianPound                     : '\u6558\u5229\u4E9E\u938A',\r\n        JamaicanDollar                  : '\u7259\u8CB7\u52A0\u5143',\r\n        ArmenianDram                    : '\u4E9E\u7F8E\u5C3C\u4E9E\u5FB7\u62C9\u59C6',\r\n        YemeniRial                      : '\u8449\u9580\u88E1\u4E9E\u723E',\r\n        IraqiDinar                      : '\u4F0A\u62C9\u514B\u7B2C\u7D0D\u723E',\r\n        IranianRial                     : '\u4F0A\u6717\u88E1\u4E9E\u723E',\r\n        NewIsraeliShekel                : '\u4EE5\u8272\u5217\u65B0\u8B1D\u514B\u723E',\r\n        IndianRupee                     : '\u5370\u5EA6\u76E7\u6BD4',\r\n        IndonesianRupiah                : '\u5370\u5C3C\u76E7\u6BD4',\r\n        JordanianDinar                  : '\u7D04\u65E6\u7B2C\u7D0D\u723E',\r\n        VND                             : '\u8D8A\u5357\u76FE',\r\n        ZambianKwacha                   : '\u5C1A\u6BD4\u4E9E\u514B\u74E6\u67E5',\r\n        GibraltarPound                  : '\u76F4\u5E03\u7F85\u9640\u938A',\r\n        ChileanPeso                     : '\u667A\u5229\u6BD4\u7D22',\r\n        CFAFrancBEAC                    : '\u4E2D\u975E\u91D1\u878D\u5408\u4F5C\u6CD5\u90CE',\r\n    },\r\n    defaultFmt: [\r\n        { \"text\": '\u81EA\u52D5', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": '\u7D14\u6587\u5B57', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u6578\u4F4D', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": '\u767E\u5206\u6BD4', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": '\u79D1\u5B78\u8A08\u6578', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u6703\u8A08', \"value\": \"\u00A5(0.00)\", \"example\": \"\u00A5(1200.09)\" },\r\n        //{ \"text\": \"\u8CA1\u52D9\", \"value\": \"(#.####)\", \"example\": \"(1200.09)\" },\r\n        { \"text\": '\u842C\u5143', \"value\": \"w\", \"example\": \"1\u4EBF2000\u4E072500\" },\r\n        { \"text\": '\u8CA8\u5E63', \"value\": \"\u00A50.00\", \"example\": \"\u00A51200.09\" },\r\n        //{ \"text\": \"\u8CA8\u5E63\u6574\u6578\", \"value\": \"\u00A5####\", \"example\": \"\u00A51200\" },\r\n        { \"text\": '\u842C\u51432\u4F4D\u5C0F\u6578', \"value\": \"w0.00\", \"example\": \"2\u4E072500.55\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u65E5\u671F', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": '\u6642\u9593', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": '\u6642\u959324H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": '\u65E5\u671F\u6642\u9593', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": '\u65E5\u671F\u6642\u959324H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '\u81EA\u5B9A\u7FA9\u683C\u5F0F', \"value\": \"fmtOtherSelf\", \"example\": \"more\" }\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            \"name\" : \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\" : \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\" : \"1930\u5E748\u67085\u65E5\",\r\n            \"value\": 'yyyy\"\u5E74\"M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\" : \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\" : \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\" : \"8\u67085\u65E5\",\r\n            \"value\": 'M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\" : \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\" : \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\" : \"\u4E0B\u534801:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 hh:mm'\r\n        },\r\n        {\r\n            \"name\" : \"\u4E0B\u53481:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm'\r\n        },\r\n        {\r\n            \"name\" : \"\u4E0B\u53481:30:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm:ss'\r\n        },\r\n        {\r\n            \"name\" : \"08-05 \u4E0B\u534801:30\",\r\n            \"value\": \"MM-dd \u4E0A\u5348/\u4E0B\u5348 hh:mm\"\r\n        },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C \u4E0B\u53481:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    fontFamily: {\r\n        MicrosoftYaHei: \"Microsoft YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\", \"Arial\", \"Tahoma\", \"Verdana\", \"\u5FAE\u8EDF\u96C5\u9ED1\", \"\u5B8B\u9AD4\", \"\u9ED1\u9AD4\", \"\u6977\u9AD4\", \"\u4EFF\u5B8B\", \"\u65B0\u5B8B\u9AD4\", \"\u83EF\u6587\u65B0\u9B4F\", \"\u83EF\u6587\u884C\u6977\", \"\u83EF\u6587\u96B8\u66F8\"],\r\n    fontjson : { \"times new roman\": 0, \"arial\": 1, \"tahoma\": 2, \"verdana\": 3, \"\u5FAE\u8EDF\u96C5\u9ED1\": 4, \"microsoft yahei\": 4, \"\u5B8B\u9AD4\": 5, \"simsun\": 5, \"\u9ED1\u9AD4\": 6, \"simhei\": 6, \"\u6977\u9AD4\": 7, \"kaiti\": 7, \"\u4EFF\u5B8B\": 8, \"fangsong\": 8, \"\u65B0\u5B8B\u9AD4\": 9, \"nsimsun\": 9, \"\u83EF\u6587\u65B0\u9B4F\": 10, \"stxinwei\": 10, \"\u83EF\u6587\u884C\u6977\": 11, \"stxingkai\": 11, \"\u83EF\u6587\u96B8\u66F8\": 12, \"stliti\": 12, },\r\n    border   : {\r\n        borderTop       : '\u4E0A\u6846\u7DDA',\r\n        borderBottom    : '\u4E0B\u6846\u7DDA',\r\n        borderLeft      : '\u5DE6\u6846\u7DDA',\r\n        borderRight     : '\u53F3\u6846\u7DDA',\r\n        borderNone      : '\u7121',\r\n        borderAll       : '\u6240\u6709',\r\n        borderOutside   : '\u5916\u5074',\r\n        borderInside    : '\u5167\u5074',\r\n        borderHorizontal: '\u5167\u5074\u6A6B\u7DDA',\r\n        borderVertical  : '\u5167\u5074\u5206\u9694\u865F',\r\n        borderColor     : '\u908A\u6846\u984F\u8272',\r\n        borderSize      : '\u908A\u6846\u7C97\u7D30'\r\n    },\r\n    merge: {\r\n        mergeAll        : \"\u5168\u90E8\u5408\u4F75\",\r\n        mergeV          : \"\u5782\u76F4\u5408\u4F75\",\r\n        mergeH          : \"\u6C34\u5E73\u5408\u4F75\",\r\n        mergeCancel     : \"\u53D6\u6D88\u5408\u4F75\",\r\n        overlappingError: \"\u4E0D\u80FD\u5408\u4F75\u91CD\u758A\u5340\u57DF\",\r\n        partiallyError  : \"\u7121\u6CD5\u5C0D\u90E8\u5206\u5408\u4F75\u5132\u5B58\u683C\u57F7\u884C\u6B64\u64CD\u4F5C\",\r\n    },\r\n    align: {\r\n        left  : \"\u5DE6\u5C0D\u9F4A\",\r\n        center: \"\u4E2D\u9593\u5C0D\u9F4A\",\r\n        right : \"\u53F3\u5C0D\u9F4A\",\r\n\r\n        top   : \"\u9802\u90E8\u5C0D\u9F4A\",\r\n        middle: \"\u5C45\u4E2D\u5C0D\u9F4A\",\r\n        bottom: \"\u5E95\u90E8\u5C0D\u9F4A\",\r\n    },\r\n    textWrap: {\r\n        \"overflow\": \"\u6EA2\u51FA\",\r\n        \"wrap\"    : \"\u81EA\u52D5\u63DB\u884C\",\r\n        \"clip\"    : \"\u622A\u65B7\",\r\n    },\r\n    rotation: {\r\n        \"none\"        : \"\u7121\u65CB\u8F49\",\r\n        \"angleup\"     : \"\u5411\u4E0A\u50BE\u659C\",\r\n        \"angledown\"   : \"\u5411\u4E0B\u50BE\u659C\",\r\n        \"vertical\"    : \"\u8C4E\u6392\u6587\u5B57\",\r\n        \"rotationUp\"  : \"\u5411\u4E0A90\u00B0\",\r\n        \"rotationDown\": \"\u5411\u4E0B90\u00B0\"\r\n    },\r\n    freezen: {\r\n        default           : \"\u51CD\u7D50\u9996\u884C\",\r\n        freezenRow        : \"\u51CD\u7D50\u9996\u884C\",\r\n        freezenColumn     : \"\u51CD\u7D50\u9996\u5217\",\r\n        freezenRC         : \"\u51CD\u7D50\u884C\u5217\",\r\n        freezenRowRange   : \"\u51CD\u7D50\u884C\u5230\u9078\u5340\",\r\n        freezenColumnRange: \"\u51CD\u7D50\u5217\u5230\u9078\u5340\",\r\n        freezenRCRange    : \"\u51CD\u7D50\u884C\u5217\u5230\u9078\u5340\",\r\n        freezenCancel     : \"\u53D6\u6D88\u51CD\u7D50\",\r\n\r\n        noSeletionError: \"\u6CA1\u6709\u9078\u5340\",\r\n    },\r\n    sort: {\r\n        \"asc\"   : \"\u6607\u51AA\",\r\n        \"desc\"  : \"\u964D\u5E8F\",\r\n        \"custom\": \"\u81EA\u5B9A\u7FA9\u6392\u5E8F\",\r\n\r\n        \"hasTitle\" : \"\u6578\u64DA\u5177\u6709\u6A19\u984C\u884C\",\r\n        \"sortBy\"   : \"\u6392\u5E8F\u4F9D\u64DA\",\r\n        \"addOthers\": \"\u6DFB\u52A0\u5176\u4ED6\u6392\u5E8F\u5217\",\r\n        \"close\"    : \"\u95DC\u9589\",\r\n        \"confirm\"  : \"\u6392\u5E8F\",\r\n\r\n        \"columnOperation\": \"\u5217\",\r\n        \"secondaryTitle\" : \"\u6B21\u8981\u6392\u5E8F\",\r\n\r\n        \"sortTitle\": \"\u6392\u5E8F\u7BC4\u570D\",\r\n\r\n        \"sortRangeTitle\"  : \"\u6392\u5E8F\u7BC4\u570D\u5F9E\",\r\n        \"sortRangeTitleTo\": \"\u5230\",\r\n\r\n\r\n        \"noRangeError\": \"\u4E0D\u80FD\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C,\u8ACB\u9078\u64C7\u55AE\u500B\u5340\u57DF,\u7136\u5F8C\u518D\u8A66\",\r\n        \"mergeError\"  : \"\u9078\u5340\u6709\u5408\u4F75\u5132\u5B58\u683C,\u7121\u6CD5\u57F7\u884C\u6B64\u64CD\u4F5C\uFF01\",\r\n\r\n    },\r\n    filter: {\r\n        \"filter\"     : \"\u7BE9\u9078\",\r\n        \"clearFilter\": \"\u6E05\u9664\u7BE9\u9078\",\r\n\r\n        sortByAsc        : \"\u4EE5A-Z\u6607\u51AA\u6392\u5217\",\r\n        sortByDesc       : \"\u4EE5Z-A\u964D\u5E8F\u6392\u5217\",\r\n        filterByColor    : \"\u6309\u984F\u8272\u7BE9\u9078\",\r\n        filterByCondition: \"\u6309\u689D\u4EF6\u904E\u6FFE\",\r\n        filterByValues   : \"\u6309\u503C\u904E\u6FFE\",\r\n\r\n        filiterInputNone: \"\u7121\",\r\n\r\n        filiterInputTip     : \"\u8F38\u5165\u7BE9\u9078\u503C\",\r\n        filiterRangeStartTip: \"\u7BC4\u570D\u958B\u59CB\",\r\n        filiterRangeEndTip  : \"\u7BC4\u570D\u7ED3\u675F\",\r\n\r\n        filterValueByAllBtn    : \"\u5168\u9078\",\r\n        filterValueByClearBtn  : \"\u6E05\u9664\",\r\n        filterValueByInverseBtn: \"\u53CD\u9078\",\r\n        filterValueByTip       : \"\u6309\u7167\u503C\u9032\u884C\u7BE9\u9078\",\r\n        filterConform          : \"\u78BA \u8A8D\",\r\n        filterCancel           : \"\u53D6 \u6D88\",\r\n        clearFilter            : \"\u6E05\u9664\u7BE9\u9078\",\r\n\r\n        conditionNone              : \"\u7121\",\r\n        conditionCellIsNull        : \"\u5132\u5B58\u683C\u70BA\u7A7A\",\r\n        conditionCellNotNull       : \"\u5132\u5B58\u683C\u6709\u6578\u64DA\",\r\n        conditionCellTextContain   : \"\u6587\u5B57\u5305\u542B\",\r\n        conditionCellTextNotContain: \"\u6587\u5B57\u4E0D\u5305\u542B\",\r\n        conditionCellTextStart     : \"\u6587\u5B57\u958B\u982D\u70BA\",\r\n        conditionCellTextEnd       : \"\u6587\u5B57\u7D50\u5C3E\u70BA\",\r\n        conditionCellTextEqual     : \"\u6587\u5B57\u7B49\u65BC\",\r\n        conditionCellDateEqual     : \"\u65E5\u671F\u7B49\u65BC\",\r\n        conditionCellDateBefore    : \"\u65E5\u671F\u65E9\u65BC\",\r\n        conditionCellDateAfter     : \"\u65E5\u671F\u665A\u65BC\",\r\n        conditionCellGreater       : \"\u5927\u65BC\",\r\n        conditionCellGreaterEqual  : \"\u5927\u65BC\u7B49\u65BC\",\r\n        conditionCellLess          : \"\u5C0F\u65BC\",\r\n        conditionCellLessEqual     : \"\u5C0F\u4E8E\u7B49\u65BC\",\r\n        conditionCellEqual         : \"\u7B49\u65BC\",\r\n        conditionCellNotEqual      : \"\u4E0D\u7B49\u65BC\",\r\n        conditionCellBetween       : \"\u4ECB\u65BC\",\r\n        conditionCellNotBetween    : \"\u4E0D\u5728\u5176\u4E2D\",\r\n\r\n        filiterMoreDataTip        : \"\u6578\u64DA\u91CF\u5927\uFF01\u8ACB\u7A0D\u5F8C\",\r\n        filiterMonthText          : \"\u6708\",\r\n        filiterYearText           : \"\u5E74\",\r\n        filiterByColorTip         : \"\u6309\u5132\u5B58\u683C\u984F\u8272\u7BE9\u9078\",\r\n        filiterByTextColorTip     : \"\u6309\u5132\u5B58\u683C\u5B57\u9AD4\u984F\u8272\u7BE9\u9078\",\r\n        filterContainerOneColorTip: \"\u672C\u5217\u50C5\u5305\u542B\u4E00\u7A2E\u984F\u8272\",\r\n        filterDateFormatTip       : \"\u65E5\u671F\u683C\u5F0F\",\r\n\r\n        valueBlank: \"(\u7A7A\u767D)\",\r\n        mergeError: \"\u7BE9\u9078\u9078\u5340\u6709\u5408\u4F75\u5132\u5B58\u683C,\u7121\u6CD5\u57F7\u884C\u6B64\u64CD\u4F5C\uFF01\",\r\n    },\r\n    rightclick: {\r\n        copy             : '\u8907\u88FD',\r\n        copyAs           : '\u8907\u88FD\u70BA',\r\n        paste            : '\u7C98\u8CBC',\r\n        insert           : '\u63D2\u5165',\r\n        delete           : '\u5220\u9664',\r\n        deleteCell       : '\u5220\u9664\u5132\u5B58\u683C',\r\n        deleteSelected   : '\u5220\u9664\u9078\u4E2D',\r\n        hide             : '\u96B1\u85CF',\r\n        hideSelected     : '\u96B1\u85CF\u9078\u4E2D',\r\n        showHide         : '\u986F\u793A\u96B1\u85CF',\r\n        to               : '\u5411',\r\n        left             : '\u5DE6',\r\n        right            : '\u53F3',\r\n        top              : '\u4E0A',\r\n        bottom           : '\u4E0B',\r\n        moveLeft         : '\u5DE6\u79FB',\r\n        moveUp           : '\u4E0A\u79FB',\r\n        add              : '\u65B0\u589E',\r\n        row              : '\u884C',\r\n        column           : '\u5217',\r\n        width            : '\u5BEC',\r\n        height           : '\u9AD8',\r\n        number           : '\u6578\u4F4D',\r\n        confirm          : '\u78BA\u8A8D',\r\n        orderAZ          : 'A-Z\u9806\u5E8F\u6392\u5217',\r\n        orderZA          : 'Z-A\u964D\u5E8F\u6392\u5217',\r\n        clearContent     : '\u6E05\u9664\u5167\u5BB9',\r\n        matrix           : '\u77E9\u9663\u64CD\u4F5C\u9078\u5340',\r\n        sortSelection    : '\u6392\u5E8F\u9078\u5340',\r\n        filterSelection  : '\u7BE9\u9078\u9078\u5340',\r\n        chartGeneration  : '\u5716\u8868\u751F\u6210',\r\n        firstLineTitle   : '\u9996\u884C\u70BA\u6A19\u984C',\r\n        untitled         : '\u7121\u6A19\u984C',\r\n        array1           : '\u4E00\u7DAD\u6578\u7D44',\r\n        array2           : '\u4E8C\u7DAD\u9663\u5217',\r\n        array3           : '\u591A\u5143\u6578\u7D44',\r\n        diagonal         : '\u5C0D\u89D2\u7DDA',\r\n        antiDiagonal     : '\u53CD\u5C0D\u89D2\u7DDA',\r\n        diagonalOffset   : '\u5C0D\u89D2\u504F\u79FB',\r\n        offset           : '\u504F\u79FB\u91CF',\r\n        boolean          : '\u5E03\u6797\u503C',\r\n        flip             : '\u7FFB\u8F49',\r\n        upAndDown        : '\u4E0A\u4E0B',\r\n        leftAndRight     : '\u5DE6\u53F3',\r\n        clockwise        : '\u9806\u6642\u91DD',\r\n        counterclockwise : '\u9006\u6642\u91DD',\r\n        transpose        : '\u8F49\u7F6E',\r\n        matrixCalculation: '\u77E9\u9663\u8A08\u7B97',\r\n        plus             : '\u52A0',\r\n        minus            : '\u51CF',\r\n        multiply         : '\u4E58',\r\n        divided          : '\u9664',\r\n        power            : '\u6B21\u65B9',\r\n        root             : '\u6B21\u65B9\u6839',\r\n        log              : 'log',\r\n        delete0          : '\u5220\u9664\u5169\u7AEF0\u503C',\r\n        removeDuplicate  : '\u5220\u9664\u91CD\u8907\u503C',\r\n        byRow            : '\u6309\u884C',\r\n        byCol            : '\u6309\u5217',\r\n        generateNewMatrix: '\u751F\u6210\u65B0\u77E9\u9663',\r\n    },\r\n    comment: {\r\n        \"insert\" : \"\u65B0\u5EFA\u6279\u8A3B\",\r\n        \"edit\"   : \"\u7DE8\u8F2F\u6279\u8A3B\",\r\n        \"delete\" : \"\u5220\u9664\",\r\n        \"showOne\": \"\u986F\u793A/\u96B1\u85CF\u6279\u8A3B\",\r\n        \"showAll\": \"\u986F\u793A/\u96B1\u85CF\u6240\u6709\u6279\u8A3B\"\r\n    },\r\n    screenshot: {\r\n        screenshotTipNoSelection: \"\u8ACB\u6846\u9078\u9700\u8981\u622A\u5716\u7684\u7BC4\u570D\",\r\n        screenshotTipTitle      : \"\u63D0\u793A\uFF01\",\r\n        screenshotTipHasMerge   : \"\u7121\u6CD5\u5C0D\u5408\u4F75\u5132\u5B58\u683C\u57F7\u884C\u6B64\u64CD\u4F5C\",\r\n        screenshotTipHasMulti   : \"\u7121\u6CD5\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C\",\r\n        screenshotTipSuccess    : \"\u622A\u53D6\u6210\u529F\",\r\n        screenshotImageName     : \"\u622A\u5716\",\r\n\r\n        downLoadClose: \"\u95DC\u9589\",\r\n        downLoadCopy : \"\u8907\u88FD\u5230\u526A\u5207\u677F\",\r\n        downLoadBtn  : \"\u4E0B\u8F09\",\r\n        browserNotTip: \"\u4E0B\u8F09\u529F\u80FDIE\u700F\u89BD\u5668\u4E0D\u652F\u6301\uFF01\",\r\n        rightclickTip: \"\u8ACB\u5728\u5716\u7247\u4E0A\u53F3\u9375\u9EDE\u64CA'\u8907\u88FD'\",\r\n        successTip   : \"\u5DF2\u6210\u529F\u8907\u88FD\uFF08\u5982\u679C\u7C98\u8CBC\u5931\u6557,\u8ACB\u5728\u5716\u7247\u4E0A\u53F3\u9375\u9EDE\u64CA'\u8907\u88FD\u5716\u7247'\uFF09\",\r\n    },\r\n    splitText: {\r\n        splitDelimiters    : \"\u5206\u5272\u7B26\u865F\",\r\n        splitOther         : \"\u5176\u5B83\",\r\n        splitContinueSymbol: \"\u9023\u7E8C\u5206\u9694\u7B26\u865F\u8996\u70BA\u55AE\u500B\u8655\u7406\",\r\n        splitDataPreview   : \"\u6578\u64DA\u9810\u89BD\",\r\n        splitTextTitle     : \"\u6587\u5B57\u5206\u5217\",\r\n        splitConfirmToExe  : \"\u6B64\u8655\u5DF2\u6709\u6578\u64DA,\u662F\u5426\u66FF\u63DB\u5B83\uFF1F\",\r\n\r\n        tipNoMulti      : \"\u80FD\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C,\u8ACB\u9078\u64C7\u55AE\u500B\u5340\u57DF,\u7136\u5F8C\u518D\u8A66\",\r\n        tipNoMultiColumn: \"\u4E00\u6B21\u53EA\u80FD\u8F49\u63DB\u4E00\u5217\u6578\u64DA,\u9078\u5B9A\u5340\u57DF\u53EF\u4EE5\u6709\u591A\u884C,\u4F46\u4E0D\u80FD\u6709\u591A\u5217,\u8ACB\u5728\u9078\u5B9A\u55AE\u5217\u5340\u57DF\u4EE5\u5F8C\u518D\u8A66\",\r\n    },\r\n    imageText: {\r\n        imageSetting: '\u5716\u7247\u8A2D\u5B9A',\r\n        close       : '\u95DC\u9589',\r\n        conventional: '\u5E38\u898F',\r\n        moveCell1   : '\u79FB\u52D5\u4E26\u8ABF\u6574\u5132\u5B58\u683C\u5927\u5C0F',\r\n        moveCell2   : '\u79FB\u52D5\u4E26\u4E14\u4E0D\u8ABF\u6574\u5132\u5B58\u683C\u7684\u5927\u5C0F',\r\n        moveCell3   : '\u4E0D\u8981\u79FB\u52D5\u5132\u5B58\u683C\u4E26\u8ABF\u6574\u5176\u5927\u5C0F',\r\n        fixedPos    : '\u56FA\u5B9A\u4F4D\u7F6E',\r\n        border      : '\u908A\u6846',\r\n        width       : '\u5BEC\u5EA6',\r\n        radius      : '\u534A\u5F91',\r\n        style       : '\u6A23\u5F0F',\r\n        solid       : '\u5BE6\u7DDA',\r\n        dashed      : '\u865B\u7DDA',\r\n        dotted      : '\u9EDE\u72C0',\r\n        double      : '\u96D9\u7DDA',\r\n        color       : '\u984F\u8272',\r\n    },\r\n    punctuation: {\r\n        \"tab\"      : \"Tab \u9375\",\r\n        \"semicolon\": \"\u5206\u865F\",\r\n        \"comma\"    : \"\u9017\u865F\",\r\n        \"space\"    : \"\u7A7A\u683C\",\r\n\r\n    },\r\n    findAndReplace: {\r\n        find            : \"\u67E5\u627E\",\r\n        replace         : \"\u66FF\u63DB\",\r\n        goto            : \"\u8F49\u5230\",\r\n        location        : \"\u5B9A\u4F4D\u689D\u4EF6\",\r\n        formula         : \"\u516C\u5F0F\",\r\n        date            : \"\u65E5\u671F\",\r\n        number          : \"\u6578\u4F4D\",\r\n        string          : \"\u5B57\u5143\",\r\n        error           : \"\u932F\u8AA4\",\r\n        condition       : \"\u689D\u4EF6\u683C\u5F0F\",\r\n        rowSpan         : \"\u9593\u9694\u884C\",\r\n        columnSpan      : \"\u9593\u9694\u5217\",\r\n        locationExample : \"\u5B9A\u4F4D\",\r\n        lessTwoRowTip   : \"\u8ACB\u9078\u64C7\u6700\u5C11\u5169\u884C\",\r\n        lessTwoColumnTip: \"\u8ACB\u9078\u64C7\u6700\u5C11\u5169\u884C\",\r\n\r\n        findTextbox   : \"\u67E5\u627E\u5185\u5BB9\",\r\n        replaceTextbox: \"\u66FF\u63DB\u5167\u5BB9\",\r\n\r\n        regexTextbox      : \"\u898F\u5247\u904B\u7B97\u5F0F\u5339\u914D\",\r\n        wholeTextbox      : \"\u6574\u8A5E\u5339\u914D\",\r\n        distinguishTextbox: \"\u5340\u5206\u5927\u5C0F\u5BEB\u5339\u914D\",\r\n\r\n        allReplaceBtn: \"\u5168\u90E8\u66FF\u63DB\",\r\n        replaceBtn   : \"\u66FF\u63DB\",\r\n        allFindBtn   : \"\u67E5\u627E\u5168\u90E8\",\r\n        findBtn      : \"\u67E5\u627E\u4E0B\u4E00\u500B\",\r\n\r\n        noFindTip: \"\u6C92\u6709\u67E5\u627E\u5230\u8A72\u5167\u5BB9\",\r\n        modeTip  : \"\u8A72\u6A21\u5F0F\u4E0B\u4E0D\u53EF\u9032\u884C\u6B64\u64CD\u4F5C\",\r\n\r\n        searchTargetSheet: \"\u5DE5\u4F5C\u8868\",\r\n        searchTargetCell : \"\u5132\u5B58\u683C\",\r\n        searchTargetValue: \"\u503C\",\r\n\r\n        searchInputTip: \"\u8ACB\u8F38\u5165\u67E5\u627E\u5167\u5BB9\",\r\n\r\n        noReplceTip: \"\u6C92\u6709\u53EF\u66FF\u63DB\u7684\u5167\u5BB9\",\r\n        noMatchTip : \"\u627E\u4E0D\u5230\u5339\u914D\u9805\",\r\n\r\n        successTip: \"\u5DF2\u7D93\u5E6B\u60A8\u8490\u7D22\u4E26\u9032\u884C\u4E86${xlength}\u8655\u66FF\u63DB\",\r\n\r\n        locationConstant  : \"\u5E38\u6578\",\r\n        locationFormula   : \"\u516C\u5F0F\",\r\n        locationDate      : \"\u65E5\u671F\",\r\n        locationDigital   : \"\u6578\u4F4D\",\r\n        locationString    : \"\u5B57\u5143\",\r\n        locationBool      : \"\u908F\u8F2F\u503C\",\r\n        locationError     : \"\u932F\u8AA4\",\r\n        locationNull      : \"\u7A7A\u503C\",\r\n        locationCondition : \"\u689D\u4EF6\u683C\u5F0F\",\r\n        locationRowSpan   : \"\u9593\u9694\u884C\",\r\n        locationColumnSpan: \"\u9593\u9694\u5217\",\r\n\r\n        locationTiplessTwoRow   : \"\u8ACB\u9078\u64C7\u6700\u5C11\u5169\u884C\",\r\n        locationTiplessTwoColumn: \"\u8ACB\u9078\u64C7\u6700\u5C11\u5169\u5217\",\r\n        locationTipNotFindCell  : \"\u672A\u627E\u5230\u5132\u5B58\u683C\"\r\n\r\n    },\r\n    sheetconfig: {\r\n        delete     : '\u5220\u9664',\r\n        copy       : '\u8907\u88FD',\r\n        rename     : '\u91CD\u547D\u540D',\r\n        changeColor: '\u66F4\u6539\u984F\u8272',\r\n        hide       : '\u96B1\u85CF',\r\n        unhide     : '\u53D6\u6D88\u96B1\u85CF',\r\n        moveLeft   : '\u5411\u5DE6\u79FB',\r\n        moveRight  : '\u5411\u53F3\u79FB',\r\n        resetColor : '\u91CD\u7F6E\u984F\u8272',\r\n        cancelText : '\u53D6\u6D88',\r\n        chooseText : '\u78BA\u5B9A\u984F\u8272',\r\n\r\n        tipNameRepeat              : \"\u7C64\u9801\u7684\u540D\u7A31\u4E0D\u80FD\u91CD\u8907\uFF01\u8ACB\u91CD\u65B0\u4FEE\u6539\",\r\n        noMoreSheet                : \"\u5DE5\u4F5C\u8584\u5167\u81F3\u5C11\u542B\u6709\u4E00\u5F35\u53EF\u8996\u5DE5\u4F5C\u8868\u3002\u82E5\u9700\u5220\u9664\u9078\u5B9A\u7684\u5DE5\u4F5C\u8868,\u8ACB\u5148\u63D2\u5165\u4E00\u5F35\u65B0\u5DE5\u4F5C\u8868\u6216\u986F\u793A\u4E00\u5F35\u96B1\u85CF\u7684\u5DE5\u4F5C\u8868\u3002\u3002\",\r\n        confirmDelete              : \"\u662F\u5426\u5220\u9664\",\r\n        redoDelete                 : \"\u53EF\u4EE5\u901A\u904ECtrl+Z\u64A4\u92B7\u5220\u9664\",\r\n        noHide                     : \"\u4E0D\u80FD\u96B1\u85CF,\u81F3\u5C11\u4FDD\u7559\u4E00\u500Bsheet\u6A19\u7C64\",\r\n        chartEditNoOpt             : \"\u5716\u8868\u7DE8\u8F2F\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8A31\u8A72\u64CD\u4F5C\uFF01\",\r\n        sheetNameSpecCharError     : \"\u540D\u7A31\u4E0D\u80FD\u5305\u542B:[ ] : \\ ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError: \"\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan         : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u5927\u65BC',\r\n        conditionformat_greaterThan_title   : '\u70BA\u5927\u65BC\u4EE5\u4E0B\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_lessThan            : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u5C0F\u65BC',\r\n        conditionformat_lessThan_title      : '\u70BA\u5C0F\u65BC\u4EE5\u4E0B\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_betweenness         : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u4ECB\u65BC',\r\n        conditionformat_betweenness_title   : '\u70BA\u4ECB\u65BC\u4EE5\u4E0B\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_equal               : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u7B49\u65BC',\r\n        conditionformat_equal_title         : '\u70BA\u7B49\u65BC\u4EE5\u4E0B\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_textContains        : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u6587\u5B57\u5305\u542B',\r\n        conditionformat_textContains_title  : '\u70BA\u5305\u542B\u4EE5\u4E0B\u6587\u5B57\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_occurrenceDate      : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u767C\u751F\u65E5\u671F',\r\n        conditionformat_occurrenceDate_title: '\u70BA\u5305\u542B\u4EE5\u4E0B\u65E5\u671F\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_duplicateValue      : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u91CD\u8907\u503C',\r\n        conditionformat_duplicateValue_title: '\u70BA\u5305\u542B\u4EE5\u4E0B\u985E\u578B\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_top10               : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u524D10\u9805',\r\n        conditionformat_top10_percent       : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u524D10%',\r\n        conditionformat_top10_title         : '\u70BA\u503C\u6700\u5927\u7684\u90A3\u4E9B\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_last10              : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u6700\u5F8C10\u9805',\r\n        conditionformat_last10_percent      : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u6700\u5F8C10%',\r\n        conditionformat_last10_title        : '\u70BA\u503C\u6700\u5C0F\u7684\u90A3\u4E9B\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_AboveAverage        : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u9AD8\u65BC\u5E73\u5747\u503C',\r\n        conditionformat_AboveAverage_title  : '\u70BA\u9AD8\u65BC\u5E73\u5747\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        conditionformat_SubAverage          : '\u689D\u4EF6\u683C\u5F0F\u2014\u2014\u4F4E\u65BC\u5E73\u5747\u503C',\r\n        conditionformat_SubAverage_title    : '\u70BA\u4F4E\u65BC\u5E73\u5747\u503C\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        rule                                : '\u898F\u5247',\r\n        newRule                             : '\u65B0\u5EFA\u898F\u5247',\r\n        editRule                            : '\u7DE8\u8F2F\u898F\u5247',\r\n        deleteRule                          : '\u5220\u9664\u898F\u5247',\r\n        deleteCellRule                      : '\u6E05\u9664\u6240\u9078\u5132\u5B58\u683C\u7684\u898F\u5247',\r\n        deleteSheetRule                     : '\u6E05\u9664\u6574\u500B\u5DE5\u4F5C\u8868\u7684\u898F\u5247',\r\n        manageRules                         : '\u7BA1\u7406\u898F\u5247',\r\n        showRules                           : '\u986F\u793A\u5176\u683C\u5F0F\u898F\u5247',\r\n        highlightCellRules                  : '\u7A81\u51FA\u986F\u793A\u5132\u5B58\u683C\u898F\u5247',\r\n        itemSelectionRules                  : '\u9805\u76EE\u9078\u53D6\u898F\u5247',\r\n        conditionformatManageRules          : '\u689D\u4EF6\u683C\u5F0F\u898F\u5247\u7BA1\u7406\u5668',\r\n        format                              : '\u683C\u5F0F',\r\n        setFormat                           : '\u8A2D\u5B9A\u683C\u5F0F',\r\n        setAs                               : '\u8A2D\u5B9A\u70BA',\r\n        setAsByArea                         : '\u91DD\u5C0D\u9078\u5B9A\u5340\u57DF,\u8A2D\u5B9A\u70BA',\r\n        applyRange                          : '\u61C9\u7528\u7BC4\u570D',\r\n        selectRange                         : '\u9EDE\u64CA\u9078\u64C7\u61C9\u7528\u7BC4\u570D',\r\n        selectRange_percent                 : '\u6240\u9078\u7BC4\u570D\u7684\u767E\u5206\u6BD4',\r\n        selectRange_average                 : '\u9078\u5B9A\u7BC4\u570D\u7684\u5E73\u5747\u503C',\r\n        selectRange_value                   : '\u9078\u5B9A\u7BC4\u570D\u4E2D\u7684\u6578\u503C',\r\n        pleaseSelectRange                   : '\u8ACB\u9078\u64C7\u61C9\u7528\u7BC4\u570D',\r\n        selectDataRange                     : '\u9EDE\u64CA\u9078\u64C7\u6578\u64DA\u7BC4\u570D',\r\n        selectCell                          : '\u9078\u64C7\u5132\u5B58\u683C',\r\n        pleaseSelectCell                    : '\u8ACB\u9078\u64C7\u5132\u5B58\u683C',\r\n        pleaseSelectADate                   : '\u8ACB\u9078\u64C7\u65E5\u671F',\r\n        pleaseEnterInteger                  : '\u8ACB\u8F38\u5165\u4E00\u500B\u4ECB\u65BC1\u548C1000\u4E4B\u9593\u7684\u6574\u6578',\r\n        onlySingleCell                      : '\u53EA\u80FD\u5C0D\u55AE\u500B\u5132\u5B58\u683C\u9032\u884C\u5F15\u7528',\r\n        conditionValueCanOnly               : '\u689D\u4EF6\u503C\u53EA\u80FD\u662F\u6578\u4F4D\u6216\u8005\u55AE\u500B\u5132\u5B58\u683C',\r\n        ruleTypeItem1                       : '\u57FA\u65BC\u5404\u81EA\u503C\u8A2D\u5B9A\u6240\u6709\u5132\u5B58\u683C\u7684\u683C\u5F0F',\r\n        ruleTypeItem2                       : '\u53EA\u70BA\u5305\u542B\u4EE5\u4E0B\u5167\u5BB9\u7684\u5132\u5B58\u683C\u8A2D\u5B9A\u683C\u5F0F',\r\n        ruleTypeItem2_title                 : '\u53EA\u70BA\u6EFF\u8DB3\u4EE5\u4E0B\u689D\u4EF6\u7684\u5132\u5B58\u683C',\r\n        ruleTypeItem3                       : '\u50C5\u5C0D\u6392\u540D\u9760\u524D\u6216\u9760\u5F8C\u7684\u6578\u503C\u8A2D\u5B9A\u683C\u5F0F',\r\n        ruleTypeItem3_title                 : '\u70BA\u4EE5\u4E0B\u6392\u540D\u5167\u7684\u503C',\r\n        ruleTypeItem4                       : '\u50C5\u5C0D\u9AD8\u65BC\u6216\u4F4E\u65BC\u5E73\u5747\u503C\u7684\u6578\u503C\u8A2D\u5B9A\u683C\u5F0F',\r\n        ruleTypeItem4_title                 : '\u70BA\u6EFF\u8DB3\u4EE5\u4E0B\u689D\u4EF6\u7684\u503C',\r\n        ruleTypeItem5                       : '\u50C5\u5C0D\u552F\u4E00\u503C\u6216\u91CD\u8907\u503C\u8A2D\u5B9A\u683C\u5F0F',\r\n        ruleTypeItem6                       : '\u4F7F\u7528\u516C\u5F0F\u78BA\u5B9A\u8981\u8A2D\u7F6E\u683C\u5F0F\u7684\u55AE\u5143\u683C',\r\n        formula                             : '\u516C\u5F0F',\r\n        textColor                           : '\u6587\u5B57\u984F\u8272',\r\n        cellColor                           : '\u5132\u5B58\u683C\u984F\u8272',\r\n        confirm                             : '\u78BA\u5B9A',\r\n        confirmColor                        : '\u78BA\u5B9A\u984F\u8272',\r\n        cancel                              : '\u53D6\u6D88',\r\n        close                               : '\u95DC\u9589',\r\n        clearColorSelect                    : '\u6E05\u9664\u984F\u8272\u9078\u64C7',\r\n        sheet                               : '\u9336',\r\n        currentSheet                        : '\u7576\u524D\u5DE5\u4F5C\u8868',\r\n        dataBar                             : '\u6578\u64DA\u689D',\r\n        dataBarColor                        : '\u6578\u64DA\u689D\u984F\u8272',\r\n        gradientDataBar_1                   : '\u85CD-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        gradientDataBar_2                   : '\u7DA0-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        gradientDataBar_3                   : '\u7D05-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        gradientDataBar_4                   : '\u67F3\u4E01-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        gradientDataBar_5                   : '\u6DFA\u85CD-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        gradientDataBar_6                   : '\u7D2B-\u767D\u6F38\u8B8A\u6578\u64DA\u689D',\r\n        solidColorDataBar_1                 : '\u85CD\u8272\u6578\u64DA\u689D',\r\n        solidColorDataBar_2                 : '\u7DA0\u8272\u6578\u64DA\u689D',\r\n        solidColorDataBar_3                 : '\u7D05\u8272\u6578\u64DA\u689D',\r\n        solidColorDataBar_4                 : '\u6A59\u8272\u6578\u64DA\u689D',\r\n        solidColorDataBar_5                 : '\u6DFA\u85CD\u8272\u6578\u64DA\u689D',\r\n        solidColorDataBar_6                 : '\u7D2B\u8272\u6578\u64DA\u689D',\r\n        colorGradation                      : '\u8272\u968E',\r\n        colorGradation_1                    : '\u7DA0-\u9EC3-\u7D05\u8272\u968E',\r\n        colorGradation_2                    : '\u7D05-\u9EC3-\u7DA0\u8272\u968E',\r\n        colorGradation_3                    : '\u7DA0-\u767D-\u7D05\u8272\u968E',\r\n        colorGradation_4                    : '\u7D05-\u767D-\u7DA0\u8272\u968E',\r\n        colorGradation_5                    : '\u85CD-\u767D-\u7D05\u8272\u968E',\r\n        colorGradation_6                    : '\u7D05-\u767D-\u85CD\u8272\u968E',\r\n        colorGradation_7                    : '\u767D-\u7D05\u8272\u968E',\r\n        colorGradation_8                    : '\u7D05-\u767D\u8272\u968E',\r\n        colorGradation_9                    : '\u7DA0-\u767D\u8272\u968E',\r\n        colorGradation_10                   : '\u767D-\u7DA0\u8272\u968E',\r\n        colorGradation_11                   : '\u7DA0-\u9EC3\u8272\u968E',\r\n        colorGradation_12                   : '\u9EC3-\u7DA0\u8272\u968E',\r\n        icons                               : '\u5716\u6A19\u96C6',\r\n        pleaseSelectIcon                    : '\u8ACB\u9EDE\u64CA\u9078\u64C7\u4E00\u7D44\u5716\u6A19:',\r\n        cellValue                           : '\u5132\u5B58\u683C\u503C',\r\n        specificText                        : '\u7279\u5B9A\u6587\u5B57',\r\n        occurrence                          : '\u767C\u751F\u65E5\u671F',\r\n        greaterThan                         : '\u5927\u65BC',\r\n        lessThan                            : '\u5C0F\u65BC',\r\n        between                             : '\u4ECB\u65BC',\r\n        equal                               : '\u7B49\u65BC',\r\n        in                                  : '\u548C',\r\n        to                                  : '\u5230',\r\n        between2                            : '\u4E4B\u9593',\r\n        contain                             : '\u5305\u542B',\r\n        textContains                        : '\u6587\u5B57\u5305\u542B',\r\n        duplicateValue                      : '\u91CD\u8907\u503C',\r\n        uniqueValue                         : '\u552F\u4E00\u503C',\r\n        top                                 : '\u524D',\r\n        top10                               : '\u524D10\u9805',\r\n        top10_percent                       : '\u524D10%',\r\n        last                                : '\u5F8C',\r\n        last10                              : '\u5F8C10\u9805',\r\n        last10_percent                      : '\u5F8C10%',\r\n        oneself                             : '\u500B',\r\n        above                               : '\u9AD8\u65BC',\r\n        aboveAverage                        : '\u9AD8\u65BC\u5E73\u5747\u503C',\r\n        below                               : '\u4F4E\u65BC',\r\n        belowAverage                        : '\u4F4E\u65BC\u5E73\u5747\u503C',\r\n        all                                 : '\u5168\u90E8',\r\n        yesterday                           : '\u6628\u5929',\r\n        today                               : '\u4ECA\u5929',\r\n        tomorrow                            : '\u660E\u5929',\r\n        lastWeek                            : '\u4E0A\u5468',\r\n        thisWeek                            : '\u672C\u5468',\r\n        lastMonth                           : '\u4E0A\u6708',\r\n        thisMonth                           : '\u672C\u6708',\r\n        lastYear                            : '\u53BB\u5E74',\r\n        thisYear                            : '\u672C\u5E74',\r\n        last7days                           : '\u6700\u8FD17\u5929',\r\n        last30days                          : '\u6700\u8FD130\u5929',\r\n        next7days                           : '\u672A\u4F867\u5929',\r\n        next30days                          : '\u672A\u4F8630\u5929',\r\n        next60days                          : '\u672A\u4F8660\u5929',\r\n        chooseRuleType                      : '\u9078\u64C7\u898F\u5247\u985E\u578B',\r\n        editRuleDescription                 : '\u7DE8\u8F2F\u898F\u5247\u8AAA\u660E',\r\n        newFormatRule                       : '\u65B0\u5EFA\u683C\u5F0F\u898F\u5247',\r\n        editFormatRule                      : '\u7DE8\u8F2F\u683C\u5F0F\u898F\u5247',\r\n        formatStyle                         : '\u683C\u5F0F\u6A23\u5F0F',\r\n        fillType                            : '\u586B\u5145\u985E\u578B',\r\n        color                               : '\u984F\u8272',\r\n        twocolor                            : '\u96D9\u8272',\r\n        tricolor                            : '\u4E09\u8272',\r\n        multicolor                          : '\u5F69\u8272',\r\n        grayColor                           : '\u7070\u8272',\r\n        gradient                            : '\u6F38\u8B8A',\r\n        solid                               : '\u5BE6\u5FC3',\r\n        maxValue                            : '\u6700\u5927\u503C',\r\n        medianValue                         : '\u4E2D\u9593\u503C',\r\n        minValue                            : '\u6700\u5C0F\u503C',\r\n        direction                           : '\u65B9\u5411',\r\n        threeWayArrow                       : '\u4E09\u5411\u7BAD\u982D',\r\n        fourWayArrow                        : '\u56DB\u5411\u7BAD\u982D',\r\n        fiveWayArrow                        : '\u4E94\u5411\u7BAD\u982D',\r\n        threeTriangles                      : '3\u500B\u4E09\u89D2\u5F62',\r\n        shape                               : '\u5F62\u72C0',\r\n        threeColorTrafficLight              : '\u4E09\u8272\u4EA4\u901A\u71C8',\r\n        fourColorTrafficLight               : '\u56DB\u8272\u4EA4\u901A\u71C8',\r\n        threeSigns                          : '\u4E09\u6A19\u8A8C',\r\n        greenRedBlackGradient               : '\u7DA0-\u7D05-\u9ED1\u6F38\u8B8A',\r\n        rimless                             : '\u7121\u908A\u6846',\r\n        bordered                            : '\u6709\u908A\u6846',\r\n        mark                                : '\u6A19\u8A18',\r\n        threeSymbols                        : '\u4E09\u500B\u7B26\u865F',\r\n        tricolorFlag                        : '\u4E09\u8272\u65D7',\r\n        circled                             : '\u6709\u5713\u5708',\r\n        noCircle                            : '\u7121\u5713\u5708',\r\n        grade                               : '\u7B49\u7D1A',\r\n        grade4                              : '\u56DB\u7B49\u7D1A',\r\n        grade5                              : '\u4E94\u7B49\u7D1A',\r\n        threeStars                          : '3\u500B\u661F\u5F62',\r\n        fiveQuadrantDiagram                 : '\u4E94\u8C61\u9650\u5716',\r\n        fiveBoxes                           : '5\u500B\u6846',\r\n    },\r\n    insertLink: {\r\n        linkText    : \"\u6587\u5B57\",\r\n        linkType    : \"\u9023\u7D50\u985E\u578B\",\r\n        external    : \"\u5916\u90E8\u9023\u7D50\",\r\n        internal    : \"\u5185\u90E8\u9023\u7D50\",\r\n        linkAddress : \"\u9023\u7D50\u5730\u5740\",\r\n        linkSheet   : \"\u5DE5\u4F5C\u8868\",\r\n        linkCell    : \"\u5132\u5B58\u683C\u5F15\u7528\",\r\n        linkTooltip : \"\u63D0\u793A\",\r\n        placeholder1: \"\u8ACB\u8F38\u5165\u7DB2\u9801\u9023\u7D50\u4F4D\u5740\",\r\n        placeholder2: \"\u8ACB\u8F38\u5165\u8981\u5F15\u7528\u7684\u5132\u5B58\u683C,\u4F8BA1\",\r\n        placeholder3: \"\u8ACB\u8F38\u5165\u63D0\u793A\u5167\u5BB9\",\r\n        tooltipInfo1: \"\u8ACB\u8F38\u5165\u6709\u6548\u7684\u9023\u7D50\",\r\n        tooltipInfo2: \"\u8ACB\u8F38\u5165\u6B63\u78BA\u7684\u5132\u5B58\u683C\u5F15\u7528\",\r\n    },\r\n    dataVerification: {\r\n        cellRange            : '\u5132\u5B58\u683C\u7BC4\u570D',\r\n        selectCellRange      : '\u9EDE\u64CA\u9078\u64C7\u5132\u5B58\u683C\u7BC4\u570D',\r\n        selectCellRange2     : '\u8ACB\u9078\u64C7\u5132\u5B58\u683C\u7BC4\u570D',\r\n        verificationCondition: '\u9A57\u8B49\u689D\u4EF6',\r\n        allowMultiSelect     : \"\u662F\u5426\u5141\u8A31\u591A\u9078\",\r\n        dropdown             : '\u4E0B\u62C9\u6E05\u55AE',\r\n        checkbox             : '\u6838\u53D6\u65B9\u584A',\r\n        number               : '\u6578\u4F4D',\r\n        number_integer       : '\u6578\u4F4D-\u6574\u6578',\r\n        number_decimal       : '\u6578\u4F4D-\u5C0F\u6578',\r\n        text_content         : '\u6587\u5B57-\u5167\u5BB9',\r\n        text_length          : '\u6587\u5B57-\u9577\u5EA6',\r\n        date                 : '\u65E5\u671F',\r\n        validity             : '\u6709\u6548\u6027',\r\n        placeholder1         : '\u8ACB\u8F38\u5165\u9078\u9805,\u4EE5\u82F1\u6587\u9017\u865F\u5206\u9694,\u59821,2,3,4,5',\r\n        placeholder2         : '\u8ACB\u8F38\u5165\u5167\u5BB9',\r\n        placeholder3         : '\u6578\u503C,\u598210',\r\n        placeholder4         : '\u8ACB\u8F38\u5165\u6307\u5B9A\u7684\u6587\u5B57',\r\n        placeholder5         : '\u8ACB\u8F38\u5165\u9078\u4E2D\u5132\u5B58\u683C\u6642\u986F\u793A\u7684\u63D0\u793A\u8A9E',\r\n        selected             : '\u9078\u64C7\u6642',\r\n        notSelected          : '\u672A\u9078\u64C7',\r\n        between              : '\u4ECB\u65BC',\r\n        notBetween           : '\u4E0D\u4ECB\u65BC',\r\n        equal                : '\u7B49\u65BC',\r\n        notEqualTo           : '\u4E0D\u7B49\u65BC',\r\n        moreThanThe          : '\u5927\u65BC',\r\n        lessThan             : '\u5C0F\u65BC',\r\n        greaterOrEqualTo     : '\u5927\u65BC\u7B49\u65BC',\r\n        lessThanOrEqualTo    : '\u5C0F\u65BC\u7B49\u65BC',\r\n        include              : '\u5305\u62EC',\r\n        exclude              : '\u4E0D\u5305\u62EC',\r\n        earlierThan          : '\u65E9\u65BC',\r\n        noEarlierThan        : '\u4E0D\u65E9\u65BC',\r\n        laterThan            : '\u665A\u65BC',\r\n        noLaterThan          : '\u4E0D\u665A\u65BC',\r\n        identificationNumber : '\u8EAB\u4EFD\u8B49\u865F\u78BC',\r\n        phoneNumber          : '\u624B\u6A5F\u865F',\r\n        remote               : '\u81EA\u52D5\u9060\u7A0B\u7372\u53D6\u9078\u9805',\r\n        prohibitInput        : '\u8F38\u5165\u6578\u64DA\u7121\u6548\u6642\u7981\u6B62\u8F38\u5165',\r\n        hintShow             : '\u9078\u4E2D\u5132\u5B58\u683C\u6642\u986F\u793A\u63D0\u793A\u8A9E',\r\n        deleteVerification   : '\u5220\u9664\u9A57\u8B49',\r\n        tooltipInfo1         : '\u4E0B\u62C9\u6E05\u55AE\u9078\u9805\u4E0D\u53EF\u70BA\u7A7A',\r\n        tooltipInfo2         : '\u6838\u53D6\u65B9\u584A\u5167\u5BB9\u4E0D\u53EF\u70BA\u7A7A',\r\n        tooltipInfo3         : '\u8F38\u5165\u7684\u503C\u4E0D\u662F\u6578\u503C\u985E\u578B',\r\n        tooltipInfo4         : '\u6578\u503C2\u4E0D\u80FD\u5C0F\u65BC\u6578\u503C1',\r\n        tooltipInfo5         : '\u6587\u5B57\u5167\u5BB9\u4E0D\u80FD\u70BA\u7A7A',\r\n        tooltipInfo6         : '\u8F38\u5165\u7684\u503C\u4E0D\u662F\u65E5\u671F\u985E\u578B',\r\n        tooltipInfo7         : '\u65E5\u671F2\u4E0D\u80FD\u5C0F\u65BC\u65E5\u671F1',\r\n        textlengthInteger    : '\u6587\u5B57\u9577\u5EA6\u5FC5\u9808\u662F\u5927\u65BC\u7B49\u65BC0\u7684\u6574\u6578',\r\n    },\r\n    formula: {\r\n        sum       : \"\u6C42\u548C\",\r\n        average   : \"\u5E73\u5747\u503C\",\r\n        count     : \"\u8A08\u6578\",\r\n        max       : \"\u6700\u5927\u503C\",\r\n        min       : \"\u6700\u5C0F\u503C\",\r\n        ifGenerate: \"if\u516C\u5F0F\u751F\u6210\u5668\",\r\n        find      : \"\u66F4\u591A\u51FD\u6578\",\r\n\r\n        tipNotBelongToIf: \"\u8A72\u5132\u5B58\u683C\u51FD\u6578\u4E0D\u5C6C\u65BCif\u516C\u5F0F!\",\r\n        tipSelectCell   : \"\u8ACB\u9078\u64C7\u5132\u5B58\u683C\u63D2\u5165\u51FD\u6578\",\r\n\r\n        ifGenCompareValueTitle: \"\u6BD4\u8F83\u503C\",\r\n        ifGenSelectCellTitle  : \"\u9EDE\u64CA\u9078\u64C7\u5132\u5B58\u683C\",\r\n        ifGenRangeTitle       : \"\u7BC4\u570D\",\r\n        ifGenRangeTo          : \"\u81F3\",\r\n        ifGenRangeEvaluate    : \"\u7BC4\u570D\u8A55\u4F30\",\r\n        ifGenSelectRangeTitle : \"\u9EDE\u64CA\u9078\u64C7\u7BC4\u570D\",\r\n        ifGenCutWay           : \"\u5283\u5206\u7BA1\u9053\",\r\n        ifGenCutSame          : \"\u5283\u5206\u503C\u76F8\u540C\",\r\n        ifGenCutNpiece        : \"\u5283\u5206\u4E3AN\u4EFD\",\r\n        ifGenCutCustom        : \"\u81EA\u5B9A\u7FA9\u8F38\u5165\",\r\n        ifGenCutConfirm       : \"\u751F\u6210\",\r\n\r\n        ifGenTipSelectCell     : \"\u9078\u64C7\u5132\u5B58\u683C\",\r\n        ifGenTipSelectCellPlace: \"\u8ACB\u9078\u64C7\u5132\u5B58\u683C\",\r\n\r\n        ifGenTipSelectRange     : \"\u9078\u64C7\u55AE\u7BC4\u570D\",\r\n        ifGenTipSelectRangePlace: \"\u8ACB\u9078\u64C7\u7BC4\u570D\",\r\n\r\n        ifGenTipNotNullValue      : \"\u6BD4\u8F03\u503C\u4E0D\u80FD\u70BA\u7A7A!\",\r\n        ifGenTipLableTitile       : \"\u6A19\u7C64\",\r\n        ifGenTipRangeNotforNull   : \"\u7BC4\u570D\u4E0D\u80FD\u70BA\u7A7A!\",\r\n        ifGenTipCutValueNotforNull: \"\u5283\u5206\u503C\u4E0D\u80FD\u70BA\u7A7A\uFF01\",\r\n        ifGenTipNotGenCondition   : \"\u6C92\u6709\u751F\u6210\u53EF\u7528\u7684\u689D\u4EF6\uFF01\",\r\n    },\r\n    formulaMore: {\r\n        valueTitle          : \"\u503C\",\r\n        tipSelectDataRange  : \"\u9078\u53D6\u6578\u64DA\u7BC4\u570D\",\r\n        tipDataRangeTile    : \"\u6578\u64DA\u7BC4\u570D\",\r\n        findFunctionTitle   : \"\u67E5\u627E\u51FD\u6578\",\r\n        tipInputFunctionName: \"\u8ACB\u8F38\u5165\u60A8\u8981\u67E5\u627E\u7684\u51FD\u6578\u540D\u7A31\u6216\u51FD\u6578\u529F\u80FD\u7684\u7C21\u8981\u63CF\u8FF0\",\r\n\r\n        Array      : \"\u6578\u7D44\",\r\n        Database   : \"\u8CC7\u6599\u4F86\u6E90\",\r\n        Date       : \"\u65E5\u671F\",\r\n        Engineering: \"\u5DE5\u7A0B\u8A08\u7B97\",\r\n        Filter     : \"\u7BE9\u6AA2\u7A0B\u5F0F\",\r\n        Financial  : \"\u8CA1\u52D9\",\r\n        luckysheet : \"Luckysheet\u5167\u5BD8\",\r\n        other      : \"\u5176\u5B83\",\r\n        Logical    : \"\u908F\u8F2F\",\r\n        Lookup     : \"\u67E5\u627E\",\r\n        Math       : \"\u6578\u5B78\",\r\n        Operator   : \"\u904B\u7B97\u5B50\",\r\n        Parser     : \"\u8F49\u63DB\u5DE5\u5177\",\r\n        Statistical: \"\u7D71\u8A08\",\r\n        Text       : \"\u6587\u5B57\",\r\n        dataMining : \"\u8CC7\u6599\u6316\u6398\",\r\n\r\n        selectFunctionTitle: \"\u9078\u64C7\u51FD\u6578\",\r\n        calculationResult  : \"\u8A08\u7B97\u7D50\u679C\",\r\n\r\n        tipSuccessText   : \"\u6210\u529F\",\r\n        tipParamErrorText: \"\u53C3\u6578\u985E\u578B\u932F\u8AA4\",\r\n\r\n        helpClose   : \"\u95DC\u9589\",\r\n        helpCollapse: \"\u6536\u8D77\",\r\n        helpExample : \"\u793A\u4F8B\",\r\n        helpAbstract: \"\u6458\u8981\",\r\n\r\n        execfunctionError          : '\u63D0\u793A\", \"\u516C\u5F0F\u5B58\u5728\u932F\u8AA4',\r\n        execfunctionSelfError      : '\u516C\u5F0F\u4E0D\u53EF\u5F15\u7528\u5176\u672C\u8EAB\u7684\u5132\u5B58\u683C',\r\n        execfunctionSelfErrorResult: '\u516C\u5F0F\u4E0D\u53EF\u5F15\u7528\u5176\u672C\u8EAB\u7684\u5132\u5B58\u683C,\u6703\u5C0E\u81F4\u8A08\u7B97\u7D50\u679C\u4E0D\u6E96\u78BA',\r\n\r\n        allowRepeatText: \"\u53EF\u91CD\u8907\",\r\n        allowOptionText: \"\u53EF\u9078\",\r\n\r\n        selectCategory: \"\u6216\u9078\u64C7\u985E\u5225\",\r\n    },\r\n    drag: {\r\n        noMerge    : \"\u7121\u6CD5\u5C0D\u5408\u4F75\u5132\u5B58\u683C\u57F7\u884C\u6B64\u64CD\u4F5C\",\r\n        affectPivot: \"\u7121\u6CD5\u5C0D\u6240\u9078\u5132\u5B58\u683C\u9032\u884C\u6B64\u66F4\u6539,\u56E0\u70BA\u5B83\u6703\u5F71\u97FF\u6578\u64DA\u900F\u8996\u9336\uFF01\",\r\n        noMulti    : \"\u7121\u6CD5\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C,\u8ACB\u9078\u64C7\u55AE\u500B\u5340\u57DF\",\r\n        noPaste    : \"\u7121\u6CD5\u5728\u6B64\u8655\u7C98\u8CBC\u6B64\u5167\u5BB9,\u8ACB\u9078\u64C7\u7C98\u8CBC\u5340\u57DF\u7684\u4E00\u500B\u5132\u5B58\u683C,\u7136\u5F8C\u518D\u6B21\u5617\u8A66\u7C98\u8CBC\",\r\n        noPartMerge: \"\u7121\u6CD5\u5C0D\u90E8\u5206\u5408\u4F75\u5132\u5B58\u683C\u57F7\u884C\u6B64\u64CD\u4F5C\",\r\n\r\n        inputCorrect        : \"\u8ACB\u8F38\u5165\u6B63\u78BA\u7684\u6578\u503C\",\r\n        notLessOne          : \"\u884C\u5217\u6578\u4E0D\u80FD\u5C0F\u65BC1\",\r\n        offsetColumnLessZero: \"\u504F\u79FB\u5217\u4E0D\u80FD\u70BA\u8CA0\u6578\uFF01\",\r\n\r\n        pasteMustKeybordAlert         : \"Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut\",\r\n        pasteMustKeybordAlertHTMLTitle: \"Copy and paste in the Sheet\",\r\n        pasteMustKeybordAlertHTML     : \"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut\",\r\n    },\r\n    pivotTable: {\r\n        title                : \"\u6578\u64DA\u900F\u8996\u9336\",\r\n        closePannel          : \"\u95DC\u9589\",\r\n        editRange            : \"\u7DE8\u8F2F\u7BC4\u570D\",\r\n        tipPivotFieldSelected: \"\u9078\u64C7\u9700\u8981\u6DFB\u52A0\u5230\u6578\u64DA\u900F\u8996\u9336\u7684\u6B04\u4F4D\",\r\n        tipClearSelectedField: \"\u6E05\u9664\u6240\u6709\u5DF2\u9078\u6B04\u4F4D\",\r\n        btnClearSelectedField: \"\u6E05\u9664\",\r\n        btnFilter            : \"\u7BE9\u9078\",\r\n        titleRow             : \"\u884C\",\r\n        titleColumn          : \"\u5217\",\r\n        titleValue           : \"\u6578\u503C\",\r\n        tipShowColumn        : \"\u7D71\u8A08\u6B04\u4F4D\u986F\u793A\u70BA\u5217\",\r\n        tipShowRow           : \"\u7D71\u8A08\u6B04\u4F4D\u986F\u793A\u70BA\u884C\",\r\n\r\n        titleSelectionDataRange: \"\u9078\u53D6\u6578\u64DA\u7BC4\u570D\",\r\n        titleDataRange         : \"\u6578\u64DA\u7BC4\u570D\",\r\n\r\n        valueSum: \"\u7E3D\u8A08\",\r\n\r\n        valueStatisticsSUM        : \"\u6C42\u548C\",\r\n        valueStatisticsCOUNT      : \"\u6578\u503C\u8A08\u6578\",\r\n        valueStatisticsCOUNTA     : \"\u8A08\u6578\",\r\n        valueStatisticsCOUNTUNIQUE: \"\u53BB\u91CD\u8A08\u6578\",\r\n        valueStatisticsAVERAGE    : \"\u5E73\u5747\u503C\",\r\n        valueStatisticsMAX        : \"\u6700\u5927\u503C\",\r\n        valueStatisticsMIN        : \"\u6700\u5C0F\u503C\",\r\n        valueStatisticsMEDIAN     : \"\u4E2D\u4F4D\u6578\",\r\n        valueStatisticsPRODUCT    : \"\u4E58\u7A4D\",\r\n        valueStatisticsSTDEV      : \"\u6A19\u6E96\u5DEE\",\r\n\r\n        valueStatisticsSTDEVP: \"\u6574\u9AD4\u6A19\u6E96\u5DEE\",\r\n        valueStatisticslet   : \"\u65B9\u5DEE\",\r\n        valueStatisticsVARP  : \"\u6574\u9AD4\u65B9\u5DEE\",\r\n\r\n        errorNotAllowEdit     : \"\u975E\u7DE8\u8F2F\u6A21\u5F0F\u4E0B\u7981\u6B62\u8A72\u64CD\u4F5C!\",\r\n        errorNotAllowMulti    : \"\u4E0D\u80FD\u5C0D\u591A\u91CD\u9078\u64C7\u5340\u57DF\u57F7\u884C\u6B64\u64CD\u4F5C,\u8ACB\u9078\u64C7\u55AE\u500B\u5340\u57DF,\u7136\u5F8C\u518D\u8A66\",\r\n        errorSelectRange      : \"\u8ACB\u9078\u64C7\u65B0\u5EFA\u900F\u8996\u9336\u7684\u5340\u57DF\",\r\n        errorIsDamage         : \"\u6B64\u6578\u64DA\u900F\u8996\u9336\u7684\u6E90\u6578\u64DA\u5DF2\u640D\u58DE\uFF01\",\r\n        errorNotAllowPivotData: \"\u4E0D\u53EF\u9078\u64C7\u6578\u64DA\u900F\u8996\u9336\u70BA\u6E90\u6578\u64DA!\",\r\n        errorSelectionRange   : \"\u9078\u64C7\u5931\u6557,\u8F38\u5165\u7BC4\u570D\u932F\u8AA4\uFF01\",\r\n        errorIncreaseRange    : \"\u8ACB\u64F4\u5927\u9078\u64C7\u7684\u6578\u64DA\u7BC4\u570D!\",\r\n\r\n        titleAddColumn        : \"\u6DFB\u52A0\u5217\u5230\u6578\u64DA\u900F\u8996\u9336\",\r\n        titleMoveColumn       : \"\u79FB\u52D5\u8A72\u5217\u5230\u4E0B\u65B9\u767D\u6846\",\r\n        titleClearColumnFilter: \"\u6E05\u9664\u8A72\u5217\u7684\u7BE9\u9078\u689D\u4EF6\",\r\n        titleFilterColumn     : \"\u7BE9\u9078\u8A72\u5217\",\r\n\r\n        titleSort        : \"\u6392\u5E8F\",\r\n        titleNoSort      : \"\u7121\u6392\u5E8F\",\r\n        titleSortAsc     : \"\u6607\u51AA\",\r\n        titleSortDesc    : \"\u964D\u5E8F\",\r\n        titleSortBy      : \"\u6392\u5E8F\u4F9D\u64DA\",\r\n        titleShowSum     : \"\u986F\u793A\u7E3D\u8A08\",\r\n        titleStasticTrue : \"\u662F\",\r\n        titleStasticFalse: \"\u5426\",\r\n    },\r\n    dropCell: {\r\n        copyCell     : \"\u8907\u88FD\u5132\u5B58\u683C\",\r\n        sequence     : \"\u586B\u5145\u5E8F\u5217\",\r\n        onlyFormat   : \"\u50C5\u586B\u5145\u683C\u5F0F\",\r\n        noFormat     : \"\u4E0D\u5E36\u683C\u5F0F\u586B\u5145\",\r\n        day          : \"\u4EE5\u5929\u6578\u586B\u5145\",\r\n        workDay      : \"\u4EE5\u5DE5\u4F5C\u65E5\u586B\u5145\",\r\n        month        : \"\u4EE5\u6708\u586B\u5145\",\r\n        year         : \"\u4EE5\u5E74\u586B\u5145\",\r\n        chineseNumber: \"\u4EE5\u4E2D\u6587\u5C0F\u5BEB\u6578\u4F4D\u586B\u5145\"\r\n    },\r\n    imageCtrl: {\r\n        borderTile: \"\u5716\u7247\u908A\u6846\u984F\u8272\u9078\u64C7\",\r\n        borderCur : \"\u7576\u524D\u984F\u8272\",\r\n    },\r\n    protection: {\r\n        protectiontTitle    : \"\u4FDD\u8B77\u5DE5\u4F5C\u8868\",\r\n        enterPassword       : \"\u8ACB\u8F38\u5165\u5BC6\u78BC\uFF08\u53EF\u7559\u7A7A\uFF09\",\r\n        enterHint           : \"\u60A8\u8A66\u5716\u66F4\u6539\u7684\u5132\u5B58\u683C\u6216\u5716\u8868\u4F4D\u65BC\u53D7\u4FDD\u8B77\u7684\u5DE5\u4F5C\u8868\u4E2D\u3002\u82E5\u8981\u66F4\u6539,\u8ACB\u53D6\u6D88\u5DE5\u4F5C\u8868\u4FDD\u8B77\u3002\u60A8\u53EF\u80FD\u9700\u8981\u8F38\u5165\u5BC6\u78BC\",\r\n        swichProtectionTip  : \"\u4FDD\u8B77\u5DE5\u4F5C\u8868\u53CA\u9396\u5B9A\u7684\u5132\u5B58\u683C\u5167\u5BB9\",\r\n        authorityTitle      : \"\u5141\u8A31\u6B64\u5DE5\u4F5C\u8868\u7684\u7528\u6236\u9032\u884C:\",\r\n        selectLockedCells   : \"\u5B9A\u9396\u5B9A\u5132\u5B58\u683C\",\r\n        selectunLockedCells : \"\u9078\u5B9A\u89E3\u9664\u9396\u5B9A\u7684\u5132\u5B58\u683C\",\r\n        formatCells         : \"\u8A2D\u5B9A\u5132\u5B58\u683C\u683C\u5F0F\",\r\n        formatColumns       : \"\u8A2D\u5B9A\u5217\u683C\u5F0F\",\r\n        formatRows          : \"\u8A2D\u5B9A\u884C\u683C\u5F0F\",\r\n        insertColumns       : \"\u63D2\u5165\u5217\",\r\n        insertRows          : \"\u63D2\u5165\u884C\",\r\n        insertHyperlinks    : \"\u63D2\u5165\u8D85\u9023\u7D50\",\r\n        deleteColumns       : \"\u5220\u9664\u5217\",\r\n        deleteRows          : \"\u5220\u9664\u884C\",\r\n        sort                : \"\u6392\u5E8F\",\r\n        filter              : \"\u4F7F\u7528\u81EA\u52D5\u7BE9\u9078\",\r\n        usePivotTablereports: \"\u4F7F\u7528\u6578\u64DA\u900F\u8996\u9336\u548C\u5831\u8868\",\r\n        editObjects         : \"\u7DE8\u8F2F\u5C0D\u8C61\",\r\n        editScenarios       : \"\u7DE8\u8F2F\u65B9\u6848\",\r\n\r\n        allowRangeTitle: \"\u5141\u8A31\u7528\u6236\u7DE8\u8F2F\u5340\u57DF\",\r\n        allowRangeAdd  : \"\u65B0\u5EFA...\",\r\n\r\n        allowRangeAddTitle         : \"\u6A19\u984C\",\r\n        allowRangeAddSqrf          : \"\u5F15\u7528\u5132\u5B58\u683C\",\r\n        selectCellRange            : '\u9EDE\u64CA\u9078\u64C7\u5132\u5B58\u683C\u7BC4\u570D',\r\n        selectCellRangeHolder      : \"\u8ACB\u8F38\u5165\u5132\u5B58\u683C\u7BC4\u570D\",\r\n        allowRangeAddTitlePassword : \"\u5BC6\u78BC\",\r\n        allowRangeAddTitleHint     : \"\u63D0\u793A\",\r\n        allowRangeAddTitleHintTitle: \"\u8A2D\u7F6E\u5BC6\u78BC\u5F8C,\u63D0\u793A\u7528\u6236\u8F38\u5165\u5BC6\u78BC\uFF08\u53EF\u7559\u7A7A\uFF09\",\r\n        allowRangeAddtitleDefault  : \"\u8ACB\u8F38\u5165\u5340\u57DF\u540D\u7A31\",\r\n\r\n        rangeItemDblclick   : \"\u6309\u5169\u4E0B\u9032\u884C\u7DE8\u8F2F\",\r\n        rangeItemHasPassword: \"\u5DF2\u8A2D\u7F6E\u5BC6\u78BC\",\r\n\r\n        rangeItemErrorTitleNull: \"\u6A19\u984C\u4E0D\u80FD\u70BA\u7A7A\",\r\n        rangeItemErrorRangeNull: \"\u5132\u5B58\u683C\u7BC4\u570D\u4E0D\u80FD\u70BA\u7A7A\",\r\n        rangeItemErrorRange    : \"\u5132\u5B58\u683C\u7BC4\u570D\u683C\u5F0F\u932F\u8AA4\",\r\n\r\n        validationTitle    : \"\u9A57\u8B49\u63D0\u793A\",\r\n        validationTips     : \"\u9700\u8981\u8F38\u5165\u5BC6\u78BC\u4F86\u64A4\u92B7\u5DE5\u4F5C\u8868\u7684\u4FDD\u8B77\",\r\n        validationInputHint: \"\u8ACB\u8F38\u5165\u5BC6\u78BC\",\r\n\r\n        checkPasswordNullalert : \"\u5BC6\u78BC\u4E0D\u80FD\u70BA\u7A7A!\",\r\n        checkPasswordWrongalert: \"\u5BC6\u78BC\u932F\u8AA4,\u8ACB\u91CD\u8A66\uFF01\",\r\n\r\n        checkPasswordSucceedalert: \"\u89E3\u9396\u6210\u529F,\u53EF\u4EE5\u7DE8\u8F2F\u8A72\u5340\u57DF!\",\r\n        defaultRangeHintText     : \"\u8A72\u5132\u5B58\u683C\u6B63\u5728\u53D7\u5BC6\u78BC\u4FDD\u8B77\",\r\n        defaultSheetHintText     : \"\u8A72\u5132\u5B58\u683C\u6216\u5716\u8868\u4F4D\u65BC\u53D7\u4FDD\u8B77\u7684\u5DE5\u4F5C\u8868\u4E2D,\u82E5\u8981\u9032\u884C\u66F4\u6539,\u8ACB\u53D6\u6D88\u5DE5\u4F5C\u8868\u4FDD\u8B77,\u60A8\u53EF\u80FD\u9700\u8981\u8F38\u5165\u5BC6\u78BC\u3002\",\r\n    },\r\n    cellFormat: {\r\n        cellFormatTitle     : \"\u8A2D\u5B9A\u5132\u5B58\u683C\u683C\u5F0F\",\r\n        protection          : \"\u4FDD\u8B77\",\r\n        locked              : \"\u9396\u5B9A\u5132\u5B58\u683C\",\r\n        hidden              : \"\u96B1\u85CF\u516C\u5F0F\",\r\n        protectionTips      : \"\u53EA\u6709\u4FDD\u8B77\u5DE5\u4F5C\u8868\u529F\u80FD\uFF08\u5728\u529F\u80FD\u8868\u5217\u9EDE\u64CA\u4FDD\u8B77\u5DE5\u4F5C\u8868\u6309\u9215\u9032\u884C\u8A2D\u5B9A\uFF09\u958B\u555F\u5F8C,\u9396\u5B9A\u5132\u5B58\u683C\u6216\u96B1\u85CF\u516C\u5F0F\u624D\u80FD\u751F\u6548\",\r\n        tipsPart            : \"\u90E8\u5206\u9078\u4E2D\",\r\n        tipsAll             : \"\u5168\u90E8\u9078\u4E2D\",\r\n        selectionIsNullAlert: \"\u8ACB\u9078\u64C7\u4E00\u500B\u7BC4\u570D\uFF01\",\r\n        sheetDataIsNullAlert: \"\u6578\u64DA\u70BA\u7A7A\u7121\u6CD5\u8A2D\u5B9A\uFF01\",\r\n    },\r\n    print: {\r\n        normalBtn: \"\u5E38\u898F\u8996\u5716\",\r\n        layoutBtn: \"\u9801\u9762\u4F48\u5C40\",\r\n        pageBtn  : \"\u5206\u9801\u9810\u89BD\",\r\n\r\n        menuItemPrint  : \"\u5217\u5370(Ctrl+P)\",\r\n        menuItemAreas  : \"\u5217\u5370\u5340\u57DF\",\r\n        menuItemRows   : \"\u5217\u5370\u6A19\u984C\u884C\",\r\n        menuItemColumns: \"\u5217\u5370\u6A19\u984C\u5217\",\r\n    },\r\n    edit: {\r\n        typing: \"\u6B63\u5728\u8F38\u5165\",\r\n    },\r\n    websocket: {\r\n        success: 'WebSocket\u9023\u63A5\u6210\u529F',\r\n        refresh: 'WebSocket\u9023\u63A5\u767C\u751F\u932F\u8AA4,\u8ACB\u5237\u65B0\u9801\u9762\uFF01',\r\n        wait   : 'WebSocket\u9023\u63A5\u767C\u751F\u932F\u8AA4,\u8ACB\u8010\u5FC3\u7B49\u5F85\uFF01',\r\n        close  : 'WebSocket\u9023\u63A5\u95DC\u9589',\r\n        contact: '\u670D\u52D9\u5668\u901A\u4FE1\u767C\u751F\u932F\u8AA4,\u8ACB\u5237\u65B0\u9801\u9762\u5F8C\u518D\u8A66,\u5982\u82E5\u4E0D\u884C\u8ACB\u806F\u7CFB\u7BA1\u7406\u54E1\uFF01',\r\n        support: '\u7576\u524D\u700F\u89BD\u5668\u4E0D\u652F\u6301WebSocket',\r\n    }\r\n\r\n};\r\n", "import en from './en'\r\nimport zh from './zh'\r\nimport es from './es'\r\nimport zh_tw from './zh_tw'\r\nimport Store from '../store';\r\n\r\nconst localeObj = {en,zh,es,zh_tw}\r\n\r\nfunction locale(){\r\n    return localeObj[Store.lang];\r\n}\r\n\r\nexport default locale;", "import locale from '../locale/locale';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\n\r\nimport { getObjType, camel2split } from '../utils/util';\r\n\r\n// \u9ED8\u8BA4\u7684\u5DE5\u5177\u680F\u6309\u94AE\r\nexport const defaultToolbar = [\r\n    'undo',\r\n    'redo',\r\n    'paintFormat',\r\n    '|',\r\n\r\n    'currencyFormat',\r\n    'percentageFormat',\r\n    'numberDecrease',\r\n    'numberIncrease',\r\n    'moreFormats',\r\n    '|',\r\n\r\n    'font',\r\n    '|',\r\n    'fontSize',\r\n    '|',\r\n\r\n    'bold',\r\n    'italic',\r\n    'strikethrough',\r\n    'underline',\r\n    'textColor',\r\n    '|',\r\n\r\n    'fillColor',\r\n    'border',\r\n    'mergeCell',\r\n    '|',\r\n\r\n    'horizontalAlignMode',\r\n    'verticalAlignMode',\r\n    'textWrapMode',\r\n    'textRotateMode',\r\n    '|',\r\n\r\n    'image',\r\n    'link',\r\n    'chart',\r\n    'postil',\r\n    'pivotTable',\r\n    '|',\r\n\r\n    'function',\r\n    'frozenMode',\r\n    'sortAndFilter',\r\n    'conditionalFormat',\r\n    'dataVerification',\r\n    'splitColumn',\r\n    'screenshot',\r\n    'findAndReplace',\r\n    'protection',\r\n    'print'\r\n];\r\n\r\n// \u5DE5\u5177\u680F\u6309\u94AE id \u5173\u7CFB\r\nexport const toolbarIdMap = {\r\n    undo: '#luckysheet-icon-undo', //Undo redo\r\n    redo: '#luckysheet-icon-redo',\r\n    paintFormat: ['#luckysheet-icon-paintformat'], //Format brush\r\n    currencyFormat: '#luckysheet-icon-currency', //currency format\r\n    percentageFormat: '#luckysheet-icon-percent', //Percentage format\r\n    numberDecrease: '#luckysheet-icon-fmt-decimal-decrease', //'Decrease the number of decimal places'\r\n    numberIncrease: '#luckysheet-icon-fmt-decimal-increase', //'Increase the number of decimal places\r\n    moreFormats: '#luckysheet-icon-fmt-other', //'More Formats'\r\n    font: '#luckysheet-icon-font-family', //'font'\r\n    fontSize: '#luckysheet-icon-font-size', //'Font size'\r\n    bold: '#luckysheet-icon-bold', //'Bold (Ctrl+B)'\r\n    italic: '#luckysheet-icon-italic', //'Italic (Ctrl+I)'\r\n    strikethrough: '#luckysheet-icon-strikethrough', //'Strikethrough (Alt+Shift+5)'\r\n    underline: '#luckysheet-icon-underline', //'Underline (Alt+Shift+6)'\r\n    textColor: ['#luckysheet-icon-text-color', '#luckysheet-icon-text-color-menu'], //'Text color'\r\n    fillColor: ['#luckysheet-icon-cell-color', '#luckysheet-icon-cell-color-menu'], //'Cell color'\r\n    border: ['#luckysheet-icon-border-all', '#luckysheet-icon-border-menu'], //'border'\r\n    mergeCell: ['#luckysheet-icon-merge-button', '#luckysheet-icon-merge-menu'], //'Merge cells'\r\n    horizontalAlignMode: ['#luckysheet-icon-align', '#luckysheet-icon-align-menu'], //'Horizontal alignment'\r\n    verticalAlignMode: ['#luckysheet-icon-valign', '#luckysheet-icon-valign-menu'], //'Vertical alignment'\r\n    textWrapMode: ['#luckysheet-icon-textwrap', '#luckysheet-icon-textwrap-menu'], //'Wrap mode'\r\n    textRotateMode: ['#luckysheet-icon-rotation', '#luckysheet-icon-rotation-menu'], //'Text Rotation Mode'\r\n    image: '#luckysheet-insertImg-btn-title', //'Insert link'\r\n    link: '#luckysheet-insertLink-btn-title', //'Insert picture'\r\n    chart: '#luckysheet-chart-btn-title', //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)\r\n    postil: '#luckysheet-icon-postil', //'comment'\r\n    pivotTable: ['#luckysheet-pivot-btn-title'], //'PivotTable'\r\n    function: ['#luckysheet-icon-function', '#luckysheet-icon-function-menu'], //'formula'\r\n    frozenMode: ['#luckysheet-freezen-btn-horizontal', '#luckysheet-icon-freezen-menu'], //'freeze mode'\r\n    sortAndFilter: '#luckysheet-icon-autofilter', //'sort and filter'\r\n    conditionalFormat: '#luckysheet-icon-conditionformat', //'Conditional Format'\r\n    dataVerification: '#luckysheet-dataVerification-btn-title', // 'Data Verification'\r\n    splitColumn: '#luckysheet-splitColumn-btn-title', //'Split column'\r\n    screenshot: '#luckysheet-chart-btn-screenshot', //'screenshot'\r\n    findAndReplace: '#luckysheet-icon-seachmore', //'Find and Replace'\r\n    protection: '#luckysheet-icon-protection', // 'Worksheet protection'\r\n    print: '#luckysheet-icon-print' // 'print'\r\n};\r\n\r\n// \u521B\u5EFA\u5DE5\u5177\u680F\u6309\u94AE\u7684html\r\nexport function createToolbarHtml() {\r\n    const toolbar = locale().toolbar;\r\n    const fontarray = locale().fontarray;\r\n    const defaultFmtArray = locale().defaultFmt;\r\n    const htmlMap = {\r\n        undo: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block disabled\" data-tips=\"${toolbar.undo}\"\r\n        id=\"luckysheet-icon-undo\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-undo iconfont luckysheet-iconfont-qianjin\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        redo: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block disabled\" data-tips=\"${toolbar.redo}\"\r\n        id=\"luckysheet-icon-redo\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-redo iconfont luckysheet-iconfont-houtui\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        paintFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.paintFormat}\"\r\n        id=\"luckysheet-icon-paintformat\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-geshishua\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        currencyFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.currencyFormat}\"\r\n        id=\"luckysheet-icon-currency\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-jine\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        percentageFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.percentageFormat}\"\r\n        id=\"luckysheet-icon-percent\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-baifenhao\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //Percentage format\r\n        numberDecrease: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.numberDecrease}\"\r\n        id=\"luckysheet-icon-fmt-decimal-decrease\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block toolbar-decimal-icon\"\r\n                    style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-decrease iconfont luckysheet-iconfont-jianxiaoxiaoshuwei\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Decrease the number of decimal places'\r\n        numberIncrease: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.numberIncrease}\"\r\n        id=\"luckysheet-icon-fmt-decimal-increase\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block toolbar-decimal-icon\"\r\n                    style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-increase iconfont luckysheet-iconfont-zengjiaxiaoshuwei\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Increase the number of decimal places\r\n        moreFormats: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.moreFormats}\"\r\n        id=\"luckysheet-icon-fmt-other\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${defaultFmtArray[0].text}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'More Formats'\r\n        font: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.font}\" id=\"luckysheet-icon-font-family\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${fontarray[0]}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'font'\r\n        fontSize: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-zoom-combobox luckysheet-toolbar-combo-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.fontSize}\" id=\"luckysheet-icon-font-size\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-combo-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-combo-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div aria-posinset=\"4\" aria-setsize=\"7\" class=\"luckysheet-inline-block luckysheet-toolbar-combo-button-caption\"\r\n                    style=\"user-select: none;\">\r\n                        <input aria-label=\"${toolbar.fontSize}\" class=\"luckysheet-toolbar-combo-button-input luckysheet-toolbar-textinput\"\r\n                        role=\"combobox\" style=\"user-select: none;\" tabindex=\"-1\" type=\"text\" value=\"10\"\r\n                        />\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-combo-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Font size'\r\n        bold: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.bold}\"\r\n        id=\"luckysheet-icon-bold\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-bold iconfont luckysheet-iconfont-jiacu\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Bold (Ctrl+B)'\r\n        italic: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.italic}\"\r\n        id=\"luckysheet-icon-italic\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-italic iconfont luckysheet-iconfont-wenbenqingxie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Italic (Ctrl+I)'\r\n        strikethrough: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.strikethrough}\"\r\n        id=\"luckysheet-icon-strikethrough\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-strikethrough iconfont luckysheet-iconfont-wenbenshanchuxian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Strikethrough (Alt+Shift+5)'\r\n        underline: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.underline}\"\r\n        id=\"luckysheet-icon-underline\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-underline iconfont luckysheet-iconfont-wenbenxiahuaxian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Underline (Alt+Shift+6)'\r\n        textColor: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-text-color\"\r\n        data-tips=\"${toolbar.textColor}\" id=\"luckysheet-icon-text-color\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-color-menu-button-indicator\" style=\"border-bottom-color: rgb(0, 0, 0); user-select: none;\">\r\n                            <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                                <div class=\"text-color-bar\" style=\"background-color:${luckysheetConfigsetting.defaultTextColor}\"></div>\r\n                                <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color iconfont luckysheet-iconfont-wenbenyanse\"\r\n                                style=\"user-select: none;\">\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseColor}...\" id=\"luckysheet-icon-text-color-menu\" role=\"button\"\r\n        style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Text color'\r\n        fillColor: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-cell-color\"\r\n        data-tips=\"${toolbar.fillColor}\" id=\"luckysheet-icon-cell-color\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-color-menu-button-indicator\" style=\"border-bottom-color: rgb(255, 255, 255); user-select: none;\">\r\n                            <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                                <div class=\"text-color-bar\" style=\"background-color:${luckysheetConfigsetting.defaultCellColor}\"></div>\r\n                                <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color iconfont luckysheet-iconfont-tianchong\"\r\n                                style=\"user-select: none;\">\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseColor}...\" id=\"luckysheet-icon-cell-color-menu\" role=\"button\"\r\n        style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Cell color'\r\n        border: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-border-all\"\r\n        data-tips=\"${toolbar.border}\" id=\"luckysheet-icon-border-all\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont luckysheet-iconfont-quanjiabiankuang\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.borderStyle}...\" id=\"luckysheet-icon-border-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'border'\r\n        mergeCell: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-merge-button\"\r\n        data-tips=\"${toolbar.mergeCell}\" id=\"luckysheet-icon-merge-button\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-merge iconfont luckysheet-iconfont-hebing\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseMergeType}...\" id=\"luckysheet-icon-merge-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Merge cells'\r\n        horizontalAlignMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-align\"\r\n        data-tips=\"${toolbar.horizontalAlign}\" id=\"luckysheet-icon-align\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont luckysheet-iconfont-wenbenzuoduiqi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.alignment}...\" id=\"luckysheet-icon-align-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Horizontal alignment'\r\n        verticalAlignMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-valign\"\r\n        data-tips=\"${toolbar.verticalAlign}\" id=\"luckysheet-icon-valign\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont luckysheet-iconfont-dibuduiqi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.alignment}...\" id=\"luckysheet-icon-valign-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Vertical alignment'\r\n        textWrapMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-textwrap\"\r\n        data-tips=\"${toolbar.textWrap}\" id=\"luckysheet-icon-textwrap\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont luckysheet-iconfont-jieduan\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.textWrapMode}...\" id=\"luckysheet-icon-textwrap-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Wrap mode'\r\n        textRotateMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-rotation\"\r\n        data-tips=\"${toolbar.textRotate}\" id=\"luckysheet-icon-rotation\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wuxuanzhuang\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.textRotateMode}...\" id=\"luckysheet-icon-rotation-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Text Rotation Mode'\r\n        image: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.insertImage}\" id=\"luckysheet-insertImg-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-tupian\"\r\n                            style=\"user-select: none;\">\r\n                                <input id=\"luckysheet-imgUpload\" type=\"file\" accept=\"image/*\" style=\"display:none;\"></input>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Insert picture'\r\n        link: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.insertLink}\" id=\"luckysheet-insertLink-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-lianjie\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Insert link'(TODO)\r\n        chart: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chart}\" id=\"luckysheet-chart-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-tubiao\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)\r\n        postil: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.postil}\"\r\n        id=\"luckysheet-icon-postil\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon-img-container luckysheet-toolbar-menu-button-caption luckysheet-inline-block iconfont luckysheet-iconfont-zhushi\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'comment'\r\n        pivotTable: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.pivotTable}\" id=\"luckysheet-pivot-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-shujutoushi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'PivotTable'\r\n        function: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-function\"\r\n        data-tips=\"${toolbar.autoSum}\" id=\"luckysheet-icon-function\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-jisuan\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${toolbar.sum}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.moreFunction}...\" id=\"luckysheet-icon-function-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'formula'\r\n        frozenMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-freezen-btn-horizontal\"\r\n        data-tips=\"${toolbar.freezeTopRow}\" id=\"luckysheet-freezen-btn-horizontal\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-dongjie1\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.moreOptions}...\" id=\"luckysheet-icon-freezen-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'freeze mode'\r\n        sortAndFilter: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.sortAndFilter}\"\r\n        id=\"luckysheet-icon-autofilter\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-shaixuan\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Sort and filter'\r\n        conditionalFormat: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.conditionalFormat}\"\r\n        id=\"luckysheet-icon-conditionformat\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-geshitiaojian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Conditional Format'\r\n        dataVerification: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.dataVerification}\" id=\"luckysheet-dataVerification-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-shujuyanzheng\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Data Verification'\r\n        splitColumn: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.splitColumn}\" id=\"luckysheet-splitColumn-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wenbenfenge\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Split column'\r\n        screenshot: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.screenshot}\" id=\"luckysheet-chart-btn-screenshot\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-jieping\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'screenshot'\r\n        findAndReplace: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.findAndReplace}\"\r\n        id=\"luckysheet-icon-seachmore\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-sousuo\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Find and Replace'\r\n        protection: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.protection}\" id=\"luckysheet-icon-protection\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-biaogesuoding\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Worksheet protection'\r\n        print: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.print}\"\r\n        id=\"luckysheet-icon-print\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-dayin\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>` // 'print'\r\n    };\r\n\r\n    const showtoolbar = luckysheetConfigsetting.showtoolbar;\r\n    const showtoolbarConfig = luckysheetConfigsetting.showtoolbarConfig;\r\n\r\n    const buttonHTML = ['<div class=\"luckysheet-toolbar-left-theme\"></div>'];\r\n\r\n    // \u6570\u7EC4\u5F62\u5F0F\u76F4\u63A5\u751F\u6210\r\n    if (getObjType(showtoolbarConfig) === 'array') {\r\n        // \u6B64\u65F6\u4E0D\u6839\u636E showtoolbar=false\uFF0CshowtoolbarConfig\u4E3A\u67D0\u51E0\u4E2A\u8FDB\u884C\u9002\u914D\uFF0C\u6B64\u65F6showtoolbarConfig\u672C\u8EAB\u5C31\u662F\u5168\u90E8\u8981\u663E\u793A\u7684\u6309\u94AE\r\n        if (!showtoolbar) {\r\n            return '';\r\n        }\r\n        let i = 0;\r\n        showtoolbarConfig.forEach(function(key, i) {\r\n            if (key === '|') {\r\n                const nameKeys = showtoolbarConfig[i - 1]\r\n                if(nameKeys !== '|') {\r\n                    buttonHTML.push(\r\n                        `<div id=\"toolbar-separator-${camel2split(nameKeys)}\" class=\"luckysheet-toolbar-separator luckysheet-inline-block\" style=\"user-select: none;\"></div>`\r\n                        );\r\n                }\r\n            } else {\r\n                buttonHTML.push(htmlMap[key]);\r\n            }\r\n        });\r\n        return buttonHTML.join('');\r\n    }\r\n\r\n    const config = defaultToolbar.reduce(function(total, curr) {\r\n        if (curr !== '|') {\r\n            total[curr] = true;\r\n        }\r\n        return total;\r\n    }, {});\r\n\r\n    if (!showtoolbar) {\r\n        for (let s in config) {\r\n            config[s] = false;\r\n        }\r\n    }\r\n\r\n    // \u5BF9\u8C61\u6A21\u5F0F \u5219\u4ECE\u91CC\u9762\u6311\u9009 true \u4FDD\u7559 false \u5220\u6389\r\n    if (JSON.stringify(showtoolbarConfig) !== '{}') {\r\n        if(showtoolbarConfig.hasOwnProperty('undoRedo')){\r\n            config.undo = config.redo = showtoolbarConfig.undoRedo;\r\n        }\r\n        Object.assign(config, showtoolbarConfig);\r\n    }\r\n    for (let i = 0; i < defaultToolbar.length; i++) {\r\n        let key = defaultToolbar[i];\r\n        if (!config[key] && key !== '|') {\r\n            // \u5982\u679C\u5F53\u524D\u5143\u7D20\u9690\u85CF \u6309\u7167\u4E4B\u524D\u7684\u89C4\u5219 \u540E\u9762\u7D27\u8DDF\u7684 | \u5206\u5272\u4E5F\u4E0D\u9700\u8981\u663E\u793A\u4E86\r\n            if (defaultToolbar[i + 1] === '|') {\r\n                i++;\r\n            }\r\n            continue;\r\n        }\r\n        if (key === '|') {\r\n            const nameKeys = defaultToolbar[i - 1]\r\n            if(nameKeys !== '|') {\r\n                buttonHTML.push(\r\n                    `<div id=\"toolbar-separator-${camel2split(nameKeys)}\" class=\"luckysheet-toolbar-separator luckysheet-inline-block\" style=\"user-select: none;\"></div>`\r\n                );\r\n            }\r\n        } else {\r\n            buttonHTML.push(htmlMap[key]);\r\n        }\r\n    }\r\n    return buttonHTML.join('');\r\n}\r\n", "import locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport { getObjType } from '../utils/util';\r\nimport { createToolbarHtml } from './toolbar';\r\n//dom variable\r\nconst gridHTML = function(){ \r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n    const locale_print = _locale.print;\r\n    const userInfo = luckysheetConfigsetting.userInfo === true ? '<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky' : luckysheetConfigsetting.userInfo; // When true, use the default HTML string. The rendering of userInfo below uses nested template strings. Otherwise, when display is used and the image path is not passed in, there will be an undefined request\r\n\r\n    return `<div class=\"luckysheet\">\r\n                    <canvas id=\"luckysheetTableContentF\" style=\"display:none;\" class=\"luckysheetTableContent\"></canvas> \r\n                    <div class=\"luckysheet-work-area luckysheet-noselected-text\"> \r\n                        <div id =\"luckysheet_info_detail\" class=\"luckysheet_info_detail\"> \r\n                            <div data-tips=\"${locale_info.return}\" id=\"luckysheet_info_detail_title\" class=\"luckysheet_info_detail_back\"> \r\n                                <i style=\"color:#444D5A;\" class=\"fa fa-angle-left fa-2x\" aria-hidden=\"true\"></i> \r\n                            </div> \r\n                            <div class=\"luckysheet-share-logo\" title=\"\\${logotitle}\"></div>\r\n                            <div class=\"sheet-name\"> \r\n                                <input data-tips=\"${locale_info.tips}\" id=\"luckysheet_info_detail_input\" class=\"luckysheet_info_detail_input luckysheet-mousedown-cancel\" value=\"${locale_info.noName}\" tabindex=\"0\" dir=\"ltr\" aria-label=\"${locale_info.rename}\" style=\"visibility: visible; width: 149px;\" data-tooltip=\"${locale_info.rename}\"> \r\n                            </div> \r\n                            <div id=\"luckysheet_info_detail_update\" class=\"luckysheet_info_detail_update\"> ${locale_info.detailUpdate} </div> \r\n                            <div id=\"luckysheet_info_detail_save\" class=\"luckysheet_info_detail_save\"> ${locale_info.wait} </div>\r\n                            \r\n                            \\${functionButton}\r\n                            \r\n                            ${getObjType(userInfo) === 'string' ? `<div class=\"luckysheet_info_detail_user\">\r\n                            <span id=\"luckysheet_info_detail_user\">${userInfo}</span></div>` : ''}\r\n\r\n                            ${getObjType(userInfo) === 'object' ? `<div class=\"luckysheet_info_detail_user\">                            \r\n                            <img src=\"${userInfo.userImage}\" id=\"luckysheet_info_detail_user_img\">\r\n                            <span id=\"luckysheet_info_detail_user\">${userInfo.userName}</span>\r\n                            </div>` : ''}\r\n                            \r\n                        </div> \r\n                        <div id=\"luckysheet-wa-editor\" class=\"luckysheet-wa-editor toolbar\"> \\${menu} </div> \r\n                        <div id=\"luckysheet-wa-calculate\" class=\"luckysheet-wa-calculate\"> \r\n                            <div class=\"luckysheet-wa-calculate-size\" id=\"luckysheet-wa-calculate-size\"></div> \r\n                            <div class=\"luckysheet-wa-calculate-help\"> \r\n                                <div class=\"luckysheet-wa-calculate-help-box\"> \r\n                                    <div spellcheck=\"false\" aria-hidden=\"false\" id=\"luckysheet-helpbox\">\r\n                                        <div id=\"luckysheet-helpbox-cell\" class=\"luckysheet-helpbox-cell-input luckysheet-mousedown-cancel\" tabindex=\"0\" contenteditable=\"true\" dir=\"ltr\" aria-autocomplete=\"list\"></div>\r\n                                    </div> \r\n                                </div>  \r\n                                <div class=\"luckysheet-wa-calculate-help-tool\">\r\n                                    <i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\r\n                                </div> \r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-cancel\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont luckysheet-iconfont-qingchu\" aria-hidden=\"true\"></i></span>\r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-confirm\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont luckysheet-iconfont-yunhang\" aria-hidden=\"true\"></i></span>\r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-fx\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont luckysheet-iconfont-hanshu\" aria-hidden=\"true\" style=\"color:#333\"></i></span> \r\n                            </div> \r\n                            <div id=\"luckysheet-functionbox-container\" class=\"luckysheet-mousedown-cancel\">\r\n                                <div class=\"luckysheet-mousedown-cancel\" dir=\"ltr\">\r\n                                    <div spellcheck=\"false\" aria-hidden=\"false\" id=\"luckysheet-functionbox\">\r\n                                        <div id=\"luckysheet-functionbox-cell\" class=\"luckysheet-functionbox-cell-input luckysheet-mousedown-cancel\" tabindex=\"0\" contenteditable=\"true\" dir=\"ltr\" aria-autocomplete=\"list\" aria-label=\"D4\"></div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>   \r\n                        </div> \r\n                    </div> \r\n                    <div class=\"luckysheet-grid-container luckysheet-scrollbars-enabled\"> \r\n                        <div class=\"luckysheet-grid-window\"> \r\n                            <div class=\"luckysheet-help-sub\"></div> \r\n                            <div class=\"luckysheet-grid-window-1\" id=\"luckysheet-grid-window-1\">\r\n                                <canvas id=\"luckysheetTableContent\" class=\"luckysheetTableContent\"></canvas> \r\n                                <table class=\"luckysheet-grid-window-2\" cellspacing=\"0\" cellpadding=\"0\" dir=\"ltr\" tabindex=\"-1\" > \r\n                                    <tbody> \r\n                                        <tr> \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div class=\"luckysheet-left-top\" id=\"luckysheet-left-top\"> </div> \r\n                                            </td> \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div id=\"luckysheet-cols-h-c\" class=\"luckysheet-cols-h-c\">\r\n                                                    <div class=\"luckysheet-cols-change-size\" id=\"luckysheet-cols-change-size\"></div>  \r\n                                                    <div class=\"luckysheet-cols-menu-btn luckysheet-mousedown-cancel\" id=\"luckysheet-cols-menu-btn\"><i class=\"fa fa-caret-down luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div>  \r\n                                                    <div class=\"luckysheet-cols-h-hover\" id=\"luckysheet-cols-h-hover\"></div>  \r\n                                                    <div id=\"luckysheet-cols-h-selected\"></div>  \r\n                                                    <div class=\"luckysheet-grdusedrange\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div>  \\${columnHeader}\r\n                                                </div>\r\n                                            </td>\r\n                                        </tr>\r\n                                        <tr>\r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div class=\"luckysheet-rows-h\" id=\"luckysheet-rows-h\"> \r\n                                                    <div class=\"luckysheet-rows-change-size\" id=\"luckysheet-rows-change-size\"></div> \r\n                                                    <div class=\"luckysheet-rows-h-hover\" id=\"luckysheet-rows-h-hover\"></div> \r\n                                                    <div id=\"luckysheet-rows-h-selected\"></div>  \r\n                                                    <div class=\"luckysheet-grdusedrange\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div> \\${rowHeader}\r\n                                                </div> \r\n                                            </td>  \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\">\r\n                                                <div class=\"luckysheet-cell-loading\" id=\"luckysheet-cell-loading\">\r\n                                                    <div class=\"luckysheet-cell-loading-inner\">\r\n                                                        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\r\n                                                        <span></span>\r\n                                                    </div>\r\n                                                </div> \r\n                                                <div class=\"luckysheet-cell-freezen\"></div> \r\n                                                <div class=\"luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-x\" id=\"luckysheet-scrollbar-x\"><div></div></div> \r\n                                                <div class=\"luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-y\" id=\"luckysheet-scrollbar-y\"><div></div></div> \r\n                                                <div class=\"luckysheet-cell-main \" id=\"luckysheet-cell-main\">\r\n                                                    <div id=\"luckysheet-formula-functionrange\"></div>  \r\n                                                    <div id=\"luckysheet-formula-functionrange-select\" class=\"luckysheet-selection-copy luckysheet-formula-functionrange-select\">\r\n                                                        <div class=\"luckysheet-selection-copy-top luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-right luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-left luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-hc\"></div>\r\n                                                    </div>  \r\n                                                    <div class=\"luckysheet-row-count-show luckysheet-count-show\" id=\"luckysheet-row-count-show\"></div>\r\n                                                    <div class=\"luckysheet-column-count-show luckysheet-count-show\" id=\"luckysheet-column-count-show\"></div>\r\n                                                    <div class=\"luckysheet-change-size-line\" id=\"luckysheet-change-size-line\"></div>  \r\n                                                    <div class=\"luckysheet-cell-selected-focus\" id=\"luckysheet-cell-selected-focus\"></div>  \r\n                                                    <div id=\"luckysheet-selection-copy\"></div>  \r\n                                                    <div id=\"luckysheet-chart-rangeShow\"></div>\r\n                                                    <div class=\"luckysheet-cell-selected-extend\" id=\"luckysheet-cell-selected-extend\"></div>  \r\n                                                    <div class=\"luckysheet-cell-selected-move\" id=\"luckysheet-cell-selected-move\"></div>  \r\n                                                    <div id=\"luckysheet-cell-selected-boxs\">\r\n                                                        <div id=\"luckysheet-cell-selected\" class=\"luckysheet-cell-selected\">\r\n                                                            <div class=\"luckysheet-cs-inner-border\"></div>\r\n                                                            <div class=\"luckysheet-cs-fillhandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-inner-border\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-top luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-bottom luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-left luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-right luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-touchhandle luckysheet-cs-touchhandle-lt\"><div class=\"luckysheet-cs-touchhandle-btn\"></div></div>\r\n                                                            <div class=\"luckysheet-cs-touchhandle luckysheet-cs-touchhandle-rb\"><div class=\"luckysheet-cs-touchhandle-btn\"></div></div>\r\n                                                        </div>\r\n                                                    </div>\r\n                                                    <div id=\"luckysheet-postil-showBoxs\"></div>\r\n                                                    <div id=\"luckysheet-multipleRange-show\"></div>  \r\n                                                    <div id=\"luckysheet-dynamicArray-hightShow\"></div>\r\n                                                    <div id=\"luckysheet-ctrl-showBoxs\">\r\n                                                        <div class=\"ctrl-list\"></div>\r\n                                                    </div>\r\n                                                    <div id=\"luckysheet-image-showBoxs\">\r\n                                                        <div id=\"luckysheet-modal-dialog-activeImage\" class=\"luckysheet-modal-dialog\" style=\"display:none;padding:0;position:absolute;z-index:300;\">\r\n                                                            <div class=\"luckysheet-modal-dialog-border\" style=\"position:absolute;\"></div> \r\n                                                            <div class=\"luckysheet-modal-dialog-content\"></div>  \r\n                                                            <div class=\"luckysheet-modal-dialog-resize\">\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\" data-type=\"lt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\" data-type=\"mt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\" data-type=\"lm\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\" data-type=\"rm\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\" data-type=\"rt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\" data-type=\"lb\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\" data-type=\"mb\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\" data-type=\"rb\"></div>\r\n                                                            </div>\r\n                                                            <div class=\"luckysheet-modal-dialog-controll\">\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-crop\" role=\"button\" tabindex=\"0\" aria-label=\"\u88C1\u526A\" title=\"\u88C1\u526A\">\r\n                                                                    <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-restore\" role=\"button\" tabindex=\"0\" aria-label=\"\u6062\u590D\u539F\u56FE\" title=\"\u6062\u590D\u539F\u56FE\">\r\n                                                                    <i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\" role=\"button\" tabindex=\"0\" aria-label=\"\u5220\u9664\" title=\"\u5220\u9664\">\r\n                                                                    <i class=\"fa fa-trash\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                            </div>\r\n                                                        </div>\r\n                                                        <div id=\"luckysheet-modal-dialog-cropping\" class=\"luckysheet-modal-dialog\" style=\"display:none;padding:0;position:absolute;z-index:300;\">\r\n                                                            <div class=\"cropping-mask\"></div>\r\n                                                            <div class=\"cropping-content\"></div>\r\n                                                            <div class=\"luckysheet-modal-dialog-border\" style=\"position:absolute;\"></div>\r\n                                                            <div class=\"luckysheet-modal-dialog-resize\">\r\n                                                                <div class=\"resize-item lt\" data-type=\"lt\"></div> \r\n                                                                <div class=\"resize-item mt\" data-type=\"mt\"></div> \r\n                                                                <div class=\"resize-item lm\" data-type=\"lm\"></div> \r\n                                                                <div class=\"resize-item rm\" data-type=\"rm\"></div> \r\n                                                                <div class=\"resize-item rt\" data-type=\"rt\"></div> \r\n                                                                <div class=\"resize-item lb\" data-type=\"lb\"></div> \r\n                                                                <div class=\"resize-item mb\" data-type=\"mb\"></div> \r\n                                                                <div class=\"resize-item rb\" data-type=\"rb\"></div>\r\n                                                            </div>\r\n                                                            <div class=\"luckysheet-modal-dialog-controll\">\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-crop\" role=\"button\" tabindex=\"0\" aria-label=\"\u88C1\u526A\" title=\"\u88C1\u526A\">\r\n                                                                    <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-restore\" role=\"button\" tabindex=\"0\" aria-label=\"\u6062\u590D\u539F\u56FE\" title=\"\u6062\u590D\u539F\u56FE\">\r\n                                                                    <i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\" role=\"button\" tabindex=\"0\" aria-label=\"\u5220\u9664\" title=\"\u5220\u9664\">\r\n                                                                    <i class=\"fa fa-trash\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                            </div>\r\n                                                        </div>\r\n                                                        <div class=\"img-list\"></div>\r\n                                                        <div class=\"cell-date-picker\">\r\n                                                            <input id=\"cellDatePickerBtn\" class=\"formulaInputFocus\" readonly=\"readonly\"/>\r\n                                                        </div>\r\n                                                    </div>\r\n                                                    <div id=\"luckysheet-dataVerification-dropdown-btn\"></div>\r\n                                                    <div id=\"luckysheet-dataVerification-dropdown-List\" class=\"luckysheet-mousedown-cancel\"></div>\r\n                                                    <div id=\"luckysheet-dataVerification-showHintBox\" class=\"luckysheet-mousedown-cancel\"></div>\r\n                                                    <div class=\"luckysheet-cell-copy\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div>  \\${flow} \r\n                                                </div> \r\n                                            </td> \r\n                                        </tr> \r\n                                    </tbody> \r\n                                </table> \r\n                            </div> \r\n                            <div class=\"luckysheet-sheet-area luckysheet-noselected-text\" id=\"luckysheet-sheet-area\">\r\n                                <div id=\"luckysheet-sheet-content\">\r\n                                    <div id=\"luckysheet-sheets-add\" class=\"luckysheet-sheets-add lucky-button-custom\"><i class=\"iconfont luckysheet-iconfont-jia1\"></i></div>\r\n                                    <div id=\"luckysheet-sheets-m\" class=\"luckysheet-sheets-m lucky-button-custom\"><i class=\"iconfont luckysheet-iconfont-caidan2\"></i></div>\r\n                                    <div class=\"luckysheet-sheet-container\" id=\"luckysheet-sheet-container\">\r\n                                        <div class=\"docs-sheet-fade docs-sheet-fade-left\" style=\"display: none;\">\r\n                                            <div class=\"docs-sheet-fade3\"></div>\r\n                                            <div class=\"docs-sheet-fade2\"></div>\r\n                                            <div class=\"docs-sheet-fade1\"></div>\r\n                                        </div>\r\n                                        <div class=\"docs-sheet-fade docs-sheet-fade-right\" style=\"display: none;\">\r\n                                            <div class=\"docs-sheet-fade1\"></div>\r\n                                            <div class=\"docs-sheet-fade2\"></div>\r\n                                            <div class=\"docs-sheet-fade3\"></div>\r\n                                        </div>\r\n                                        <div class=\"luckysheet-sheet-container-c\" id=\"luckysheet-sheet-container-c\"></div>\r\n                                    </div>\r\n                                    <div id=\"luckysheet-sheets-leftscroll\" class=\"luckysheet-sheets-scroll lucky-button-custom\"><i class=\"fa fa-caret-left\"></i></div>\r\n                                    <div id=\"luckysheet-sheets-rightscroll\" class=\"luckysheet-sheets-scroll lucky-button-custom\"><i class=\"fa fa-caret-right\"></i></div>\r\n                                </div>\r\n                            </div> \r\n                        </div> \r\n                        <div class=\"luckysheet-stat-area\"> \r\n                            <div class=\"luckysheet-sta-c\">\r\n                                <div class=\"luckysheet-zoom-content\" id=\"luckysheet-zoom-content\">\r\n                                    <div class=\"luckysheet-zoom-minus\" id=\"luckysheet-zoom-minus\">\r\n                                        <div class=\"luckysheet-zoom-minus-icon\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-slider\" id=\"luckysheet-zoom-slider\">\r\n                                        <div class=\"luckysheet-zoom-line\"></div>\r\n                                        <div class=\"luckysheet-zoom-cursor\" id=\"luckysheet-zoom-cursor\"></div>\r\n                                        <div class=\"luckysheet-zoom-hundred\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-plus\" id=\"luckysheet-zoom-plus\">\r\n                                        <div class=\"luckysheet-zoom-plus-icon\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-ratioText\" id=\"luckysheet-zoom-ratioText\">100%</div>\r\n                                </div>\r\n                                <div class=\"luckysheet-print-viewList\">\r\n                                    <div type=\"viewNormal\" class=\"luckysheet-print-viewBtn luckysheet-print-viewNormal luckysheet-print-viewBtn-active\" title=\"${locale_print.normalBtn}\"><i class=\"icon iconfont luckysheet-iconfont-putong\"></i></div>\r\n                                    <div type=\"viewLayout\" class=\"luckysheet-print-viewBtn luckysheet-print-viewLayout\" title=\"${locale_print.layoutBtn}\"><i class=\"icon iconfont luckysheet-iconfont-yemianbuju\"></i></div>\r\n                                    <div type=\"viewPage\" class=\"luckysheet-print-viewBtn luckysheet-print-viewPage\" title=\"${locale_print.pageBtn}\"><i class=\"icon iconfont luckysheet-iconfont-fenyeyulan\"></i></div>\r\n                                </div>\r\n                                <div class=\"luckysheet-sta-content\" id=\"luckysheet-sta-content\"></div>  \r\n                                <!--<div class=\"luckysheet-bottom-content\" id=\"luckysheet-bottom-content-show\"></div> -->\r\n                            </div> \r\n                        </div> \r\n                    </div>\r\n                    <div id=\"luckysheet-copy-content\" contenteditable=\"true\"></div>\r\n                    <input id=\"luckysheet-copy-btn\" type=\"button\" data-clipboard-target=\"luckysheet-copy-content\">\r\n                    <div id=\"testdpidiv\" style=\"height: 1in; left: -100%; position: absolute; top: -100%; width: 1in;\"></div>\r\n                  </div>`;\r\n}\r\n\r\nconst columeHeader_word = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],\r\n    columeHeader_word_index = { 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25 },\r\n    flow = '<div id=\"luckysheet-cell-flow_${index}\" class=\"luckysheet-cell-flow luckysheetsheetchange\" style=\"width:${width}px;\"><div class=\"luckysheet-cell-flow-clip\"><div class=\"luckysheet-grdblkpush\"></div>${flow}</div></div>',\r\n    colsmenuHTML = '';\r\n\r\n//\u53F3\u952E\u83DC\u5355dom\r\nfunction rightclickHTML(){\r\n    const _locale = locale();\r\n    const rightclick = _locale.rightclick;\r\n    const toolbar = _locale.toolbar;\r\n\r\n    const config = customCellRightClickConfig();\r\n\r\n    // \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n    let handleincellMenuseparator = true;\r\n\r\n    if(!config.insertRow && !config.insertColumn && !config.deleteRow && !config.deleteColumn && !config.deleteCell ){\r\n        handleincellMenuseparator = false;\r\n    }\r\n\r\n    let dataMenuseparator = true;\r\n\r\n    if(!config.clear && !config.matrix && !config.sort && !config.filter && !config.chart && !config.image && !config.link && !config.data && !config.cellFormat){\r\n        dataMenuseparator = false;\r\n    }\r\n\r\n    const customsButtons = (config.customs || []).map((item, index) => `\r\n            <div data-index=\"${index}\" class=\"luckysheetColsRowsHandleAdd_custom luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                ${item.title}\r\n                </div>\r\n            </div>`\r\n        ).join(\"\");\r\n\r\n    const rightclickContainer =  `<div id=\"luckysheet-rightclick-menu\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-copy-btn\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-copy-btn\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" style=\"display:${config.copy ? 'block' : 'none'};\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.copy}</div>\r\n                </div>\r\n                <div id=\"luckysheetcopyfor\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\"  style=\"display:${config.copyAs ? 'block' : 'none'};\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.copyAs}<span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-paste\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.paste ? 'block' : 'none'};\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.paste}</div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-handleincell\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${handleincellMenuseparator ? 'block' : 'none'};\"></div>\r\n                    <div id=\"luckysheetColsRowsHandleAdd_row\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.insertRow ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.insert}${rightclick.row}<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheetColsRowsHandleAdd_column\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.insertColumn ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.insert}${rightclick.column}<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-delRows\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${config.deleteRow ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.row}<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-delCols\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${config.deleteColumn ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.column}<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <!-- cell right click remove hide button\r\n                    <div id=\"luckysheetColsRowsHandleHid\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.hide}<span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    -->\r\n                    <div id=\"luckysheetCellsHandleDel\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${config.deleteCell ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.deleteCell}<span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-add\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                    <div id=\"luckysheet-top-left-add-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.to}\r\n                            <span class=\"luckysheet-cols-rows-shift-left\">${rightclick.left}</span>\r\n                            ${rightclick.add}\r\n                            <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align:center;margin-left:5px;\"/>\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-bottom-right-add-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.to}\r\n                            <span class=\"luckysheet-cols-rows-shift-right\">${rightclick.right}</span>\r\n                            ${rightclick.add}\r\n                            <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-del-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.deleteSelected}\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-hide-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}\r\n                        <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-show-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.showHide}\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-column-row-width-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                            <span class=\"luckysheet-cols-rows-shift-size luckysheet-mousedown-cancel\">${rightclick.width}</span>\r\n                            <input type=\"number\" class=\"luckysheet-mousedown-cancel rcsize\" min=\"0\" max=\"255\" placeholder=\"${rightclick.number}\" value=\"\" style=\"width:50px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\">\r\n                            px\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-shift\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${config.sort ? 'block' : 'none'};\"></div>\r\n                    <div id=\"luckysheetorderbyasc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.sort ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.orderAZ}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetorderbydesc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.sort ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.orderZA}</div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-data\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${dataMenuseparator ? 'block' : 'none'};\"></div>\r\n                    <div id=\"luckysheet-delete-text\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.clear ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.clearContent}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetmatrix\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${config.matrix ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.matrix}<span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheetorderby\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.sort ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.sortSelection}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetfilter\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.filter ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.filterSelection}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetdatavisual\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.chart ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.chartGeneration}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetInsertImage\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.image ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${toolbar.insertImage}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetInsertLink\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.link ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${toolbar.insertLink}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetDataVerification\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.data ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${toolbar.dataVerification}</div>\r\n                    </div>\r\n                    <div id=\"luckysheetCellFormatRightClickMenu\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.cellFormat ? 'block' : 'none'};\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${toolbar.cellFormat}</div>\r\n                    </div>\r\n                    ${customsButtons}\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheetcopyfor_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-copy-json-head\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">Json ${rightclick.firstLineTitle}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-json-nohead\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">Json ${rightclick.untitled}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-array1\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.array1}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-array2\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.array2}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-arraymore-confirm\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.array3}</span>\r\n                        <input type=\"number\" id=\"luckysheet-copy-arraymore-row\" min=\"1\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.row}\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;\"/>\r\n                            \u00D7\r\n                            <input type=\"number\" id=\"luckysheet-copy-arraymore-col\" min=\"1\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.column}\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;\"/>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                <div id=\"luckysheet-copy-diagonal\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.diagonal}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-antidiagonal\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.antiDiagonal}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-diagonaloffset\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.diagonalOffset}\r\n                        <input type=\"number\" id=\"luckysheet-copy-diagonaloffset-value\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.offset}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        ${rightclick.column}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-boolvalue\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.boolean}</div>\r\n                </div>\r\n            </div>\r\n            \r\n            <!-- Revision: modeled on google sheet\r\n            \r\n            <div id=\"luckysheetColsRowsHandleAdd_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.top}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.row}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.bottom}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.row}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.left}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.right}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            \r\n            -->\r\n\r\n            <!-- delete row or column\r\n            \r\n            <div id=\"luckysheetColsRowsHandleDel_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-delRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-delCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            \r\n            -->\r\n\r\n            <!--\r\n            <div id=\"luckysheetColsRowsHandleHid_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-hidRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-showHidRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.showHide}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-hidCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-showHidCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.showHide}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            -->\r\n\r\n            <div id=\"luckysheetCellsHandleDel_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-delCellsMoveLeft\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.moveLeft}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-delCellsMoveUp\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.moveUp}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheetmatrix_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.flip}\r\n                        <button id=\"luckysheet-matrix-turn-up\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.upAndDown}</button>\r\n                        <button id=\"luckysheet-matrix-turn-left\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.leftAndRight}</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.flip}\r\n                        <button id=\"luckysheet-matrix-turn-cw\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.clockwise}</button>\r\n                        <button id=\"luckysheet-matrix-turn-anticw\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.counterclockwise}</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div id=\"luckysheet-matrix-turn-trans\" class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.transpose}</div>\r\n                </div>\r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                <div id=\"luckysheet-matrix-cal-confirm\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-mousedown-cancel\">${rightclick.matrixCalculation}</div>\r\n                        <div class=\"luckysheet-mousedown-cancel\">\r\n                            <select id=\"luckysheet-matrix-cal-type\" class=\"luckysheet-mousedown-cancel\" style=\"height:20px;\">\r\n                                <option value=\"plus\">${rightclick.plus}</option>\r\n                                <option value=\"minus\">${rightclick.minus}</option>\r\n                                <option value=\"multiply\">${rightclick.multiply}</option>\r\n                                <option value=\"divided\">${rightclick.divided}</option>\r\n                                <option value=\"power\">${rightclick.power}</option>\r\n                                <option value=\"root\">${rightclick.root}</option>\r\n                                <option value=\"log\">${rightclick.log}</option>\r\n                            </select>\r\n                            <input type=\"number\" id=\"luckysheet-matrix-cal-value\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${rightclick.number}\" value=\"2\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.delete0}\r\n                        <button id=\"luckysheet-matrix-delezero-row\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.byRow}</button>\r\n                        <button id=\"luckysheet-matrix-delezero-column\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.byCol}</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.removeDuplicate}\r\n                        <button id=\"luckysheet-matrix-delerpt-row\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.byRow}</button>\r\n                        <button id=\"luckysheet-matrix-delerpt-column\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${rightclick.byCol}</button>\r\n                    </div>\r\n                </div>\r\n            </div>`;\r\n\r\n            return rightclickContainer;\r\n}\r\n\r\nconst pivottableconfigHTML = function(){\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n\r\n    return '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-pivotTable-config-option\"> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.titleSort+'</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-order\"> <option selected=\"selected\" value=\"default\">'+locale_pivotTable.titleNoSort+'</option> <option value=\"asc\">'+locale_pivotTable.titleSortAsc+'</option> <option value=\"desc\">'+locale_pivotTable.titleSortDesc+'</option> </select> </div> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.titleSortBy+'</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-orderby\"> </select> </div> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.titleShowSum+'</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-stastic\"> <option  value=\"0\">'+locale_pivotTable.titleStasticFalse+'</option> <option value=\"1\" selected=\"selected\">'+locale_pivotTable.titleStasticTrue+'</option> </select> </div> </div> </div> </div>';\r\n} \r\n\r\nconst pivottablesumHTML = function(){\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n\r\n    return '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-pivotTable-config-option-sumtype\"> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"SUM\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsSUM+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNT\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsCOUNT+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNTA\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsCOUNTA+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNTUNIQUE\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsCOUNTUNIQUE+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"AVERAGE\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsAVERAGE+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MAX\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsMAX+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MIN\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsMIN+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MEDIAN\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsMEDIAN+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"PRODUCT\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsPRODUCT+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"STDEV\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsSTDEV+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"STDEVP\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsSTDEVP+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"VAR\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticslet+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"VARP\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">'+locale_pivotTable.valueStatisticsVARP+'</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> </div>';\r\n} \r\n\r\nconst sheetHTML = '<div style=\"${style}\" id=\"luckysheet-sheets-item${index}\" data-index=\"${index}\" class=\"luckysheet-sheets-item ${active}\"><span class=\"luckysheet-sheets-item-name\" spellcheck =\"false\" contenteditable=\"false\">${name}</span> <span class=\"luckysheet-sheets-item-menu luckysheet-mousedown-cancel\"><i class=\"fa fa-sort-desc luckysheet-mousedown-cancel\"></i></span>${colorset}</div>',\r\n    columnHeaderHTML = '<div class=\"luckysheet-cols-h-cells luckysheetsheetchange\"  id=\"luckysheet-cols-h-cells_${index}\" style=\"width:${width}px;\"> <div class=\"luckysheet-cols-h-cells-c\"> <div class=\"luckysheet-grdblkpush\"></div>${column}</div></div>',\r\n    sheetselectlistHTML = '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-sheet-list\">${item}</div>',\r\n    sheetselectlistitemHTML = '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"  id=\"luckysheet-sheet-btn${index}\" data-index=\"${index}\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"${style}\" ><span class=\"icon luckysheet-mousedown-cancel\">${icon}</span>${name}</div></div>',\r\n    inputHTML = '<div dir=\"ltr\"><div class=\"luckysheet-input-box-index\" id=\"luckysheet-input-box-index\"></div><div id=\"luckysheet-input-box\" spellcheck=\"false\" aria-hidden=\"false\" class=\"luckysheet-input-box\"><div class=\"luckysheet-cell-input editable\" tabindex=\"0\" role=\"combobox\" contenteditable=\"true\" id=\"luckysheet-rich-text-editor\" dir=\"ltr\" g_editable=\"true\" aria-autocomplete=\"list\"></div></div></div>',\r\n    modelHTML = '<div id=\"${id}\" style=\"${style}\" class=\"luckysheet-modal-dialog ${addclass}\" tabindex=\"0\" role=\"dialog\" aria-labelledby=\":41e\" dir=\"ltr\"> <div class=\"luckysheet-modal-dialog-title luckysheet-modal-dialog-title-draggable\"> <span class=\"luckysheet-modal-dialog-title-text\" role=\"heading\">${title}</span>\t <span class=\"luckysheet-modal-dialog-title-close\" role=\"button\" tabindex=\"0\" aria-label=\"${close}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div> <div class=\"luckysheet-modal-dialog-content\">${content}</div> <div class=\"luckysheet-modal-dialog-buttons\">\t ${botton} </div></div>',\r\n\r\n    maskHTML = '<div class=\"luckysheet-modal-dialog-mask\" id=\"luckysheet-modal-dialog-mask\"></div>';\r\n\r\n//\u5E95\u90E8 \u8868\u683C\u6807\u7B7E\u64CD\u4F5Cdom\r\nfunction sheetconfigHTML(){\r\n    const sheetconfig = locale().sheetconfig;\r\n\r\n    const config = customSheetRightClickConfig();\r\n\r\n    /* \u5982\u679C\u914D\u7F6E\u9879\u5168\u90E8\u4E3Aflase\uFF0C\u5219\u9690\u85CF\u5165\u53E3\u4E14\u4E0D\u518D\u83DC\u5355\u9879 */\r\n    if(Object.values(config).every(ele=> !ele)){\r\n        $('#luckysheet-sheet-container-c').addClass(\"luckysheet-sheet-container-menu-hide\");\r\n        return \"\";\r\n    }\r\n\r\n    let hideTopMenuseparator = true;\r\n    let moveTopMenuseparator = true;\r\n\r\n    // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n    if(!config.delete && !config.copy && !config.rename && !config.color){\r\n        hideTopMenuseparator = false;\r\n        if(!config.hide){\r\n            moveTopMenuseparator = false;\r\n        }\r\n    }\r\n\r\n    // 2. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n    if(!config.hide){\r\n        hideTopMenuseparator = false;\r\n    }\r\n    if(!config.move){\r\n        moveTopMenuseparator = false;\r\n    }\r\n\r\n\r\n    const sheetconfigModel = `<div id=\"luckysheet-rightclick-sheet-menu\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\"> \r\n                <div id=\"luckysheetsheetconfigdelete\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.delete ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.delete}</div>\r\n                </div> \r\n                <div id=\"luckysheetsheetconfigcopy\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.copy ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.copy}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigrename\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.rename ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.rename}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigcolor\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${config.color ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> \r\n                        ${sheetconfig.changeColor} <span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span> \r\n                    </div> \r\n                </div> \r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${hideTopMenuseparator ? 'block' : 'none'};\"></div> \r\n                <div id=\"luckysheetsheetconfighide\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.hide ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.hide}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigshow\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.hide ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.unhide}</div> \r\n                </div> \r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${moveTopMenuseparator ? 'block' : 'none'};\"></div> \r\n                <div id=\"luckysheetsheetconfigmoveleft\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.move ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.moveLeft}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigmoveright\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${config.move ? 'block' : 'none'};\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.moveRight}</div> \r\n                </div> \r\n            </div> \r\n            <div id=\"luckysheetsheetconfigcolor_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheetsheetconfigcolorreset\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.resetColor}</div>\r\n                </div> \r\n                <div class=\"luckysheet-mousedown-cancel\"> \r\n                    <div class=\"luckysheet-mousedown-cancel\"> \r\n                        <input type=\"text\" id=\"luckysheetsheetconfigcolorur\" /> \r\n                    </div> \r\n                </div> \r\n            </div>`;\r\n\r\n            return sheetconfigModel;\r\n}\r\n\r\nconst luckysheetPivotTableHTML = function(){\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n    // return '<div id=\"luckysheet-modal-dialog-slider-pivot\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\"> <div class=\"luckysheet-modal-dialog-slider-title\"> <span>'+locale_pivotTable.title+'</span> <span id=\"luckysheet-modal-dialog-slider-close\" title=\"'+locale_pivotTable.closePannel+'\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div> <div class=\"luckysheet-modal-dialog-slider-content\"> <div class=\"luckysheet-modal-dialog-slider-range\"> <div id=\"luckysheet-dialog-pivotTable-range\"></div> <div id=\"luckysheet-dialog-pivotTable-range-seleted\">'+locale_pivotTable.editRange+'</div> </div> <div class=\"luckysheet-modal-dialog-slider-list-title\"> '+locale_pivotTable.tipPivotFieldSelected+' <span title=\"'+locale_pivotTable.tipClearSelectedField+'\" id=\"luckysheet-dialog-pivotTable-clearitem\">'+locale_pivotTable.btnClearSelectedField+'</span></div> <div id=\"luckysheet-modal-dialog-pivotTable-list\" class=\"luckysheet-modal-dialog-slider-list luckysheet-scrollbars\"> </div> <div class=\"luckysheet-modal-dialog-slider-config-c\"> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-filter\"> <div> <span><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i> '+locale_pivotTable.btnFilter+'</span> </div> <div id=\"luckysheet-modal-dialog-config-filter\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-row\"> <div> <span><i class=\"fa fa-list-alt\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleRow+'</span> </div> <div id=\"luckysheet-modal-dialog-config-row\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-column\"> <div> <span><i class=\"fa fa-indent\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleColumn+'</span> </div> <div id=\"luckysheet-modal-dialog-config-column\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-value\"> <div> <span><i class=\"fa fa-cube\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleValue+'</span> <span style=\"float: right;margin-right: 10px;display:none;\" id=\"luckysheetpivottablevaluecolrowshow\"><label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"'+locale_pivotTable.tipShowColumn+'\" for=\"luckysheetpivottablevaluecolrow\">'+locale_pivotTable.titleColumn+'</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow\" /> <label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"'+locale_pivotTable.tipShowRow+'\" for=\"luckysheetpivottablevaluecolrow1\">'+locale_pivotTable.titleRow+'</label> <input type=\"radio\" value=\"0\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow1\" /></span></div> <div id=\"luckysheet-modal-dialog-config-value\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> </div> </div> </div>';\r\n    return `\r\n        <div id=\"luckysheet-modal-dialog-slider-pivot\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\">\r\n        <div class=\"luckysheet-modal-dialog-slider-title\"> <span>${locale_pivotTable.title}</span> <span id=\"luckysheet-modal-dialog-slider-close\" title=\"${locale_pivotTable.closePannel}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div>\r\n        <div class=\"luckysheet-modal-dialog-slider-content\">\r\n            <div class=\"luckysheet-modal-dialog-slider-range\">\r\n                <div id=\"luckysheet-dialog-pivotTable-range\"></div>\r\n                <div id=\"luckysheet-dialog-pivotTable-range-seleted\">${locale_pivotTable.editRange}</div>\r\n            </div>\r\n            <div class=\"luckysheet-modal-dialog-slider-list-title\"> ${locale_pivotTable.tipPivotFieldSelected} <span title=\"${locale_pivotTable.tipClearSelectedField}\" id=\"luckysheet-dialog-pivotTable-clearitem\">${locale_pivotTable.btnClearSelectedField}</span></div>\r\n            <div id=\"luckysheet-modal-dialog-pivotTable-list\" class=\"luckysheet-modal-dialog-slider-list luckysheet-scrollbars\"> </div>\r\n            <div class=\"luckysheet-modal-dialog-slider-config-c\">\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-filter\">\r\n                    <div> <span><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i> ${locale_pivotTable.btnFilter}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-filter\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-row\">\r\n                    <div> <span><i class=\"fa fa-list-alt\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleRow}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-row\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-column\">\r\n                    <div> <span><i class=\"fa fa-indent\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleColumn}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-column\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-value\">\r\n                    <div> <span><i class=\"fa fa-cube\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleValue}</span> <span style=\"float: right;margin-right: 10px;display:none;\" id=\"luckysheetpivottablevaluecolrowshow\"><label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"${locale_pivotTable.tipShowColumn}\" for=\"luckysheetpivottablevaluecolrow\">${locale_pivotTable.titleColumn}</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow\" /> <label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"${locale_pivotTable.tipShowRow}\" for=\"luckysheetpivottablevaluecolrow1\">${locale_pivotTable.titleRow}</label> <input type=\"radio\" value=\"0\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow1\" /></span></div>\r\n                    <div id=\"luckysheet-modal-dialog-config-value\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        </div>\r\n        `;\r\n} \r\n\r\nfunction filtermenuHTML() { \r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n    \r\n    return `<div class=\"luckysheet-cols-menu luckysheet-mousedown-cancel luckysheet-filter-menu\" id=\"luckysheet-\\${menuid}-menu\"><div id=\"luckysheet-\\${menuid}-orderby-asc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.sortByAsc}</div></div><div id=\"luckysheet-\\${menuid}-orderby-desc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><div style=\"width:205px;\" class=\"luckysheet-mousedown-cancel\">${locale_filter.sortByDesc}</div></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div><div id=\"luckysheet-\\${menuid}-orderby-color\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"position: relative;\">${locale_filter.filterByColor}<span class=\"luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou\" style=\"user-select: none;right: 0;\"></span></div></div><div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-bycondition\" style=\"padding-top:0px;padding-bottom:0px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i> ${locale_filter.filterByCondition}</div></div> <div class=\"luckysheet-\\${menuid}-bycondition\" style=\"display:none;\"><div class=\"luckysheet-flat-menu-button luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-selected\"><span class=\"luckysheet-mousedown-cancel\" data-value=\"null\" data-type=\"0\">${locale_filter.filiterInputNone}</span><div class=\"luckysheet-mousedown-cancel\"><i class=\"fa fa-sort\" aria-hidden=\"true\"></i></div></div><div class=\"luckysheet-\\${menuid}-selected-input\"><input type=\"text\" placeholder=\"${locale_filter.filiterInputTip}\" class=\"luckysheet-mousedown-cancel\" /></div><div class=\"luckysheet-\\${menuid}-selected-input luckysheet-\\${menuid}-selected-input2\"><span>\u4ECE</span><input type=\"text\" placeholder=\"${locale_filter.filiterRangeStartTip}\" class=\"luckysheet-mousedown-cancel\" /><span>\u5230</span><input type=\"text\" placeholder=\"${locale_filter.filiterRangeEndTip}\" class=\"luckysheet-mousedown-cancel\" /></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-byvalue\" style=\"padding-top:0px;padding-bottom:0px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i> ${locale_filter.filterByValues}</div></div> <div class=\"luckysheet-\\${menuid}-byvalue\"><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel luckysheet-mousedown-\\${menuid}-byvalue-btn\"><span id=\"luckysheet-\\${menuid}-byvalue-btn-all\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByAllBtn}</span> - <span id=\"luckysheet-\\${menuid}-byvalue-btn-clear\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByClearBtn}</span> - <span id=\"luckysheet-\\${menuid}-byvalue-btn-contra\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByInverseBtn}</span> <div><i class=\"fa fa-\\${menuid} luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div></div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"padding-left:3px; padding-right:3px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><input type=\"text\" placeholder=\"${locale_filter.filterValueByTip}\" class=\"luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-byvalue-input\" /><div class=\"luckysheet-\\${menuid}-byvalue-input-icon luckysheet-mousedown-cancel\"><i class=\"fa fa-search luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div></div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div id=\"luckysheet-\\${menuid}-byvalue-select\" class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"></div></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><div class=\"btn btn-primary luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-confirm\">${locale_filter.filterConform}</div> <div class=\"btn btn-default luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-cancel\">${locale_filter.filterCancel}</div> <div class=\"btn btn-danger luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-initial\">${locale_filter.clearFilter}</div></div></div> </div>`\r\n}\r\n\r\nfunction filtersubmenuHTML() {\r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n    \r\n    return `<div style=\"z-index:1004;overflow-y:auto;\" class=\"luckysheet-filter-submenu luckysheet-cols-menu luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-submenu\"><div data-value=\"null\" data-type=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionNone}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"cellnull\"  data-type=\"0\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellIsNull}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"cellnonull\"  data-type=\"0\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotNull}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textinclude\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextContain}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textnotinclude\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextNotContain}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textstart\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextStart}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textend\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextEnd}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextEqual}</div></div>  <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>  <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"dateequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"datelessthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateBefore}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"datemorethan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateAfter}</div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"morethan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellGreater}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"moreequalthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellGreaterEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"lessthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellLess}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"lessequalthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellLessEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"equal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"noequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"include\"  data-type=\"2\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellBetween}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"noinclude\" data-type=\"2\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotBetween}</div></div> </div>`\r\n}\r\n\r\nfunction luckysheetAlternateformatHtml(){\r\n    const _locale = locale()\r\n    const alternatingColors =_locale.alternatingColors;\r\n    const toolbar = _locale.toolbar;\r\n\r\n\r\n    return '<div id=\"luckysheet-modal-dialog-slider-alternateformat\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-alternateformat\" style=\"display: block;\">'+\r\n                '<div class=\"luckysheet-modal-dialog-slider-title\">'+\r\n                    '<span>'+ toolbar.alternatingColors +'</span>'+\r\n                    '<span class=\"luckysheet-model-close-btn\" title=\"'+ alternatingColors.close +'\">'+\r\n                        '<i class=\"fa fa-times\" aria-hidden=\"true\"></i>'+\r\n                    '</span>'+\r\n                '</div>'+\r\n                '<div class=\"luckysheet-modal-dialog-slider-content\">'+\r\n                    '<div class=\"textTitle\">'+ alternatingColors.applyRange +'</div>'+\r\n                    '<div id=\"luckysheet-alternateformat-range\">'+\r\n                        '<input class=\"formulaInputFocus\" placeholder=\"'+ alternatingColors.selectRange +'\"/>'+\r\n                        '<i class=\"fa fa-table\" aria-hidden=\"true\"></i>'+\r\n                    '</div>'+\r\n                    '<div id=\"luckysheet-alternateformat-checkbox\">'+\r\n                        '<div class=\"cf\">'+\r\n                            '<input type=\"checkbox\" id=\"luckysheet-alternateformat-rowHeader\"/>'+\r\n                            '<label for=\"luckysheet-alternateformat-rowHeader\">'+ alternatingColors.header +'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"cf\">'+\r\n                            '<input type=\"checkbox\" id=\"luckysheet-alternateformat-rowFooter\"/>'+\r\n                            '<label for=\"luckysheet-alternateformat-rowFooter\">'+ alternatingColors.footer +'</label>'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"textTitle\">'+alternatingColors.textTitle+'</div>'+\r\n                    '<div id=\"luckysheet-alternateformat-modelList\" class=\"cf\"></div>'+\r\n                    '<div class=\"textTitle\">'+alternatingColors.custom+'</div>'+\r\n                    '<div id=\"luckysheet-alternateformat-modelCustom\" class=\"cf\"></div>'+\r\n                    '<div id=\"luckysheet-alternateformat-modelToning\">'+\r\n                        '<div class=\"toningbox header\">'+\r\n                            '<div class=\"toningShow\"> '+ alternatingColors.header +' </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionTextColor +'\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionCellColor +'\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                        '</div>'+\r\n                        '<div class=\"toningbox ctOne\">'+\r\n                            '<div class=\"toningShow\"> '+ alternatingColors.colorShow +'1 </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionTextColor +'\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionCellColor +'\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                        '</div>'+\r\n                        '<div class=\"toningbox ctTwo\">'+\r\n                            '<div class=\"toningShow\"> '+ alternatingColors.colorShow +'2 </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionTextColor +'\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionCellColor +'\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                        '</div>'+\r\n                        '<div class=\"toningbox footer\">'+\r\n                            '<div class=\"toningShow\"> '+ alternatingColors.footer +' </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionTextColor +'\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                            '<div class=\"luckysheet-color-menu-button-indicator\" title=\"'+ alternatingColors.selectionCellColor +'\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<button id=\"luckysheet-alternateformat-remove\" class=\"btn btn-default\" style=\"margin: 10px;\">'+ alternatingColors.removeColor +'</button>'+\r\n                '</div>'+\r\n            '</div>';\r\n}\r\n\r\nconst luckysheetchartpointconfigHTML = '<div class=\"luckysheet-chart-point-config\"> <div class=\"luckysheet-chart-point-config-set\"> <div class=\"luckysheet-chart-point-config-left\"> <div class=\"luckysheet-chart-point-config-left-top\"> <div class=\"luckysheet-chart-point-searchcondition\"> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 0px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u9009\u62E9\u7EF4\u5EA6</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"\u7EF4\u5EA6\u9009\u62E9\" name=\"luckysheetpointconfigsearchdim\" id=\"luckysheetpointconfigsearchdim\"> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 3px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;\">\u6392\u5E8F</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <label data-tips=\"\u65E0\u6392\u5E8F\" for=\"luckysheetpointconfigsearchorderno\">\u65E0\u6392\u5E8F</label> <input type=\"radio\" checked=\"checked\" value=\"0\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderno\"> <label data-tips=\"\u5347\u5E8F\" for=\"luckysheetpointconfigsearchorderasc\">\u5347\u5E8F</label> <input type=\"radio\" value=\"1\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderasc\"> <label data-tips=\"\u964D\u5E8F\" for=\"luckysheetpointconfigsearchorderdesc\">\u964D\u5E8F</label> <input type=\"radio\" value=\"2\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderdesc\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 5px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:90%;text-align: left;\"> <select data-width=\"70\" data-tips=\"\u6309\u7167\u4EC0\u4E48\u65B9\u5F0F\u67E5\u8BE2\" name=\"luckysheetpointconfigsearchtype\" id=\"luckysheetpointconfigsearchtype\"> <option value=\"0\" selected=\"selected\">\u6309\u7167\u540D\u79F0</option> <option value=\"1\">\u6309\u6392\u5E8F\u524D%</option> </select> <input data-tips=\"\u67E5\u8BE2\u5173\u4E8E\u70B9\u7684\u5173\u952E\u5B57\" id=\"luckysheetpointconfigsearchcontent\" type=\"text\" class=\"luckysheet-datavisual-config-input-no\" style=\"width:40%;\" placeholder=\"\u67E5\u8BE2\u5185\u5BB9\" /> <button id=\"luckysheetpointconfigsearchcomfirm\" class=\"btn btn-primary luckysheet-model-conform-btn\">\u67E5\u8BE2</button> </div> </div> </div> </div> <div class=\"luckysheet-chart-point-config-left-mid\"> <span id=\"luckysheet-chart-point-btn-all\" class=\"luckysheet-mousedown-cancel\">\u5168\u9009</span> - <span id=\"luckysheet-chart-point-btn-clear\" class=\"luckysheet-mousedown-cancel\">\u6E05\u9664</span> - <span id=\"luckysheet-chart-point-btn-contra\" class=\"luckysheet-mousedown-cancel\">\u53CD\u9009</span><span style=\"text-decoration:none;color:#8D8D8D;float:right;margin-right:40px;cursor:default;\" class=\"luckysheet-mousedown-cancel\">\u53EF\u4EE5\u76F4\u63A5\u6846\u9009\u6570\u636E\u70B9</span> </div> <div class=\"luckysheet-chart-point-config-left-bottom\"> <div class=\"luckysheet-chart-point-searchitem-c luckysheet-noselected-text\">  </div> </div> </div> <div class=\"luckysheet-chart-point-config-right\"> <div class=\"luckysheet-chart-point-itemconfig\"> <div class=\"luckysheet-datavisual-content-row\" style=\"font-size: 16px;font-weight: bold;\"> \u6570\u636E\u70B9\u8BBE\u7F6E </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u56FE\u5F62\u989C\u8272</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <input data-tips=\"\u989C\u8272\" class=\"luckysheet-datavisual-config-colorOpacity\" id=\"scattersingleitemstylecolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"color\" /> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u56FE\u5F62\u5927\u5C0F</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersingleallsymbolsizeslider\" data-tips=\"\u70B9\u5927\u5C0F\u8BBE\u7F6E\" name=\"scattersingleallsymbolsize\" id=\"scattersingleallsymbolsize\" data-width=\"50\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\"> <option value=\"4\" selected=\"selected\">4px</option> <option value=\"6\">6px</option> <option value=\"8\">8px</option> <option value=\"10\">10px</option> <option value=\"12\">12px</option> <option value=\"14\">14px</option> <option value=\"16\">16px</option> <option value=\"diy\">\u81EA\u5B9A\u4E49</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"\u6ED1\u52A8\u4FEE\u6539\u70B9\u5927\u5C0F\" id=\"scattersingleallsymbolsizeslider\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"1\" data-max=\"50\" data-step=\"1\"></div> <input data-tips=\"\u81EA\u5B9A\u4E49\u70B9\u5927\u5C0F\" data-sliderid=\"scattersingleallsymbolsizeslider\" id=\"scattersingleallsymbolsizesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\" placeholder=\"\u8BF7\u8F93\u5165\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersingleallsymbolsizesliderdiy\">px</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u56FE\u5F62\u5F62\u72B6</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"\u70B9\u7C7B\u578B\u8BBE\u7F6E\" data-width=\"70\" name=\"scattersingleallsymboltype\" id=\"scattersingleallsymboltype\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symboltype\"> <option value=\"emptyCircle\" selected=\"selected\">\u7A7A\u5FC3\u5706</option> <option value=\"circle\">\u5706\u5F62</option> <option value=\"emptyRectangle\">\u7A7A\u5FC3\u77E9\u5F62</option> <option value=\"rect\">\u77E9\u5F62</option> <option value=\"roundRect\">\u5706\u89D2\u77E9\u5F62</option> <option value=\"emptyTriangle\">\u7A7A\u5FC3\u4E09\u89D2</option> <option value=\"triangle\">\u4E09\u89D2\u5F62</option> <option value=\"emptyDiamond\">\u7A7A\u5FC3\u83F1\u5F62</option> <option value=\"diamond\">\u83F1\u5F62</option> <option value=\"droplet\">\u6C34\u6EF4</option> <option value=\"pin\">\u6807\u6CE8</option> <option value=\"arrow\">\u7BAD\u5934</option> <option value=\"heart\">\u5FC3\u5F62</option> <option value=\"star\">\u661F\u661F</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-rowsplit-sub\"></div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u8FB9\u6846\u7C97\u7EC6</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersingleitemstyleborderwidthslider\" data-tips=\"\u70B9\u8FB9\u6846\u7C97\u7EC6\" name=\"scattersingleitemstyleborderwidth\" id=\"scattersingleitemstyleborderwidth\" data-width=\"50\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\"><option value=\"0\" selected=\"selected\">\u65E0</option> <option value=\"1\">1px</option> <option value=\"2\">2px</option> <option value=\"3\">3px</option> <option value=\"4\">4px</option> <option value=\"5\">5px</option> <option value=\"6\">6px</option> <option value=\"7\">7px</option> <option value=\"8\">8px</option> <option value=\"diy\">\u81EA\u5B9A\u4E49</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"\u6ED1\u52A8\u4FEE\u6539\u8FB9\u6846\u7C97\u7EC6\" id=\"scattersingleitemstyleborderwidthslider\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"12\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"\u81EA\u5B9A\u4E49\u8FB9\u6846\u7C97\u7EC6\" data-sliderid=\"scattersingleitemstyleborderwidthslider\" id=\"scattersingleitemstyleborderwidthsliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\" placeholder=\"\u8BF7\u8F93\u5165\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersingleitemstyleborderwidthsliderdiy\">%</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u8FB9\u6846\u6837\u5F0F</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"\u70B9\u8FB9\u6846\u7C7B\u578B\u8BBE\u7F6E\" data-width=\"50\" name=\"scattersingleitemstyleborderlinetype\" id=\"scattersingleitemstyleborderlinetype\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderlinetype\"> <option value=\"solid\" selected=\"selected\">\u5B9E\u7EBF</option> <option value=\"dashed\">\u865A\u7EBF</option> <option value=\"dotted\">\u70B9\u7EBF</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u8FB9\u6846\u989C\u8272</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <input data-tips=\"\u70B9\u8FB9\u6846\u989C\u8272\" class=\"luckysheet-datavisual-config-colorOpacity\" id=\"scattersingleitemstyleborderlinecolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderlinecolor\" /> </div> </div> <div class=\"luckysheet-datavisual-content-rowsplit-sub\"></div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\"><i class=\"fa fa-th-large\" aria-hidden=\"true\"></i> \u6587\u5B57\u6807\u7B7E</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <label data-tips=\"\u663E\u793A\u6570\u636E\u70B9\u7684\u6807\u7B7E\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\" for=\"scattersinglelabellabelshow\">\u663E\u793A</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"scattersinglelabellabelshow\" id=\"scattersinglelabellabelshow\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\"> <label data-tips=\"\u9690\u85CF\u6570\u636E\u70B9\u7684\u6807\u7B7E\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\" for=\"scattersinglelabellabelshow1\">\u9690\u85CF</label> <input type=\"radio\" value=\"0\" name=\"scattersinglelabellabelshow\" id=\"scattersinglelabellabelshow1\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"height:auto;line-height: initial;margin-left:auto;\" showfor=\"scattersinglelabellabelshow1\" hidefor=\"scattersinglelabellabelshow\"> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:40%;\">\u6570\u503C\u6BD4\u4F8B</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:50%;\"> <select data-tips=\"\u523B\u5EA6\u6570\u503C\u653E\u5927\u6BD4\u4F8B\" name=\"scattersinglelabelformatratio\" id=\"scattersinglelabelformatratio\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"formatratio\"> <option value=\"0.01\">\u4E58\u4EE5100</option> <option value=\"0.1\">\u4E58\u4EE510</option> <option value=\"1\" selected=\"selected\">\u9ED8\u8BA4</option> <option value=\"10\">\u9664\u4EE510</option> <option value=\"100\">\u9664\u4EE5100</option> <option value=\"1000\">\u9664\u4EE51000</option> <option value=\"10000\">\u9664\u4EE51\u4E07</option> <option value=\"100000\">\u9664\u4EE510\u4E07</option> <option value=\"1000000\">\u9664\u4EE5\u4E00\u767E\u4E07</option> <option value=\"10000000\">\u9664\u4EE5\u4E00\u5343\u4E07</option> <option value=\"100000000\">\u9664\u4EE5\u4E00\u4EBF</option> <option value=\"1000000000\">\u9664\u4EE5\u5341\u4EBF</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:40%;white-space: nowrap;\">\u5C0F\u6570\u4F4D\u6570</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:50%;\"> <select data-tips=\"\u6570\u503C\u5C0F\u6570\u70B9\u4F4D\u6570\" name=\"scattersinglelabelfloatlen\" id=\"scattersinglelabelfloatlen\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"floatlen\"> <option value=\"auto\" selected=\"selected\">\u81EA\u52A8\u663E\u793A</option> <option value=\"0\">\u6574\u6570</option> <option value=\"1\">1\u4F4D\u5C0F\u6570</option> <option value=\"2\">2\u4F4D\u5C0F\u6570</option> <option value=\"3\">3\u4F4D\u5C0F\u6570</option> <option value=\"4\">4\u4F4D\u5C0F\u6570</option> <option value=\"5\">5\u4F4D\u5C0F\u6570</option> <option value=\"6\">6\u4F4D\u5C0F\u6570</option> <option value=\"7\">7\u4F4D\u5C0F\u6570</option> <option value=\"8\">8\u4F4D\u5C0F\u6570</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:20%;\">\u6807\u7B7E\u683C\u5F0F</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:70%;\"> <select data-sliderdiy=\"scattersinglelabelcontentformatslider\" data-tips=\"\u6807\u7B7E\u663E\u793A\u683C\u5F0F\" name=\"scattersinglelabelcontentformat\" id=\"scattersinglelabelcontentformat\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"contentformat\"> <option value=\"default\" selected=\"selected\">\u9ED8\u8BA4</option> <option value=\"1\">\u4EC5\u6570\u636E\u540D</option> <option value=\"2\">\u6570\u636E\u540D+2\u7EF4\u6570\u503C</option> <option value=\"5\">\u6570\u636E\u540D+\u5168\u90E8\u6570\u503C</option> <option value=\"diy\">\u81EA\u5B9A\u4E49</option> </select> </div> </div> <div style=\"display:none;\"> <div class=\"luckysheet-datavisual-content-row\" id=\"scattersinglelabelcontentformatslider\"> <div style=\"text-align:center; width:60px; display:inline-block;\">\u6570\u636E\u540D\u79F0</div> <label data-tips=\"\u662F\u5426\u663E\u793A\u6570\u636E\u540D\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelshow\" for=\"scattersinglelabeldatalabelshow\" style=\"font-weight:bold;\"><i class=\"fa fa-eye\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" checked=\"checked\" name=\"scattersinglelabeldatalabelshow\" id=\"scattersinglelabeldatalabelshow\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelshow\"> <input data-tips=\"\u663E\u793A\u5728\u6570\u636E\u540D\u524D\u90E8\u6587\u5B57\" placeholder=\"\u524D\u7F00\" id=\"scattersinglelabeldatalabelprefix\" type=\"text\" class=\"luckysheet-datavisual-config-input\" style=\"width:60px;height:19px;\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelprefix\" /> <input data-tips=\"\u663E\u793A\u5728\u6570\u636E\u540D\u5C3E\u90E8\u6587\u5B57\" placeholder=\"\u540E\u7F00\" id=\"scattersinglelabeldatalabelsuffix\" type=\"text\" class=\"luckysheet-datavisual-config-input\" style=\"width:60px;height:19px;\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelsuffix\" /> <label data-tips=\"\u662F\u5426\u5728\u6570\u636E\u540D\u540E\u6362\u884C\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelline\" for=\"scattersinglelabeldatalabelline\" style=\"font-weight:bold;\">\u6362\u884C</label> <input type=\"checkbox\" checked=\"checked\" name=\"scattersinglelabeldatalabelline\" id=\"scattersinglelabeldatalabelline\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelline\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" > <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">\u6807\u7B7E\u4F4D\u7F6E</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersinglelabellabelplaceslider\" data-tips=\"\u6807\u7B7E\u8DDD\u79BB\u56FE\u5F62\u4F4D\u7F6E\" data-width=\"70\" name=\"scattersinglelabellabelplace\" id=\"scattersinglelabellabelplace\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplace\"> <option value=\"top\" selected=\"selected\">\u9876\u7AEF</option> <option value=\"left\">\u5DE6\u4FA7</option> <option value=\"right\">\u53F3\u4FA7</option> <option value=\"bottom\">\u5E95\u90E8</option> <option value=\"inside\">\u5185\u90E8\u5C45\u4E2D</option> <option value=\"diy\">\u81EA\u5B9A\u4E49</option> <option value=\"insideLeft\">\u5185\u90E8\u5DE6\u4FA7</option> <option value=\"insideRight\">\u5185\u90E8\u53F3\u4FA7</option> <option value=\"insideTop\">\u5185\u90E8\u9876\u7AEF</option> <option value=\"insideBottom\">\u5185\u90E8\u5E95\u7AEF</option> <option value=\"insideTopLeft\">\u5185\u90E8\u5DE6\u4E0A</option> <option value=\"insideBottomLeft\">\u5185\u90E8\u5DE6\u4E0B</option> <option value=\"insideTopRight\">\u5185\u90E8\u53F3\u4E0A</option> <option value=\"insideBottomRight\">\u5185\u90E8\u53F3\u4E0B</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;height:65px;\"> <div data-tips=\"\u6ED1\u52A8\u4FEE\u6539\u70B9\u6587\u672C\u6C34\u5E73\u4F4D\u7F6E\" id=\"scattersinglelabellabelplaceslider\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"-100\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"\u81EA\u5B9A\u4E49\u70B9\u6587\u672C\u6C34\u5E73\u4F4D\u7F6E\" data-sliderid=\"scattersinglelabellabelplaceslider\" id=\"scattersinglelabellabelplacesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" placeholder=\"\u8BF7\u8F93\u5165\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelplacesliderdiy\">px</label> <br /> <div data-tips=\"\u6ED1\u52A8\u4FEE\u6539\u70B9\u6587\u672C\u5782\u76F4\u4F4D\u7F6E\" id=\"scattersinglelabellabelplaceslider1\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"-100\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"\u81EA\u5B9A\u4E49\u70B9\u6587\u672C\u5782\u76F4\u4F4D\u7F6E\" data-sliderid=\"scattersinglelabellabelplaceslider1\" id=\"scattersinglelabellabelplaceslider1diy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" placeholder=\"\u8BF7\u8F93\u5165\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelplaceslider1diy\">px</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <label data-tips=\"\u52A0\u7C97\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelbold\" for=\"scattersinglelabellabelbold\" style=\"font-weight:bold;\"><i class=\"fa fa-bold\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" name=\"scattersinglelabellabelbold\" id=\"scattersinglelabellabelbold\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelbold\"> <label data-tips=\"\u659C\u4F53\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelitalic\" for=\"scattersinglelabellabelitalic\" class=\"luckysheet-datavisual-content-column-italic\"><i class=\"fa fa-italic\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" name=\"scattersinglelabellabelitalic\" id=\"scattersinglelabellabelitalic\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelitalic\"> <select data-sliderdiy=\"scattersinglelabellabelfontsizeslider\" data-width=\"50\" data-tips=\"\u5B57\u4F53\u5927\u5C0F\" name=\"scattersinglelabellabelfontsize\" id=\"scattersinglelabellabelfontsize\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\"> <option value=\"12\">12px</option> <option value=\"14\">14px</option> <option value=\"16\">16px</option> <option value=\"18\">18px</option> <option value=\"20\">20px</option> <option value=\"22\">22px</option> <option value=\"24\">24px</option> <option value=\"30\">30px</option> <option value=\"36\">36px</option> <option value=\"diy\">\u81EA\u5B9A\u4E49</option> </select> <input data-tips=\"\u5B57\u4F53\u989C\u8272\" class=\"luckysheet-datavisual-config-color\" id=\"scattersinglelinelabelcolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelcolor\" /> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"\u6ED1\u52A8\u4FEE\u6539\u5B57\u4F53\u5927\u5C0F\" id=\"scattersinglelabellabelfontsizeslider\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"12\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"\u81EA\u5B9A\u4E49\u5B57\u4F53\u5927\u5C0F\" data-sliderid=\"scattersinglelabellabelfontsizeslider\" id=\"scattersinglelabellabelfontsizesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\" placeholder=\"\u8BF7\u8F93\u5165\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelfontsizesliderdiy\">px</label> </div> </div> </div> </div> </div> <div class=\"luckysheet-chart-point-config-chart\"> <div id=\"luckysheet-chart-point-config-chart-c\" class=\"luckysheet-chart-point-config-chart-c\"> </div> </div> </div>';\r\nconst luckysheetToolHTML = '<div id=\"luckysheet-tooltip-up\" class=\"jfk-tooltip\" role=\"tooltip\" aria-hidden=\"true\" style=\"left: 505px; top: 410px;\"><div class=\"jfk-tooltip-contentId\">\u7EC4\u5408\u56FE\u8868</div><div class=\"jfk-tooltip-arrow jfk-tooltip-arrowup\" style=\"left: 35.5px;\"><div class=\"jfk-tooltip-arrowimplbefore\"></div><div class=\"jfk-tooltip-arrowimplafter\"></div></div></div>';\r\n\r\n// toolbar\r\nfunction menuToolBar() {\r\n    return createToolbarHtml();\r\n}\r\n\r\nfunction customLoadingConfig() {\r\n    const _locale = locale();\r\n    const info = _locale.info;\r\n    const config = {\r\n        enable: true,\r\n        image: 'image://css/loading.gif',\r\n        text: info.loading,\r\n        viewBox: \"32 32 64 64\", // \u53EA\u6709\u4E3Apath\u65F6\uFF0C\u624D\u4F1A\u4F7F\u7528\r\n        imageClass: '',\r\n        textClass: '',\r\n        customClass: ''\r\n    }\r\n    if (JSON.stringify(luckysheetConfigsetting.loading) !== '{}') {\r\n        Object.assign(config, luckysheetConfigsetting.loading);\r\n    }\r\n    return config;\r\n}\r\n\r\nconst luckysheetloadingImage = function (config) {\r\n    if(typeof config.image===\"function\"){\r\n        return config.image()\r\n    }\r\n    const regE = new RegExp(\"^(image|path)://\");\r\n    const regResult = regE.exec(config.image);\r\n    let imageHtml = '';\r\n    if (regResult !== null) {\r\n        const prefix = regResult[0];\r\n        const type = regResult[1];\r\n        const imageStr = regResult.input.substring(prefix.length);\r\n        switch (type) {\r\n            case \"image\":\r\n                imageHtml = `<div class=\"image-type\" style=\"background-image: url(${imageStr});\"></div>`;\r\n                break;\r\n            case \"path\":\r\n                const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n                svg.setAttribute(\"class\", \"path-type\");\r\n                svg.setAttribute(\"viewBox\", config.viewBox);\r\n                const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n                path.setAttribute(\"d\", imageStr);\r\n                path.setAttribute(\"fill\", \"currentColor\");\r\n                svg.appendChild(path);\r\n                imageHtml = svg.outerHTML;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n    return imageHtml;\r\n}\r\n\r\nconst luckysheetlodingHTML = function (target, coverConfig) {\r\n    if (!target) {\r\n        return;\r\n    }\r\n    const config = customLoadingConfig();\r\n    if (coverConfig && JSON.stringify(coverConfig) !== \"{}\") {\r\n        Object.assign(config, coverConfig);\r\n    }\r\n    if (typeof config.enable === \"boolean\" && config.enable === false) {\r\n        return {\r\n            el: '',\r\n            show: show,\r\n            close: close\r\n        }\r\n    }\r\n    const imageHtml = luckysheetloadingImage(config);\r\n    const id = \"luckysheet-loading-\" + uuid.v4();\r\n    const loadingHtml = `\r\n        <div class=\"luckysheet-loading-content\"> \r\n            <div class=\"${config.imageClass} luckysheet-loading-image\">\r\n                ${imageHtml}\r\n            </div>\r\n            <div class=\"${config.textClass} luckysheet-loading-text\">\r\n            <span>${config.text}</span>\r\n            </div>    \r\n        </div>`;\r\n    const loading = document.createElement(\"div\");\r\n    loading.id = id;\r\n    loading.className = \"luckysheet-loading-mask \" + config.customClass;\r\n    $(loading).html(loadingHtml);\r\n    $(target).append(loading);\r\n\r\n    function show() {\r\n        if(id){\r\n            $(\"#\" + id).show();\r\n        }     \r\n    }\r\n\r\n    function close() {\r\n        if(id){\r\n            $(\"#\" + id).hide();\r\n        }  \r\n    }\r\n    return {\r\n        el: loading,\r\n        show: show,\r\n        close: close\r\n    };\r\n}\r\n\r\n// var menusetting = {\r\n//     menu_selectall: '<div id=\"luckysheet-selectall-btn-title\"><i class=\"fa fa-i-cursor\"></i> \u5168\u9009</div>',\r\n//     menu_copy: '<div id=\"luckysheet-copy-btn-title\"><i class=\"fa fa-copy\"></i> \u590D\u5236</div>',\r\n//     menu_undo: '<div id=\"luckysheet-redo-btn-title\"><i class=\"fa fa-reply\"></i> \u64A4\u9500</div>',\r\n//     menu_redo: '<div id=\"luckysheet-undo-btn-title\"><i class=\"fa fa-share\"></i> \u6062\u590D</div>',\r\n//     menu_paste: '<div id=\"luckysheet-paste-btn-title\"><i class=\"fa fa-clipboard\"></i> \u7C98\u8D34</div>',\r\n//     menu_download: '<div id=\"luckysheet-download-btn-title\"><i class=\"fa fa-cloud-download\"></i> \u4E0B\u8F7D</div>',\r\n//     menu_share: '<div id=\"luckysheet-share-btn-title\"><i class=\"fa fa-share-alt\"></i> \u5206\u4EAB</div>',\r\n//     menu_chart: '<div id=\"luckysheet-chart-btn-title\"> <i class=\"fa fa-pie-chart\"></i> \u56FE\u8868\u751F\u6210</div>',\r\n//     menu_pivot: '<div id=\"luckysheet-pivot-btn-title\"> <i class=\"fa fa-cube\" aria-hidden=\"true\"></i> \u6570\u636E\u900F\u89C6\u8868</div>',\r\n//     menu_freezenrow: '<div id=\"luckysheet-freezen-btn-horizontal\"><i class=\"fa fa-list-alt\"></i> \u51BB\u7ED3\u9996\u884C</div>',\r\n//     menu_freezencolumn: '<div id=\"luckysheet-freezen-btn-vertical\"><i class=\"fa fa-indent\"></i> \u51BB\u7ED3\u9996\u5217</div>',\r\n// };\r\n\r\nconst luckyColor = [\r\n    \"#c1232b\",\r\n    \"#27727b\",\r\n    \"#fcce10\",\r\n    \"#e87c25\",\r\n    \"#b5c334\",\r\n    \"#fe8463\",\r\n    \"#9bca63\",\r\n    \"#fad860\",\r\n    \"#f3a43b\",\r\n    \"#60c0dd\",\r\n    \"#d7504b\",\r\n    \"#c6e579\",\r\n    \"#f4e001\",\r\n    \"#f0805a\",\r\n    \"#26c0c0\",\r\n    \"#c12e34\",\r\n    \"#e6b600\",\r\n    \"#0098d9\",\r\n    \"#2b821d\",\r\n    \"#005eaa\",\r\n    \"#339ca8\",\r\n    \"#cda819\",\r\n    \"#32a487\",\r\n    \"#3fb1e3\",\r\n    \"#6be6c1\",\r\n    \"#626c91\",\r\n    \"#a0a7e6\",\r\n    \"#c4ebad\",\r\n    \"#96dee8\"\r\n];\r\n\r\nconst keycode = {\r\n\r\n    BACKSPACE: 8,\r\n    TAB: 9,\r\n    ENTER: 13,\r\n    SHIFT: 16,\r\n    CTRL: 17,\r\n    PAUSE: 19,\r\n    CAPSLOCK: 20,\r\n    ESC: 27,\r\n\r\n    SPACE: 33,\r\n    PAGEUP: 33,\r\n    PAGEDOWN: 34,\r\n    END: 35,\r\n    HOME: 36,\r\n    LEFT: 37,\r\n    UP: 38,\r\n    RIGHT: 39,\r\n    DOWN: 40,\r\n    INSERT: 45,\r\n    DELETE: 46,\r\n\r\n    WIN: 91,\r\n    WIN_R: 92,\r\n    MENU: 93,\r\n\r\n    F1: 112,\r\n    F2: 113,\r\n    F3: 114,\r\n    F4: 115,\r\n    F5: 116,\r\n    F6: 117,\r\n    F7: 118,\r\n    F8: 119,\r\n    F9: 120,\r\n    F10: 121,\r\n    F11: 122,\r\n    F12: 123,\r\n    NUMLOCK: 144,\r\n    SCROLLLOCK: 145\r\n};\r\n\r\nconst luckysheetdefaultstyle = {\r\n    fillStyle: \"#000000\",\r\n    textBaseline: \"middle\",\r\n    strokeStyle: \"#dfdfdf\",\r\n    rowFillStyle: \"#5e5e5e\",\r\n    textAlign: 'center'\r\n}\r\n\r\nconst luckysheetdefaultFont = function(){\r\n    return  'normal normal normal '+ Store.defaultFontSize +'pt '+ locale().fontarray[0] +', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\",  \"WenQuanYi Micro Hei\", sans-serif';\r\n} \r\n\r\nconst luckysheet_CFiconsImg = new Image();\r\nluckysheet_CFiconsImg.src = \"data:image/png;base64,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\";\r\n\r\nconst iconfontObjects = {\r\n    border:{\r\n        'border-top': ' iconfont luckysheet-iconfont-shangbiankuang',\r\n        'border-bottom': ' iconfont luckysheet-iconfont-xiabiankuang',\r\n        'border-left': ' iconfont luckysheet-iconfont-zuobiankuang',\r\n        'border-right': ' iconfont luckysheet-iconfont-youbiankuang',\r\n        'border-none': ' iconfont luckysheet-iconfont-wubiankuang',\r\n        'border-all': ' iconfont luckysheet-iconfont-quanjiabiankuang',\r\n        'border-outside': ' iconfont luckysheet-iconfont-sizhoujiabiankuang',\r\n        'border-inside': ' iconfont luckysheet-iconfont-neikuangxian',\r\n        'border-horizontal': ' iconfont luckysheet-iconfont-neikuanghengxian',\r\n        'border-vertical': ' iconfont luckysheet-iconfont-neikuangshuxian',\r\n    },\r\n    align:{\r\n        'left': ' iconfont luckysheet-iconfont-wenbenzuoduiqi',\r\n        'center': ' iconfont luckysheet-iconfont-wenbenjuzhongduiqi',\r\n        'right': ' iconfont luckysheet-iconfont-wenbenyouduiqi',\r\n        'top': ' iconfont luckysheet-iconfont-dingbuduiqi',\r\n        'middle': ' iconfont luckysheet-iconfont-shuipingduiqi',\r\n        'bottom': ' iconfont luckysheet-iconfont-dibuduiqi',\r\n    },\r\n    textWrap:{\r\n        'overflow': ' iconfont luckysheet-iconfont-yichu1',\r\n        'wrap': ' iconfont luckysheet-iconfont-zidonghuanhang',\r\n        'clip': ' iconfont luckysheet-iconfont-jieduan',\r\n    },\r\n    rotation:{\r\n        'none': ' iconfont luckysheet-iconfont-wuxuanzhuang',\r\n        'angleup': ' iconfont luckysheet-iconfont-xiangshangqingxie',\r\n        'angledown': ' iconfont luckysheet-iconfont-xiangxiaqingxie',\r\n        'vertical': ' iconfont luckysheet-iconfont-shupaiwenzi',\r\n        'rotation-up': ' iconfont luckysheet-iconfont-wenbenxiangshang',\r\n        'rotation-down': ' iconfont luckysheet-iconfont-xiangxia90',\r\n    }\r\n}\r\n\r\n/**\r\n *\u5355\u5143\u683C\u53F3\u51FB\u83DC\u5355\u914D\u7F6E\r\n *\r\n */\r\nfunction customCellRightClickConfig() {\r\n    const config = {\r\n\t\tcopy: true, // copy\r\n\t\tcopyAs: true, // copy as\r\n\t\tpaste: true, // paste\r\n\t\tinsertRow: true, // insert row\r\n\t\tinsertColumn: true, // insert column\r\n\t\tdeleteRow: true, // delete the selected row\r\n\t\tdeleteColumn: true, // delete the selected column\r\n\t\tdeleteCell: true, // delete cell\r\n\t\thideRow: true, // hide the selected row and display the selected row\r\n\t\thideColumn: true, // hide the selected column and display the selected column\r\n\t\trowHeight: true, // row height\r\n\t\tcolumnWidth: true, // column width\r\n\t\tclear: true, // clear content\r\n\t\tmatrix: true, // matrix operation selection\r\n\t\tsort: true, // sort selection\r\n\t\tfilter: true, // filter selection\r\n\t\tchart: true, // chart generation\r\n\t\timage: true, // insert picture\r\n\t\tlink: true, // insert link\r\n\t\tdata: true, // data verification\r\n\t\tcellFormat: true // Set cell format\r\n\t}\r\n\r\n    // cellRightClickConfig determines the final result\r\n    if(JSON.stringify(luckysheetConfigsetting.cellRightClickConfig) !== '{}'){\r\n        Object.assign(config,luckysheetConfigsetting.cellRightClickConfig);\r\n    }\r\n    luckysheetConfigsetting.cellRightClickConfig = config;\r\n    return config;\r\n}\r\n\r\n/**\r\n *sheet\u9875\u53F3\u51FB\u83DC\u5355\u914D\u7F6E\r\n *\r\n */\r\nfunction customSheetRightClickConfig() {\r\n    const config = {\r\n        delete: true, //Delete\r\n        copy: true, //Copy\r\n        rename: true, //Rename\r\n        color: true, //Change color\r\n        hide: true, //Hide, unhide\r\n        move: true, //Move to the left, move to the right\r\n\t}\r\n\r\n    // sheetRightClickConfig determines the final result\r\n    if(JSON.stringify(luckysheetConfigsetting.sheetRightClickConfig) !== '{}'){\r\n        Object.assign(config,luckysheetConfigsetting.sheetRightClickConfig);\r\n    }\r\n    luckysheetConfigsetting.sheetRightClickConfig = config;\r\n    return config;\r\n}\r\n\r\nexport {\r\n    gridHTML,\r\n    columeHeader_word,\r\n    columeHeader_word_index,\r\n    flow,\r\n    colsmenuHTML,\r\n    rightclickHTML,\r\n    pivottableconfigHTML,\r\n    pivottablesumHTML,\r\n    sheetHTML,\r\n    columnHeaderHTML,\r\n    sheetselectlistHTML,\r\n    sheetselectlistitemHTML,\r\n    inputHTML,\r\n    modelHTML,\r\n    maskHTML,\r\n    filtermenuHTML,\r\n    filtersubmenuHTML,\r\n    sheetconfigHTML,\r\n    luckysheetPivotTableHTML,\r\n    luckysheetAlternateformatHtml,\r\n    luckysheetchartpointconfigHTML,\r\n    luckysheetToolHTML,\r\n    menuToolBar,\r\n    luckysheetlodingHTML,\r\n    luckyColor,\r\n    keycode,\r\n    luckysheetdefaultstyle,\r\n    luckysheet_CFiconsImg,\r\n    luckysheetdefaultFont,\r\n    iconfontObjects\r\n}", "import { chatatABC } from '../utils/util';\r\nimport Store from '../store';\r\n\r\nfunction getSheetIndex(index) {\r\n    for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n        if (Store.luckysheetfile[i][\"index\"] == index) {\r\n            return i;\r\n        }\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nfunction getRangetxt(sheetIndex, range, currentIndex) {\r\n    let sheettxt = \"\";\r\n\r\n    if (currentIndex == null) {\r\n        currentIndex = Store.currentSheetIndex;\r\n    }\r\n\r\n    if (sheetIndex != currentIndex) {\r\n        //sheet\u540D\u5B57\u5305\u542B'\u7684\uFF0C\u5F15\u7528\u65F6\u5E94\u8BE5\u66FF\u6362\u4E3A''\r\n        sheettxt = Store.luckysheetfile[getSheetIndex(sheetIndex)].name.replace(/'/g,\"''\");\r\n        //\u5982\u679C\u5305\u542B\u9664a-z\u3001A-Z\u30010-9\u3001\u4E0B\u5212\u7EBF\u7B49\u4EE5\u5916\u7684\u5B57\u7B26\u90A3\u4E48\u5C31\u7528\u5355\u5F15\u53F7\u5305\u8D77\u6765\r\n        if(/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/.test(sheettxt))\r\n        {\r\n            sheettxt = sheettxt+\"!\";\r\n        }\r\n        else\r\n        {\r\n            sheettxt=\"'\"+sheettxt+\"'!\";\r\n        }\r\n    }\r\n\r\n    let row0 = range[\"row\"][0], row1 = range[\"row\"][1];\r\n    let column0 = range[\"column\"][0], column1 = range[\"column\"][1];\r\n\r\n    if (row0 == null && row1 == null) {\r\n        return sheettxt + chatatABC(column0) + \":\" + chatatABC(column1);\r\n    }\r\n    else if (column0 == null && column1 == null) {\r\n        return sheettxt + (row0 + 1) + \":\" + (row1 + 1);\r\n    }\r\n    else {\r\n        if (column0 == column1 && row0 == row1) {\r\n            return sheettxt + chatatABC(column0) + (row0 + 1);\r\n        }\r\n        else {\r\n            return sheettxt + chatatABC(column0) + (row0 + 1) + \":\" + chatatABC(column1) + (row1 + 1);\r\n        }\r\n    }\r\n}\r\n\r\nfunction getluckysheet_select_save() {\r\n    return Store.luckysheet_select_save;\r\n}\r\n\r\nfunction getluckysheet_scroll_status() {\r\n    return Store.luckysheet_scroll_status;\r\n}\r\n\r\nfunction getluckysheetfile(plugin) {\r\n    // \u83B7\u53D6\u56FE\u8868\u6570\u636E\r\n    if(plugin){\r\n        Store.luckysheetfile.forEach(file => {\r\n            if(!!file.chart){\r\n                file.chart.forEach((chartObj)=>{\r\n                    const chartJson = Store.getChartJson(chartObj.chart_id);\r\n                    chartObj.chartOptions = chartJson;\r\n                })\r\n            }\r\n        });\r\n    }\r\n    \r\n    return Store.luckysheetfile;\r\n}\r\n\r\nfunction getconfig() {\r\n    return Store.config;\r\n}\r\n\r\nfunction getvisibledatarow() {\r\n    return Store.visibledatarow;\r\n}\r\n\r\nfunction getvisibledatacolumn() {\r\n    return Store.visibledatacolumn;\r\n}\r\n\r\nexport {\r\n    getSheetIndex,\r\n    getRangetxt,\r\n    getluckysheet_select_save,\r\n    getluckysheet_scroll_status,\r\n    getluckysheetfile,\r\n    getconfig,\r\n    getvisibledatarow,\r\n    getvisibledatacolumn,\r\n}\r\n", "import { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nfunction setluckysheet_select_save(v) {\r\n    Store.luckysheet_select_save = v;\r\n}\r\n\r\nfunction setluckysheet_scroll_status(v) {\r\n    Store.luckysheet_scroll_status = v;\r\n}\r\n\r\nfunction setluckysheetfile(d) {\r\n    Store.luckysheetfile = d;\r\n}\r\n\r\nfunction setconfig(v) {\r\n    Store.config = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = v;\r\n    }\r\n}\r\n\r\nfunction setvisibledatarow(v) {\r\n    Store.visibledatarow = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].visibledatarow = v;\r\n    }\r\n}\r\n\r\nfunction setvisibledatacolumn(v) {\r\n    Store.visibledatacolumn = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].visibledatacolumn = v;\r\n    }\r\n}\r\n\r\nexport {\r\n    setluckysheet_select_save,\r\n    setluckysheet_scroll_status,\r\n    setluckysheetfile,\r\n    setconfig,\r\n    setvisibledatarow,\r\n    setvisibledatacolumn,\r\n}", "const browser = {\r\n    mobilecheck: function() {\r\n        var a = !1;\r\n        return function(b) {\r\n            (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(b) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(b.substr(0, 4))) && (a = !0);\r\n        }(navigator.userAgent || navigator.vendor || window.opera), document.body && document.body.clientWidth && document.body.clientHeight && document.body.clientWidth < 350 && document.body.clientHeight < 500 && (a = !0), a;\r\n    },\r\n    iphoneCheck: function() {\r\n        var a = !1;\r\n        return /iPhone/i.test(navigator.userAgent) && (a = !0), !0;\r\n    },\r\n    isWeixin:function() {\r\n        var a = navigator.userAgent.toLowerCase();\r\n        return \"micromessenger\" == a.match(/MicroMessenger/i) ? !0 : !1;\r\n    },\r\n    isAndroid:function() {\r\n        var a = navigator.userAgent,\r\n            b = (navigator.appVersion, a.indexOf(\"Android\") > -1 || a.indexOf(\"Linux\") > -1);\r\n        return b;\r\n    },\r\n    tabletCheck:function() {\r\n        var a = /ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase());\r\n        return a;\r\n    },\r\n    BrowserType: function() {\r\n        var userAgent = navigator.userAgent; //\u53D6\u5F97\u6D4F\u89C8\u5668\u7684userAgent\u5B57\u7B26\u4E32\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //\u5224\u65AD\u662F\u5426Opera\u6D4F\u89C8\u5668\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //\u5224\u65AD\u662F\u5426IE\u6D4F\u89C8\u5668\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        var isEdge = userAgent.indexOf(\"Edge\") > -1; //\u5224\u65AD\u662F\u5426IE\u7684Edge\u6D4F\u89C8\u5668\r\n        var isFF = userAgent.indexOf(\"Firefox\") > -1; //\u5224\u65AD\u662F\u5426Firefox\u6D4F\u89C8\u5668\r\n        var isSafari = userAgent.indexOf(\"Safari\") > -1 && userAgent.indexOf(\"Chrome\") == -1; //\u5224\u65AD\u662F\u5426Safari\u6D4F\u89C8\u5668\r\n        var isChrome = userAgent.indexOf(\"Chrome\") > -1 && userAgent.indexOf(\"Safari\") > -1; //\u5224\u65ADChrome\u6D4F\u89C8\u5668\r\n        if (isIE) {\r\n            var reIE = new RegExp(\"MSIE (\\\\d+\\\\.\\\\d+);\");\r\n            reIE.test(userAgent);\r\n            var fIEVersion = parseFloat(RegExp[\"$1\"]);\r\n            if (fIEVersion == 7) {\r\n                return \"IE7\";\r\n            } else if (fIEVersion == 8) {\r\n                return \"IE8\";\r\n            } else if (fIEVersion == 9) {\r\n                return \"IE9\";\r\n            } else if (fIEVersion == 10) {\r\n                return \"IE10\";\r\n            // } else if (fIEVersion == 11) {\r\n            //     return \"IE11\";\r\n            } else {\r\n                return \"0\";\r\n            } //IE\u7248\u672C\u8FC7\u4F4E\r\n        } //isIE end\r\n        if (isFF) {\r\n            return \"FF\";\r\n        }\r\n        if (isOpera) {\r\n            return \"Opera\";\r\n        }\r\n        if (isSafari) {\r\n            return \"Safari\";\r\n        }\r\n        if (isChrome) {\r\n            return \"Chrome\";\r\n        }\r\n        if (isEdge) {\r\n            return \"Edge\";\r\n        }\r\n        if (isIE11) {\r\n            return \"IE11\";\r\n        }\r\n    }, //myBrowser() end\r\n    //\u5224\u65AD\u662F\u5426\u662FIE\u6D4F\u89C8\u5668\r\n    isIE: function() {\r\n        var userAgent = navigator.userAgent; //\u53D6\u5F97\u6D4F\u89C8\u5668\u7684userAgent\u5B57\u7B26\u4E32\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //\u5224\u65AD\u662F\u5426Opera\u6D4F\u89C8\u5668\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //\u5224\u65AD\u662F\u5426IE\u6D4F\u89C8\u5668\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        if (isIE || isIE11) {\r\n            return \"1\";\r\n        } else {\r\n            return \"-1\";\r\n        }\r\n    },\r\n    //\u5224\u65AD\u662F\u5426\u662FIE\u6D4F\u89C8\u5668\uFF0C\u5305\u62ECEdge\u6D4F\u89C8\u5668\r\n    IEVersion: function() {\r\n        var userAgent = navigator.userAgent; //\u53D6\u5F97\u6D4F\u89C8\u5668\u7684userAgent\u5B57\u7B26\u4E32\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //\u5224\u65AD\u662F\u5426Opera\u6D4F\u89C8\u5668\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //\u5224\u65AD\u662F\u5426IE\u6D4F\u89C8\u5668\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        var isEdge = userAgent.indexOf(\"Windows NT 6.1; Trident/7.0;\") > -1 && !isIE; //\u5224\u65AD\u662F\u5426IE\u7684Edge\u6D4F\u89C8\u5668\r\n        if (isIE) {\r\n            var reIE = new RegExp(\"MSIE (\\\\d+\\\\.\\\\d+);\");\r\n            reIE.test(userAgent);\r\n            var fIEVersion = parseFloat(RegExp[\"$1\"]);\r\n            if (fIEVersion == 7) {\r\n                return \"IE7\";\r\n            } else if (fIEVersion == 8) {\r\n                return \"IE8\";\r\n            } else if (fIEVersion == 9) {\r\n                return \"IE9\";\r\n            } else if (fIEVersion == 10) {\r\n                return \"IE10\";\r\n            // } else if (fIEVersion == 11) {\r\n            //     return \"IE11\";\r\n            } else {\r\n                return \"0\";\r\n            } //IE\u7248\u672C\u8FC7\u4F4E\r\n        } else if (isEdge) {\r\n            return \"Edge\";\r\n        } else if (isIE11) {\r\n            return \"IE11\";\r\n        } else {\r\n            return \"-1\"; //\u975EIE\r\n        }\r\n    },\r\n    luckysheetrefreshfixednum:null,\r\n    luckysheetrefreshfixed:function(){\r\n        var _this = this;\r\n        if(_this.luckysheetrefreshfixednum==null){\r\n            if(_this.BrowserType()==\"FF\"){\r\n                _this.luckysheetrefreshfixednum = 5;\r\n            }\r\n            else{\r\n                _this.luckysheetrefreshfixednum = 0;\r\n            }\r\n        }\r\n\r\n        return _this.luckysheetrefreshfixednum;\r\n    },\r\n    detectOS() {\r\n        var userAgent = navigator.userAgent;\r\n        var isWin = (navigator.platform == \"Win32\") || (navigator.platform == \"Windows\");\r\n        var isMac = (navigator.platform == \"Mac68K\") || (navigator.platform == \"MacPPC\") || (navigator.platform == \"Macintosh\") || (navigator.platform == \"MacIntel\");\r\n        if (isMac) return \"Mac\";\r\n        var isUnix = (navigator.platform == \"X11\") && !isWin && !isMac;\r\n        if (isUnix) return \"Unix\";\r\n        var isLinux = (String(navigator.platform).indexOf(\"Linux\") > -1);\r\n        if (isLinux) return \"Linux\";\r\n        if (isWin) {\r\n            var isWin2K = userAgent.indexOf(\"Windows NT 5.0\") > -1 || userAgent.indexOf(\"Windows 2000\") > -1;\r\n            if (isWin2K) return \"Win2000\";\r\n            var isWinXP = userAgent.indexOf(\"Windows NT 5.1\") > -1 || userAgent.indexOf(\"Windows XP\") > -1;\r\n            if (isWinXP) return \"WinXP\";\r\n            var isWin2003 = userAgent.indexOf(\"Windows NT 5.2\") > -1 || userAgent.indexOf(\"Windows 2003\") > -1;\r\n            if (isWin2003) return \"Win2003\";\r\n            var isWinVista= userAgent.indexOf(\"Windows NT 6.0\") > -1 || userAgent.indexOf(\"Windows Vista\") > -1;\r\n            if (isWinVista) return \"WinVista\";\r\n            var isWin7 = userAgent.indexOf(\"Windows NT 6.1\") > -1 || userAgent.indexOf(\"Windows 7\") > -1;\r\n            if (isWin7) return \"Win7\";\r\n        }\r\n        return \"other\";\r\n    }\r\n};\r\n\r\nexport default browser;", "'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n", "'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n", "'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n        );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n", "// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n", "'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        state.flags = 0;           /* expect zlib header */\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        else if (len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n        state.dmax = 1 << len;\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if (state.flags & 0x0200) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Array(state.head.extra_len);\n              }\n              utils.arraySet(\n                state.head.extra,\n                input,\n                next,\n                // extra field is limited to 65536 bytes\n                // - no need for additional size check\n                copy,\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if (state.flags & 0x0200) {\n              state.check = crc32(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          utils.arraySet(output, input, next, copy, put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inflate_fast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if (_out) {\n            strm.adler = state.check =\n                /*UPDATE(state.check, put - _out, _out);*/\n                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n", "'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== c.Z_OK) {\n        throw new Error(msg[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 aligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n", "// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n", "export function showloading(txt) {\r\n    $(\"#luckysheet-cell-loading\").find(\"span\").text(txt).end().show();\r\n};\r\n\r\nexport function hideloading() {\r\n    $(\"#luckysheet-cell-loading\").hide();\r\n};", "import browser from './browser';\r\nimport formula from './formula';\r\nimport { datagridgrowth } from './getdata';\r\nimport { jfrefreshgrid, jfrefreshgridall, jfrefreshrange } from './refresh';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nconst editor = {\r\n    //worker+blob\u5B9E\u73B0\u6DF1\u62F7\u8D1D\u66FF\u6362extend\r\n    deepCopyFlowDataState:false,\r\n    deepCopyFlowDataCache:\"\",\r\n    deepCopyFlowDataWorker:null,\r\n    deepCopyFlowData:function(flowData){\r\n        let _this = this;\r\n\r\n        if(_this.deepCopyFlowDataState){\r\n            if(_this.deepCopyFlowDataWorker != null){\r\n                _this.deepCopyFlowDataWorker.terminate();  \r\n            }\r\n            return _this.deepCopyFlowDataCache;\r\n        }\r\n        else{\r\n            if(flowData == null){\r\n                flowData = Store.flowdata;\r\n            }\r\n\r\n            return $.extend(true, [], flowData);\r\n        }\r\n    },\r\n    webWorkerFlowDataCache:function(flowData){\r\n        let _this = this;\r\n\r\n        try{\r\n            if(_this.deepCopyFlowDataWorker != null){//\u5B58\u65B0\u7684webwork\u524D\u5148\u9500\u6BC1\u4EE5\u524D\u7684\r\n                _this.deepCopyFlowDataWorker.terminate();\r\n            }\r\n\r\n            let funcTxt = 'data:text/javascript;chartset=US-ASCII,onmessage = function (e) { postMessage(e.data); };';\r\n            _this.deepCopyFlowDataState = false;\r\n\r\n            //\u9002\u914DIE\r\n            let worker;\r\n            if(browser.isIE() == 1){\r\n                let response = \"self.onmessage=function(e){postMessage(e.data);}\";\r\n                worker = new Worker('./plugins/Worker-helper.js');\r\n                worker.postMessage(response);\r\n            }\r\n            else{\r\n                worker = new Worker(funcTxt);\r\n            }\r\n\r\n            _this.deepCopyFlowDataWorker = worker;\r\n            worker.postMessage(flowData);\r\n            worker.onmessage = function(e) { \r\n                _this.deepCopyFlowDataCache = e.data;\r\n                _this.deepCopyFlowDataState = true;\r\n            };\r\n        }\r\n        catch(e){\r\n            _this.deepCopyFlowDataCache = $.extend(true, [], flowData);\r\n        }\r\n    },\r\n\r\n    /**\r\n     * @param {Array} dataChe \r\n     * @param {Object} range \u662F\u5426\u6307\u5B9A\u9009\u533A\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n     * @since Add range parameter. Update by siwei@2020-09-10. \r\n     */\r\n    controlHandler: function (dataChe, range) {\r\n        let _this = this;\r\n\r\n        let d = _this.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n        // let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let last = range || Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n        let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n        let rlen = dataChe.length, clen = dataChe[0].length;\r\n\r\n        let addr = curR + rlen - d.length, addc = curC + clen - d[0].length;\r\n        if(addr > 0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        for (let r = 0; r < rlen; r++) {\r\n            let x = [].concat(d[r + curR]);\r\n            for (let c = 0; c < clen; c++) {\r\n                let value = \"\";\r\n                if (dataChe[r] != null && dataChe[r][c] != null) {\r\n                    value = dataChe[r][c];\r\n                }\r\n                x[c + curC] = value;\r\n            }\r\n            d[r + curR] = x;\r\n        }\r\n\r\n        if (addr > 0 || addc > 0) {\r\n            jfrefreshgridall(d[0].length, d.length, d, null, Store.luckysheet_select_save, \"datachangeAll\");\r\n        }\r\n        else {\r\n            jfrefreshrange(d, Store.luckysheet_select_save);\r\n        }\r\n    },\r\n    clearRangeByindex: function (st_r, ed_r, st_c, ed_c, sheetIndex) {\r\n        let index = getSheetIndex(sheetIndex);\r\n        let d = $.extend(true, [], Store.luckysheetfile[index][\"data\"]);\r\n        \r\n        for (let r = st_r; r <= ed_r; r++) {\r\n            let x = [].concat(d[r]);\r\n            for (let c = st_c; c <= ed_c; c++) {\r\n                formula.delFunctionGroup(r, c);\r\n                formula.execFunctionGroup(r, c, \"\");\r\n                x[c] = null;\r\n            }\r\n            d[r] = x;\r\n        }\r\n\r\n        if(sheetIndex == Store.currentSheetIndex){\r\n            let rlen = ed_r - st_r + 1, \r\n                clen = ed_c - st_c + 1;\r\n            \r\n            if (rlen > 5000) {\r\n                jfrefreshgrid(d, [{ \"row\": [st_r, ed_r], \"column\": [st_c, ed_c] }]);\r\n            }\r\n            else {\r\n                jfrefreshrange(d, { \"row\": [st_r, ed_r], \"column\": [st_c, ed_c] });\r\n            }\r\n        }\r\n        else{\r\n            Store.luckysheetfile[index][\"data\"] = d;\r\n        }\r\n    },\r\n    controlHandlerD: function (dataChe) {\r\n        let _this = this;\r\n\r\n        let d = _this.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n        let rlen = dataChe.length, clen = dataChe[0].length;\r\n\r\n        let addr = r1 + rlen - d.length, addc = c1 + clen - d[0].length;\r\n        if(addr >0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                d[r][c] = null;\r\n            }\r\n        }\r\n\r\n        for(let i = 0; i < rlen; i++){\r\n            for(let j = 0; j < clen; j++){\r\n                d[r1 + i][c1 + j] = dataChe[i][j];\r\n            }\r\n        }\r\n\r\n        let range = [\r\n            { \"row\": [r1, r2], \"column\": [c1, c2] },\r\n            { \"row\": [r1, r1 + rlen - 1], \"column\": [c1, c1 + clen - 1] }\r\n        ];\r\n\r\n        jfrefreshgrid(d, range);\r\n    }\r\n};\r\n\r\nexport default editor;", "import { getObjType } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\n//\u52A8\u6001\u6570\u7EC4\u8BA1\u7B97\r\nfunction dynamicArrayCompute(dynamicArray) {\r\n    let dynamicArray_compute = {};\r\n\r\n    if(getObjType(dynamicArray) == \"array\"){\r\n        for(let i = 0; i < dynamicArray.length; i++){\r\n            let d_row = dynamicArray[i].r;\r\n            let d_col = dynamicArray[i].c;\r\n            let d_f = dynamicArray[i].f;\r\n            \r\n            if(Store.flowdata[d_row][d_col] != null && Store.flowdata[d_row][d_col].f != null && Store.flowdata[d_row][d_col].f == d_f){\r\n                if((d_row + \"_\" + d_col) in dynamicArray_compute){\r\n                    dynamicArray_compute = dynamicArraySpillEditCompute(dynamicArray_compute, d_row , d_col);\r\n                }\r\n\r\n                let d_data = dynamicArray[i].data;\r\n                let d_rowlen = d_data.length;\r\n                let d_collen = 1;\r\n\r\n                if(getObjType(d_data[0]) == \"array\"){\r\n                    d_collen = d_data[0].length;\r\n                }\r\n\r\n                if(dynamicArrayRangeIsAllNull({ \"row\": [d_row, d_row + d_rowlen - 1], \"column\": [d_col, d_col + d_collen - 1] }, Store.flowdata)){\r\n                    for(let x = 0; x < d_rowlen; x++){\r\n                        for(let y = 0; y < d_collen; y++){\r\n                            let rowIndex = d_row + x;\r\n                            let colIndex = d_col + y;\r\n\r\n                            if(getObjType(d_data[0]) == \"array\"){\r\n                                dynamicArray_compute[rowIndex + \"_\" + colIndex] = {\"v\": d_data[x][y], \"r\": d_row, \"c\": d_col};\r\n                            }\r\n                            else{\r\n                                dynamicArray_compute[rowIndex + \"_\" + colIndex] = {\"v\": d_data[x], \"r\": d_row, \"c\": d_col};\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    dynamicArray_compute[d_row + \"_\" + d_col] = {\"v\": \"#SPILL!\", \"r\": d_row, \"c\": d_col};\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return dynamicArray_compute;       \r\n}\r\n\r\nfunction dynamicArraySpillEditCompute(computeObj, r, c) {\r\n    let rowIndex = computeObj[r + \"_\" + c].r;\r\n    let colIndex = computeObj[r + \"_\" + c].c;\r\n\r\n    for(let x in computeObj){\r\n        if(x == (rowIndex + \"_\" + colIndex)){\r\n            computeObj[x].v = \"#SPILL!\";\r\n        }\r\n        else if(computeObj[x].r == rowIndex && computeObj[x].c == colIndex){\r\n            delete computeObj[x];\r\n        }\r\n    }\r\n\r\n    return computeObj;\r\n}\r\n\r\n//\u8303\u56F4\u662F\u5426\u90FD\u662F\u7A7A\u5355\u5143\u683C(\u9664\u7B2C\u4E00\u4E2A\u5355\u5143\u683C)\r\nfunction dynamicArrayRangeIsAllNull(range, data) {\r\n    let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n    let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n    let isAllNull = true;\r\n    for(let r = r1; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            if(!(r == r1 && c == c1) && data[r][c] != null && data[r][c].v != null && data[r][c].v.toString() != \"\"){\r\n                isAllNull = false;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return isAllNull;\r\n}\r\n\r\n//\u70B9\u51FB\u8868\u683C\u533A\u57DF\u662F\u5426\u5C5E\u4E8E\u52A8\u6001\u6570\u7EC4\u533A\u57DF\r\nfunction dynamicArrayHightShow(r, c) {\r\n    let dynamicArray = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"] == null ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"];\r\n    let dynamicArray_compute = dynamicArrayCompute(dynamicArray);\r\n\r\n    if((r + \"_\" + c) in dynamicArray_compute && dynamicArray_compute[r + \"_\" + c].v != \"#SPILL!\"){\r\n        let d_row = dynamicArray_compute[r + \"_\" + c].r;\r\n        let d_col = dynamicArray_compute[r + \"_\" + c].c;\r\n\r\n        let d_f = Store.flowdata[d_row][d_col].f;\r\n\r\n        let rlen, clen;\r\n        for(let i = 0; i < dynamicArray.length; i++){\r\n            if(dynamicArray[i].f == d_f){\r\n                rlen = dynamicArray[i].data.length;\r\n\r\n                if(getObjType(dynamicArray[i].data[0]) == \"array\"){\r\n                    clen = dynamicArray[i].data[0].length;\r\n                }\r\n                else{\r\n                    clen = 1;\r\n                }\r\n            }\r\n        }\r\n\r\n        let d_row_end = d_row + rlen - 1;\r\n        let d_col_end = d_col + clen - 1;\r\n\r\n        let row = Store.visibledatarow[d_row_end], \r\n            row_pre = d_row - 1 == -1 ? 0 : Store.visibledatarow[d_row - 1];\r\n        let col = Store.visibledatacolumn[d_col_end], \r\n            col_pre = d_col - 1 == -1 ? 0 : Store.visibledatacolumn[d_col - 1];\r\n\r\n        $(\"#luckysheet-dynamicArray-hightShow\").css({ \r\n            \"left\": col_pre, \r\n            \"width\": col - col_pre - 1, \r\n            \"top\": row_pre, \r\n            \"height\": row - row_pre - 1, \r\n            \"display\": \"block\" \r\n        });\r\n    }\r\n    else{\r\n        $(\"#luckysheet-dynamicArray-hightShow\").hide();\r\n    }\r\n}\r\n\r\nexport {\r\n    dynamicArrayCompute,\r\n    dynamicArraySpillEditCompute,\r\n    dynamicArrayRangeIsAllNull,\r\n    dynamicArrayHightShow,\r\n}", "import Store from '../store';\r\n\r\nfunction luckysheetRangeLast(obj) {\r\n    let range;\r\n    \r\n    if(document.createRange){ //chrome, firefox, opera, safari, ie9+\r\n        if(obj.innerHTML != obj.innerText || obj.innerHTML == \"\"){\r\n            obj.focus(); //\u89E3\u51B3ff\u4E0D\u83B7\u53D6\u7126\u70B9\u65E0\u6CD5\u5B9A\u4F4D\u95EE\u9898\r\n            range = window.getSelection();//\u521B\u5EFArange\r\n            range.selectAllChildren(obj);//range \u9009\u62E9obj\u4E0B\u6240\u6709\u5B50\u5185\u5BB9\r\n            range.collapseToEnd();//\u5149\u6807\u79FB\u81F3\u6700\u540E\r\n        }\r\n        else{\r\n            let len = obj.innerText.length;\r\n\r\n            range = document.createRange();\r\n            range.selectNodeContents(obj);\r\n            range.setStart(obj.childNodes[0], len);\r\n            range.collapse(true);\r\n\r\n            let selection = window.getSelection();\r\n            selection.removeAllRanges();\r\n            selection.addRange(range);    \r\n        }\r\n    }\r\n    else if(document.selection){ //ie8 and lower\r\n        range = document.body.createTextRange();\r\n        range.moveToElementText(obj);\r\n        range.collapse(false);\r\n        range.select();\r\n    }\r\n}\r\n\r\nfunction getCursortPosition(textDom){\r\n    let cursorPos = 0;\r\n    \r\n    if(document.selection){\r\n        textDom.focus();\r\n        let selectRange = document.selection.createRange();\r\n        selectRange.moveStart(\"character\", -textDom.value.length);\r\n        cursorPos = selectRange.text.length;\r\n    }\r\n    else if(textDom.selectionStart || textDom.selectionStart == \"0\"){\r\n        cursorPos = textDom.selectionStart;\r\n    }\r\n\r\n    return cursorPos;\r\n}\r\n\r\nfunction hideMenuByCancel(event){\r\n\r\n    // Right-click the menu in the title bar, and click on the elements whose class is luckysheet-cols-rows-shift-left and luckysheet-cols-rows-shift-right will trigger the hiding of the menu bar. It should be prohibited. Exclude these two elements. There may be more Other elements will also jump here for more testing\r\n\r\n    if(event.target.classList && (event.target.classList.contains('luckysheet-cols-rows-shift-left') || event.target.classList.contains('luckysheet-cols-rows-shift-right'))){\r\n        return;\r\n    }\r\n\r\n    if (!$(event.target).hasClass(\"luckysheet-mousedown-cancel\") && $(event.target).filter(\"[class*='sp-palette']\").length == 0 && $(event.target).filter(\"[class*='sp-thumb']\").length == 0 && $(event.target).filter(\"[class*='sp-']\").length == 0) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-cols-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        // $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\").hide();\r\n        $(\"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\").hide();\r\n        //$(\"body > luckysheet-menuButton\").hide();\r\n        Store.luckysheet_cols_menu_status = false;\r\n    }\r\n}\r\n\r\nfunction selectTextDom(ele){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        range.selectNodeContents(ele);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n    else if (document.selection) {\r\n        let range = document.body.createTextRange();\r\n        range.moveToElementText(ele);\r\n        range.select();\r\n    } \r\n}\r\n\r\nfunction selectTextContent(ele){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var content=ele.firstChild;\r\n        range.setStart(content,0);\r\n        range.setEnd(content,content.length);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n    else if (document.selection) {\r\n        let range = document.body.createTextRange();\r\n        range.moveToElementText(ele);\r\n        range.select();\r\n    } \r\n}\r\n\r\nfunction selectTextContentCross(sEle, eEle){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var sContent=sEle.firstChild, eContent=eEle.firstChild;\r\n        range.setStart(sContent,0);\r\n        range.setEnd(eContent,eContent.length);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n}\r\n\r\nfunction selectTextContentCollapse(sEle, index){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var sContent=sEle.firstChild;\r\n        if(index>sContent.length){\r\n            index=sContent.length;\r\n        }\r\n        else if(index<0){\r\n            index = 0;\r\n        }\r\n        range.setStart(sContent,index);\r\n        range.collapse(true);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n\r\n    }\r\n}\r\n\r\nfunction isInPage(node) {\r\n    return (node === document.body) ? false : document.body.contains(node);\r\n}\r\n\r\nexport {\r\n    luckysheetRangeLast,\r\n    getCursortPosition,\r\n    hideMenuByCancel,\r\n    selectTextContent,\r\n    selectTextDom,\r\n    selectTextContentCross,\r\n    selectTextContentCollapse\r\n}", "import {getFontStyleByCell, textTrim} from \"../global/getdata\";\r\nimport {selectTextContent,selectTextContentCross,selectTextContentCollapse} from '../global/cursorPos';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport const inlineStyleAffectAttribute = {\"bl\":1, \"it\":1 , \"ff\":1, \"cl\":1, \"un\":1,\"fs\":1,\"fc\":1};\r\nexport const inlineStyleAffectCssName = {\"font-weight\":1, \"font-style\":1 , \"font-family\":1, \"text-decoration\":1, \"border-bottom\":1,\"font-size\":1,\"color\":1};\r\n\r\nexport function isInlineStringCell(cell){\r\n    let isIs = cell && cell.ct!=null && cell.ct.t==\"inlineStr\" && cell.ct.s!=null && cell.ct.s.length>0;\r\n    return isIs; \r\n}\r\n\r\nexport function isInlineStringCT(ct){\r\n    let isIs = ct!=null && ct.t==\"inlineStr\" && ct.s!=null && ct.s.length>0;\r\n    return isIs; \r\n}\r\n\r\nexport function updateInlineStringFormat(cell, attr, value, $input){\r\n    // let s = Store.inlineStringEditCache;\r\n    var  w = window.getSelection(); \r\n    var range;\r\n    if(w.type==\"None\"){\r\n        range = Store.inlineStringEditRange;\r\n    }\r\n    else{\r\n        range = w.getRangeAt(0);\r\n    } \r\n    \r\n\r\n    // if(isInlineStringCell(cell)){\r\n    //     if(Store.inlineStringEditCache==null){\r\n    //         Store.inlineStringEditCache = JSON.parse(JSON.stringify(cell.ct.s));\r\n    //     }\r\n    // }\r\n    // else{\r\n    //     Store.inlineStringEditCache = [{\r\n    //         v:cell.v\r\n    //     }];\r\n    // }\r\n\r\n    let cac = range.commonAncestorContainer;\r\n    let $textEditor;\r\n    if(cac.id==\"luckysheet-rich-text-editor\"){\r\n        $textEditor = $(cac);\r\n    }\r\n    else{\r\n        $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n    }\r\n    let $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n\r\n    if($textEditor.length==0 && $functionbox.length==0 && Store.inlineStringEditRange!=null){\r\n        range = Store.inlineStringEditRange;\r\n        cac = range.commonAncestorContainer;\r\n        if(cac.id==\"luckysheet-rich-text-editor\"){\r\n            $textEditor = $(cac);\r\n        }\r\n        else{\r\n            $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n        }\r\n        $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n    }\r\n\r\n    if(range.collapsed===true){\r\n        return;\r\n    }\r\n\r\n    let endContainer = range.endContainer, startContainer = range.startContainer;\r\n    let endOffset = range.endOffset, startOffset = range.startOffset;\r\n\r\n    if($textEditor.length>0){\r\n        if(startContainer===endContainer){\r\n            let span = startContainer.parentNode, spanIndex, inherit=false;\r\n            \r\n            let content = span.innerHTML;\r\n\r\n            let fullContent = $textEditor.html();\r\n            if(fullContent.substr(0,5) != \"<span\"){\r\n                inherit = true;\r\n            }\r\n\r\n            let left=\"\" , mid=\"\" , right=\"\";\r\n            let s1=0, s2=startOffset, s3 = endOffset, s4=content.length;\r\n            left = content.substring(s1, s2);\r\n            mid = content.substring(s2, s3);\r\n            right = content.substring(s3, s4);\r\n\r\n            let cont = \"\";\r\n            if(left!=\"\"){\r\n                let cssText = span.style.cssText;\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                cont += \"<span style='\"+ cssText +\"'>\" + left + \"</span>\";\r\n            }\r\n\r\n            if(mid!=\"\"){\r\n                // let styleObj = {};\r\n                // styleObj[attr] = value;\r\n                // let s = getFontStyleByCell(styleObj, undefined, undefined, false);\r\n                // let ukey = textTrim(s.substr(0, s.indexOf(':')));\r\n                // let uvalue = textTrim(s.substr(s.indexOf(':')+1));\r\n                // uvalue = uvalue.substr(0, uvalue.length-1);\r\n                // let cssText = span.style.cssText;\r\n                // cssText = removeClassWidthCss(cssText, attr);\r\n\r\n                let cssText = getCssText(span.style.cssText, attr, value);\r\n\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                \r\n                cont += \"<span style='\"+ cssText +\"'>\" + mid + \"</span>\";\r\n            }\r\n\r\n            if(right!=\"\"){\r\n                let cssText = span.style.cssText;\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                cont += \"<span style='\"+ cssText +\"'>\" + right + \"</span>\";\r\n            }\r\n\r\n            if(startContainer.parentNode.tagName==\"SPAN\"){\r\n                spanIndex = $textEditor.find(\"span\").index(span);\r\n                $(span).replaceWith(cont);\r\n            }\r\n            else{\r\n                spanIndex = 0;\r\n                $(span).html(cont);\r\n            }\r\n            \r\n\r\n            let seletedNodeIndex = 0;\r\n            if(s1==s2){\r\n                seletedNodeIndex  = spanIndex;\r\n            }\r\n            else{\r\n                seletedNodeIndex  = spanIndex+1;\r\n            }\r\n\r\n            selectTextContent($textEditor.find(\"span\").get(seletedNodeIndex));\r\n        }\r\n        else{\r\n            if(startContainer.parentNode.tagName==\"SPAN\" && endContainer.parentNode.tagName==\"SPAN\"){\r\n                let startSpan = startContainer.parentNode, startSpanIndex;\r\n                let endSpan = endContainer.parentNode, endSpanIndex;\r\n\r\n                startSpanIndex = $textEditor.find(\"span\").index(startSpan);\r\n                endSpanIndex = $textEditor.find(\"span\").index(endSpan);\r\n\r\n                let startContent = startSpan.innerHTML, endContent = endSpan.innerHTML;\r\n                let sleft=\"\" , sright=\"\", eleft=\"\" , eright=\"\";\r\n                let s1=0, s2=startOffset, s3 = endOffset, s4=endContent.length;\r\n\r\n                sleft = startContent.substring(s1, s2);\r\n                sright = startContent.substring(s2, startContent.length);\r\n\r\n                eleft = endContent.substring(0, s3);\r\n                eright = endContent.substring(s3, s4);\r\n                let spans = $textEditor.find(\"span\");\r\n                let replaceSpans = spans.slice(startSpanIndex, endSpanIndex+1);\r\n                let cont = \"\";\r\n                for(let i=0;i<startSpanIndex;i++){\r\n                    let span = spans.get(i), content = span.innerHTML;\r\n                    cont += \"<span style='\"+ span.style.cssText +\"'>\" + content + \"</span>\";\r\n                }\r\n                if(sleft!=\"\"){\r\n                    cont += \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"</span>\";\r\n                }\r\n\r\n                if(sright!=\"\"){\r\n                    let cssText = getCssText(startSpan.style.cssText, attr, value);\r\n                    cont += \"<span style='\"+ cssText +\"'>\" + sright + \"</span>\";\r\n                }\r\n\r\n                if(startSpanIndex<endSpanIndex){\r\n                    for(let i=startSpanIndex+1;i<endSpanIndex;i++){\r\n                        let span = spans.get(i), content = span.innerHTML;\r\n                        cont += \"<span style='\"+ span.style.cssText +\"'>\" + content + \"</span>\";\r\n                    }\r\n                }\r\n\r\n                if(eleft!=\"\"){\r\n                    let cssText = getCssText(endSpan.style.cssText, attr, value);\r\n                    cont += \"<span style='\"+ cssText +\"'>\" + eleft + \"</span>\";\r\n                }                \r\n                \r\n                if(eright!=\"\"){\r\n                    cont += \"<span style='\"+ endSpan.style.cssText +\"'>\" + eright + \"</span>\";\r\n                }\r\n\r\n                for(let i=endSpanIndex+1;i<spans.length;i++){\r\n                    let span = spans.get(i), content = span.innerHTML;\r\n                    cont += \"<span style='\"+ span.style.cssText +\"'>\" + content + \"</span>\";\r\n                }\r\n\r\n                $textEditor.html(cont);\r\n\r\n                // console.log(replaceSpans, cont);\r\n                // replaceSpans.replaceWith(cont);\r\n\r\n                let startSeletedNodeIndex, endSeletedNodeIndex;\r\n                if(s1==s2){\r\n                    startSeletedNodeIndex  = startSpanIndex;\r\n                    endSeletedNodeIndex = endSpanIndex;\r\n                }\r\n                else{\r\n                    startSeletedNodeIndex  = startSpanIndex+1;\r\n                    endSeletedNodeIndex = endSpanIndex+1;\r\n                }\r\n\r\n                spans = $textEditor.find(\"span\");\r\n\r\n                selectTextContentCross(spans.get(startSeletedNodeIndex), spans.get(endSeletedNodeIndex));\r\n            }\r\n        }\r\n    }\r\n    else if($functionbox.length>0){\r\n\r\n    }\r\n}\r\n\r\nexport function enterKeyControll(cell){\r\n    var  w = window.getSelection(); \r\n    \r\n    if(w.type==\"None\"){\r\n        return\r\n    }\r\n    var range = w.getRangeAt(0);\r\n    let cac = range.commonAncestorContainer;\r\n    let $textEditor;\r\n    if(cac.id==\"luckysheet-rich-text-editor\"){\r\n        $textEditor = $(cac);\r\n    }\r\n    else{\r\n        $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n    }\r\n    let $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n\r\n    // if(range.collapsed===true){\r\n    //     return;\r\n    // }\r\n\r\n    let endContainer = range.endContainer, startContainer = range.startContainer;\r\n    let endOffset = range.endOffset, startOffset = range.startOffset;\r\n    \r\n    if($textEditor.length>0){\r\n        let startSpan = startContainer.parentNode;\r\n        if(startContainer.id==\"luckysheet-rich-text-editor\"){\r\n            startSpan = $(startContainer).find(\"span\");\r\n            if(startSpan.length==0){\r\n                // \u5728\u672B\u5C3E\u6362\u884C\u64CD\u4F5C\u4F1A\u5BFC\u81F4\u6570\u636E\u4E22\u5931(\u8986\u76D6)\r\n                startContainer.innerHTML = `<span>${startContainer.innerText}</span>`;\r\n                startSpan = $(startContainer).find(\"span\");\r\n            }\r\n            startSpan = startSpan.get(startSpan.length-1);\r\n            startOffset = startSpan.innerHTML.length;\r\n        }\r\n        // let startSpanIndex = $textEditor.find(\"span\").index(startSpan);\r\n        if(range.collapsed===false){\r\n            range.deleteContents();\r\n        }\r\n\r\n        // \u5982\u679C\u62F7\u8D1D\u7684\u5185\u5BB9\u4E3A\uFF1Apc&web \uFF0C\u90A3\u4E48innerHTML\u5F97\u5230\u7684\u503C\u4E3A\uFF1Apc&amp;web \uFF0C\u6267\u884C\u6362\u884C\u64CD\u4F5C\u5B58\u5728\u95EE\u9898\r\n        // let startContent = startSpan.innerHTML; \r\n        let startContent = startSpan.innerText;\r\n        let sleft=\"\" , sright=\"\";\r\n        let s1=0, s2=startOffset;\r\n\r\n        sleft = startContent.substring(s1, s2);\r\n        sright = startContent.substring(s2, startContent.length);\r\n\r\n        \r\n        let spanIndex,cont;\r\n        if(startContainer.parentNode.tagName==\"SPAN\"){\r\n            let textSpan = $textEditor.find(\"span\");\r\n            spanIndex = textSpan.index(startSpan);\r\n            if((spanIndex==textSpan.length-1) && sright==\"\"){\r\n                let txt = textSpan[spanIndex].innerHTML;\r\n                if(txt.substr(txt.length-1, 1)==\"\\n\"){\r\n                    cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\" + \"</span>\";\r\n                }\r\n                else{\r\n                    cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\\n\" + \"</span>\";\r\n                }\r\n                \r\n            }\r\n            else{\r\n                cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\" + sright + \"</span>\";\r\n            }\r\n            \r\n            $(startSpan).replaceWith(cont);\r\n        }\r\n        else{\r\n            \r\n            let cssText = getFontStyleByCell(cell);\r\n            if(sright==\"\"){\r\n                cont = \"<span style='\"+ cssText +\"'>\" + sleft + \"\\n\\n\" + \"</span>\";\r\n            }\r\n            else{\r\n                cont = \"<span style='\"+ cssText +\"'>\" + sleft + \"\\n\" + sright + \"</span>\";\r\n            }\r\n            \r\n            if(startContainer.id==\"luckysheet-rich-text-editor\"){\r\n                $(startSpan).replaceWith(cont);\r\n                let textSpan = $textEditor.find(\"span\");\r\n                spanIndex = textSpan.length-1;\r\n                startOffset = textSpan.get(spanIndex).innerHTML.length-1;\r\n            }\r\n            else{\r\n                $(startSpan).html(cont);\r\n                spanIndex = 0;\r\n            }\r\n            \r\n        }\r\n\r\n        selectTextContentCollapse($textEditor.find(\"span\").get(spanIndex), startOffset+1);\r\n\r\n    }\r\n    else if($functionbox.length>0){\r\n\r\n    }\r\n}\r\n\r\nexport function updateInlineStringFormatOutside(cell, key, value){\r\n    if(cell.ct==null){\r\n        return;\r\n    }\r\n    let s = cell.ct.s;\r\n    if(s==null){\r\n        return;\r\n    }\r\n    for(let i=0;i<s.length;i++){\r\n        let item = s[i];\r\n        item[key] = value;\r\n    }\r\n}\r\n\r\nexport function convertSpanToShareString($dom){\r\n    let styles = [], preStyleList, preStyleListString=null;\r\n    for(let i=0;i<$dom.length;i++){\r\n        let span = $dom.get(i);\r\n        let styleList = convertCssToStyleList(span.style.cssText);\r\n\r\n        let curStyleListString = JSON.stringify(styleList);\r\n        // let v = span.innerHTML;\r\n        let v = span.innerText;\r\n        v = v.replace(/\\n/g, \"\\r\\n\");\r\n\r\n        if(curStyleListString==preStyleListString){\r\n            preStyleList.v += v;\r\n        }\r\n        else{\r\n            styleList.v = v;\r\n            styles.push(styleList); \r\n\r\n            preStyleListString = curStyleListString;\r\n            preStyleList = styleList;\r\n        }\r\n    }\r\n    return styles;\r\n}\r\n\r\nexport function convertCssToStyleList(cssText){\r\n    if(cssText==null || cssText.length==0){\r\n        return {};\r\n    }\r\n    let cssTextArray = cssText.split(\";\");\r\n\r\n\r\n    const _locale = locale();\r\n    const locale_fontarray = _locale.fontarray;\r\n    const locale_fontjson = _locale.fontjson;\r\n    let styleList = {    \r\n        \"ff\":locale_fontarray[0], //font family\r\n        \"fc\":\"#000000\",//font color\r\n        \"fs\":10,//font size\r\n        \"cl\":0,//strike\r\n        \"un\":0,//underline\r\n        \"bl\":0,//blod\r\n        \"it\":0,//italic\r\n    };\r\n    cssTextArray.forEach(s => {\r\n        s = s.toLowerCase();\r\n        let key = textTrim(s.substr(0, s.indexOf(':')));\r\n        let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n        if(key==\"font-weight\"){\r\n            if(value==\"bold\"){\r\n                styleList[\"bl\"] = 1;\r\n            }\r\n            else{\r\n                styleList[\"bl\"] = 0;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-style\"){\r\n            if(value==\"italic\"){\r\n                styleList[\"it\"] = 1;\r\n            }\r\n            else{\r\n                styleList[\"it\"] = 0;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-family\"){\r\n            let ff = locale_fontjson[value];\r\n            if(ff==null){\r\n                styleList[\"ff\"] = value;\r\n            }\r\n            else{\r\n                styleList[\"ff\"] = ff;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-size\"){\r\n            styleList[\"fs\"] = parseInt(value);\r\n        }\r\n\r\n        if(key==\"color\"){\r\n            styleList[\"fc\"] = value;\r\n        }\r\n\r\n        if(key==\"text-decoration\"){\r\n                styleList[\"cl\"] = 1;\r\n        }\r\n\r\n        if(key==\"border-bottom\"){\r\n            styleList[\"un\"] = 1;\r\n        }\r\n\r\n        if(key==\"lucky-strike\"){\r\n            styleList[\"cl\"] = value;\r\n        }\r\n\r\n        if(key==\"lucky-underline\"){\r\n            styleList[\"un\"] = value;\r\n        }\r\n\r\n    });\r\n\r\n    return styleList;\r\n}\r\n\r\nconst luckyToCssName = {\r\n    \"bl\":\"font-weight\",\r\n    \"it\":\"font-style\",\r\n    \"ff\":\"font-family\",\r\n    \"fs\":\"font-size\",\r\n    \"fc\":\"color\",\r\n    \"cl\":\"text-decoration\",\r\n    \"un\":\"border-bottom\",\r\n}\r\n\r\nfunction getClassWithcss(cssText, ukey){\r\n    let cssTextArray = cssText.split(\";\");\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey){\r\n                return value;\r\n            }\r\n        }\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nfunction upsetClassWithCss(cssText, ukey, uvalue){\r\n    let cssTextArray = cssText.split(\";\");\r\n    let newCss = \"\";\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey){\r\n                newCss += key + \":\" + uvalue + \";\";\r\n            }\r\n            else if(key.length>0){\r\n                newCss += key + \":\" + value + \";\";\r\n            }\r\n        }\r\n    }\r\n    else if(ukey.length>0){\r\n        cssText += ukey + \":\" + uvalue + \";\"; \r\n        newCss = cssText;\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\nfunction removeClassWidthCss(cssText, ukey){\r\n    let cssTextArray = cssText.split(\";\");\r\n    let newCss = \"\";\r\n    let oUkey = ukey;\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(ukey in luckyToCssName){\r\n        ukey = luckyToCssName[ukey];\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey || (oUkey==\"cl\" && key==\"lucky-strike\") || (oUkey==\"un\" && key==\"lucky-underline\") ){\r\n                continue;\r\n            }\r\n            else if(key.length>0){\r\n                newCss += key + \":\" + value + \";\";\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        newCss = cssText;\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\nfunction getCssText(cssText, attr, value){\r\n    let styleObj = {};\r\n    styleObj[attr] = value;\r\n    if(attr==\"un\"){\r\n        let fontColor = getClassWithcss(cssText,\"color\");\r\n        if(fontColor==\"\"){\r\n            fontColor = \"#000000\";\r\n        }\r\n        let fs = getClassWithcss(cssText,\"font-size\");\r\n        if(fs==\"\"){\r\n            fs = 11;\r\n        }\r\n        fs = parseInt(fs);\r\n        styleObj[\"_fontSize\"] = fs;\r\n        styleObj[\"_color\"] = fontColor;\r\n    }\r\n    let s = getFontStyleByCell(styleObj, undefined, undefined, false);\r\n    let ukey = textTrim(s.substr(0, s.indexOf(':')));\r\n    let uvalue = textTrim(s.substr(s.indexOf(':')+1));\r\n    uvalue = uvalue.substr(0, uvalue.length-1);\r\n    // let cssText = span.style.cssText;\r\n    cssText = removeClassWidthCss(cssText, attr);\r\n\r\n    cssText = upsetClassWithCss(cssText, ukey, uvalue);\r\n\r\n    return cssText;\r\n}\r\n\r\nfunction extendCssText(origin, cover, isLimit=true){\r\n    let originArray = origin.split(\";\");\r\n    let coverArray = cover.split(\";\");\r\n    let newCss = \"\";\r\n    \r\n    let addKeyList = {};\r\n    for(let i=0;i<originArray.length;i++){\r\n        let so = originArray[i], isAdd=true;\r\n        so = so.toLowerCase();\r\n        let okey = textTrim(so.substr(0, so.indexOf(':')));\r\n\r\n        /* \u4E0D\u8BBE\u7F6E\u6587\u5B57\u7684\u5927\u5C0F\uFF0C\u89E3\u51B3\u8BBE\u7F6E\u5220\u9664\u7EBF\u7B49\u540E\u5B57\u4F53\u53D8\u5927\u7684\u95EE\u9898 */\r\n        if(okey == \"font-size\"){\r\n            continue;\r\n        }\r\n\r\n        let ovalue = textTrim(so.substr(so.indexOf(':') + 1));\r\n\r\n        if(isLimit){\r\n            if(!(okey in inlineStyleAffectCssName)){\r\n                continue;\r\n            }\r\n        }\r\n\r\n        for(let a=0;a<coverArray.length;a++){\r\n            let sc = coverArray[a];\r\n            sc = sc.toLowerCase();\r\n            let ckey = textTrim(sc.substr(0, sc.indexOf(':')));\r\n            let cvalue = textTrim(sc.substr(sc.indexOf(':') + 1));\r\n\r\n            if(okey==ckey){\r\n                newCss += ckey + \":\" + cvalue + \";\";\r\n                isAdd = false;\r\n                continue;\r\n            }\r\n        }\r\n\r\n        if(isAdd){\r\n            newCss += okey + \":\" + ovalue + \";\";\r\n        }\r\n\r\n        addKeyList[okey] = 1;\r\n    }\r\n\r\n    for(let a=0;a<coverArray.length;a++){\r\n        let sc = coverArray[a];\r\n        sc = sc.toLowerCase();\r\n        let ckey = textTrim(sc.substr(0, sc.indexOf(':')));\r\n        let cvalue = textTrim(sc.substr(sc.indexOf(':') + 1));\r\n\r\n        if(isLimit){\r\n            if(!(ckey in inlineStyleAffectCssName)){\r\n                continue;\r\n            }\r\n        }\r\n\r\n        if(!(ckey in addKeyList)){\r\n            newCss += ckey + \":\" + cvalue + \";\";\r\n        }\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n", "import { getObjType,rgbTohex } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport server from '../controllers/server';\r\nimport formula from './formula';\r\nimport editor from './editor';\r\nimport { dynamicArrayCompute } from './dynamicArray';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport { isInlineStringCT,isInlineStringCell,convertCssToStyleList } from '../controllers/inlineString';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\n//Get selection range value\r\nexport function getdatabyselection(range, sheetIndex) {\r\n    if(range == null){\r\n        range = Store.luckysheet_select_save[0];\r\n    }\r\n\r\n    if (range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n\r\n    //\u53D6\u6570\u636E\r\n    let d, cfg;\r\n    if(sheetIndex != null && sheetIndex != Store.currentSheetIndex){\r\n        d = Store.luckysheetfile[getSheetIndex(sheetIndex)][\"data\"];\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)][\"config\"];\r\n    }\r\n    else{\r\n        d = editor.deepCopyFlowData(Store.flowdata);\r\n        cfg = Store.config;    \r\n    }\r\n\r\n    let data = [];\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        if(d[r] == null){\r\n            continue;\r\n        }\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        let row = [];\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\nexport function getdatabyselectionD(d, range) {\r\n    if (range == null || range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n    \r\n    let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"]);\r\n    let data = [];\r\n\r\n    if(d==null){\r\n        return data;\r\n    }\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        if(d[r] == null){\r\n            continue;\r\n        }\r\n\r\n        // if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n        //     continue;\r\n        // }\r\n\r\n        let row = [];\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            let value;\r\n            \r\n            if((r + \"_\" + c) in dynamicArray_compute){\r\n                value = dynamicArray_compute[r + \"_\" + c];\r\n            }\r\n            else{\r\n                value = d[r][c];\r\n            }\r\n\r\n            row.push(value);\r\n        }\r\n\r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\nexport function getdatabyselectionNoCopy(range) {\r\n    if (range == null || range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n\r\n    let data = [];\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        let row = [];\r\n        \r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            let value = \"\";\r\n\r\n            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {\r\n                value = Store.flowdata[r][c];\r\n            }\r\n\r\n            row.push(value);\r\n        }\r\n        \r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n//Get the value of the cell\r\nexport function getcellvalue(r, c, data, type) {\r\n    if (type == null) {\r\n        type = \"v\";\r\n    }\r\n\r\n    if (data == null) {\r\n        data = Store.flowdata;\r\n    }\r\n\r\n    let d_value;\r\n\r\n    if (r != null && c != null) {\r\n        d_value = data[r][c];\r\n    }\r\n    else if (r != null) {\r\n        d_value = data[r];\r\n    }\r\n    else if (c != null) {\r\n        let newData = data[0].map(function(col, i) {\r\n            return data.map(function(row) {\r\n                return row[i];\r\n            })\r\n        });\r\n        d_value = newData[c];\r\n    }\r\n    else {\r\n        return data;\r\n    }\r\n\r\n    let retv = d_value;\r\n\r\n    if(getObjType(d_value) == \"object\"){\r\n        retv = d_value[type];\r\n\r\n        if (type == \"f\" && retv != null) {\r\n            retv = formula.functionHTMLGenerate(retv);\r\n        }\r\n        else if(type == \"f\") {\r\n            retv = d_value[\"v\"];\r\n        }\r\n        else if(d_value && d_value.ct && d_value.ct.t == 'd') {\r\n            retv = d_value.m;\r\n        }\r\n    }\r\n\r\n    if(retv == undefined){\r\n        retv = null;\r\n    }\r\n\r\n    return retv;\r\n}\r\n\r\n//Data increase in rows and columns\r\nexport function datagridgrowth(data, addr, addc, iscallback) {\r\n    if (addr <= 0 && addc <= 0) {\r\n        return data;\r\n    }\r\n\r\n    if (addr <= 0) {\r\n        addr = 0;\r\n    }\r\n\r\n    if (addc <= 0) {\r\n        addc = 0;\r\n    }\r\n\r\n    let dataClen = 0;\r\n    if (data.length == 0) {\r\n        data = [];\r\n        dataClen = 0;\r\n    }\r\n    else {\r\n        dataClen = data[0].length;\r\n    }\r\n\r\n    let coladd = [];//\u9700\u8981\u989D\u5916\u589E\u52A0\u7684\u7A7A\u5217\r\n    for (let c = 0; c < addc; c++) {\r\n        coladd.push(null);\r\n    }\r\n\r\n    let rowadd = [];//\u5B8C\u6574\u7684\u4E00\u4E2A\u7A7A\u884C\r\n    for (let r = 0; r < dataClen + addc; r++) {\r\n        rowadd.push(null);\r\n    }\r\n\r\n    for (let r = 0; r < data.length; r++) {\r\n        data[r] = [].concat(data[r].concat(coladd));\r\n    }\r\n\r\n    for (let r = 0; r < addr; r++) {\r\n        data.push([].concat(rowadd));\r\n    }\r\n\r\n    if(!!iscallback){\r\n        server.saveParam(\"all\", Store.currentSheetIndex, data.length, { \"k\": \"row\" });\r\n        server.saveParam(\"all\", Store.currentSheetIndex, data[0].length, { \"k\": \"column\" });\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n\r\n//Get the formula of the cell\r\nexport function getcellFormula(r, c, i, data) {\r\n    let cell;\r\n    if(data!=null){\r\n        cell = data[r][c];\r\n    }\r\n    else{\r\n        cell = getOrigincell(r,c,i);\r\n    }\r\n\r\n    \r\n    if(cell==null){\r\n        return null;\r\n    }\r\n\r\n    return cell.f;\r\n}\r\n\r\n\r\nexport function getOrigincell(r, c, i) {\r\n    if(r==null || c==null){\r\n        return;\r\n    }\r\n    let data;\r\n    if (i == null) {\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        let sheet = sheetmanage.getSheetByIndex(i);\r\n        data = sheet.data;\r\n    }\r\n\r\n    if(!data || !data[r] || !data[r][c]){\r\n        return;\r\n    }\r\n\r\n    return data[r][c];\r\n\r\n\r\n}\r\n\r\nexport function getRealCellValue(r, c){\r\n    let value = getcellvalue(r, c, null, \"m\");\r\n    if(value == null){\r\n        value = getcellvalue(r, c);\r\n        if(value==null){\r\n            let ct = getcellvalue(r, c, null, \"ct\");\r\n            if(isInlineStringCT(ct)){\r\n                value = ct.s;\r\n            }\r\n        }\r\n    }\r\n\r\n    return value;\r\n}\r\n\r\nexport function getInlineStringNoStyle(r, c){\r\n    let ct = getcellvalue(r, c, null, \"ct\");\r\n    if(isInlineStringCT(ct)){\r\n        let strings = ct.s, value=\"\";\r\n        for(let i=0;i<strings.length;i++){\r\n            let strObj = strings[i];\r\n            if(strObj.v!=null){\r\n                value += strObj.v;\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nexport function getInlineStringStyle(r, c, data){\r\n    let ct = getcellvalue(r, c, data, \"ct\");\r\n    if (data == null) {\r\n        data = Store.flowdata;\r\n    }\r\n    let cell = data[r][c];\r\n    if(isInlineStringCT(ct)){\r\n        let strings = ct.s, value=\"\";\r\n        for(let i=0;i<strings.length;i++){\r\n            let strObj = strings[i];\r\n            if(strObj.v!=null){\r\n                let style = getFontStyleByCell(strObj);\r\n                value += \"<span index='\"+ i +\"' style='\"+ style +\"'>\" + strObj.v + \"</span>\";\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nexport function getFontStyleByCell(cell,checksAF,checksCF, isCheck=true){\r\n    if(cell==null){\r\n        return;\r\n    }\r\n    let style = \"\";\r\n    const _locale = locale();\r\n    const locale_fontarray = _locale.fontarray;\r\n    for(let key in cell){\r\n        let value = cell[key];\r\n        if(isCheck){\r\n            value = checkstatusByCell(cell, key);\r\n        }\r\n        if(key == \"bl\" && value != \"0\"){\r\n            style += \"font-weight: bold;\";\r\n        }\r\n\r\n        if(key == \"it\" && value != \"0\"){\r\n            style += \"font-style:italic;\";\r\n        }\r\n\r\n        if(key == \"ff\"){\r\n            let f = value;\r\n            if(!isNaN(parseInt(value))){\r\n                f = locale_fontarray[parseInt(value)];\r\n            }\r\n            else{\r\n                f = value;\r\n            }\r\n            style += \"font-family: \" + f + \";\";\r\n        }\r\n\r\n        if(key == \"fs\" && value != \"10\"){\r\n            style += \"font-size: \"+ value + \"pt;\";\r\n        }\r\n\r\n        if((key == \"fc\" && value != \"#000000\") || checksAF != null || (checksCF != null && checksCF[\"textColor\"] != null)){\r\n            if(checksCF != null && checksCF[\"textColor\"] != null){\r\n                style += \"color: \" + checksCF[\"textColor\"] + \";\";\r\n            }\r\n            else if(checksAF != null){\r\n                style += \"color: \" + checksAF[0] + \";\";\r\n            }\r\n            else{\r\n                style += \"color: \" + value + \";\";  \r\n            }\r\n        }\r\n\r\n        if(key == \"cl\" && value != \"0\"){\r\n            style += \"text-decoration: line-through;\";\r\n        }\r\n\r\n        if(key == \"un\" && (value == \"1\" || value == \"3\")){\r\n            let color = cell[\"_color\"];\r\n            if(color==null){\r\n                color = cell[\"fc\"];\r\n            }\r\n            let fs = cell[\"_fontSize\"];\r\n            if(fs==null){\r\n                fs = cell[\"fs\"];\r\n            }\r\n            style += \"border-bottom: \"+ Math.floor(fs/9) +\"px solid \"+ color +\";\";\r\n        }\r\n\r\n    }\r\n    return style;\r\n}\r\n\r\nexport function checkstatusByCell(cell, a){\r\n    let foucsStatus =cell;\r\n    let tf = {\"bl\":1, \"it\":1 , \"ff\":1, \"cl\":1, \"un\":1};\r\n\r\n    if(a in tf || (a==\"fs\" && isInlineStringCell(cell)) ){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            // var  w = window.getSelection(), isInlineEdit=false; \r\n            // if(w.type!=\"None\"){\r\n            //     var range = w.getRangeAt(0);\r\n            //     let startContainer = range.startContainer;\r\n            //     if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && startContainer.parentNode.tagName==\"SPAN\" && !range.collapsed) {\r\n            //         let span = startContainer.parentNode;\r\n            //         let styleList = convertCssToStyleList(span.style.cssText);\r\n            //         foucsStatus = styleList[a];\r\n            //         isInlineEdit = true;\r\n            //     }\r\n            // }\r\n            \r\n            // if(!isInlineEdit){       \r\n            //     if(isInlineStringCell(cell)){\r\n            //         foucsStatus = cell.ct.s[0][a];\r\n            //     }\r\n            //     else{\r\n            //         foucsStatus = foucsStatus[a];\r\n            //     }\r\n            // }   \r\n            \r\n            foucsStatus = foucsStatus[a];\r\n            \r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"fc\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"#000000\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"#000000\";\r\n            }\r\n\r\n            if(foucsStatus.indexOf(\"rgba\") > -1){\r\n                foucsStatus = rgbTohex(foucsStatus);\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"bg\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n            else if(foucsStatus.toString().indexOf(\"rgba\") > -1){\r\n                foucsStatus = rgbTohex(foucsStatus);\r\n            }\r\n        }\r\n    }\r\n    else if(a.substr(0, 2) == \"bs\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"none\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"none\";\r\n            }\r\n        }\r\n    }\r\n    else if(a.substr(0, 2) == \"bc\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"#000000\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"#000000\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"ht\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"1\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"1\";\r\n            }\r\n        }\r\n\r\n        if([\"0\", \"1\", \"2\"].indexOf(foucsStatus.toString()) == -1){\r\n            foucsStatus = \"1\";\r\n        }\r\n    }\r\n    else if(a == \"vt\"){//\u9ED8\u8BA4\u5782\u76F4\u5C45\u4E2D\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n\r\n        if([\"0\", \"1\", \"2\"].indexOf(foucsStatus.toString()) == -1){\r\n            foucsStatus = \"0\";\r\n        }\r\n    }\r\n    else if(a == \"ct\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"fs\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"10\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"10\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"tb\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"tr\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"rt\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    return foucsStatus;\r\n}\r\n\r\nexport function textTrim(x) {\r\n    if(x==null || x.length==0){\r\n        return x;\r\n    }\r\n    return x.replace(/^\\s+|\\s+$/gm,'');\r\n}", "function luckysheetbinary_search(arr, key) {\r\n    let low = 0, high = arr.length - 1;\r\n    \r\n    while (low <= high) {\r\n        let mid = parseInt((high + low) / 2);\r\n        \r\n        if (key < arr[mid] && (mid == 0 || key >= arr[mid - 1])) {\r\n            return mid;\r\n        } \r\n        else if (key >= arr[mid]) {\r\n            low = mid + 1;\r\n        } \r\n        else if (key < arr[mid]) {\r\n            high = mid - 1;\r\n        }\r\n        else {\r\n            return -1;\r\n        }\r\n    }\r\n}\r\n\r\nfunction luckysheetorder_search(arr, y) {\r\n    let i = 0, \r\n        row = 0, \r\n        row_pre = 0, \r\n        row_index = -1, \r\n        i_ed = arr.length - 1;\r\n\r\n    while (i < arr.length && i_ed >= 0 && i_ed >= i) {\r\n        row = arr[i_ed];\r\n\r\n        if (i_ed == 0) {\r\n            row_pre = 0;\r\n        }\r\n        else {\r\n            row_pre = arr[i_ed - 1];\r\n        }\r\n\r\n        if (y >= row_pre && y < row) {\r\n            row_index = i_ed;\r\n            break;\r\n        }\r\n\r\n        row = arr[i];\r\n\r\n        if (i == 0) {\r\n            row_pre = 0;\r\n        }\r\n        else {\r\n            row_pre = arr[i - 1];\r\n        }\r\n\r\n        if (y >= row_pre && y < row) {\r\n            row_index = i;\r\n            break;\r\n        }\r\n\r\n        i++;\r\n        i_ed--;\r\n    }\r\n\r\n    return row_index;\r\n}\r\n\r\nfunction luckysheet_searcharray(arr, y) {\r\n    let index = arr.length - 1;\r\n\r\n    if (arr.length < 40 || y <= arr[20] || y >= arr[index - 20]) {\r\n        index = luckysheetorder_search(arr, y);\r\n    }\r\n    else {\r\n        index = luckysheetbinary_search(arr, y);\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\nexport {\r\n    luckysheet_searcharray,\r\n}", "import { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport Store from '../store';\r\n\r\nfunction rowLocationByIndex(row_index) {\r\n    let row = 0, row_pre = 0;\r\n    row = Store.visibledatarow[row_index];\r\n\r\n    if (row_index == 0) {\r\n        row_pre = 0;\r\n    }\r\n    else {\r\n        row_pre = Store.visibledatarow[row_index - 1];\r\n    }\r\n\r\n    return [row_pre, row, row_index];\r\n}\r\n\r\nfunction rowLocation(y) {\r\n    let row_index = luckysheet_searcharray(Store.visibledatarow, y);\r\n\r\n    if (row_index == -1 && y > 0) {\r\n        row_index = Store.visibledatarow.length - 1;\r\n    }\r\n    else if (row_index == -1 && y <= 0) {\r\n        row_index = 0;\r\n    }\r\n\r\n    return rowLocationByIndex(row_index);\r\n}\r\n\r\nfunction colLocationByIndex(col_index){\r\n    let col = 0, col_pre = 0;\r\n    col = Store.visibledatacolumn[col_index];\r\n\r\n    if (col_index == 0) {\r\n        col_pre = 0;\r\n    }\r\n    else {\r\n        col_pre = Store.visibledatacolumn[col_index - 1];\r\n    }\r\n\r\n    return [col_pre, col, col_index];\r\n}\r\n\r\nfunction colSpanLocationByIndex(col_index, span){\r\n    let col = 0, col_pre = 0;\r\n    col = Store.visibledatacolumn[col_index + span - 1];\r\n\r\n    if (col_index == 0) {\r\n        col_pre = 0;\r\n    }\r\n    else {\r\n        col_pre = Store.visibledatacolumn[col_index - 1];\r\n    }\r\n\r\n    return [col_pre, col, col_index];\r\n}\r\n\r\nfunction colLocation(x) {\r\n    let col_index = luckysheet_searcharray(Store.visibledatacolumn, x);\r\n\r\n    if (col_index == -1 && x > 0) {\r\n        col_index = Store.visibledatacolumn.length - 1;\r\n    }\r\n    else if (col_index == -1 && x <= 0) {\r\n        col_index = 0;\r\n    }\r\n\r\n    return colLocationByIndex(col_index);\r\n}\r\n\r\nfunction mouseposition(x, y) {\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n\r\n    let newX = x - container_offset.left - Store.rowHeaderWidth,\r\n        newY = y - container_offset.top - Store.infobarHeight - Store.toolbarHeight - Store.calculatebarHeight - Store.columnHeaderHeight;\r\n\r\n    return [newX, newY];\r\n}\r\n\r\nexport {\r\n    rowLocationByIndex,\r\n    rowLocation,\r\n    colLocationByIndex,\r\n    colSpanLocationByIndex,\r\n    colLocation,\r\n    mouseposition,\r\n}\r\n", "import {luckysheetfontformat} from '../utils/util';\r\nimport menuButton from '../controllers/menuButton';\r\nimport {checkstatusByCell} from './getdata';\r\nimport {colLocationByIndex,colSpanLocationByIndex} from './location';\r\nimport {checkWordByteLength, hasChinaword, isRealNull} from './validate';\r\nimport {isInlineStringCell} from '../controllers/inlineString';\r\n\r\nimport Store from '../store';\r\n\r\n/**\r\n * \u8BA1\u7B97\u8303\u56F4\u884C\u9AD8\r\n *\r\n * @param d \u539F\u59CB\u6570\u636E\r\n * @param r1 \u8D77\u59CB\u884C\r\n * @param r2 \u622A\u81F3\u884C\r\n * @param cfg \u914D\u7F6E\r\n * @returns \u8BA1\u7B97\u540E\u7684\u914D\u7F6E\r\n */\r\nfunction rowlenByRange(d, r1, r2, cfg) {\r\n    let cfg_clone = $.extend(true, {}, cfg);\r\n    if(cfg_clone[\"rowlen\"] == null){\r\n        cfg_clone[\"rowlen\"] = {};\r\n    }\r\n\r\n    if(cfg_clone[\"customHeight\"] == null){\r\n        cfg_clone[\"customHeight\"] = {};\r\n    }\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline\u4EE5top\u8BA1\u7B97\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if (cfg_clone[\"rowhidden\"] != null && cfg_clone[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        let currentRowLen = Store.defaultrowlen;\r\n\r\n        if(cfg_clone[\"customHeight\"][r]==1){\r\n            continue;\r\n        }\r\n\r\n        delete cfg_clone[\"rowlen\"][r];\r\n\r\n        for(let c = 0; c < d[r].length; c++){\r\n            let cell = d[r][c];\r\n\r\n            if(cell == null){\r\n                continue;\r\n            }\r\n\r\n            if(cell != null && (cell.v != null || isInlineStringCell(cell)) ){\r\n                let cellWidth;\r\n                if(cell.mc){\r\n                    if(c === cell.mc.c){\r\n                        let st_cellWidth = colLocationByIndex(c)[0];\r\n                        let ed_cellWidth = colLocationByIndex(cell.mc.c + cell.mc.cs - 1)[1];\r\n                        cellWidth = ed_cellWidth - st_cellWidth - 2;\r\n                    }else{\r\n                        continue;\r\n                    }\r\n                } else {\r\n                    cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n                }\r\n\r\n                let textInfo = getCellTextInfo(cell, canvas,{\r\n                    r:r,\r\n                    c:c,\r\n                    cellWidth:cellWidth\r\n                });\r\n\r\n                let computeRowlen = 0;\r\n\r\n                if(textInfo!=null){\r\n                    computeRowlen = textInfo.textHeightAll+2;\r\n                }\r\n\r\n                //\u6BD4\u8F83\u8BA1\u7B97\u9AD8\u5EA6\u548C\u5F53\u524D\u9AD8\u5EA6\u53D6\u6700\u5927\u9AD8\u5EA6\r\n                if(computeRowlen > currentRowLen){\r\n                    currentRowLen = computeRowlen;\r\n                }\r\n            }\r\n        }\r\n\r\n        currentRowLen = currentRowLen/Store.zoomRatio;\r\n\r\n        if(currentRowLen != Store.defaultrowlen){\r\n            cfg_clone[\"rowlen\"][r] = currentRowLen;\r\n        }else{\r\n            if(cfg[\"rowlen\"]?.[r]){\r\n                cfg_clone[\"rowlen\"][r] = cfg[\"rowlen\"][r]\r\n            }\r\n        }\r\n    }\r\n\r\n    return cfg_clone;\r\n}\r\n\r\n//\u6839\u636E\u5185\u5BB9\u8BA1\u7B97\u884C\u9AD8\r\nfunction computeRowlenByContent(d, r) {\r\n    let currentRowLen = 0;\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline\u4EE5top\u8BA1\u7B97\r\n\r\n    for(let c = 0; c < d[r].length; c++){\r\n        let cell = d[r][c];\r\n\r\n        if (cell == null) {\r\n            continue;\r\n        }\r\n\r\n        if (cell.mc != null) {\r\n            if (1 !== cell.mc.rs) {\r\n                continue;\r\n            }\r\n        }\r\n\r\n\r\n        if(cell != null && (cell.v != null || isInlineStringCell(cell)) ){\r\n            let cellWidth = computeCellWidth(cell, c);\r\n\r\n            let textInfo = getCellTextInfo(cell, canvas,{\r\n                r:r,\r\n                c:c,\r\n                cellWidth:cellWidth\r\n            });\r\n\r\n            let computeRowlen = 0;\r\n\r\n            if (textInfo != null) {\r\n                computeRowlen = textInfo.textHeightAll + 2;\r\n            }\r\n\r\n            //\u6BD4\u8F83\u8BA1\u7B97\u9AD8\u5EA6\u548C\u5F53\u524D\u9AD8\u5EA6\u53D6\u6700\u5927\u9AD8\u5EA6\r\n            if (computeRowlen > currentRowLen) {\r\n                currentRowLen = computeRowlen;\r\n            }\r\n        }\r\n    }\r\n\r\n    return currentRowLen;\r\n}\r\n\r\nfunction computeCellWidth(cell, col_index) {\r\n    let colLocationArr = colLocationByIndex(col_index);\r\n    if (cell.mc && cell.mc.c !== cell.mc.cs) {\r\n        colLocationArr = colSpanLocationByIndex(col_index, cell.mc.cs);\r\n    }\r\n\r\n    return colLocationArr[1] - colLocationArr[0] - 2;\r\n}\r\n\r\nfunction computeColWidthByContent(d, c, rh) {\r\n    let currentColLen = 0;\r\n    let rowlenArr = computeRowlenArr(rh, c)\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline\u4EE5top\u8BA1\u7B97\r\n\r\n    for (var i = 0; i < d.length; i++) {\r\n        var cell = d[i][c]\r\n\r\n        if (cell != null && (cell.v != null || isInlineStringCell(cell))) {\r\n            let cellHeight = rowlenArr[c];\r\n            let textInfo = getCellTextInfo(cell, canvas, {\r\n                r: i,\r\n                c: c,\r\n                cellHeight: cellHeight\r\n            });\r\n\r\n            let computeCollen = 0;\r\n\r\n            if (textInfo != null) {\r\n                computeCollen = textInfo.textWidthAll + 2;\r\n            }\r\n\r\n            //\u6BD4\u8F83\u8BA1\u7B97\u9AD8\u5EA6\u548C\u5F53\u524D\u9AD8\u5EA6\u53D6\u6700\u5927\u9AD8\u5EA6\r\n            if (computeCollen > currentColLen) {\r\n                currentColLen = computeCollen;\r\n            }\r\n        }\r\n    }\r\n\r\n    return currentColLen;\r\n}\r\n\r\n//\u8BA1\u7B97\u8868\u683C\u884C\u9AD8\u6570\u7EC4\r\nfunction computeRowlenArr(rowHeight, cfg) {\r\n    let rowlenArr = [];\r\n    let rh_height = 0;\r\n\r\n    for (let i = 0; i < rowHeight; i++) {\r\n        let rowlen = Store.defaultrowlen;\r\n\r\n        if (cfg[\"rowlen\"] != null && cfg[\"rowlen\"][i] != null) {\r\n            rowlen = cfg[\"rowlen\"][i];\r\n        }\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][i] != null) {\r\n            rowlen = cfg[\"rowhidden\"][i];\r\n            rowlenArr.push(rh_height);\r\n            continue;\r\n        }\r\n        else {\r\n            rh_height += rowlen + 1;\r\n        }\r\n\r\n        rowlenArr.push(rh_height);//\u884C\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n    }\r\n\r\n    return rowlenArr;\r\n}\r\n\r\n//\u83B7\u53D6\u6362\u884C\u5355\u5143\u683C\u622A\u65AD\u6570\u7EC4\r\nfunction getCellTextSplitArr(strValue, strArr, cellWidth, canvas){\r\n    for(let strI = 1; strI <= strValue.length; strI++){\r\n        let strV = strValue.substring(0, strI);\r\n        let strtextMetrics = getMeasureText(strV, canvas).width;\r\n\r\n        if(strtextMetrics > cellWidth){\r\n            if(strI - 1 <= 0){\r\n                return strArr;\r\n            }\r\n            else{\r\n                strArr.push(strValue.substring(0, strI - 1));\r\n                return getCellTextSplitArr(strValue.substring(strI - 1), strArr, cellWidth, canvas);\r\n            }\r\n        }\r\n        else if(strI == strValue.length){\r\n            strArr.push(strV);\r\n        }\r\n    }\r\n\r\n    return strArr;\r\n}\r\n\r\n//\u83B7\u53D6\u6709\u503C\u5355\u5143\u683C\u6587\u672C\u5927\u5C0F\r\n// let measureTextCache = {}, measureTextCacheTimeOut = null;\r\nfunction getMeasureText(value, ctx, fontset){\r\n\r\n    let mtc = Store.measureTextCache[value + \"_\" + ctx.font];\r\n    if(fontset!=null){\r\n        mtc = Store.measureTextCache[value + \"_\" + fontset];\r\n    }\r\n\r\n    if(mtc != null){\r\n        return mtc;\r\n    }\r\n    else{\r\n        if(fontset!=null){\r\n            let preFont = ctx.font;\r\n            ctx.font = fontset;\r\n        }\r\n\r\n        let measureText = ctx.measureText(value), cache = {};\r\n        // var regu = \"^[ ]+$\";\r\n        // var re = new RegExp(regu);\r\n        // if(measureText.actualBoundingBoxRight==null || re.test(value)){\r\n        //     cache.width = measureText.width;\r\n        // }\r\n        // else{\r\n        //     //measureText.actualBoundingBoxLeft +\r\n        //     cache.width = measureText.actualBoundingBoxRight;\r\n        // }\r\n\r\n        cache.width = measureText.width;\r\n\r\n        if(fontset!=null){\r\n            ctx.font = fontset;\r\n        }\r\n\r\n        cache.actualBoundingBoxDescent = measureText.actualBoundingBoxDescent;\r\n        cache.actualBoundingBoxAscent = measureText.actualBoundingBoxAscent;\r\n        if(cache.actualBoundingBoxDescent==null || cache.actualBoundingBoxAscent==null || isNaN(cache.actualBoundingBoxDescent) || isNaN(cache.actualBoundingBoxAscent)){\r\n            let commonWord = \"M\"\r\n            if(hasChinaword(value)){\r\n                commonWord = \"\u7530\";\r\n            }\r\n            let oneLineTextHeight = menuButton.getTextSize(commonWord, ctx.font)[1]*0.8;\r\n            if(ctx.textBaseline==\"top\"){\r\n                cache.actualBoundingBoxDescent = oneLineTextHeight;\r\n                cache.actualBoundingBoxAscent = 0;\r\n            }\r\n            else if(ctx.textBaseline==\"middle\"){\r\n                cache.actualBoundingBoxDescent = oneLineTextHeight/2;\r\n                cache.actualBoundingBoxAscent = oneLineTextHeight/2;\r\n            }\r\n            else{\r\n                cache.actualBoundingBoxDescent = 0;\r\n                cache.actualBoundingBoxAscent = oneLineTextHeight;\r\n            }\r\n\r\n            //console.log(value, oneLineTextHeight, measureText.actualBoundingBoxDescent+measureText.actualBoundingBoxAscent,ctx.font);\r\n        }\r\n\r\n        if(ctx.textBaseline == 'alphabetic'){\r\n            let descText = \"gjpqy\", matchText=\"abcdABCD\";\r\n            let descTextMeasure = Store.measureTextCache[descText + \"_\" + ctx.font];\r\n            if(fontset!=null){\r\n                descTextMeasure = Store.measureTextCache[descText + \"_\" + fontset];\r\n            }\r\n\r\n            let matchTextMeasure = Store.measureTextCache[matchText + \"_\" + ctx.font];\r\n            if(fontset!=null){\r\n                matchTextMeasure = Store.measureTextCache[matchText + \"_\" + fontset];\r\n            }\r\n\r\n            if(descTextMeasure == null){\r\n                descTextMeasure = ctx.measureText(descText);\r\n            }\r\n\r\n            if(matchTextMeasure == null){\r\n                matchTextMeasure = ctx.measureText(matchText);\r\n            }\r\n\r\n            if(cache.actualBoundingBoxDescent<=matchTextMeasure.actualBoundingBoxDescent){\r\n                cache.actualBoundingBoxDescent = descTextMeasure.actualBoundingBoxDescent;\r\n                if(cache.actualBoundingBoxDescent==null){\r\n                    cache.actualBoundingBoxDescent = 0;\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n        cache.width *= Store.zoomRatio;\r\n        cache.actualBoundingBoxDescent *= Store.zoomRatio;\r\n        cache.actualBoundingBoxAscent *= Store.zoomRatio;\r\n        Store.measureTextCache[value + \"_\" + Store.zoomRatio +  \"_\" + ctx.font] = cache;\r\n        // console.log(measureText, value);\r\n        return cache;\r\n    }\r\n}\r\n\r\nfunction isSupportBoundingBox(ctx){\r\n    let measureText = ctx.measureText(\"\u7530\");\r\n    if(measureText.actualBoundingBoxAscent==null){\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n\r\n\r\n//\u83B7\u53D6\u5355\u5143\u683C\u6587\u672C\u5185\u5BB9\u7684\u6E32\u67D3\u4FE1\u606F\r\n// let measureTextCache = {}, measureTextCacheTimeOut = null;\r\n// option {cellWidth,cellHeight,space_width,space_height}\r\nfunction getCellTextInfo(cell , ctx, option){\r\n    let cellWidth = option.cellWidth;\r\n    let cellHeight = option.cellHeight;\r\n    let isMode = \"\", isModeSplit = \"\";\r\n    // console.log(\"initialinfo\", cell, option);\r\n    if(cellWidth==null){\r\n        isMode = \"onlyWidth\";\r\n        isModeSplit = \"_\";\r\n    }\r\n    let textInfo = Store.measureTextCellInfoCache[option.r + \"_\" + option.c + isModeSplit + isMode];\r\n    if(textInfo != null){\r\n        return textInfo;\r\n    }\r\n\r\n    // let cell = Store.flowdata[r][c];\r\n    let space_width = option.space_width, space_height = option.space_height; //\u5BBD\u9AD8\u65B9\u5411 \u95F4\u9699\r\n\r\n    if(space_width==null){\r\n        space_width = 2;\r\n    }\r\n\r\n    if(space_height==null){\r\n        space_height = 2;\r\n    }\r\n\r\n    //\u6C34\u5E73\u5BF9\u9F50\r\n    let horizonAlign = checkstatusByCell(cell, \"ht\");\r\n    //\u5782\u76F4\u5BF9\u9F50\r\n    let verticalAlign = checkstatusByCell(cell, \"vt\");\r\n\r\n    let tb = checkstatusByCell(cell ,\"tb\");//wrap overflow\r\n    let tr = checkstatusByCell(cell ,\"tr\");//rotate\r\n    let rt = checkstatusByCell(cell ,\"rt\");//rotate angle\r\n\r\n    let isRotateUp = 1, isRotateDown=0;\r\n\r\n    if(rt==null){\r\n        if(tr==\"0\"){\r\n            rt = 0;\r\n        }\r\n        else if(tr==\"1\"){\r\n            rt = 45;\r\n        }\r\n        else if(tr==\"4\"){\r\n            rt = 90;\r\n        }\r\n        else if(tr==\"2\"){\r\n            rt = 135;\r\n        }\r\n        else if(tr==\"5\"){\r\n            rt = 180;\r\n        }\r\n\r\n        if(rt==null){\r\n            rt = 0;\r\n        }\r\n    }\r\n\r\n    if(rt>180 || rt<0){\r\n        rt = 0;\r\n    }\r\n\r\n    rt = parseInt(rt);\r\n    if(rt>90){\r\n        rt = 90 -rt;\r\n        isRotateUp = 0;\r\n        isRotateDown = 1;\r\n    }\r\n\r\n    ctx.textAlign=\"start\";\r\n\r\n    let textContent = {};\r\n    textContent.values = [];\r\n\r\n    let fontset, cancelLine=\"0\", underLine=\"0\", fontSize=11, isInline=false, value, inlineStringArr=[];\r\n    if(isInlineStringCell(cell)){\r\n        let sharedStrings = cell.ct.s, similarIndex = 0;\r\n        for(let i=0;i<sharedStrings.length;i++){\r\n            let shareCell = sharedStrings[i];\r\n            let scfontset = luckysheetfontformat(shareCell);\r\n            let fc = shareCell.fc, cl=shareCell.cl,un = shareCell.un, v = shareCell.v, fs=shareCell.fs;\r\n            v = v.replace(/\\r\\n/g, \"_x000D_\").replace(/&#13;&#10;/g, \"_x000D_\").replace(/\\r/g, \"_x000D_\").replace(/\\n/g, \"_x000D_\");\r\n            let splitArr = v.split(\"_x000D_\");\r\n            for(let x=0;x<splitArr.length;x++){\r\n                let newValue = splitArr[x];\r\n\r\n                if(newValue==\"\" && x!=splitArr.length-1){\r\n                    inlineStringArr.push({\r\n                        fontset:scfontset,\r\n                        fc:fc==null?\"#000\":fc,\r\n                        cl:cl==null?0:cl,\r\n                        un:un==null?0:un,\r\n                        wrap:true,\r\n                        fs:fs==null?11:fs,\r\n                    });\r\n                    similarIndex++;\r\n                }\r\n                else{\r\n                    let newValueArray = newValue.split(\"\");\r\n                    for(let n=0;n<newValueArray.length;n++){\r\n                        let nv = newValueArray[n];\r\n\r\n                        inlineStringArr.push({\r\n                            fontset:scfontset,\r\n                            fc:fc==null?\"#000\":fc,\r\n                            cl:cl==null?0:cl,\r\n                            un:un==null?0:un,\r\n                            v: nv,\r\n                            si:similarIndex,\r\n                            fs:fs==null?11:fs,\r\n                        });\r\n\r\n                    }\r\n\r\n                    if(x!=splitArr.length-1 ){\r\n                        inlineStringArr.push({\r\n                            fontset:scfontset,\r\n                            fc:fc==null?\"#000\":fc,\r\n                            cl:cl==null?0:cl,\r\n                            un:un==null?0:un,\r\n                            wrap:true,\r\n                            fs:fs==null?11:fs,\r\n                        });\r\n                        similarIndex++;\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            similarIndex++;\r\n        }\r\n        isInline = true;\r\n    }\r\n    else{\r\n        fontset = luckysheetfontformat(cell);\r\n        ctx.font = fontset;\r\n\r\n        cancelLine = checkstatusByCell(cell ,\"cl\");//cancelLine\r\n        underLine = checkstatusByCell(cell ,\"un\");//underLine\r\n        fontSize = checkstatusByCell(cell ,\"fs\");\r\n\r\n        if(cell instanceof Object){\r\n            value = cell.m;\r\n            if(value == null){\r\n                value = cell.v;\r\n            }\r\n        }\r\n        else{\r\n            value = cell;\r\n        }\r\n\r\n        if(isRealNull(value)){\r\n            return null;\r\n        }\r\n    }\r\n\r\n    if(tr==\"3\"){//vertical text\r\n        ctx.textBaseline = 'top';\r\n\r\n\r\n        let textW_all = 0; //\u62C6\u5206\u540E\u5BBD\u9AD8\u5EA6\u5408\u8BA1\r\n        let textH_all = 0;\r\n        let colIndex=0, textH_all_cache=0, textH_all_Column = {}, textH_all_ColumnHeight=[];\r\n        if(isInline){\r\n            let preShareCell = null;\r\n            for(let i = 0; i < inlineStringArr.length; i++){\r\n                let shareCell = inlineStringArr[i];\r\n                let value = shareCell.v, showValue=shareCell.v;\r\n                if(shareCell.wrap===true){\r\n                    value = \"M\";\r\n                    showValue = \"\";\r\n\r\n\r\n                    if( preShareCell!=null && preShareCell.wrap!==true && (i<inlineStringArr.length-1)){\r\n                        // console.log(\"wrap\",i,colIndex,preShareCell.wrap);\r\n                        textH_all_ColumnHeight.push(textH_all_cache);\r\n                        textH_all_cache = 0;\r\n                        colIndex +=1;\r\n\r\n                        preShareCell = shareCell;\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                let measureText = getMeasureText(value, ctx, shareCell.fontset);\r\n\r\n                let textW = measureText.width + space_width;\r\n                let textH = measureText.actualBoundingBoxAscent + measureText.actualBoundingBoxDescent + space_height;\r\n\r\n                // textW_all += textW;\r\n                textH_all_cache += textH;\r\n\r\n\r\n                if(tb==\"2\" && !shareCell.wrap){\r\n                    if(textH_all_cache>cellHeight && textH_all_Column[colIndex]!=null){\r\n                        // textW_all += textW;\r\n                        // textH_all = Math.max(textH_all,textH_all_cache);\r\n                        // console.log(\">\",i,colIndex);\r\n                        textH_all_ColumnHeight.push(textH_all_cache-textH);\r\n                        textH_all_cache = textH;\r\n                        colIndex +=1;\r\n                    }\r\n                }\r\n\r\n                if(i== inlineStringArr.length-1){\r\n                    textH_all_ColumnHeight.push(textH_all_cache);\r\n                }\r\n\r\n                if(textH_all_Column[colIndex]==null){\r\n                    textH_all_Column[colIndex]= [];\r\n                }\r\n\r\n                let item = {\r\n                    content:showValue,\r\n                    style:shareCell,\r\n                    width:textW,\r\n                    height:textH,\r\n                    left:0,\r\n                    top:0,\r\n                    colIndex:colIndex,\r\n                    asc:measureText.actualBoundingBoxAscent,\r\n                    desc:measureText.actualBoundingBoxDescent,\r\n                    inline:true,\r\n                }\r\n\r\n                if(shareCell.wrap===true){\r\n                    item.wrap=true;\r\n                }\r\n\r\n                textH_all_Column[colIndex].push(item);\r\n                console.log(\"normal\",i,colIndex,shareCell, preShareCell, textH_all_Column);\r\n                preShareCell = shareCell;\r\n\r\n            }\r\n        }\r\n        else{\r\n            let measureText = getMeasureText(value, ctx);\r\n            let textHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n            value = value.toString();\r\n\r\n            let vArr = [];\r\n            if(value.length > 1){\r\n                vArr = value.split(\"\");\r\n            }\r\n            else{\r\n                vArr.push(value);\r\n            }\r\n            let oneWordWidth =  getMeasureText(vArr[0], ctx).width;\r\n\r\n            for(let i = 0; i < vArr.length; i++){\r\n                let textW = oneWordWidth + space_width;\r\n                let textH = textHeight + space_height;\r\n\r\n                // textW_all += textW;\r\n                textH_all_cache += textH;\r\n\r\n\r\n                if(tb==\"2\"){\r\n                    if(textH_all_cache>cellHeight && textH_all_Column[colIndex]!=null){\r\n                        // textW_all += textW;\r\n                        // textH_all = Math.max(textH_all,textH_all_cache);\r\n                        textH_all_ColumnHeight.push(textH_all_cache-textH);\r\n                        textH_all_cache = textH;\r\n                        colIndex +=1;\r\n                    }\r\n                }\r\n\r\n                if(i== vArr.length-1){\r\n                    textH_all_ColumnHeight.push(textH_all_cache);\r\n                }\r\n\r\n                if(textH_all_Column[colIndex]==null){\r\n                    textH_all_Column[colIndex]= [];\r\n                }\r\n\r\n                textH_all_Column[colIndex].push({\r\n                    content:vArr[i],\r\n                    style:fontset,\r\n                    width:textW,\r\n                    height:textH,\r\n                    left:0,\r\n                    top:0,\r\n                    colIndex:colIndex,\r\n                    asc:measureText.actualBoundingBoxAscent,\r\n                    desc:measureText.actualBoundingBoxDescent\r\n                });\r\n\r\n            }\r\n        }\r\n\r\n        let textH_all_ColumWidth = [];\r\n        for(let i = 0; i < textH_all_ColumnHeight.length; i++){\r\n            let columnHeight = textH_all_ColumnHeight[i];\r\n            let col = textH_all_Column[i], colMaxW=0;\r\n            for(let c=0;c<col.length;c++){\r\n                let word = col[c];\r\n                colMaxW = Math.max(colMaxW, word.width);\r\n            }\r\n            textH_all_ColumWidth.push(colMaxW);\r\n            textW_all += colMaxW;\r\n            textH_all = Math.max(textH_all, columnHeight);\r\n        }\r\n\r\n        textContent.type = \"verticalWrap\";\r\n        textContent.textWidthAll = textW_all;\r\n        textContent.textHeightAll = textH_all;\r\n\r\n        if(isMode==\"onlyWidth\"){\r\n            // console.log(\"verticalWrap\", textContent,cell, option);\r\n            return textContent;\r\n        }\r\n\r\n        let cumColumnWidth = 0;\r\n        for(let i = 0; i < textH_all_ColumnHeight.length; i++){\r\n            let columnHeight = textH_all_ColumnHeight[i];\r\n            let columnWidth = textH_all_ColumWidth[i];\r\n\r\n            let col = textH_all_Column[i];\r\n            let cumWordHeight = 0;\r\n            for(let c=0;c<col.length;c++){\r\n                let word = col[c];\r\n\r\n                let left = space_width + cumColumnWidth;\r\n                if(horizonAlign == \"0\"){\r\n                    left = cellWidth / 2 + cumColumnWidth - textW_all/2 + space_width*textH_all_ColumnHeight.length;\r\n                }\r\n                else if(horizonAlign == \"2\"){\r\n                    left = cellWidth + cumColumnWidth - textW_all + space_width;\r\n                }\r\n\r\n                let top = (cellHeight - space_height)  + cumWordHeight - columnHeight;\r\n                if(verticalAlign == \"0\"){\r\n                    top = cellHeight / 2 + cumWordHeight - columnHeight/2;\r\n                }\r\n                else if(verticalAlign == \"1\"){\r\n                    top = space_height  + cumWordHeight;\r\n                }\r\n\r\n                cumWordHeight += word.height;\r\n\r\n                word.left = left;\r\n                word.top = top;\r\n\r\n                drawLineInfo(word, cancelLine, underLine,{\r\n                    width:columnWidth,\r\n                    height:word.height,\r\n                    left:left,\r\n                    top:top+word.height-space_height,\r\n                    asc:word.height,\r\n                    desc:0,\r\n                    fs:fontSize\r\n                });\r\n\r\n                textContent.values.push(word);\r\n            }\r\n\r\n            cumColumnWidth+=columnWidth;\r\n\r\n        }\r\n    }\r\n    else{\r\n        let supportBoundBox = isSupportBoundingBox(ctx);\r\n        if(supportBoundBox){\r\n            ctx.textBaseline = 'alphabetic';\r\n        }\r\n        else{\r\n            ctx.textBaseline = 'bottom';\r\n        }\r\n\r\n        if(tb==\"2\" || isInline){//wrap\r\n\r\n            let textW_all = 0; //\u62C6\u5206\u540E\u5BBD\u9AD8\u5EA6\u5408\u8BA1\r\n            let textH_all = 0;\r\n            let textW_all_inner = 0;\r\n\r\n            // let oneWordWidth =  getMeasureText(vArr[0], ctx).width;\r\n            let splitIndex=0, text_all_cache=0, text_all_split = {}, text_all_splitLen=[];\r\n\r\n            textContent.rotate = rt;\r\n            rt = Math.abs(rt);\r\n\r\n            let anchor = 0, preHeight = 0, preWidth=0, preStr, preTextHeight, preTextWidth, preMeasureText, i=1, wrapStyle={}, spaceOrTwoByte=null, spaceOrTwoByteIndex=null;\r\n            if(isInline){\r\n                while(i <= inlineStringArr.length){\r\n                    let shareCells = inlineStringArr.slice(anchor, i);\r\n                    if(shareCells[shareCells.length-1].wrap===true){\r\n\r\n                        anchor = i;\r\n\r\n                        if(shareCells.length>1){\r\n                            for(let s=0;s<shareCells.length-1;s++){\r\n                                let sc = shareCells[s];\r\n                                let item = {\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                }\r\n\r\n                                // if(rt!=0){//rotate\r\n                                //     item.textHeight = sc.textHeight;\r\n                                //     item.textWidth = sc.textWidth;\r\n                                // }\r\n\r\n                                text_all_split[splitIndex].push(item);\r\n                            }\r\n                        }\r\n\r\n                        if(shareCells.length==1 || i==inlineStringArr.length){\r\n                            let sc = shareCells[0];\r\n                            let measureText = getMeasureText(\"M\", ctx, sc.fontset);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex] = [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:\"\",\r\n                                style:sc,\r\n                                width:measureText.width,\r\n                                height:measureText.actualBoundingBoxAscent+measureText.actualBoundingBoxDescent,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                inline:true,\r\n                                wrap:true,\r\n                                fs:sc.fs\r\n                            });\r\n                        }\r\n\r\n\r\n\r\n                        splitIndex +=1;\r\n\r\n                        i++;\r\n\r\n                        continue;\r\n                    }\r\n\r\n                    let textWidth=0, textHeight=0;\r\n                    for(let s=0;s<shareCells.length;s++){\r\n                        let sc = shareCells[s];\r\n                        if(sc.measureText==null){\r\n                            sc.measureText = getMeasureText(sc.v, ctx, sc.fontset);\r\n                        }\r\n                        textWidth += sc.measureText.width;\r\n                        textHeight = Math.max(sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent);\r\n                        // console.log(sc.v,sc.measureText.width,sc.measureText.actualBoundingBoxAscent,sc.measureText.actualBoundingBoxDescent);\r\n                    }\r\n\r\n                    let width = textWidth * Math.cos(rt*Math.PI/180) + textHeight * Math.sin(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    let height = textWidth * Math.sin(rt*Math.PI/180) + textHeight * Math.cos(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    // textW_all += textW;\r\n\r\n\r\n                    let lastWord = shareCells[shareCells.length-1];\r\n                    if(lastWord.v==\" \" || checkWordByteLength(lastWord.v)==2){\r\n                        spaceOrTwoByteIndex = i;\r\n                    }\r\n\r\n\r\n                    if(rt!=0){//rotate\r\n                        // console.log(\"all\",anchor, i , str);\r\n                        console.log(height,space_height, cellHeight, shareCells,(height+space_height)>cellHeight);\r\n                        if((height+space_height)>cellHeight && text_all_split[splitIndex]!=null && tb==\"2\" && i!= inlineStringArr.length){\r\n                            // console.log(\"cut\",anchor, i , str);\r\n\r\n                            if(spaceOrTwoByteIndex!=null && spaceOrTwoByteIndex<i){\r\n\r\n                                for(let s=0;s<spaceOrTwoByteIndex-anchor;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n                                anchor = spaceOrTwoByteIndex;\r\n\r\n                                i = spaceOrTwoByteIndex + 1;\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByteIndex = null;\r\n\r\n                            }\r\n                            else{\r\n\r\n                                anchor = i-1;\r\n\r\n                                for(let s=0;s<shareCells.length-1;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n\r\n                        }\r\n                        else if(i== inlineStringArr.length){\r\n                            // console.log(\"last\",anchor, i , str);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            for(let s=0;s<shareCells.length;s++){\r\n                                let sc = shareCells[s];\r\n                                text_all_split[splitIndex].push({\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                });\r\n                            }\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n                    else{//plain\r\n                        if((width+space_width)>cellWidth && text_all_split[splitIndex]!=null && tb==\"2\" && i!= inlineStringArr.length){\r\n\r\n\r\n                            if(spaceOrTwoByteIndex!=null && spaceOrTwoByteIndex<i){\r\n\r\n                                for(let s=0;s<spaceOrTwoByteIndex-anchor;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n                                anchor = spaceOrTwoByteIndex;\r\n\r\n                                i = spaceOrTwoByteIndex + 1;\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByteIndex = null;\r\n\r\n                            }\r\n                            else{\r\n                                anchor = i-1;\r\n\r\n                                for(let s=0;s<shareCells.length-1;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n\r\n                        }\r\n                        else if(i== inlineStringArr.length){\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n\r\n                            for(let s=0;s<shareCells.length;s++){\r\n                                let sc = shareCells[s];\r\n                                text_all_split[splitIndex].push({\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                });\r\n                            }\r\n\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n\r\n                }\r\n            }\r\n            else{\r\n                value = value.toString();\r\n                while(i <= value.length){\r\n                    let str = value.substring(anchor, i);\r\n                    let measureText =  getMeasureText(str, ctx);\r\n                    let textWidth = measureText.width;\r\n                    let textHeight = measureText.actualBoundingBoxAscent+measureText.actualBoundingBoxDescent;\r\n\r\n                    let width = textWidth * Math.cos(rt*Math.PI/180) + textHeight * Math.sin(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    let height = textWidth * Math.sin(rt*Math.PI/180) + textHeight * Math.cos(rt*Math.PI/180);//consider text box wdith and line height\r\n                    let lastWord = str.substr(str.length-1,1);\r\n                    if(lastWord==\" \" || checkWordByteLength(lastWord)==2){\r\n                        if(preMeasureText!=null){\r\n                            spaceOrTwoByte = {\r\n                                index:i,\r\n                                str:preStr + lastWord,\r\n                                width:preTextWidth,\r\n                                height:preTextHeight,\r\n                                asc:preMeasureText.actualBoundingBoxAscent,\r\n                                desc:preMeasureText.actualBoundingBoxDescent,\r\n                            };\r\n                        }\r\n\r\n                    }\r\n                    // textW_all += textW;\r\n                    // console.log(str,anchor,i);\r\n                    if(rt!=0){//rotate\r\n                        // console.log(\"all\",anchor, i , str);\r\n                        if((height+space_height)>cellHeight && text_all_split[splitIndex]!=null && i!= value.length){\r\n                            // console.log(\"cut\",anchor, i , str);\r\n\r\n                            if(spaceOrTwoByte!=null && spaceOrTwoByte.index<i){\r\n\r\n                                anchor = spaceOrTwoByte.index;\r\n\r\n                                i = spaceOrTwoByte.index + 1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:spaceOrTwoByte.str,\r\n                                    style:fontset,\r\n                                    width:spaceOrTwoByte.width,\r\n                                    height:spaceOrTwoByte.height,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:spaceOrTwoByte.asc,\r\n                                    desc:spaceOrTwoByte.desc,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(1,anchor,i,splitIndex , spaceOrTwoByte.str);\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByte = null;\r\n\r\n\r\n\r\n                            }\r\n                            else{\r\n                                anchor = i-1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:preStr,\r\n                                    style:fontset,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    height:preTextHeight,\r\n                                    width:preTextWidth,\r\n                                    asc:measureText.actualBoundingBoxAscent,\r\n                                    desc:measureText.actualBoundingBoxDescent,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(2,anchor,i, splitIndex, preStr);\r\n\r\n                                splitIndex +=1;\r\n\r\n\r\n                            }\r\n                        }\r\n                        else if(i== value.length){\r\n                            // console.log(\"last\",anchor, i , str);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:str,\r\n                                style:fontset,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                height:textHeight,\r\n                                width:textWidth,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                fs:fontSize,\r\n                            });\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n                    else{//plain\r\n                        if((width+space_width)>cellWidth && text_all_split[splitIndex]!=null && i!= value.length){\r\n                            // console.log(spaceOrTwoByte, i, anchor);\r\n                            if(spaceOrTwoByte!=null && spaceOrTwoByte.index<i){\r\n\r\n                                anchor = spaceOrTwoByte.index;\r\n\r\n                                i = spaceOrTwoByte.index + 1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:spaceOrTwoByte.str,\r\n                                    style:fontset,\r\n                                    width:spaceOrTwoByte.width,\r\n                                    height:spaceOrTwoByte.height,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:spaceOrTwoByte.asc,\r\n                                    desc:spaceOrTwoByte.desc,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByte = null;\r\n\r\n\r\n\r\n                            }\r\n                            else{\r\n\r\n                                spaceOrTwoByte = null;\r\n                                anchor = i-1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:preStr,\r\n                                    style:fontset,\r\n                                    width:preTextWidth,\r\n                                    height:preTextHeight,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:measureText.actualBoundingBoxAscent,\r\n                                    desc:measureText.actualBoundingBoxDescent,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(2);\r\n\r\n\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n                        }\r\n                        else if(i== value.length){\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:str,\r\n                                style:fontset,\r\n                                width:textWidth,\r\n                                height:textHeight,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                fs:fontSize,\r\n                            });\r\n\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n\r\n                    preStr = str;\r\n                    preTextHeight = textHeight;\r\n                    preTextWidth = textWidth;\r\n                    preMeasureText = measureText;\r\n\r\n                }\r\n\r\n                // console.log(text_all_split)\r\n            }\r\n\r\n            let split_all_size = [], oneLinemaxWordCount=0;\r\n            // console.log(\"split\",splitIndex, text_all_split);\r\n            let splitLen = Object.keys(text_all_split).length;\r\n            for(let i = 0; i < splitLen; i++){\r\n                let splitLists = text_all_split[i];\r\n                if(splitLists==null){\r\n                    continue;\r\n                }\r\n                let sWidth = 0, sHeight=0, maxDesc=0,maxAsc=0, lineHeight=0, maxWordCount=0;\r\n                for(let s=0;s<splitLists.length;s++){\r\n                    let sp = splitLists[s];\r\n                    if(rt!=0){//rotate\r\n                        sWidth += sp.width;\r\n                        sHeight = Math.max(sHeight, sp.height-(supportBoundBox?sp.desc:0));\r\n                    }\r\n                    else{//plain\r\n                        sWidth += sp.width;\r\n                        sHeight = Math.max(sHeight, sp.height-(supportBoundBox?sp.desc:0));\r\n                    }\r\n                    maxDesc = Math.max(maxDesc,(supportBoundBox?sp.desc:0));\r\n                    maxAsc = Math.max(maxAsc, sp.asc);\r\n                    maxWordCount++;\r\n                }\r\n\r\n                lineHeight = sHeight/2;\r\n                oneLinemaxWordCount = Math.max(oneLinemaxWordCount, maxWordCount);\r\n                if(rt!=0){//rotate\r\n                    sHeight+=lineHeight;\r\n                    textW_all_inner =  Math.max(textW_all_inner, sWidth);\r\n                    // textW_all =  Math.max(textW_all, sWidth+ (textH_all)/Math.tan(rt*Math.PI/180));\r\n                    textH_all += sHeight;\r\n                }\r\n                else{//plain\r\n                    // console.log(\"textH_all\",textW_all, textH_all);\r\n                    sHeight+=lineHeight;\r\n                    textW_all=Math.max(textW_all, sWidth);\r\n                    textH_all+=sHeight;\r\n                }\r\n\r\n\r\n                split_all_size.push({\r\n                    width:sWidth,\r\n                    height:sHeight,\r\n                    desc:maxDesc,\r\n                    asc:maxAsc,\r\n                    lineHeight:lineHeight,\r\n                    wordCount: maxWordCount\r\n                });\r\n            }\r\n            // console.log(textH_all,textW_all,textW_all_inner);\r\n            // let cumColumnWidth = 0;\r\n            let cumWordHeight = 0,cumColumnWidth = 0;\r\n            let rtPI = rt*Math.PI/180;\r\n            let lastLine = split_all_size[splitLen-1];\r\n            let lastLineSpaceHeight = lastLine.lineHeight;\r\n            textH_all = textH_all - lastLineSpaceHeight + lastLine.desc;\r\n            let rw = (textH_all)/Math.sin(rtPI) + textW_all_inner*Math.cos(rtPI);\r\n            let rh = textW_all_inner*Math.sin(rtPI), fixOneLineLeft = 0;\r\n\r\n            if(rt!=0){\r\n                if(splitLen==1){\r\n                    textW_all = textW_all_inner + 2*(textH_all/Math.tan(rtPI));\r\n                    fixOneLineLeft = textH_all/Math.tan(rtPI);\r\n                }\r\n                else{\r\n                    textW_all = textW_all_inner + textH_all/Math.tan(rtPI);\r\n                }\r\n                textContent.textWidthAll = rw;\r\n                textContent.textHeightAll = rh;\r\n            }\r\n            else{\r\n                textContent.textWidthAll = textW_all;\r\n                textContent.textHeightAll = textH_all;\r\n            }\r\n\r\n            if(isMode==\"onlyWidth\"){\r\n                // console.log(\"plainWrap\", textContent,cell, option);\r\n                return textContent;\r\n            }\r\n\r\n            if(rt!=0 && isRotateUp==\"1\"){\r\n                ctx.textAlign=\"end\";\r\n                for(let i = 0; i < splitLen; i++){\r\n                    let splitLists = text_all_split[i];\r\n                    if(splitLists==null){\r\n                        continue;\r\n                    }\r\n                    let size = split_all_size[i];\r\n\r\n                    cumColumnWidth = 0;\r\n\r\n                    for(let c=splitLists.length-1;c>=0;c--){\r\n                        let wordGroup = splitLists[c];\r\n                        let left, top;\r\n                        if(rt!=0){//rotate\r\n                            let x, y = cumWordHeight+size.asc;\r\n\r\n                            x = (cumWordHeight)/Math.tan(rtPI) - cumColumnWidth + textW_all_inner;\r\n                            if(horizonAlign == \"0\"){//center\r\n                                let sh = textH_all/Math.sin(rtPI);\r\n                                if(verticalAlign == \"0\"){//mid\r\n\r\n                                    left = x + cellWidth/2 - (textW_all/2) + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x + cellWidth/2 - textW_all/2;\r\n                                    top = y - (textH_all/2 - rh/2);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth/2 - (textW_all/2)+lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rh/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"1\"){//left\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x - rh*Math.sin(rtPI)/2 + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 + rh*Math.cos(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x - rh*Math.sin(rtPI);\r\n                                    top = y + rh*Math.cos(rtPI);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"2\"){//right\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x + cellWidth - rw/2 - (textW_all_inner/2+(textH_all/2)/Math.tan(rtPI))+ lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top fixOneLineLeft\r\n                                    left = x + cellWidth - textW_all + fixOneLineLeft;\r\n                                    top = y - textH_all;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth - rw*Math.cos(rtPI) + lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rw*Math.sin(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n\r\n                        }\r\n\r\n                        wordGroup.left = left;\r\n                        wordGroup.top = top;\r\n\r\n                        // console.log(left, top,  cumWordHeight, size.height);\r\n\r\n                        drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                            width:wordGroup.width,\r\n                            height:wordGroup.height,\r\n                            left:left-wordGroup.width,\r\n                            top:top,\r\n                            asc:size.asc,\r\n                            desc:size.desc,\r\n                            fs:wordGroup.fs\r\n                        });\r\n\r\n                        textContent.values.push(wordGroup);\r\n\r\n                        cumColumnWidth += wordGroup.width;\r\n                    }\r\n\r\n\r\n                    cumWordHeight += size.height;\r\n\r\n\r\n                }\r\n            }\r\n            else{\r\n                for(let i = 0; i < splitLen; i++){\r\n                    let splitLists = text_all_split[i];\r\n                    if(splitLists==null){\r\n                        continue;\r\n                    }\r\n                    let size = split_all_size[i];\r\n\r\n                    cumColumnWidth = 0;\r\n\r\n                    for(let c=0;c<splitLists.length;c++){\r\n                        let wordGroup = splitLists[c];\r\n                        let left, top;\r\n                        if(rt!=0){//rotate\r\n                            let x, y = cumWordHeight+size.asc;\r\n\r\n                            x = (textH_all-cumWordHeight)/Math.tan(rtPI) + cumColumnWidth;\r\n\r\n                            if(horizonAlign == \"0\"){//center\r\n                                let sh = textH_all/Math.sin(rtPI);\r\n                                if(verticalAlign == \"0\"){//mid\r\n\r\n                                    left = x + cellWidth/2 - (textW_all/2) - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x + cellWidth/2 - textW_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y - (textH_all/2 - rh/2)+lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth/2 - (textW_all/2)-lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rh/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"1\"){//left\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x - rh*Math.sin(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y - textH_all + cellHeight/2 - rh*Math.cos(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x;\r\n                                    top = y - textH_all;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x - rh*Math.sin(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y - textH_all + cellHeight - rh*Math.cos(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"2\"){//right\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x + cellWidth - rw/2 - textW_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top fixOneLineLeft\r\n                                    left = x + cellWidth - rw*Math.cos(rtPI);\r\n                                    top = y + rh*Math.cos(rtPI);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth - textW_all - lastLineSpaceHeight*Math.cos(rtPI) + fixOneLineLeft;\r\n                                    top = y + cellHeight - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n\r\n                            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                                width:wordGroup.width,\r\n                                height:wordGroup.height,\r\n                                left:left,\r\n                                top:top,\r\n                                asc:size.asc,\r\n                                desc:size.desc,\r\n                                fs:wordGroup.fs\r\n                            });\r\n\r\n                        }\r\n                        else{//plain\r\n                            left = space_width + cumColumnWidth;\r\n                            if(horizonAlign == \"0\"){\r\n                                //+ space_width*textH_all_ColumnHeight.length\r\n                                left = cellWidth / 2 + cumColumnWidth - size.width/2;\r\n                            }\r\n                            else if(horizonAlign == \"2\"){\r\n                                left = cellWidth + cumColumnWidth - size.width;\r\n                            }\r\n\r\n                            top = (cellHeight - space_height)  + cumWordHeight +size.asc-textH_all;\r\n                            if(verticalAlign == \"0\"){\r\n                                top = cellHeight / 2 + cumWordHeight - textH_all/2 + size.asc;\r\n                            }\r\n                            else if(verticalAlign == \"1\"){\r\n                                top = space_height  + cumWordHeight+ size.asc;\r\n                            }\r\n\r\n\r\n\r\n                            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                                width:wordGroup.width,\r\n                                height:wordGroup.height,\r\n                                left:left,\r\n                                top:top,\r\n                                asc:size.asc,\r\n                                desc:size.desc,\r\n                                fs:wordGroup.fs\r\n                            });\r\n                        }\r\n\r\n\r\n                        wordGroup.left = left;\r\n                        wordGroup.top = top;\r\n\r\n                        textContent.values.push(wordGroup);\r\n\r\n                        cumColumnWidth += wordGroup.width;\r\n                    }\r\n\r\n\r\n                    cumWordHeight += size.height;\r\n\r\n\r\n                }\r\n            }\r\n\r\n            textContent.type = \"plainWrap\";\r\n\r\n            if(rt!=0){\r\n                // let leftCenter = (textW_all + textH_all/Math.tan(rt*Math.PI/180))/2;\r\n                // let topCenter = textH_all/2;\r\n\r\n                // if(isRotateUp==\"1\"){\r\n                //     textContent.textLeftAll += leftCenter;\r\n                //     textContent.textTopAll += topCenter;\r\n                // }\r\n                // else {\r\n                //     textContent.textLeftAll += leftCenter;\r\n                //     textContent.textTopAll -= topCenter;\r\n                // }\r\n\r\n                if(horizonAlign == \"0\"){//center\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = rh/2;\r\n\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = cellHeight - rh/2;\r\n                    }\r\n                }\r\n                else if(horizonAlign == \"1\"){//left\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = 0;\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = cellHeight;\r\n                    }\r\n                }\r\n                else if(horizonAlign == \"2\"){//right\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = cellWidth - rw/2;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = cellWidth;\r\n                        textContent.textTopAll = 0;\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = cellWidth;\r\n                        textContent.textTopAll = cellHeight;\r\n                    }\r\n                }\r\n\r\n            }\r\n            // else{\r\n            //     textContent.textWidthAll = textW_all;\r\n            //     textContent.textHeightAll = textH_all;\r\n            // }\r\n\r\n        }\r\n        else{\r\n            let measureText = getMeasureText(value, ctx);\r\n            let textWidth = measureText.width;\r\n            let textHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n            textContent.rotate = rt;\r\n\r\n            rt = Math.abs(rt);\r\n            let rtPI = rt*Math.PI/180;\r\n\r\n            let textWidthAll = textWidth * Math.cos(rtPI) + textHeight * Math.sin(rtPI);//consider text box wdith and line height\r\n\r\n            let textHeightAll = textWidth * Math.sin(rtPI) + textHeight * Math.cos(rtPI);//consider text box wdith and line height\r\n\r\n            if(rt!=0){\r\n                textContent.textHeightAll = textHeightAll;\r\n            }\r\n            else{\r\n                textContent.textHeightAll = textHeightAll+textHeight/2-measureText.actualBoundingBoxDescent-space_height;\r\n            }\r\n            textContent.textWidthAll = textWidthAll;\r\n\r\n            // console.log(textContent.textWidthAll , textContent.textHeightAll);\r\n            if(isMode==\"onlyWidth\"){\r\n                // console.log(\"plain\", textContent,cell, option);\r\n                return textContent;\r\n            }\r\n\r\n            let width = textWidthAll, height = textHeightAll;\r\n\r\n            let left = space_width + textHeight * Math.sin(rtPI)*isRotateUp; //\u9ED8\u8BA4\u4E3A1\uFF0C\u5DE6\u5BF9\u9F50\r\n            if(horizonAlign == \"0\"){ //\u5C45\u4E2D\u5BF9\u9F50\r\n                left = cellWidth / 2  - (width / 2) + textHeight * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n            else if(horizonAlign == \"2\"){ //\u53F3\u5BF9\u9F50\r\n                left = (cellWidth - space_width)  - width + textHeight * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n\r\n            let top = (cellHeight - space_height)  - height + measureText.actualBoundingBoxAscent * Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp; //\u9ED8\u8BA4\u4E3A2\uFF0C\u4E0B\u5BF9\u9F50\r\n            if(verticalAlign == \"0\"){ //\u5C45\u4E2D\u5BF9\u9F50\r\n                top = cellHeight / 2  - (height / 2) + measureText.actualBoundingBoxAscent* Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n            else if(verticalAlign == \"1\"){ //\u4E0A\u5BF9\u9F50\r\n                top = space_height + measureText.actualBoundingBoxAscent* Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n\r\n            textContent.type = \"plain\";\r\n\r\n            let wordGroup = {\r\n                content:value,\r\n                style:fontset,\r\n                width:width,\r\n                height:height,\r\n                left:left,\r\n                top:top,\r\n            }\r\n\r\n            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                width:textWidth,\r\n                height:textHeight,\r\n                left:left,\r\n                top:top,\r\n                asc:measureText.actualBoundingBoxAscent,\r\n                desc:measureText.actualBoundingBoxDescent,\r\n                fs:fontSize,\r\n            });\r\n\r\n            textContent.values.push(wordGroup);\r\n\r\n            textContent.textLeftAll = left;\r\n            textContent.textTopAll = top;\r\n\r\n            textContent.asc = measureText.actualBoundingBoxAscent;\r\n            textContent.desc = measureText.actualBoundingBoxDescent;\r\n\r\n            // console.log(\"plain\",left,top);\r\n        }\r\n    }\r\n\r\n    return textContent;\r\n}\r\n\r\n\r\nfunction drawLineInfo(wordGroup, cancelLine,underLine,option){\r\n    let left = option.left, top = option.top, width=option.width, height = option.height, asc = option.asc,desc = option.desc,fs = option.fs;\r\n\r\n    if(wordGroup.wrap===true){\r\n        return;\r\n    }\r\n\r\n    if(wordGroup.inline==true && wordGroup.style!=null){\r\n        cancelLine = wordGroup.style.cl;\r\n        underLine = wordGroup.style.un;\r\n    }\r\n\r\n    if(cancelLine!=\"0\"){\r\n        wordGroup.cancelLine = {};\r\n        wordGroup.cancelLine.startX = left;\r\n        wordGroup.cancelLine.startY = top-asc/2+1;\r\n\r\n        wordGroup.cancelLine.endX = left + width;\r\n        wordGroup.cancelLine.endY = top-asc/2+1;\r\n\r\n        wordGroup.cancelLine.fs = fs;\r\n\r\n    }\r\n\r\n    if(underLine!=\"0\"){\r\n         wordGroup.underLine = [];\r\n         if(underLine==\"1\" || underLine==\"2\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top + 3;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top + 3;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"2\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"3\" || underLine==\"4\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"4\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc+2;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc+2;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n    }\r\n}\r\n\r\n\r\n\r\nexport {\r\n    computeColWidthByContent,\r\n    rowlenByRange,\r\n    computeRowlenByContent,\r\n    computeRowlenArr,\r\n    getCellTextSplitArr,\r\n    getMeasureText,\r\n    getCellTextInfo\r\n}\r\n", "import Store from '../store';\r\nimport { computeRowlenByContent,computeColWidthByContent } from './getRowlen';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\n\r\nexport default function rhchInit(rowheight, colwidth) {\r\n    zoomSetting();//Zoom sheet on first load\r\n    //\u884C\u9AD8\r\n    if(rowheight != null){\r\n        Store.visibledatarow = [];\r\n        Store.rh_height = 0;\r\n\r\n        for (let r = 0; r < rowheight; r++) {\r\n            let rowlen = Store.defaultrowlen;\r\n\r\n            if (Store.config[\"rowlen\"] != null && Store.config[\"rowlen\"][r] != null) {\r\n                rowlen = Store.config[\"rowlen\"][r];\r\n            }\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                Store.visibledatarow.push(Store.rh_height);\r\n                continue;\r\n            }\r\n\r\n            // \u81EA\u52A8\u884C\u9AD8\u8BA1\u7B97\r\n            if (rowlen === 'auto') {\r\n                rowlen = computeRowlenByContent(Store.flowdata, r);\r\n            }\r\n            Store.rh_height += Math.round((rowlen + 1) * Store.zoomRatio);\r\n\r\n            Store.visibledatarow.push(Store.rh_height); //\u884C\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n        }\r\n\r\n        // \u5982\u679C\u589E\u52A0\u884C\u548C\u56DE\u5230\u9876\u90E8\u6309\u94AE\u9690\u85CF\uFF0C\u5219\u51CF\u5C11\u5E95\u90E8\u7A7A\u767D\u533A\u57DF\uFF0C\u4F46\u662F\u9884\u7559\u8DB3\u591F\u7A7A\u95F4\u7ED9\u5355\u5143\u683C\u4E0B\u62C9\u6309\u94AE\r\n        if (!luckysheetConfigsetting.enableAddRow && !luckysheetConfigsetting.enableAddBackTop) {\r\n            Store.rh_height += 29;\r\n        } else {\r\n            Store.rh_height += 80;  //\u6700\u5E95\u90E8\u589E\u52A0\u7A7A\u767D\r\n        }\r\n\r\n    }\r\n\r\n    //\u5217\u5BBD\r\n    if(colwidth != null){\r\n        Store.visibledatacolumn = [];\r\n        Store.ch_width = 0;\r\n\r\n        let maxColumnlen = 120;\r\n\r\n        for (let c = 0; c < colwidth; c++) {\r\n            let firstcolumnlen = Store.defaultcollen;\r\n\r\n            if (Store.config[\"columnlen\"] != null && Store.config[\"columnlen\"][c] != null) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][c];\r\n            }\r\n            else {\r\n                if (Store.flowdata[0] != null && Store.flowdata[0][c] != null) {\r\n                    if (firstcolumnlen > 300) {\r\n                        firstcolumnlen = 300;\r\n                    }\r\n                    else if (firstcolumnlen < Store.defaultcollen) {\r\n                        firstcolumnlen = Store.defaultcollen;\r\n                    }\r\n\r\n                    if (firstcolumnlen != Store.defaultcollen) {\r\n                        if (Store.config[\"columnlen\"] == null) {\r\n                            Store.config[\"columnlen\"] = {};\r\n                        }\r\n\r\n                        Store.config[\"columnlen\"][c] = firstcolumnlen;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null){\r\n                Store.visibledatacolumn.push(Store.ch_width);\r\n                continue;\r\n            }\r\n\r\n            // \u81EA\u52A8\u884C\u9AD8\u8BA1\u7B97\r\n            if (firstcolumnlen === 'auto') {\r\n                firstcolumnlen = computeColWidthByContent(Store.flowdata, c, rowheight);\r\n            }\r\n            Store.ch_width += Math.round((firstcolumnlen + 1)*Store.zoomRatio);\r\n\r\n            Store.visibledatacolumn.push(Store.ch_width);//\u5217\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n\r\n            // if(maxColumnlen < firstcolumnlen + 1){\r\n            //     maxColumnlen = firstcolumnlen + 1;\r\n            // }\r\n        }\r\n\r\n        // Store.ch_width += 120;\r\n        Store.ch_width += maxColumnlen;\r\n    }\r\n}\r\n\r\n\r\nexport function zoomSetting(){\r\n    //zoom\r\n    Store.rowHeaderWidth = luckysheetConfigsetting.rowHeaderWidth * Store.zoomRatio;\r\n    Store.columnHeaderHeight = luckysheetConfigsetting.columnHeaderHeight *Store.zoomRatio;\r\n    $(\"#luckysheet-rows-h\").width((Store.rowHeaderWidth-1.5));\r\n    $(\"#luckysheet-cols-h-c\").height((Store.columnHeaderHeight-1.5));\r\n    $(\"#luckysheet-left-top\").css({width:Store.rowHeaderWidth-1.5, height:Store.columnHeaderHeight-1.5});\r\n}\r\n", "!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):t.dayjs=e()}(this,function(){\"use strict\";var t=\"millisecond\",e=\"second\",n=\"minute\",r=\"hour\",i=\"day\",s=\"week\",u=\"month\",a=\"quarter\",o=\"year\",f=\"date\",h=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[^0-9]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,c=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,d={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")},$=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},l={s:$,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+$(r,2,\"0\")+\":\"+$(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,u),s=n-i<0,a=e.clone().add(r+(s?-1:1),u);return+(-(r+(n-i)/(s?i-a:a-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:o,w:s,d:i,D:f,h:r,m:n,s:e,ms:t,Q:a}[h]||String(h||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},y=\"en\",M={};M[y]=d;var m=function(t){return t instanceof S},D=function(t,e,n){var r;if(!t)return y;if(\"string\"==typeof t)M[t]&&(r=t),e&&(M[t]=e,r=t);else{var i=t.name;M[i]=t,r=i}return!n&&r&&(y=r),r||!n&&y},v=function(t,e){if(m(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new S(n)},g=l;g.l=D,g.i=m,g.w=function(t,e){return v(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var S=function(){function d(t){this.$L=D(t.locale,null,!0),this.parse(t)}var $=d.prototype;return $.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(g.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match(h);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},$.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},$.$utils=function(){return g},$.isValid=function(){return!(\"Invalid Date\"===this.$d.toString())},$.isSame=function(t,e){var n=v(t);return this.startOf(e)<=n&&n<=this.endOf(e)},$.isAfter=function(t,e){return v(t)<this.startOf(e)},$.isBefore=function(t,e){return this.endOf(e)<v(t)},$.$g=function(t,e,n){return g.u(t)?this[e]:this.set(n,t)},$.unix=function(){return Math.floor(this.valueOf()/1e3)},$.valueOf=function(){return this.$d.getTime()},$.startOf=function(t,a){var h=this,c=!!g.u(a)||a,d=g.p(t),$=function(t,e){var n=g.w(h.$u?Date.UTC(h.$y,e,t):new Date(h.$y,e,t),h);return c?n:n.endOf(i)},l=function(t,e){return g.w(h.toDate()[t].apply(h.toDate(\"s\"),(c?[0,0,0,0]:[23,59,59,999]).slice(e)),h)},y=this.$W,M=this.$M,m=this.$D,D=\"set\"+(this.$u?\"UTC\":\"\");switch(d){case o:return c?$(1,0):$(31,11);case u:return c?$(1,M):$(0,M+1);case s:var v=this.$locale().weekStart||0,S=(y<v?y+7:y)-v;return $(c?m-S:m+(6-S),M);case i:case f:return l(D+\"Hours\",0);case r:return l(D+\"Minutes\",1);case n:return l(D+\"Seconds\",2);case e:return l(D+\"Milliseconds\",3);default:return this.clone()}},$.endOf=function(t){return this.startOf(t,!1)},$.$set=function(s,a){var h,c=g.p(s),d=\"set\"+(this.$u?\"UTC\":\"\"),$=(h={},h[i]=d+\"Date\",h[f]=d+\"Date\",h[u]=d+\"Month\",h[o]=d+\"FullYear\",h[r]=d+\"Hours\",h[n]=d+\"Minutes\",h[e]=d+\"Seconds\",h[t]=d+\"Milliseconds\",h)[c],l=c===i?this.$D+(a-this.$W):a;if(c===u||c===o){var y=this.clone().set(f,1);y.$d[$](l),y.init(),this.$d=y.set(f,Math.min(this.$D,y.daysInMonth())).$d}else $&&this.$d[$](l);return this.init(),this},$.set=function(t,e){return this.clone().$set(t,e)},$.get=function(t){return this[g.p(t)]()},$.add=function(t,a){var f,h=this;t=Number(t);var c=g.p(a),d=function(e){var n=v(h);return g.w(n.date(n.date()+Math.round(e*t)),h)};if(c===u)return this.set(u,this.$M+t);if(c===o)return this.set(o,this.$y+t);if(c===i)return d(1);if(c===s)return d(7);var $=(f={},f[n]=6e4,f[r]=36e5,f[e]=1e3,f)[c]||1,l=this.$d.getTime()+t*$;return g.w(l,this)},$.subtract=function(t,e){return this.add(-1*t,e)},$.format=function(t){var e=this;if(!this.isValid())return\"Invalid Date\";var n=t||\"YYYY-MM-DDTHH:mm:ssZ\",r=g.z(this),i=this.$locale(),s=this.$H,u=this.$m,a=this.$M,o=i.weekdays,f=i.months,h=function(t,r,i,s){return t&&(t[r]||t(e,n))||i[r].substr(0,s)},d=function(t){return g.s(s%12||12,t,\"0\")},$=i.meridiem||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r},l={YY:String(this.$y).slice(-2),YYYY:this.$y,M:a+1,MM:g.s(a+1,2,\"0\"),MMM:h(i.monthsShort,a,f,3),MMMM:h(f,a),D:this.$D,DD:g.s(this.$D,2,\"0\"),d:String(this.$W),dd:h(i.weekdaysMin,this.$W,o,2),ddd:h(i.weekdaysShort,this.$W,o,3),dddd:o[this.$W],H:String(s),HH:g.s(s,2,\"0\"),h:d(1),hh:d(2),a:$(s,u,!0),A:$(s,u,!1),m:String(u),mm:g.s(u,2,\"0\"),s:String(this.$s),ss:g.s(this.$s,2,\"0\"),SSS:g.s(this.$ms,3,\"0\"),Z:r};return n.replace(c,function(t,e){return e||l[t]||r.replace(\":\",\"\")})},$.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},$.diff=function(t,f,h){var c,d=g.p(f),$=v(t),l=6e4*($.utcOffset()-this.utcOffset()),y=this-$,M=g.m(this,$);return M=(c={},c[o]=M/12,c[u]=M,c[a]=M/3,c[s]=(y-l)/6048e5,c[i]=(y-l)/864e5,c[r]=y/36e5,c[n]=y/6e4,c[e]=y/1e3,c)[d]||y,h?M:g.a(M)},$.daysInMonth=function(){return this.endOf(u).$D},$.$locale=function(){return M[this.$L]},$.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=D(t,e,!0);return r&&(n.$L=r),n},$.clone=function(){return g.w(this.$d,this)},$.toDate=function(){return new Date(this.valueOf())},$.toJSON=function(){return this.isValid()?this.toISOString():null},$.toISOString=function(){return this.$d.toISOString()},$.toString=function(){return this.$d.toUTCString()},d}(),p=S.prototype;return v.prototype=p,[[\"$ms\",t],[\"$s\",e],[\"$m\",n],[\"$H\",r],[\"$W\",i],[\"$M\",u],[\"$y\",o],[\"$D\",f]].forEach(function(t){p[t[1]]=function(e){return this.$g(e,t[0],t[1])}}),v.extend=function(t,e){return t.$i||(t(e,S,v),t.$i=!0),v},v.locale=D,v.isDayjs=m,v.unix=function(t){return v(1e3*t)},v.en=M[y],v.Ls=M,v.p={},v});\n", "import { hasChinaword } from './validate';\r\nimport dayjs from 'dayjs'\r\n\r\nfunction isdatetime(s) {\r\n    if (s == null || s.toString().length < 5) {\r\n        return false;\r\n    }\r\n    else if(checkDateTime(s)){\r\n        return true;\r\n    }\r\n    else {\r\n        return false;\r\n    }\r\n\r\n    function checkDateTime(str){\r\n        var reg1 = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(\\s(\\d{1,2}):(\\d{1,2})(:(\\d{1,2}))?)?$/;\r\n        var reg2 = /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})(\\s(\\d{1,2}):(\\d{1,2})(:(\\d{1,2}))?)?$/;\r\n\r\n        if(!reg1.test(str) && !reg2.test(str)){\r\n            return false;\r\n        }\r\n\r\n        var year = RegExp.$1,\r\n            month = RegExp.$2,\r\n            day = RegExp.$3;\r\n\r\n        if(year < 1900){\r\n            return false;\r\n        }\r\n\r\n        if(month > 12){\r\n            return false;\r\n        }\r\n\r\n        if(day > 31){\r\n            return false;\r\n        }\r\n\r\n        if(month == 2){\r\n            if(new Date(year, 1, 29).getDate() == 29 && day > 29){\r\n                return false;\r\n            }\r\n            else if(new Date(year, 1, 29).getDate() != 29 && day > 28){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n\r\nfunction diff(now, then) {\r\n    return dayjs(now).diff(dayjs(then));\r\n}\r\n\r\nfunction isdatatypemulti(s) {\r\n    let type = {};\r\n\r\n    if (isdatetime(s)) {\r\n        type[\"date\"] = true;\r\n    }\r\n\r\n    if (!isNaN(parseFloat(s)) && !hasChinaword(s)) {\r\n        type[\"num\"] = true;\r\n    }\r\n\r\n    return type;\r\n}\r\n\r\nfunction isdatatype(s) {\r\n    let type = \"string\";\r\n\r\n    if (isdatetime(s)) {\r\n        type = \"date\";\r\n    }\r\n    else if (!isNaN(parseFloat(s)) && !hasChinaword(s)) {\r\n        type = \"num\";\r\n    }\r\n\r\n    return type;\r\n}\r\n\r\nexport {\r\n    isdatetime,\r\n    diff,\r\n    isdatatypemulti,\r\n    isdatatype,\r\n}\r\n", "/*! @preserve\n * numeral.js\n * version : 2.0.6\n * author : Adam Draper\n * license : MIT\n * http://adamwdraper.github.com/Numeral-js/\n */\n\n(function (global, factory) {\n    if (typeof define === 'function' && define.amd) {\n        define(factory);\n    } else if (typeof module === 'object' && module.exports) {\n        module.exports = factory();\n    } else {\n        global.numeral = factory();\n    }\n}(this, function () {\n    /************************************\n        Variables\n    ************************************/\n\n    var numeral,\n        _,\n        VERSION = '2.0.6',\n        formats = {},\n        locales = {},\n        defaults = {\n            currentLocale: 'en',\n            zeroFormat: null,\n            nullFormat: null,\n            defaultFormat: '0,0',\n            scalePercentBy100: true\n        },\n        options = {\n            currentLocale: defaults.currentLocale,\n            zeroFormat: defaults.zeroFormat,\n            nullFormat: defaults.nullFormat,\n            defaultFormat: defaults.defaultFormat,\n            scalePercentBy100: defaults.scalePercentBy100\n        };\n\n\n    /************************************\n        Constructors\n    ************************************/\n\n    // Numeral prototype object\n    function Numeral(input, number) {\n        this._input = input;\n\n        this._value = number;\n    }\n\n    numeral = function(input) {\n        var value,\n            kind,\n            unformatFunction,\n            regexp;\n\n        if (numeral.isNumeral(input)) {\n            value = input.value();\n        } else if (input === 0 || typeof input === 'undefined') {\n            value = 0;\n        } else if (input === null || _.isNaN(input)) {\n            value = null;\n        } else if (typeof input === 'string') {\n            if (options.zeroFormat && input === options.zeroFormat) {\n                value = 0;\n            } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) {\n                value = null;\n            } else {\n                for (kind in formats) {\n                    regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat;\n\n                    if (regexp && input.match(regexp)) {\n                        unformatFunction = formats[kind].unformat;\n\n                        break;\n                    }\n                }\n\n                unformatFunction = unformatFunction || numeral._.stringToNumber;\n\n                value = unformatFunction(input);\n            }\n        } else {\n            value = Number(input)|| null;\n        }\n\n        return new Numeral(input, value);\n    };\n\n    // version number\n    numeral.version = VERSION;\n\n    // compare numeral object\n    numeral.isNumeral = function(obj) {\n        return obj instanceof Numeral;\n    };\n\n    // helper functions\n    numeral._ = _ = {\n        // formats numbers separators, decimals places, signs, abbreviations\n        numberToFormat: function(value, format, roundingFunction) {\n            var locale = locales[numeral.options.currentLocale],\n                negP = false,\n                optDec = false,\n                leadingCount = 0,\n                abbr = '',\n                trillion = 1000000000000,\n                billion = 1000000000,\n                million = 1000000,\n                thousand = 1000,\n                decimal = '',\n                neg = false,\n                abbrForce, // force abbreviation\n                abs,\n                min,\n                max,\n                power,\n                int,\n                precision,\n                signed,\n                thousands,\n                output;\n\n            // make sure we never format a null value\n            value = value || 0;\n\n            abs = Math.abs(value);\n\n            // see if we should use parentheses for negative number or if we should prefix with a sign\n            // if both are present we default to parentheses\n            if (numeral._.includes(format, '(')) {\n                negP = true;\n                format = format.replace(/[\\(|\\)]/g, '');\n            } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) {\n                signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1;\n                format = format.replace(/[\\+|\\-]/g, '');\n            }\n\n            // see if abbreviation is wanted\n            if (numeral._.includes(format, 'a')) {\n                abbrForce = format.match(/a(k|m|b|t)?/);\n\n                abbrForce = abbrForce ? abbrForce[1] : false;\n\n                // check for space before abbreviation\n                if (numeral._.includes(format, ' a')) {\n                    abbr = ' ';\n                }\n\n                format = format.replace(new RegExp(abbr + 'a[kmbt]?'), '');\n\n                if (abs >= trillion && !abbrForce || abbrForce === 't') {\n                    // trillion\n                    abbr += locale.abbreviations.trillion;\n                    value = value / trillion;\n                } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') {\n                    // billion\n                    abbr += locale.abbreviations.billion;\n                    value = value / billion;\n                } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') {\n                    // million\n                    abbr += locale.abbreviations.million;\n                    value = value / million;\n                } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') {\n                    // thousand\n                    abbr += locale.abbreviations.thousand;\n                    value = value / thousand;\n                }\n            }\n\n            // check for optional decimals\n            if (numeral._.includes(format, '[.]')) {\n                optDec = true;\n                format = format.replace('[.]', '.');\n            }\n\n            // break number and format\n            int = value.toString().split('.')[0];\n            precision = format.split('.')[1];\n            thousands = format.indexOf(',');\n            leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length;\n\n            if (precision) {\n                if (numeral._.includes(precision, '[')) {\n                    precision = precision.replace(']', '');\n                    precision = precision.split('[');\n                    decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);\n                } else {\n                    decimal = numeral._.toFixed(value, precision.length, roundingFunction);\n                }\n\n                int = decimal.split('.')[0];\n\n                if (numeral._.includes(decimal, '.')) {\n                    decimal = locale.delimiters.decimal + decimal.split('.')[1];\n                } else {\n                    decimal = '';\n                }\n\n                if (optDec && Number(decimal.slice(1)) === 0) {\n                    decimal = '';\n                }\n            } else {\n                int = numeral._.toFixed(value, 0, roundingFunction);\n            }\n\n            // check abbreviation again after rounding\n            if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) {\n                int = String(Number(int) / 1000);\n\n                switch (abbr) {\n                    case locale.abbreviations.thousand:\n                        abbr = locale.abbreviations.million;\n                        break;\n                    case locale.abbreviations.million:\n                        abbr = locale.abbreviations.billion;\n                        break;\n                    case locale.abbreviations.billion:\n                        abbr = locale.abbreviations.trillion;\n                        break;\n                }\n            }\n\n\n            // format number\n            if (numeral._.includes(int, '-')) {\n                int = int.slice(1);\n                neg = true;\n            }\n\n            if (int.length < leadingCount) {\n                for (var i = leadingCount - int.length; i > 0; i--) {\n                    int = '0' + int;\n                }\n            }\n\n            if (thousands > -1) {\n                int = int.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + locale.delimiters.thousands);\n            }\n\n            if (format.indexOf('.') === 0) {\n                int = '';\n            }\n\n            output = int + decimal + (abbr ? abbr : '');\n\n            if (negP) {\n                output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : '');\n            } else {\n                if (signed >= 0) {\n                    output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+');\n                } else if (neg) {\n                    output = '-' + output;\n                }\n            }\n\n            return output;\n        },\n        // unformats numbers separators, decimals places, signs, abbreviations\n        stringToNumber: function(string) {\n            var locale = locales[options.currentLocale],\n                stringOriginal = string,\n                abbreviations = {\n                    thousand: 3,\n                    million: 6,\n                    billion: 9,\n                    trillion: 12\n                },\n                abbreviation,\n                value,\n                i,\n                regexp;\n\n            if (options.zeroFormat && string === options.zeroFormat) {\n                value = 0;\n            } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) {\n                value = null;\n            } else {\n                value = 1;\n\n                if (locale.delimiters.decimal !== '.') {\n                    string = string.replace(/\\./g, '').replace(locale.delimiters.decimal, '.');\n                }\n\n                for (abbreviation in abbreviations) {\n                    regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\\\)|(\\\\' + locale.currency.symbol + ')?(?:\\\\))?)?$');\n\n                    if (stringOriginal.match(regexp)) {\n                        value *= Math.pow(10, abbreviations[abbreviation]);\n                        break;\n                    }\n                }\n\n                // check for negative number\n                value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1;\n\n                // remove non numbers\n                string = string.replace(/[^0-9\\.]+/g, '');\n\n                value *= Number(string);\n            }\n\n            return value;\n        },\n        isNaN: function(value) {\n            return typeof value === 'number' && isNaN(value);\n        },\n        includes: function(string, search) {\n            return string.indexOf(search) !== -1;\n        },\n        insert: function(string, subString, start) {\n            return string.slice(0, start) + subString + string.slice(start);\n        },\n        reduce: function(array, callback /*, initialValue*/) {\n            if (this === null) {\n                throw new TypeError('Array.prototype.reduce called on null or undefined');\n            }\n\n            if (typeof callback !== 'function') {\n                throw new TypeError(callback + ' is not a function');\n            }\n\n            var t = Object(array),\n                len = t.length >>> 0,\n                k = 0,\n                value;\n\n            if (arguments.length === 3) {\n                value = arguments[2];\n            } else {\n                while (k < len && !(k in t)) {\n                    k++;\n                }\n\n                if (k >= len) {\n                    throw new TypeError('Reduce of empty array with no initial value');\n                }\n\n                value = t[k++];\n            }\n            for (; k < len; k++) {\n                if (k in t) {\n                    value = callback(value, t[k], k, t);\n                }\n            }\n            return value;\n        },\n        /**\n         * Computes the multiplier necessary to make x >= 1,\n         * effectively eliminating miscalculations caused by\n         * finite precision.\n         */\n        multiplier: function (x) {\n            var parts = x.toString().split('.');\n\n            return parts.length < 2 ? 1 : Math.pow(10, parts[1].length);\n        },\n        /**\n         * Given a variable number of arguments, returns the maximum\n         * multiplier that must be used to normalize an operation involving\n         * all of them.\n         */\n        correctionFactor: function () {\n            var args = Array.prototype.slice.call(arguments);\n\n            return args.reduce(function(accum, next) {\n                var mn = _.multiplier(next);\n                return accum > mn ? accum : mn;\n            }, 1);\n        },\n        /**\n         * Implementation of toFixed() that treats floats more like decimals\n         *\n         * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\n         * problems for accounting- and finance-related software.\n         */\n        toFixed: function(value, maxDecimals, roundingFunction, optionals) {\n            var splitValue = value.toString().split('.'),\n                minDecimals = maxDecimals - (optionals || 0),\n                boundedPrecision,\n                optionalsRegExp,\n                power,\n                output;\n\n            // Use the smallest precision value possible to avoid errors from floating point representation\n            if (splitValue.length === 2) {\n              boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals);\n            } else {\n              boundedPrecision = minDecimals;\n            }\n\n            power = Math.pow(10, boundedPrecision);\n\n            // Multiply up by precision, round accurately, then divide and use native toFixed():\n            output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision);\n\n            if (optionals > maxDecimals - boundedPrecision) {\n                optionalsRegExp = new RegExp('\\\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$');\n                output = output.replace(optionalsRegExp, '');\n            }\n\n            return output;\n        }\n    };\n\n    // avaliable options\n    numeral.options = options;\n\n    // avaliable formats\n    numeral.formats = formats;\n\n    // avaliable formats\n    numeral.locales = locales;\n\n    // This function sets the current locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    numeral.locale = function(key) {\n        if (key) {\n            options.currentLocale = key.toLowerCase();\n        }\n\n        return options.currentLocale;\n    };\n\n    // This function provides access to the loaded locale data.  If\n    // no arguments are passed in, it will simply return the current\n    // global locale object.\n    numeral.localeData = function(key) {\n        if (!key) {\n            return locales[options.currentLocale];\n        }\n\n        key = key.toLowerCase();\n\n        if (!locales[key]) {\n            throw new Error('Unknown locale : ' + key);\n        }\n\n        return locales[key];\n    };\n\n    numeral.reset = function() {\n        for (var property in defaults) {\n            options[property] = defaults[property];\n        }\n    };\n\n    numeral.zeroFormat = function(format) {\n        options.zeroFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numeral.nullFormat = function (format) {\n        options.nullFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numeral.defaultFormat = function(format) {\n        options.defaultFormat = typeof(format) === 'string' ? format : '0.0';\n    };\n\n    numeral.register = function(type, name, format) {\n        name = name.toLowerCase();\n\n        if (this[type + 's'][name]) {\n            throw new TypeError(name + ' ' + type + ' already registered.');\n        }\n\n        this[type + 's'][name] = format;\n\n        return format;\n    };\n\n\n    numeral.validate = function(val, culture) {\n        var _decimalSep,\n            _thousandSep,\n            _currSymbol,\n            _valArray,\n            _abbrObj,\n            _thousandRegEx,\n            localeData,\n            temp;\n\n        //coerce val to string\n        if (typeof val !== 'string') {\n            val += '';\n\n            if (console.warn) {\n                console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val);\n            }\n        }\n\n        //trim whitespaces from either sides\n        val = val.trim();\n\n        //if val is just digits return true\n        if (!!val.match(/^\\d+$/)) {\n            return true;\n        }\n\n        //if val is empty return false\n        if (val === '') {\n            return false;\n        }\n\n        //get the decimal and thousands separator from numeral.localeData\n        try {\n            //check if the culture is understood by numeral. if not, default it to current locale\n            localeData = numeral.localeData(culture);\n        } catch (e) {\n            localeData = numeral.localeData(numeral.locale());\n        }\n\n        //setup the delimiters and currency symbol based on culture/locale\n        _currSymbol = localeData.currency.symbol;\n        _abbrObj = localeData.abbreviations;\n        _decimalSep = localeData.delimiters.decimal;\n        if (localeData.delimiters.thousands === '.') {\n            _thousandSep = '\\\\.';\n        } else {\n            _thousandSep = localeData.delimiters.thousands;\n        }\n\n        // validating currency symbol\n        temp = val.match(/^[^\\d]+/);\n        if (temp !== null) {\n            val = val.substr(1);\n            if (temp[0] !== _currSymbol) {\n                return false;\n            }\n        }\n\n        //validating abbreviation symbol\n        temp = val.match(/[^\\d]+$/);\n        if (temp !== null) {\n            val = val.slice(0, -1);\n            if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) {\n                return false;\n            }\n        }\n\n        _thousandRegEx = new RegExp(_thousandSep + '{2}');\n\n        if (!val.match(/[^\\d.,]/g)) {\n            _valArray = val.split(_decimalSep);\n            if (_valArray.length > 2) {\n                return false;\n            } else {\n                if (_valArray.length < 2) {\n                    return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx));\n                } else {\n                    if (_valArray[0].length === 1) {\n                        return ( !! _valArray[0].match(/^\\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\\d+$/));\n                    } else {\n                        return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\\d+$/));\n                    }\n                }\n            }\n        }\n\n        return false;\n    };\n\n\n    /************************************\n        Numeral Prototype\n    ************************************/\n\n    numeral.fn = Numeral.prototype = {\n        clone: function() {\n            return numeral(this);\n        },\n        format: function(inputString, roundingFunction) {\n            var value = this._value,\n                format = inputString || options.defaultFormat,\n                kind,\n                output,\n                formatFunction;\n\n            // make sure we have a roundingFunction\n            roundingFunction = roundingFunction || Math.round;\n\n            // format based on value\n            if (value === 0 && options.zeroFormat !== null) {\n                output = options.zeroFormat;\n            } else if (value === null && options.nullFormat !== null) {\n                output = options.nullFormat;\n            } else {\n                for (kind in formats) {\n                    if (format.match(formats[kind].regexps.format)) {\n                        formatFunction = formats[kind].format;\n\n                        break;\n                    }\n                }\n\n                formatFunction = formatFunction || numeral._.numberToFormat;\n\n                output = formatFunction(value, format, roundingFunction);\n            }\n\n            return output;\n        },\n        value: function() {\n            return this._value;\n        },\n        input: function() {\n            return this._input;\n        },\n        set: function(value) {\n            this._value = Number(value);\n\n            return this;\n        },\n        add: function(value) {\n            var corrFactor = _.correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr, currI, O) {\n                return accum + Math.round(corrFactor * curr);\n            }\n\n            this._value = _.reduce([this._value, value], cback, 0) / corrFactor;\n\n            return this;\n        },\n        subtract: function(value) {\n            var corrFactor = _.correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr, currI, O) {\n                return accum - Math.round(corrFactor * curr);\n            }\n\n            this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor;\n\n            return this;\n        },\n        multiply: function(value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = _.correctionFactor(accum, curr);\n                return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor);\n            }\n\n            this._value = _.reduce([this._value, value], cback, 1);\n\n            return this;\n        },\n        divide: function(value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = _.correctionFactor(accum, curr);\n                return Math.round(accum * corrFactor) / Math.round(curr * corrFactor);\n            }\n\n            this._value = _.reduce([this._value, value], cback);\n\n            return this;\n        },\n        difference: function(value) {\n            return Math.abs(numeral(this._value).subtract(value).value());\n        }\n    };\n\n    /************************************\n        Default Locale && Format\n    ************************************/\n\n    numeral.register('locale', 'en', {\n        delimiters: {\n            thousands: ',',\n            decimal: '.'\n        },\n        abbreviations: {\n            thousand: 'k',\n            million: 'm',\n            billion: 'b',\n            trillion: 't'\n        },\n        ordinal: function(number) {\n            var b = number % 10;\n            return (~~(number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n        },\n        currency: {\n            symbol: '$'\n        }\n    });\n\n    \n\n(function() {\n        numeral.register('format', 'bps', {\n            regexps: {\n                format: /(BPS)/,\n                unformat: /(BPS)/\n            },\n            format: function(value, format, roundingFunction) {\n                var space = numeral._.includes(format, ' BPS') ? ' ' : '',\n                    output;\n\n                value = value * 10000;\n\n                // check for space before BPS\n                format = format.replace(/\\s?BPS/, '');\n\n                output = numeral._.numberToFormat(value, format, roundingFunction);\n\n                if (numeral._.includes(output, ')')) {\n                    output = output.split('');\n\n                    output.splice(-1, 0, space + 'BPS');\n\n                    output = output.join('');\n                } else {\n                    output = output + space + 'BPS';\n                }\n\n                return output;\n            },\n            unformat: function(string) {\n                return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15);\n            }\n        });\n})();\n\n\n(function() {\n        var decimal = {\n            base: 1000,\n            suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n        },\n        binary = {\n            base: 1024,\n            suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\n        };\n\n    var allSuffixes =  decimal.suffixes.concat(binary.suffixes.filter(function (item) {\n            return decimal.suffixes.indexOf(item) < 0;\n        }));\n        var unformatRegex = allSuffixes.join('|');\n        // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp)\n        unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')';\n\n    numeral.register('format', 'bytes', {\n        regexps: {\n            format: /([0\\s]i?b)/,\n            unformat: new RegExp(unformatRegex)\n        },\n        format: function(value, format, roundingFunction) {\n            var output,\n                bytes = numeral._.includes(format, 'ib') ? binary : decimal,\n                suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '',\n                power,\n                min,\n                max;\n\n            // check for space before\n            format = format.replace(/\\s?i?b/, '');\n\n            for (power = 0; power <= bytes.suffixes.length; power++) {\n                min = Math.pow(bytes.base, power);\n                max = Math.pow(bytes.base, power + 1);\n\n                if (value === null || value === 0 || value >= min && value < max) {\n                    suffix += bytes.suffixes[power];\n\n                    if (min > 0) {\n                        value = value / min;\n                    }\n\n                    break;\n                }\n            }\n\n            output = numeral._.numberToFormat(value, format, roundingFunction);\n\n            return output + suffix;\n        },\n        unformat: function(string) {\n            var value = numeral._.stringToNumber(string),\n                power,\n                bytesMultiplier;\n\n            if (value) {\n                for (power = decimal.suffixes.length - 1; power >= 0; power--) {\n                    if (numeral._.includes(string, decimal.suffixes[power])) {\n                        bytesMultiplier = Math.pow(decimal.base, power);\n\n                        break;\n                    }\n\n                    if (numeral._.includes(string, binary.suffixes[power])) {\n                        bytesMultiplier = Math.pow(binary.base, power);\n\n                        break;\n                    }\n                }\n\n                value *= (bytesMultiplier || 1);\n            }\n\n            return value;\n        }\n    });\n})();\n\n\n(function() {\n        numeral.register('format', 'currency', {\n        regexps: {\n            format: /(\\$)/\n        },\n        format: function(value, format, roundingFunction) {\n            var locale = numeral.locales[numeral.options.currentLocale],\n                symbols = {\n                    before: format.match(/^([\\+|\\-|\\(|\\s|\\$]*)/)[0],\n                    after: format.match(/([\\+|\\-|\\)|\\s|\\$]*)$/)[0]\n                },\n                output,\n                symbol,\n                i;\n\n            // strip format of spaces and $\n            format = format.replace(/\\s?\\$\\s?/, '');\n\n            // format the number\n            output = numeral._.numberToFormat(value, format, roundingFunction);\n\n            // update the before and after based on value\n            if (value >= 0) {\n                symbols.before = symbols.before.replace(/[\\-\\(]/, '');\n                symbols.after = symbols.after.replace(/[\\-\\)]/, '');\n            } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) {\n                symbols.before = '-' + symbols.before;\n            }\n\n            // loop through each before symbol\n            for (i = 0; i < symbols.before.length; i++) {\n                symbol = symbols.before[i];\n\n                switch (symbol) {\n                    case '$':\n                        output = numeral._.insert(output, locale.currency.symbol, i);\n                        break;\n                    case ' ':\n                        output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1);\n                        break;\n                }\n            }\n\n            // loop through each after symbol\n            for (i = symbols.after.length - 1; i >= 0; i--) {\n                symbol = symbols.after[i];\n\n                switch (symbol) {\n                    case '$':\n                        output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i)));\n                        break;\n                    case ' ':\n                        output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1));\n                        break;\n                }\n            }\n\n\n            return output;\n        }\n    });\n})();\n\n\n(function() {\n        numeral.register('format', 'exponential', {\n        regexps: {\n            format: /(e\\+|e-)/,\n            unformat: /(e\\+|e-)/\n        },\n        format: function(value, format, roundingFunction) {\n            var output,\n                exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0',\n                parts = exponential.split('e');\n\n            format = format.replace(/e[\\+|\\-]{1}0/, '');\n\n            output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction);\n\n            return output + 'e' + parts[1];\n        },\n        unformat: function(string) {\n            var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'),\n                value = Number(parts[0]),\n                power = Number(parts[1]);\n\n            power = numeral._.includes(string, 'e-') ? power *= -1 : power;\n\n            function cback(accum, curr, currI, O) {\n                var corrFactor = numeral._.correctionFactor(accum, curr),\n                    num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor);\n                return num;\n            }\n\n            return numeral._.reduce([value, Math.pow(10, power)], cback, 1);\n        }\n    });\n})();\n\n\n(function() {\n        numeral.register('format', 'ordinal', {\n        regexps: {\n            format: /(o)/\n        },\n        format: function(value, format, roundingFunction) {\n            var locale = numeral.locales[numeral.options.currentLocale],\n                output,\n                ordinal = numeral._.includes(format, ' o') ? ' ' : '';\n\n            // check for space before\n            format = format.replace(/\\s?o/, '');\n\n            ordinal += locale.ordinal(value);\n\n            output = numeral._.numberToFormat(value, format, roundingFunction);\n\n            return output + ordinal;\n        }\n    });\n})();\n\n\n(function() {\n        numeral.register('format', 'percentage', {\n        regexps: {\n            format: /(%)/,\n            unformat: /(%)/\n        },\n        format: function(value, format, roundingFunction) {\n            var space = numeral._.includes(format, ' %') ? ' ' : '',\n                output;\n\n            if (numeral.options.scalePercentBy100) {\n                value = value * 100;\n            }\n\n            // check for space before %\n            format = format.replace(/\\s?\\%/, '');\n\n            output = numeral._.numberToFormat(value, format, roundingFunction);\n\n            if (numeral._.includes(output, ')')) {\n                output = output.split('');\n\n                output.splice(-1, 0, space + '%');\n\n                output = output.join('');\n            } else {\n                output = output + space + '%';\n            }\n\n            return output;\n        },\n        unformat: function(string) {\n            var number = numeral._.stringToNumber(string);\n            if (numeral.options.scalePercentBy100) {\n                return number * 0.01;\n            }\n            return number;\n        }\n    });\n})();\n\n\n(function() {\n        numeral.register('format', 'time', {\n        regexps: {\n            format: /(:)/,\n            unformat: /(:)/\n        },\n        format: function(value, format, roundingFunction) {\n            var hours = Math.floor(value / 60 / 60),\n                minutes = Math.floor((value - (hours * 60 * 60)) / 60),\n                seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60));\n\n            return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds);\n        },\n        unformat: function(string) {\n            var timeArray = string.split(':'),\n                seconds = 0;\n\n            // turn hours and minutes into seconds and add them all up\n            if (timeArray.length === 3) {\n                // hours\n                seconds = seconds + (Number(timeArray[0]) * 60 * 60);\n                // minutes\n                seconds = seconds + (Number(timeArray[1]) * 60);\n                // seconds\n                seconds = seconds + Number(timeArray[2]);\n            } else if (timeArray.length === 2) {\n                // minutes\n                seconds = seconds + (Number(timeArray[0]) * 60);\n                // seconds\n                seconds = seconds + Number(timeArray[1]);\n            }\n            return Number(seconds);\n        }\n    });\n})();\n\nreturn numeral;\n}));\n", "import { isRealNum, valueIsError } from './validate';\r\nimport { isdatetime } from './datecontroll';\r\nimport { getcellvalue } from './getdata';\r\nimport numeral from 'numeral';\r\n\r\nvar SSF = ({});\r\nvar make_ssf = function make_ssf(SSF) {\r\n    SSF.version = '0.11.2';\r\n\r\n    function _strrev(x) {\r\n        var o = \"\",\r\n            i = x.length - 1;\r\n        while (i >= 0) o += x.charAt(i--);\r\n        return o;\r\n    }\r\n\r\n    function fill(c, l) {\r\n        var o = \"\";\r\n        while (o.length < l) o += c;\r\n        return o;\r\n    }\r\n\r\n    function pad0(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n\r\n    function pad_(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill(' ', d - t.length) + t;\r\n    }\r\n\r\n    function rpad_(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : t + fill(' ', d - t.length);\r\n    }\r\n\r\n    function pad0r1(v, d) {\r\n        var t = \"\" + Math.round(v);\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n\r\n    function pad0r2(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n    var p2_32 = Math.pow(2, 32);\r\n\r\n    function pad0r(v, d) {\r\n        if (v > p2_32 || v < -p2_32) return pad0r1(v, d);\r\n        var i = Math.round(v);\r\n        return pad0r2(i, d);\r\n    }\r\n\r\n    function isgeneral(s, i) {\r\n        i = i || 0;\r\n        return s.length >= 7 + i && (s.charCodeAt(i) | 32) === 103 && (s.charCodeAt(i + 1) | 32) === 101 && (s.charCodeAt(i + 2) | 32) === 110 && (s.charCodeAt(i + 3) | 32) === 101 && (s.charCodeAt(i + 4) | 32) === 114 && (s.charCodeAt(i + 5) | 32) === 97 && (s.charCodeAt(i + 6) | 32) === 108;\r\n    }\r\n    var days = [\r\n        ['Sun', 'Sunday'],\r\n        ['Mon', 'Monday'],\r\n        ['Tue', 'Tuesday'],\r\n        ['Wed', 'Wednesday'],\r\n        ['Thu', 'Thursday'],\r\n        ['Fri', 'Friday'],\r\n        ['Sat', 'Saturday']\r\n    ];\r\n    var months = [\r\n        ['J', 'Jan', 'January'],\r\n        ['F', 'Feb', 'February'],\r\n        ['M', 'Mar', 'March'],\r\n        ['A', 'Apr', 'April'],\r\n        ['M', 'May', 'May'],\r\n        ['J', 'Jun', 'June'],\r\n        ['J', 'Jul', 'July'],\r\n        ['A', 'Aug', 'August'],\r\n        ['S', 'Sep', 'September'],\r\n        ['O', 'Oct', 'October'],\r\n        ['N', 'Nov', 'November'],\r\n        ['D', 'Dec', 'December']\r\n    ];\r\n\r\n    function init_table(t) {\r\n        t[0] = 'General';\r\n        t[1] = '0';\r\n        t[2] = '0.00';\r\n        t[3] = '#,##0';\r\n        t[4] = '#,##0.00';\r\n        t[9] = '0%';\r\n        t[10] = '0.00%';\r\n        t[11] = '0.00E+00';\r\n        t[12] = '# ?/?';\r\n        t[13] = '# ??/??';\r\n        t[14] = 'm/d/yy';\r\n        t[15] = 'd-mmm-yy';\r\n        t[16] = 'd-mmm';\r\n        t[17] = 'mmm-yy';\r\n        t[18] = 'h:mm AM/PM';\r\n        t[19] = 'h:mm:ss AM/PM';\r\n        t[20] = 'h:mm';\r\n        t[21] = 'h:mm:ss';\r\n        t[22] = 'm/d/yy h:mm';\r\n        t[37] = '#,##0 ;(#,##0)';\r\n        t[38] = '#,##0 ;[Red](#,##0)';\r\n        t[39] = '#,##0.00;(#,##0.00)';\r\n        t[40] = '#,##0.00;[Red](#,##0.00)';\r\n        t[45] = 'mm:ss';\r\n        t[46] = '[h]:mm:ss';\r\n        t[47] = 'mmss.0';\r\n        t[48] = '##0.0E+0';\r\n        t[49] = '@';\r\n        t[56] = '\"\u4E0A\u5348/\u4E0B\u5348 \"hh\"\u6642\"mm\"\u5206\"ss\"\u79D2 \"';\r\n        t[65535] = 'General';\r\n    }\r\n    var table_fmt = {};\r\n    init_table(table_fmt);\r\n    /* Defaults determined by systematically testing in Excel 2019 */\r\n    /* These formats appear to default to other formats in the table */\r\n    var default_map = [];\r\n    var defi = 0;\r\n    //  5 -> 37 ...  8 -> 40\r\n    for (defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;\r\n    // 23 ->  0 ... 26 ->  0\r\n    for (defi = 23; defi <= 26; ++defi) default_map[defi] = 0;\r\n    // 27 -> 14 ... 31 -> 14\r\n    for (defi = 27; defi <= 31; ++defi) default_map[defi] = 14;\r\n    // 50 -> 14 ... 58 -> 14\r\n    for (defi = 50; defi <= 58; ++defi) default_map[defi] = 14;\r\n    // 59 ->  1 ... 62 ->  4\r\n    for (defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;\r\n    // 67 ->  9 ... 68 -> 10\r\n    for (defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;\r\n    // 72 -> 14 ... 75 -> 17\r\n    for (defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;\r\n    // 69 -> 12 ... 71 -> 14\r\n    for (defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;\r\n    // 76 -> 20 ... 78 -> 22\r\n    for (defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;\r\n    // 79 -> 45 ... 81 -> 47\r\n    for (defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;\r\n    // 82 ->  0 ... 65536 -> 0 (omitted)\r\n    /* These formats technically refer to Accounting formats with no equivalent */\r\n    var default_str = [];\r\n    //  5 -- Currency,   0 decimal, black negative\r\n    default_str[5] = default_str[63] = '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)';\r\n    //  6 -- Currency,   0 decimal, red   negative\r\n    default_str[6] = default_str[64] = '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)';\r\n    //  7 -- Currency,   2 decimal, black negative\r\n    default_str[7] = default_str[65] = '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)';\r\n    //  8 -- Currency,   2 decimal, red   negative\r\n    default_str[8] = default_str[66] = '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)';\r\n    // 41 -- Accounting, 0 decimal, No Symbol\r\n    default_str[41] = '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)';\r\n    // 42 -- Accounting, 0 decimal, $  Symbol\r\n    default_str[42] = '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)';\r\n    // 43 -- Accounting, 2 decimal, No Symbol\r\n    default_str[43] = '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)';\r\n    // 44 -- Accounting, 2 decimal, $  Symbol\r\n    default_str[44] = '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)';\r\n\r\n    function frac(x, D, mixed) {\r\n        var sgn = x < 0 ? -1 : 1;\r\n        var B = x * sgn;\r\n        var P_2 = 0,\r\n            P_1 = 1,\r\n            P = 0;\r\n        var Q_2 = 1,\r\n            Q_1 = 0,\r\n            Q = 0;\r\n        var A = Math.floor(B);\r\n        while (Q_1 < D) {\r\n            A = Math.floor(B);\r\n            P = A * P_1 + P_2;\r\n            Q = A * Q_1 + Q_2;\r\n            if ((B - A) < 0.00000005) break;\r\n            B = 1 / (B - A);\r\n            P_2 = P_1;\r\n            P_1 = P;\r\n            Q_2 = Q_1;\r\n            Q_1 = Q;\r\n        }\r\n        if (Q > D) {\r\n            if (Q_1 > D) {\r\n                Q = Q_2;\r\n                P = P_2;\r\n            } else {\r\n                Q = Q_1;\r\n                P = P_1;\r\n            }\r\n        }\r\n        if (!mixed) return [0, sgn * P, Q];\r\n        var q = Math.floor(sgn * P / Q);\r\n        return [q, sgn * P - q * Q, Q];\r\n    }\r\n\r\n    function parse_date_code(v, opts, b2) {\r\n        if (v > 2958465 || v < 0) return null;\r\n        var date = (v | 0),\r\n            time = Math.floor(86400 * (v - date)),\r\n            dow = 0;\r\n        var dout = [];\r\n        var out = {\r\n            D: date,\r\n            T: time,\r\n            u: 86400 * (v - date) - time,\r\n            y: 0,\r\n            m: 0,\r\n            d: 0,\r\n            H: 0,\r\n            M: 0,\r\n            S: 0,\r\n            q: 0\r\n        };\r\n        if (Math.abs(out.u) < 1e-6) out.u = 0;\r\n        if (opts && opts.date1904) date += 1462;\r\n        if (out.u > 0.9999) {\r\n            out.u = 0;\r\n            if (++time == 86400) {\r\n                out.T = time = 0;\r\n                ++date;\r\n                ++out.D;\r\n            }\r\n        }\r\n        if (date === 60) {\r\n            dout = b2 ? [1317, 10, 29] : [1900, 2, 29];\r\n            dow = 3;\r\n        } else if (date === 0) {\r\n            dout = b2 ? [1317, 8, 29] : [1900, 1, 0];\r\n            dow = 6;\r\n        } else {\r\n            if (date > 60) --date;\r\n            /* 1 = Jan 1 1900 in Gregorian */\r\n            var d = new Date(1900, 0, 1);\r\n            d.setDate(d.getDate() + date - 1);\r\n            dout = [d.getFullYear(), d.getMonth() + 1, d.getDate()];\r\n            dow = d.getDay();\r\n            if (date < 60) dow = (dow + 6) % 7;\r\n            if (b2) dow = fix_hijri(d, dout);\r\n        }\r\n        out.y = dout[0];\r\n        out.m = dout[1];\r\n        out.d = dout[2];\r\n        out.S = time % 60;\r\n        time = Math.floor(time / 60);\r\n        out.M = time % 60;\r\n        time = Math.floor(time / 60);\r\n        out.H = time;\r\n        out.q = dow;\r\n        return out;\r\n    }\r\n    SSF.parse_date_code = parse_date_code;\r\n    var basedate = new Date(1899, 11, 31, 0, 0, 0);\r\n    var dnthresh = basedate.getTime();\r\n    var base1904 = new Date(1900, 2, 1, 0, 0, 0);\r\n\r\n    function datenum_local(v, date1904) {\r\n        var epoch = v.getTime();\r\n        if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;\r\n        else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;\r\n        return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);\r\n    }\r\n    /* The longest 32-bit integer text is \"-4294967296\", exactly 11 chars */\r\n    function general_fmt_int(v) {\r\n        return v.toString(10);\r\n    }\r\n    SSF._general_int = general_fmt_int;\r\n    /* ECMA-376 18.8.30 numFmt*/\r\n    /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */\r\n    var general_fmt_num = (function make_general_fmt_num() {\r\n        var trailing_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)$/;\r\n\r\n        function strip_decimal(o) {\r\n            return (o.indexOf(\".\") == -1) ? o : o.replace(trailing_zeroes_and_decimal, \"$1\");\r\n        }\r\n        /* General Exponential always shows 2 digits exp and trims the mantissa */\r\n        var mantissa_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/;\r\n        var exp_with_single_digit = /(E[+-])(\\d)$/;\r\n\r\n        function normalize_exp(o) {\r\n            if (o.indexOf(\"E\") == -1) return o;\r\n            return o.replace(mantissa_zeroes_and_decimal, \"$1E\").replace(exp_with_single_digit, \"$10$2\");\r\n        }\r\n        /* exponent >= -9 and <= 9 */\r\n        function small_exp(v) {\r\n            var w = (v < 0 ? 12 : 11);\r\n            var o = strip_decimal(v.toFixed(12));\r\n            if (o.length <= w) return o;\r\n            o = v.toPrecision(10);\r\n            if (o.length <= w) return o;\r\n            return v.toExponential(5);\r\n        }\r\n        /* exponent >= 11 or <= -10 likely exponential */\r\n        function large_exp(v) {\r\n            var o = strip_decimal(v.toFixed(11));\r\n            return (o.length > (v < 0 ? 12 : 11) || o === \"0\" || o === \"-0\") ? v.toPrecision(6) : o;\r\n        }\r\n\r\n        function general_fmt_num_base(v) {\r\n            var V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E),\r\n                o;\r\n            if (V >= -4 && V <= -1) o = v.toPrecision(10 + V);\r\n            else if (Math.abs(V) <= 9) o = small_exp(v);\r\n            else if (V === 10) o = v.toFixed(10).substr(0, 12);\r\n            else o = large_exp(v);\r\n            return strip_decimal(normalize_exp(o.toUpperCase()));\r\n        }\r\n        return general_fmt_num_base;\r\n    })();\r\n    SSF._general_num = general_fmt_num;\r\n    /*\r\n        \"General\" rules:\r\n        - text is passed through (\"@\")\r\n        - booleans are rendered as TRUE/FALSE\r\n        - \"up to 11 characters\" displayed for numbers\r\n        - Default date format (code 14) used for Dates\r\n        TODO: technically the display depends on the width of the cell\r\n    */\r\n    function general_fmt(v, opts) {\r\n        switch (typeof v) {\r\n            case 'string':\r\n                return v;\r\n            case 'boolean':\r\n                return v ? \"TRUE\" : \"FALSE\";\r\n            case 'number':\r\n                return (v | 0) === v ? v.toString(10) : general_fmt_num(v);\r\n            case 'undefined':\r\n                return \"\";\r\n            case 'object':\r\n                if (v == null) return \"\";\r\n                if (v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);\r\n        }\r\n        throw new Error(\"unsupported value in General format: \" + v);\r\n    }\r\n    SSF._general = general_fmt;\r\n\r\n    function fix_hijri(date, o) {\r\n        /* TODO: properly adjust y/m/d and  */\r\n        o[0] -= 581;\r\n        var dow = date.getDay();\r\n        if (date < 60) dow = (dow + 6) % 7;\r\n        return dow;\r\n    }\r\n    var THAI_DIGITS = \"\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\".split(\"\");\r\n    /*jshint -W086 */\r\n    function write_date(type, fmt, val, ss0) {\r\n        var o = \"\",\r\n            ss = 0,\r\n            tt = 0,\r\n            y = val.y,\r\n            out, outl = 0;\r\n        switch (type) {\r\n            case 98:\r\n                /* 'b' buddhist year */ y = val.y + 543;\r\n                /* falls through */\r\n            case 121:\r\n                /* 'y' year */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = y % 100;\r\n                        outl = 2;\r\n                        break;\r\n                    default:\r\n                        out = y % 10000;\r\n                        outl = 4;\r\n                        break;\r\n                }\r\n                break;\r\n            case 109:\r\n                /* 'm' month */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.m;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    case 3:\r\n                        return months[val.m - 1][1];\r\n                    case 5:\r\n                        return months[val.m - 1][0];\r\n                    default:\r\n                        return months[val.m - 1][2];\r\n                }\r\n                break;\r\n            case 100:\r\n                /* 'd' day */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.d;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    case 3:\r\n                        return days[val.q][0];\r\n                    default:\r\n                        return days[val.q][1];\r\n                }\r\n                break;\r\n            case 104:\r\n                /* 'h' 12-hour */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = 1 + (val.H + 11) % 12;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad hour format: ' + fmt;\r\n                }\r\n                break;\r\n            case 72:\r\n                /* 'H' 24-hour */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.H;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad hour format: ' + fmt;\r\n                }\r\n                break;\r\n            case 77:\r\n                /* 'M' minutes */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.M;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad minute format: ' + fmt;\r\n                }\r\n                break;\r\n            case 115:\r\n                /* 's' seconds */ if (fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;\r\n                if (val.u === 0 && (fmt == \"s\" || fmt == \"ss\")) return pad0(val.S, fmt.length);\r\n                if (ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\r\n                else tt = ss0 === 1 ? 10 : 1;\r\n                ss = Math.round((tt) * (val.S + val.u));\r\n                if (ss >= 60 * tt) ss = 0;\r\n                if (fmt === 's') return ss === 0 ? \"0\" : \"\" + ss / tt;\r\n                o = pad0(ss, 2 + ss0);\r\n                if (fmt === 'ss') return o.substr(0, 2);\r\n                return \".\" + o.substr(2, fmt.length - 1);\r\n            case 90:\r\n                /* 'Z' absolute time */ switch (fmt) {\r\n                    case '[h]':\r\n                    case '[hh]':\r\n                        out = val.D * 24 + val.H;\r\n                        break;\r\n                    case '[m]':\r\n                    case '[mm]':\r\n                        out = (val.D * 24 + val.H) * 60 + val.M;\r\n                        break;\r\n                    case '[s]':\r\n                    case '[ss]':\r\n                        out = ((val.D * 24 + val.H) * 60 + val.M) * 60 + Math.round(val.S + val.u);\r\n                        break;\r\n                    default:\r\n                        throw 'bad abstime format: ' + fmt;\r\n                }\r\n                outl = fmt.length === 3 ? 1 : 2;\r\n                break;\r\n            case 101:\r\n                /* 'e' era */ out = y;\r\n                outl = 1;\r\n                break;\r\n        }\r\n        var outstr = outl > 0 ? pad0(out, outl) : \"\";\r\n        return outstr;\r\n    }\r\n    /*jshint +W086 */\r\n    function commaify(s) {\r\n        var w = 3;\r\n        if (s.length <= w) return s;\r\n        var j = (s.length % w),\r\n            o = s.substr(0, j);\r\n        for (; j != s.length; j += w) o += (o.length > 0 ? \",\" : \"\") + s.substr(j, w);\r\n        return o;\r\n    }\r\n    var write_num = (function make_write_num() {\r\n        var pct1 = /%/g;\r\n\r\n        function write_num_pct(type, fmt, val) {\r\n            var sfmt = fmt.replace(pct1, \"\"),\r\n                mul = fmt.length - sfmt.length;\r\n            return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill(\"%\", mul);\r\n        }\r\n\r\n        function write_num_cm(type, fmt, val) {\r\n            var idx = fmt.length - 1;\r\n            while (fmt.charCodeAt(idx - 1) === 44) --idx;\r\n            return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));\r\n        }\r\n\r\n        function write_num_exp(fmt, val) {\r\n            var o;\r\n            var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\r\n            if (fmt.match(/^#+0.0E\\+0$/)) {\r\n                if (val == 0) return \"0.0E+0\";\r\n                else if (val < 0) return \"-\" + write_num_exp(fmt, -val);\r\n                var period = fmt.indexOf(\".\");\r\n                if (period === -1) period = fmt.indexOf('E');\r\n                var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;\r\n                if (ee < 0) ee += period;\r\n                o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);\r\n                if (o.indexOf(\"e\") === -1) {\r\n                    var fakee = Math.floor(Math.log(val) * Math.LOG10E);\r\n                    if (o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length + ee);\r\n                    else o += \"E+\" + (fakee - ee);\r\n                    while (o.substr(0, 2) === \"0.\") {\r\n                        o = o.charAt(0) + o.substr(2, period) + \".\" + o.substr(2 + period);\r\n                        o = o.replace(/^0+([1-9])/, \"$1\").replace(/^0+\\./, \"0.\");\r\n                    }\r\n                    o = o.replace(/\\+-/, \"-\");\r\n                }\r\n                o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/, function($$, $1, $2, $3) {\r\n                    return $1 + $2 + $3.substr(0, (period + ee) % period) + \".\" + $3.substr(ee) + \"E\";\r\n                });\r\n            } else o = val.toExponential(idx);\r\n            if (fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0, o.length - 1) + \"0\" + o.charAt(o.length - 1);\r\n            if (fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/, \"e\");\r\n            return o.replace(\"e\", \"E\");\r\n        }\r\n        var frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\r\n\r\n        function write_num_f1(r, aval, sign) {\r\n            var den = parseInt(r[4], 10),\r\n                rr = Math.round(aval * den),\r\n                base = Math.floor(rr / den);\r\n            var myn = (rr - base * den),\r\n                myd = den;\r\n            return sign + (base === 0 ? \"\" : \"\" + base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn, r[1].length) + r[2] + \"/\" + r[3] + pad0(myd, r[4].length));\r\n        }\r\n\r\n        function write_num_f2(r, aval, sign) {\r\n            return sign + (aval === 0 ? \"\" : \"\" + aval) + fill(\" \", r[1].length + 2 + r[4].length);\r\n        }\r\n        var dec1 = /^#*0*\\.([0#]+)/;\r\n        var closeparen = /\\).*[0#]/;\r\n        var phone = /\\(###\\) ###\\\\?-####/;\r\n\r\n        function hashq(str) {\r\n            var o = \"\",\r\n                cc;\r\n            for (var i = 0; i != str.length; ++i) switch ((cc = str.charCodeAt(i))) {\r\n                case 35:\r\n                    break;\r\n                case 63:\r\n                    o += \" \";\r\n                    break;\r\n                case 48:\r\n                    o += \"0\";\r\n                    break;\r\n                default:\r\n                    o += String.fromCharCode(cc);\r\n            }\r\n            return o;\r\n        }\r\n\r\n        function rnd(val, d) {\r\n            var dd = Math.pow(10, d);\r\n            return \"\" + (Math.round(val * dd) / dd);\r\n        }\r\n\r\n        function dec(val, d) {\r\n            var _frac = val - Math.floor(val),\r\n                dd = Math.pow(10, d);\r\n            if (d < ('' + Math.round(_frac * dd)).length) return 0;\r\n            return Math.round(_frac * dd);\r\n        }\r\n\r\n        function carry(val, d) {\r\n            if (d < ('' + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {\r\n                return 1;\r\n            }\r\n            return 0;\r\n        }\r\n\r\n        function flr(val) {\r\n            if (val < 2147483647 && val > -2147483648) return \"\" + (val >= 0 ? (val | 0) : (val - 1 | 0));\r\n            return \"\" + Math.floor(val);\r\n        }\r\n\r\n        function write_num_flt(type, fmt, val) {\r\n            if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\r\n                var ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\r\n                if (val >= 0) return write_num_flt('n', ffmt, val);\r\n                return '(' + write_num_flt('n', ffmt, -val) + ')';\r\n            }\r\n            if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\r\n            if (fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\r\n            if (fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\r\n            if (fmt.charCodeAt(0) === 36) return \"$\" + write_num_flt(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);\r\n            var o;\r\n            var r, ri, ff, aval = Math.abs(val),\r\n                sign = val < 0 ? \"-\" : \"\";\r\n            if (fmt.match(/^00+$/)) return sign + pad0r(aval, fmt.length);\r\n            if (fmt.match(/^[#?]+$/)) {\r\n                o = pad0r(val, 0);\r\n                if (o === \"0\") o = \"\";\r\n                return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);\r\n            if (fmt.match(/^#+0+$/)) return sign + pad0r(aval, fmt.length - fmt.indexOf(\"0\"));\r\n            if ((r = fmt.match(dec1))) {\r\n                o = rnd(val, r[1].length).replace(/^([^\\.]+)$/, \"$1.\" + hashq(r[1])).replace(/\\.$/, \".\" + hashq(r[1])).replace(/\\.(\\d*)$/, function($$, $1) {\r\n                    return \".\" + $1 + fill(\"0\", hashq(r[1]).length - $1.length);\r\n                });\r\n                return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\r\n            }\r\n            fmt = fmt.replace(/^#+([0.])/, \"$1\");\r\n            if ((r = fmt.match(/^(0*)\\.(#*)$/))) {\r\n                return sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/, \".$1\").replace(/^(-?\\d*)$/, \"$1.\").replace(/^0\\./, r[1].length ? \"0.\" : \".\");\r\n            }\r\n            if ((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify(pad0r(aval, 0));\r\n            if ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\" + (Math.floor(val) + carry(val, r[1].length))) + \".\" + pad0(dec(val, r[1].length), r[1].length);\r\n            }\r\n            if ((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type, fmt.replace(/^#,#*,/, \"\"), val);\r\n            if ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\r\n                o = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g, \"\"), val));\r\n                ri = 0;\r\n                return _strrev(_strrev(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, function(x) {\r\n                    return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : \"\";\r\n                }));\r\n            }\r\n            if (fmt.match(phone)) {\r\n                o = write_num_flt(type, \"##########\", val);\r\n                return \"(\" + o.substr(0, 3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\r\n            }\r\n            var oa = \"\";\r\n            if ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(r[4].length, 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, false);\r\n                o = \"\" + sign;\r\n                oa = write_num(\"n\", r[1], ff[1]);\r\n                if (oa.charAt(oa.length - 1) == \" \") oa = oa.substr(0, oa.length - 1) + \"0\";\r\n                o += oa + r[2] + \"/\" + r[3];\r\n                oa = rpad_(ff[2], ri);\r\n                if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;\r\n                o += oa;\r\n                return o;\r\n            }\r\n            if ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(Math.max(r[1].length, r[4].length), 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, true);\r\n                return sign + (ff[0] || (ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1], ri) + r[2] + \"/\" + r[3] + rpad_(ff[2], ri) : fill(\" \", 2 * ri + 1 + r[2].length + r[3].length));\r\n            }\r\n            if ((r = fmt.match(/^[#0?]+$/))) {\r\n                o = pad0r(val, 0);\r\n                if (fmt.length <= o.length) return o;\r\n                return hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(/^([#0?]+)\\.([#0]+)$/))) {\r\n                o = \"\" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\r\n                ri = o.indexOf(\".\");\r\n                var lres = fmt.indexOf(\".\") - ri,\r\n                    rres = fmt.length - o.length - lres;\r\n                return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));\r\n            }\r\n            if ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\r\n                ri = dec(val, r[1].length);\r\n                return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\\d,\\d{3}$/, \"0$&\").replace(/^\\d*$/, function($$) {\r\n                    return \"00,\" + ($$.length < 3 ? pad0(0, 3 - $$.length) : \"\") + $$;\r\n                }) + \".\" + pad0(ri, r[1].length);\r\n            }\r\n            switch (fmt) {\r\n                case \"###,##0.00\":\r\n                    return write_num_flt(type, \"#,##0.00\", val);\r\n                case \"###,###\":\r\n                case \"##,###\":\r\n                case \"#,###\":\r\n                    var x = commaify(pad0r(aval, 0));\r\n                    return x !== \"0\" ? sign + x : \"\";\r\n                case \"###,###.00\":\r\n                    return write_num_flt(type, \"###,##0.00\", val).replace(/^0\\./, \".\");\r\n                case \"#,###.00\":\r\n                    return write_num_flt(type, \"#,##0.00\", val).replace(/^0\\./, \".\");\r\n                default:\r\n            }\r\n            throw new Error(\"unsupported format |\" + fmt + \"|\");\r\n        }\r\n\r\n        function write_num_cm2(type, fmt, val) {\r\n            var idx = fmt.length - 1;\r\n            while (fmt.charCodeAt(idx - 1) === 44) --idx;\r\n            return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));\r\n        }\r\n\r\n        function write_num_pct2(type, fmt, val) {\r\n            var sfmt = fmt.replace(pct1, \"\"),\r\n                mul = fmt.length - sfmt.length;\r\n            return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill(\"%\", mul);\r\n        }\r\n\r\n        function write_num_exp2(fmt, val) {\r\n            var o;\r\n            var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\r\n            if (fmt.match(/^#+0.0E\\+0$/)) {\r\n                if (val == 0) return \"0.0E+0\";\r\n                else if (val < 0) return \"-\" + write_num_exp2(fmt, -val);\r\n                var period = fmt.indexOf(\".\");\r\n                if (period === -1) period = fmt.indexOf('E');\r\n                var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;\r\n                if (ee < 0) ee += period;\r\n                o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);\r\n                if (!o.match(/[Ee]/)) {\r\n                    var fakee = Math.floor(Math.log(val) * Math.LOG10E);\r\n                    if (o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length + ee);\r\n                    else o += \"E+\" + (fakee - ee);\r\n                    o = o.replace(/\\+-/, \"-\");\r\n                }\r\n                o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/, function($$, $1, $2, $3) {\r\n                    return $1 + $2 + $3.substr(0, (period + ee) % period) + \".\" + $3.substr(ee) + \"E\";\r\n                });\r\n            } else o = val.toExponential(idx);\r\n            if (fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0, o.length - 1) + \"0\" + o.charAt(o.length - 1);\r\n            if (fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/, \"e\");\r\n            return o.replace(\"e\", \"E\");\r\n        }\r\n\r\n        function write_num_int(type, fmt, val) {\r\n            if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\r\n                var ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\r\n                if (val >= 0) return write_num_int('n', ffmt, val);\r\n                return '(' + write_num_int('n', ffmt, -val) + ')';\r\n            }\r\n            if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\r\n            if (fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\r\n            if (fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\r\n            if (fmt.charCodeAt(0) === 36) return \"$\" + write_num_int(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);\r\n            var o;\r\n            var r, ri, ff, aval = Math.abs(val),\r\n                sign = val < 0 ? \"-\" : \"\";\r\n            if (fmt.match(/^00+$/)) return sign + pad0(aval, fmt.length);\r\n            if (fmt.match(/^[#?]+$/)) {\r\n                o = (\"\" + val);\r\n                if (val === 0) o = \"\";\r\n                return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);\r\n            if (fmt.match(/^#+0+$/)) return sign + pad0(aval, fmt.length - fmt.indexOf(\"0\"));\r\n            if ((r = fmt.match(dec1))) {\r\n                o = (\"\" + val).replace(/^([^\\.]+)$/, \"$1.\" + hashq(r[1])).replace(/\\.$/, \".\" + hashq(r[1]));\r\n                o = o.replace(/\\.(\\d*)$/, function($$, $1) {\r\n                    return \".\" + $1 + fill(\"0\", hashq(r[1]).length - $1.length);\r\n                });\r\n                return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\r\n            }\r\n            fmt = fmt.replace(/^#+([0.])/, \"$1\");\r\n            if ((r = fmt.match(/^(0*)\\.(#*)$/))) {\r\n                return sign + (\"\" + aval).replace(/\\.(\\d*[1-9])0*$/, \".$1\").replace(/^(-?\\d*)$/, \"$1.\").replace(/^0\\./, r[1].length ? \"0.\" : \".\");\r\n            }\r\n            if ((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify((\"\" + aval));\r\n            if ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\" + val)) + \".\" + fill('0', r[1].length);\r\n            }\r\n            if ((r = fmt.match(/^#,#*,#0/))) return write_num_int(type, fmt.replace(/^#,#*,/, \"\"), val);\r\n            if ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\r\n                o = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g, \"\"), val));\r\n                ri = 0;\r\n                return _strrev(_strrev(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, function(x) {\r\n                    return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : \"\";\r\n                }));\r\n            }\r\n            if (fmt.match(phone)) {\r\n                o = write_num_int(type, \"##########\", val);\r\n                return \"(\" + o.substr(0, 3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\r\n            }\r\n            var oa = \"\";\r\n            if ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(r[4].length, 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, false);\r\n                o = \"\" + sign;\r\n                oa = write_num(\"n\", r[1], ff[1]);\r\n                if (oa.charAt(oa.length - 1) == \" \") oa = oa.substr(0, oa.length - 1) + \"0\";\r\n                o += oa + r[2] + \"/\" + r[3];\r\n                oa = rpad_(ff[2], ri);\r\n                if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;\r\n                o += oa;\r\n                return o;\r\n            }\r\n            if ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(Math.max(r[1].length, r[4].length), 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, true);\r\n                return sign + (ff[0] || (ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1], ri) + r[2] + \"/\" + r[3] + rpad_(ff[2], ri) : fill(\" \", 2 * ri + 1 + r[2].length + r[3].length));\r\n            }\r\n            if ((r = fmt.match(/^[#0?]+$/))) {\r\n                o = \"\" + val;\r\n                if (fmt.length <= o.length) return o;\r\n                return hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(/^([#0]+)\\.([#0]+)$/))) {\r\n                o = \"\" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\r\n                ri = o.indexOf(\".\");\r\n                var lres = fmt.indexOf(\".\") - ri,\r\n                    rres = fmt.length - o.length - lres;\r\n                return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));\r\n            }\r\n            if ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify(\"\" + val).replace(/^\\d,\\d{3}$/, \"0$&\").replace(/^\\d*$/, function($$) {\r\n                    return \"00,\" + ($$.length < 3 ? pad0(0, 3 - $$.length) : \"\") + $$;\r\n                }) + \".\" + pad0(0, r[1].length);\r\n            }\r\n            switch (fmt) {\r\n                case \"###,###\":\r\n                case \"##,###\":\r\n                case \"#,###\":\r\n                    var x = commaify(\"\" + aval);\r\n                    return x !== \"0\" ? sign + x : \"\";\r\n                default:\r\n                    if (fmt.match(/\\.[0#?]*$/)) return write_num_int(type, fmt.slice(0, fmt.lastIndexOf(\".\")), val) + hashq(fmt.slice(fmt.lastIndexOf(\".\")));\r\n            }\r\n            throw new Error(\"unsupported format |\" + fmt + \"|\");\r\n        }\r\n        return function write_num(type, fmt, val) {\r\n            return (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\r\n        };\r\n    })();\r\n\r\n    function split_fmt(fmt) {\r\n        var out = [];\r\n        var in_str = false /*, cc*/ ;\r\n        for (var i = 0, j = 0; i < fmt.length; ++i) switch (( /*cc=*/ fmt.charCodeAt(i))) {\r\n            case 34:\r\n                /* '\"' */ in_str = !in_str;\r\n                break;\r\n            case 95:\r\n            case 42:\r\n            case 92:\r\n                /* '_' '*' '\\\\' */\r\n                ++i;\r\n                break;\r\n            case 59:\r\n                /* ';' */ out[out.length] = fmt.substr(j, i - j);\r\n                j = i + 1;\r\n        }\r\n        out[out.length] = fmt.substr(j);\r\n        if (in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\r\n        return out;\r\n    }\r\n    SSF._split = split_fmt;\r\n    var abstime = /\\[[HhMmSs\\u0E0A\\u0E19\\u0E17]*\\]/;\r\n\r\n    function fmt_is_date(fmt) {\r\n        var i = 0,\r\n            /*cc = 0,*/ c = \"\",\r\n            o = \"\";\r\n        while (i < fmt.length) {\r\n            switch ((c = fmt.charAt(i))) {\r\n                case 'G':\r\n                    if (isgeneral(fmt, i)) i += 6;\r\n                    i++;\r\n                    break;\r\n                case '\"':\r\n                    for (;\r\n                        ( /*cc=*/ fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) { /*empty*/ }++i;\r\n                    break;\r\n                case '\\\\':\r\n                    i += 2;\r\n                    break;\r\n                case '_':\r\n                    i += 2;\r\n                    break;\r\n                case '@':\r\n                    ++i;\r\n                    break;\r\n                case 'B':\r\n                case 'b':\r\n                    if (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") return true;\r\n                    /* falls through */\r\n                case 'M':\r\n                case 'D':\r\n                case 'Y':\r\n                case 'H':\r\n                case 'S':\r\n                case 'E':\r\n                    /* falls through */\r\n                case 'm':\r\n                case 'd':\r\n                case 'y':\r\n                case 'h':\r\n                case 's':\r\n                case 'e':\r\n                case 'g':\r\n                    return true;\r\n                case 'A':\r\n                case 'a':\r\n                case '\u4E0A':\r\n                    if (fmt.substr(i, 3).toUpperCase() === \"A/P\") return true;\r\n                    if (fmt.substr(i, 5).toUpperCase() === \"AM/PM\") return true;\r\n                    if (fmt.substr(i, 5).toUpperCase() === \"\u4E0A\u5348/\u4E0B\u5348\") return true;\r\n                    ++i;\r\n                    break;\r\n                case '[':\r\n                    o = c;\r\n                    while (fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\r\n                    if (o.match(abstime)) return true;\r\n                    break;\r\n                case '.':\r\n                    /* falls through */\r\n                case '0':\r\n                case '#':\r\n                    while (i < fmt.length && (\"0#?.,E+-%\".indexOf(c = fmt.charAt(++i)) > -1 || (c == '\\\\' && fmt.charAt(i + 1) == \"-\" && \"0#\".indexOf(fmt.charAt(i + 2)) > -1))) { /* empty */ }\r\n                    break;\r\n                case '?':\r\n                    while (fmt.charAt(++i) === c) { /* empty */ }\r\n                    break;\r\n                case '*':\r\n                    ++i;\r\n                    if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;\r\n                    break;\r\n                case '(':\r\n                case ')':\r\n                    ++i;\r\n                    break;\r\n                case '1':\r\n                case '2':\r\n                case '3':\r\n                case '4':\r\n                case '5':\r\n                case '6':\r\n                case '7':\r\n                case '8':\r\n                case '9':\r\n                    while (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) { /* empty */ }\r\n                    break;\r\n                case ' ':\r\n                    ++i;\r\n                    break;\r\n                default:\r\n                    ++i;\r\n                    break;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    SSF.is_date = fmt_is_date;\r\n\r\n    function eval_fmt(fmt, v, opts, flen) {\r\n        var out = [],\r\n            o = \"\",\r\n            i = 0,\r\n            c = \"\",\r\n            lst = 't',\r\n            dt, j, cc;\r\n        var hr = 'H';\r\n        /* Tokenize */\r\n        while (i < fmt.length) {\r\n            switch ((c = fmt.charAt(i))) {\r\n                case 'G':\r\n                    /* General */ if (!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    out[out.length] = {\r\n                        t: 'G',\r\n                        v: 'General'\r\n                    };\r\n                    i += 7;\r\n                    break;\r\n                case '\"':\r\n                    /* Literal text */ for (o = \"\";\r\n                        (cc = fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: o\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '\\\\':\r\n                    var w = fmt.charAt(++i),\r\n                        t = (w === \"(\" || w === \")\") ? w : 't';\r\n                    out[out.length] = {\r\n                        t: t,\r\n                        v: w\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '_':\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: \" \"\r\n                    };\r\n                    i += 2;\r\n                    break;\r\n                case '@':\r\n                    /* Text Placeholder */ out[out.length] = {\r\n                        t: 'T',\r\n                        v: v\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case 'B':\r\n                case 'b':\r\n                    if (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") {\r\n                        if (dt == null) {\r\n                            dt = parse_date_code(v, opts, fmt.charAt(i + 1) === \"2\");\r\n                            if (dt == null) return \"\";\r\n                        }\r\n                        out[out.length] = {\r\n                            t: 'X',\r\n                            v: fmt.substr(i, 2)\r\n                        };\r\n                        lst = c;\r\n                        i += 2;\r\n                        break;\r\n                    }\r\n                    /* falls through */\r\n                case 'M':\r\n                case 'D':\r\n                case 'Y':\r\n                case 'H':\r\n                case 'S':\r\n                case 'E':\r\n                    c = c.toLowerCase();\r\n                    /* falls through */\r\n                case 'm':\r\n                case 'd':\r\n                case 'y':\r\n                case 'h':\r\n                case 's':\r\n                case 'e':\r\n                case 'g':\r\n                    if (v < 0) return \"\";\r\n                    if (dt == null) {\r\n                        dt = parse_date_code(v, opts);\r\n                        if (dt == null) return \"#####\";\r\n                    }\r\n                    o = c;\r\n                    while (++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o += c;\r\n                    if (c === 'm' && lst.toLowerCase() === 'h') c = 'M';\r\n                    if (c === 'h') c = hr;\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: o\r\n                    };\r\n                    lst = c;\r\n                    break;\r\n                case 'A':\r\n                case 'a':\r\n                case '\u4E0A':\r\n                    var q = {\r\n                        t: c,\r\n                        v: c\r\n                    };\r\n                    if (dt == null) dt = parse_date_code(v, opts);\r\n                    if (fmt.substr(i, 3).toUpperCase() === \"A/P\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"P\" : \"A\";\r\n                        q.t = 'T';\r\n                        hr = 'h';\r\n                        i += 3;\r\n                    } else if (fmt.substr(i, 5).toUpperCase() === \"AM/PM\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"PM\" : \"AM\";\r\n                        q.t = 'T';\r\n                        i += 5;\r\n                        hr = 'h';\r\n                    } else if (fmt.substr(i, 5).toUpperCase() === \"\u4E0A\u5348/\u4E0B\u5348\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"\u4E0B\u5348\" : \"\u4E0A\u5348\";\r\n                        q.t = 'T';\r\n                        i += 5;\r\n                        hr = 'h';\r\n                    } else {\r\n                        q.t = \"t\";\r\n                        ++i;\r\n                    }\r\n                    if (dt == null && q.t === 'T') return \"\";\r\n                    out[out.length] = q;\r\n                    lst = c;\r\n                    break;\r\n                case '[':\r\n                    o = c;\r\n                    while (fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\r\n                    if (o.slice(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\r\n                    if (o.match(abstime)) {\r\n                        if (dt == null) {\r\n                            dt = parse_date_code(v, opts);\r\n                            if (dt == null) return \"\";\r\n                        }\r\n                        out[out.length] = {\r\n                            t: 'Z',\r\n                            v: o.toLowerCase()\r\n                        };\r\n                        lst = o.charAt(1);\r\n                    } else if (o.indexOf(\"$\") > -1) {\r\n                        o = (o.match(/\\$([^-\\[\\]]*)/) || [])[1] || \"$\";\r\n                        if (!fmt_is_date(fmt)) out[out.length] = {\r\n                            t: 't',\r\n                            v: o\r\n                        };\r\n                    }\r\n                    break;\r\n                    /* Numbers */\r\n                case '.':\r\n                    if (dt != null) {\r\n                        o = c;\r\n                        while (++i < fmt.length && (c = fmt.charAt(i)) === \"0\") o += c;\r\n                        out[out.length] = {\r\n                            t: 's',\r\n                            v: o\r\n                        };\r\n                        break;\r\n                    }\r\n                    /* falls through */\r\n                case '0':\r\n                case '#':\r\n                    o = c;\r\n                    while (++i < fmt.length && \"0#?.,E+-%\".indexOf(c = fmt.charAt(i)) > -1) o += c;\r\n                    out[out.length] = {\r\n                        t: 'n',\r\n                        v: o\r\n                    };\r\n                    break;\r\n                case '?':\r\n                    o = c;\r\n                    while (fmt.charAt(++i) === c) o += c;\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: o\r\n                    };\r\n                    lst = c;\r\n                    break;\r\n                case '*':\r\n                    ++i;\r\n                    if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;\r\n                    break; // **\r\n                case '(':\r\n                case ')':\r\n                    out[out.length] = {\r\n                        t: (flen === 1 ? 't' : c),\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '1':\r\n                case '2':\r\n                case '3':\r\n                case '4':\r\n                case '5':\r\n                case '6':\r\n                case '7':\r\n                case '8':\r\n                case '9':\r\n                    o = c;\r\n                    while (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) o += fmt.charAt(i);\r\n                    out[out.length] = {\r\n                        t: 'D',\r\n                        v: o\r\n                    };\r\n                    break;\r\n                case ' ':\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '$':\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: '$'\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                default:\r\n                    // if (\"\u00A4\u0E3FBsBr\u20B5\u20A1\u20AB\u0192FtRs.\u20ADkr\u00A3\u20A4Lm\u20A5\u20A6\u20B1PQRSkRp\u09F2\u09F3R$S/.\u3012\u20AE\u20A9\u00A5NT\uFFE5z\u0142\u20B4\u20AA\u17DB\u0440\u0443\u0431\u20AC\uFF04,$-+/():!^&'~{}<>=\u20ACacfijklopqrtuvwxzP\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    if (\"\u00A4\u0E3FBsBr\u20B5\u20A1\u20AB\u0192FtRs.\u20ADkr\u00A3\u20A4Lm\u20A5\u20A6\u20B1PQRSkRp\u09F2\u09F3R$S/.\u3012\u20AE\u20A9\u00A5NT\uFFE5z\u0142\u20B4\u20AA\u17DB\u0440\u0443\u0431\u20AC\uFF04,$-+/():!^&'~{}<>=\u20ACacfijklopqrtuvwxzP$\uFFE5LekdinAf$dhAflRial?\uFFE1BirrKzMOPPGKRsGsB/R$\u0440\u0440levkrKMzBsPNuFBuKPkrRD$NfkCFA?CVEGMDFrCDHTGNAfLFdjKGSFGGHSRielKCFknKshLSLL\uFFE1LtRFRONArRfMWKRMMURsMROS/KMDLMTnRC$kr\u20ACGELCHFSLLSCRDbSZLSDGSOSSomFCFPTShT$VUVQUGX\u0433\u0440\u043DsomWSTNT$FtDramRpZMWFCFA\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n            }\r\n        }\r\n        /* Scan for date/time parts */\r\n        var bt = 0,\r\n            ss0 = 0,\r\n            ssm;\r\n        for (i = out.length - 1, lst = 't'; i >= 0; --i) {\r\n            switch (out[i].t) {\r\n                case 'h':\r\n                case 'H':\r\n                    out[i].t = hr;\r\n                    lst = 'h';\r\n                    if (bt < 1) bt = 1;\r\n                    break;\r\n                case 's':\r\n                    if ((ssm = out[i].v.match(/\\.0+$/))) ss0 = Math.max(ss0, ssm[0].length - 1);\r\n                    if (bt < 3) bt = 3;\r\n                    /* falls through */\r\n                case 'd':\r\n                case 'y':\r\n                case 'M':\r\n                case 'e':\r\n                    lst = out[i].t;\r\n                    break;\r\n                case 'm':\r\n                    if (lst === 's') {\r\n                        out[i].t = 'M';\r\n                        if (bt < 2) bt = 2;\r\n                    }\r\n                    break;\r\n                case 'X':\r\n                    /*if(out[i].v === \"B2\");*/ break;\r\n                case 'Z':\r\n                    if (bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\r\n                    if (bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\r\n                    if (bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\r\n            }\r\n        }\r\n        /* time rounding depends on presence of minute / second / usec fields */\r\n        switch (bt) {\r\n            case 0:\r\n                break;\r\n            case 1:\r\n                if (dt.u >= 0.5) {\r\n                    dt.u = 0;\r\n                    ++dt.S;\r\n                }\r\n                if (dt.S >= 60) {\r\n                    dt.S = 0;\r\n                    ++dt.M;\r\n                }\r\n                if (dt.M >= 60) {\r\n                    dt.M = 0;\r\n                    ++dt.H;\r\n                }\r\n                break;\r\n            case 2:\r\n                if (dt.u >= 0.5) {\r\n                    dt.u = 0;\r\n                    ++dt.S;\r\n                }\r\n                if (dt.S >= 60) {\r\n                    dt.S = 0;\r\n                    ++dt.M;\r\n                }\r\n                break;\r\n        }\r\n        /* replace fields */\r\n        var nstr = \"\",\r\n            jj;\r\n        for (i = 0; i < out.length; ++i) {\r\n            switch (out[i].t) {\r\n                case 't':\r\n                case 'T':\r\n                case ' ':\r\n                case 'D':\r\n                    break;\r\n                case 'X':\r\n                    out[i].v = \"\";\r\n                    out[i].t = \";\";\r\n                    break;\r\n                case 'd':\r\n                case 'm':\r\n                case 'y':\r\n                case 'h':\r\n                case 'H':\r\n                case 'M':\r\n                case 's':\r\n                case 'e':\r\n                case 'b':\r\n                case 'Z':\r\n                    out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\r\n                    out[i].t = 't';\r\n                    break;\r\n                case 'n':\r\n                case '?':\r\n                    jj = i + 1;\r\n                    while (out[jj] != null && (\r\n                            (c = out[jj].t) === \"?\" || c === \"D\" || ((c === \" \" || c === \"t\") && out[jj + 1] != null && (out[jj + 1].t === '?' || out[jj + 1].t === \"t\" && out[jj + 1].v === '/')) || (out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || (c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj + 1] != null && out[jj + 1].t == '?')))) {\r\n                        out[i].v += out[jj].v;\r\n                        out[jj] = {\r\n                            v: \"\",\r\n                            t: \";\"\r\n                        };\r\n                        ++jj;\r\n                    }\r\n                    nstr += out[i].v;\r\n                    i = jj - 1;\r\n                    break;\r\n                case 'G':\r\n                    out[i].t = 't';\r\n                    out[i].v = general_fmt(v, opts);\r\n                    break;\r\n            }\r\n        }\r\n        var vv = \"\",\r\n            myv, ostr;\r\n        if (nstr.length > 0) {\r\n            if (nstr.charCodeAt(0) == 40) /* '(' */ {\r\n                myv = (v < 0 && nstr.charCodeAt(0) === 45 ? -v : v);\r\n                ostr = write_num('n', nstr, myv);\r\n            } else {\r\n                myv = (v < 0 && flen > 1 ? -v : v);\r\n                ostr = write_num('n', nstr, myv);\r\n                if (myv < 0 && out[0] && out[0].t == 't') {\r\n                    ostr = ostr.substr(1);\r\n                    out[0].v = \"-\" + out[0].v;\r\n                }\r\n            }\r\n            jj = ostr.length - 1;\r\n            var decpt = out.length;\r\n            for (i = 0; i < out.length; ++i)\r\n                if (out[i] != null && out[i].t != 't' && out[i].v.indexOf(\".\") > -1) {\r\n                    decpt = i;\r\n                    break;\r\n                }\r\n            var lasti = out.length;\r\n            if (decpt === out.length && ostr.indexOf(\"E\") === -1) {\r\n                for (i = out.length - 1; i >= 0; --i) {\r\n                    if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\r\n                    if (jj >= out[i].v.length - 1) {\r\n                        jj -= out[i].v.length;\r\n                        out[i].v = ostr.substr(jj + 1, out[i].v.length);\r\n                    } else if (jj < 0) out[i].v = \"\";\r\n                    else {\r\n                        out[i].v = ostr.substr(0, jj + 1);\r\n                        jj = -1;\r\n                    }\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n                if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;\r\n            } else if (decpt !== out.length && ostr.indexOf(\"E\") === -1) {\r\n                jj = ostr.indexOf(\".\") - 1;\r\n                for (i = decpt; i >= 0; --i) {\r\n                    if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\r\n                    j = out[i].v.indexOf(\".\") > -1 && i === decpt ? out[i].v.indexOf(\".\") - 1 : out[i].v.length - 1;\r\n                    vv = out[i].v.substr(j + 1);\r\n                    for (; j >= 0; --j) {\r\n                        if (jj >= 0 && (out[i].v.charAt(j) === \"0\" || out[i].v.charAt(j) === \"#\")) vv = ostr.charAt(jj--) + vv;\r\n                    }\r\n                    out[i].v = vv;\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n                if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;\r\n                jj = ostr.indexOf(\".\") + 1;\r\n                for (i = decpt; i < out.length; ++i) {\r\n                    if (out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;\r\n                    j = out[i].v.indexOf(\".\") > -1 && i === decpt ? out[i].v.indexOf(\".\") + 1 : 0;\r\n                    vv = out[i].v.substr(0, j);\r\n                    for (; j < out[i].v.length; ++j) {\r\n                        if (jj < ostr.length) vv += ostr.charAt(jj++);\r\n                    }\r\n                    out[i].v = vv;\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n            }\r\n        }\r\n        for (i = 0; i < out.length; ++i)\r\n            if (out[i] != null && 'n?'.indexOf(out[i].t) > -1) {\r\n                myv = (flen > 1 && v < 0 && i > 0 && out[i - 1].v === \"-\" ? -v : v);\r\n                out[i].v = write_num(out[i].t, out[i].v, myv);\r\n                out[i].t = 't';\r\n            }\r\n        var retval = \"\";\r\n        for (i = 0; i !== out.length; ++i)\r\n            if (out[i] != null) retval += out[i].v;\r\n   \r\n        return retval;\r\n    }\r\n    SSF._eval = eval_fmt;\r\n    var cfregex = /\\[[=<>]/;\r\n    var cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\r\n\r\n    function chkcond(v, rr) {\r\n        if (rr == null) return false;\r\n        var thresh = parseFloat(rr[2]);\r\n        switch (rr[1]) {\r\n            case \"=\":\r\n                if (v == thresh) return true;\r\n                break;\r\n            case \">\":\r\n                if (v > thresh) return true;\r\n                break;\r\n            case \"<\":\r\n                if (v < thresh) return true;\r\n                break;\r\n            case \"<>\":\r\n                if (v != thresh) return true;\r\n                break;\r\n            case \">=\":\r\n                if (v >= thresh) return true;\r\n                break;\r\n            case \"<=\":\r\n                if (v <= thresh) return true;\r\n                break;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    function choose_fmt(f, v) {\r\n        var fmt = split_fmt(f);\r\n        var l = fmt.length,\r\n            lat = fmt[l - 1].indexOf(\"@\");\r\n        if (l < 4 && lat > -1) --l;\r\n        if (fmt.length > 4) throw new Error(\"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\r\n        if (typeof v !== \"number\") return [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : \"@\"];\r\n        switch (fmt.length) {\r\n            case 1:\r\n                fmt = lat > -1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"];\r\n                break;\r\n            case 2:\r\n                fmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"];\r\n                break;\r\n            case 3:\r\n                fmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"];\r\n                break;\r\n            case 4:\r\n                break;\r\n        }\r\n        var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\r\n        if (fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\r\n        if (fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\r\n            var m1 = fmt[0].match(cfregex2);\r\n            var m2 = fmt[1].match(cfregex2);\r\n            return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\r\n        }\r\n        return [l, ff];\r\n    }\r\n\r\n    function format(fmt, v, o) {\r\n        if (o == null) o = {};\r\n        var sfmt = \"\";\r\n        switch (typeof fmt) {\r\n            case \"string\":\r\n                if (fmt == \"m/d/yy\" && o.dateNF) sfmt = o.dateNF;\r\n                else sfmt = fmt;\r\n                break;\r\n            case \"number\":\r\n                if (fmt == 14 && o.dateNF) sfmt = o.dateNF;\r\n                else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];\r\n                if (sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];\r\n                if (sfmt == null) sfmt = default_str[fmt] || \"General\";\r\n                break;\r\n        }\r\n\r\n        //new runze \u589E\u52A0\u4E07 \u4EBF \u683C\u5F0F  \r\n        //\u6CE8\uFF1A\"w\":2\u4E072500  \"w0\":2\u4E072500  \"w0.0\":2\u4E072500.2  \"w0.00\":2\u4E072500.23......\u81EA\u5B9A\u4E49\u7CBE\u786E\u5EA6\r\n        var reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n        if(!!sfmt.match(reg)){\r\n            if(isNaN(v)){\r\n                return v;\r\n            }\r\n\r\n             //var v =300101886.436;\r\n            var acc = sfmt.slice(1); //\u53D6\u5F970/0.0/0.00\r\n            var isNegative = false;\r\n            if(!isNaN(v) && Number(v) < 0){\r\n                isNegative = true;\r\n                v = Math.abs(v);\r\n            }\r\n            var vInt = parseInt(v);\r\n             \r\n            var vlength = vInt.toString().length;\r\n            if( vlength> 4){\r\n                if(vlength > 8){\r\n                    var y =parseInt (v / 100000000);  //\u4EBF\r\n                    var w = parseInt(parseFloat(v).subtract(y*100000000) / 10000); //\u4E07\r\n                    var q = parseFloat(v).subtract(y*100000000 + w*10000); //\u5343\u4EE5\u540E\r\n                    if(acc != \"\"){\r\n                        q = numeral(q).format(acc); //\u5904\u7406\u7CBE\u786E\u5EA6\r\n                    }\r\n                    v = y + \"\u4EBF\" + w + \"\u4E07\" + q;\r\n                }else{\r\n                    var w = parseInt(v / 10000); //\u4E07\r\n                    var q = parseFloat(v).subtract(w*10000) //\u5343\u4EE5\u540E\r\n                    if(acc != \"\"){\r\n                        q = numeral(q).format(acc); //\u5904\u7406\u7CBE\u786E\u5EA6\r\n                    }\r\n                    v = w + \"\u4E07\" + q;\r\n                }\r\n                \r\n\r\n                if(v.indexOf(\"\u4EBF0\u4E070\") != -1){\r\n                    v = v.replace(\"0\u4E070\",\"\");\r\n                }else if(v.indexOf(\"\u4EBF0\u4E07\") != -1){\r\n                    v = v.replace(\"0\u4E07\",\"\");\r\n                }else if(v.indexOf(\"\u4E070\") != -1){\r\n                    v = v.replace(\"\u4E070\",\"\u4E07\");\r\n                }\r\n\r\n                //\u820D\u5F03\u6B63\u5219\u540E\u987E\u65AD\u8A00\u5199\u6CD5\uFF0C\u65E7\u6D4F\u89C8\u5668\u4E0D\u8BC6\u522B\uFF08360 V9\uFF09\r\n                if (v.indexOf(\"\u4EBF\") != -1 && v.indexOf(\"\u4E07\") == -1) { //1\u4EBF/1\u4EBF111 => 1\u4EBF/1\u4EBF0111\r\n                    var afterYi = v.substring(v.indexOf(\"\u4EBF\") + 1);\r\n                    if (afterYi.substring(0, 1) !== \".\" && afterYi != \"\") {\r\n                        switch ((parseInt(afterYi) + \"\").length) {\r\n                            case 1:\r\n                                afterYi = \"000\" + afterYi;\r\n                                break;\r\n                            case 2:\r\n                                afterYi = \"00\" + afterYi;\r\n                                break;\r\n                            case 3:\r\n                                afterYi = \"0\" + afterYi;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"\u4EBF\") + 1) + afterYi;\r\n                    }\r\n                } else if (v.indexOf(\"\u4EBF\") == -1 && v.indexOf(\"\u4E07\") != -1) { //3\u4E070011\r\n                    var afterWan = v.substring(v.indexOf(\"\u4E07\") + 1);\r\n                    if (afterWan.substring(0, 1) !== \".\" && afterWan != \"\") {\r\n                        switch ((parseInt(afterWan) + \"\").length) {\r\n                            case 1:\r\n                                afterWan = \"000\" + afterWan;\r\n                                break;\r\n                            case 2:\r\n                                afterWan = \"00\" + afterWan;\r\n                                break;\r\n                            case 3:\r\n                                afterWan = \"0\" + afterWan;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"\u4E07\") + 1) + afterWan;\r\n                    }\r\n                } else if (v.indexOf(\"\u4EBF\") != -1 && v.indexOf(\"\u4E07\") != -1) { //1\u4EBF0053\u4E070611\r\n                    var afterYi = v.substring(v.indexOf(\"\u4EBF\") + 1,v.indexOf(\"\u4E07\")),\r\n                        afterWan = v.substring(v.indexOf(\"\u4E07\") + 1);\r\n\r\n                    switch ((parseInt(afterYi) + \"\").length) {\r\n                        case 1:\r\n                            afterYi = \"000\" + afterYi;\r\n                            break;\r\n                        case 2:\r\n                            afterYi = \"00\" + afterYi;\r\n                            break;\r\n                        case 3:\r\n                            afterYi = \"0\" + afterYi;\r\n                            break;\r\n                    }\r\n                    v = v.substring(0, v.indexOf(\"\u4EBF\") + 1) + afterYi + v.substring(v.indexOf(\"\u4E07\"))\r\n                    \r\n\r\n                    if (afterWan.substring(0, 1) !== \".\" && afterWan != \"\") {\r\n                        switch ((parseInt(afterWan) + \"\").length) {\r\n                            case 1:\r\n                                afterWan = \"000\" + afterWan;\r\n                                break;\r\n                            case 2:\r\n                                afterWan = \"00\" + afterWan;\r\n                                break;\r\n                            case 3:\r\n                                afterWan = \"0\" + afterWan;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"\u4E07\") + 1) + afterWan\r\n                    }\r\n                }\r\n\r\n            }else{\r\n                if(acc != \"\"){\r\n                    v = numeral(v).format(acc); //\u5904\u7406\u7CBE\u786E\u5EA6\r\n                }\r\n            }\r\n            if(isNegative){\r\n                return '-' + v;\r\n            }else{\r\n                return v;\r\n            }\r\n            \r\n        }\r\n\r\n\r\n        if (isgeneral(sfmt, 0)) return general_fmt(v, o);\r\n        if (v instanceof Date) v = datenum_local(v, o.date1904);\r\n        var f = choose_fmt(sfmt, v);\r\n        if (isgeneral(f[1])) return general_fmt(v, o);\r\n        if (v === true) v = \"TRUE\";\r\n        else if (v === false) v = \"FALSE\";\r\n        else if (v === \"\" || v == null) return \"\";\r\n        return eval_fmt(f[1], v, o, f[0]);\r\n    }\r\n\r\n    function load_entry(fmt, idx) {\r\n        if (typeof idx != 'number') {\r\n            idx = +idx || -1;\r\n            for (var i = 0; i < 0x0188; ++i) {\r\n                if (table_fmt[i] == undefined) {\r\n                    if (idx < 0) idx = i;\r\n                    continue;\r\n                }\r\n                if (table_fmt[i] == fmt) {\r\n                    idx = i;\r\n                    break;\r\n                }\r\n            }\r\n            if (idx < 0) idx = 0x187;\r\n        }\r\n        table_fmt[idx] = fmt;\r\n        return idx;\r\n    }\r\n    SSF.load = load_entry;\r\n    SSF._table = table_fmt;\r\n    SSF.get_table = function get_table() {\r\n        return table_fmt;\r\n    };\r\n    SSF.load_table = function load_table(tbl) {\r\n        for (var i = 0; i != 0x0188; ++i)\r\n            if (tbl[i] !== undefined) load_entry(tbl[i], i);\r\n    };\r\n    SSF.init_table = init_table;\r\n    SSF.format = format;\r\n};\r\nmake_ssf(SSF);\r\n\r\nvar XLMLFormatMap /*{[string]:string}*/ = ({\r\n    \"General Number\": \"General\",\r\n    \"General Date\": SSF._table[22],\r\n    \"Long Date\": \"dddd, mmmm dd, yyyy\",\r\n    \"Medium Date\": SSF._table[15],\r\n    \"Short Date\": SSF._table[14],\r\n    \"Long Time\": SSF._table[19],\r\n    \"Medium Time\": SSF._table[18],\r\n    \"Short Time\": SSF._table[20],\r\n    \"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\r\n    \"Fixed\": SSF._table[2],\r\n    \"Standard\": SSF._table[4],\r\n    \"Percent\": SSF._table[10],\r\n    \"Scientific\": SSF._table[11],\r\n    \"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\r\n    \"True/False\": '\"True\";\"True\";\"False\";@',\r\n    \"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\r\n});\r\n\r\nvar unescapexml = (function() {\r\n    /* 22.4.2.4 bstr (Basic String) */\r\n    var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\\da-fA-F]+));/g,\r\n        coderegex = /_x([\\da-fA-F]{4})_/g;\r\n    return function unescapexml(text) {\r\n        var s = text + '',\r\n            i = s.indexOf(\"<![CDATA[\");\r\n        if (i == -1) return s.replace(encregex, function($$, $1) {\r\n            return encodings[$$] || String.fromCharCode(parseInt($1, $$.indexOf(\"x\") > -1 ? 16 : 10)) || $$;\r\n        }).replace(coderegex, function(m, c) {\r\n            return String.fromCharCode(parseInt(c, 16));\r\n        });\r\n        var j = s.indexOf(\"]]>\");\r\n        return unescapexml(s.slice(0, i)) + s.slice(i + 9, j) + unescapexml(s.slice(j + 3));\r\n    };\r\n})();\r\n\r\nfunction xlml_format(format, value) {\r\n    var fmt = XLMLFormatMap[format] || unescapexml(format);\r\n    if (fmt === \"General\") return SSF._general(value);\r\n    return SSF.format(fmt, value);\r\n}\r\n\r\nvar basedate = new Date(1899, 11, 31, 0, 0, 0);\r\nvar dnthresh = basedate.getTime();\r\nvar base1904 = new Date(1900, 2, 1, 0, 0, 0);\r\n\r\nfunction datenum(v, date1904) {\r\n    var epoch = v.getTime();\r\n    if (date1904) epoch -= 1462 * 24 * 60 * 60 * 1000;\r\n    return (epoch - dnthresh) / (24 * 60 * 60 * 1000);\r\n}\r\n\r\nexport function datenum_local(v, date1904) {\r\n    var epoch = Date.UTC(v.getFullYear(), v.getMonth(), v.getDate(), v.getHours(), v.getMinutes(), v.getSeconds());\r\n    var dnthresh_utc = Date.UTC(1899, 11, 31, 0, 0, 0);\r\n\r\n    if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;\r\n    else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;\r\n    return (epoch - dnthresh_utc) / (24 * 60 * 60 * 1000);\r\n}\r\n\r\nfunction numdate(v) {\r\n    var out = new Date();\r\n    out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);\r\n    return out;\r\n}\r\n/* ISO 8601 Duration */\r\nfunction parse_isodur(s) {\r\n    var sec = 0,\r\n        mt = 0,\r\n        time = false;\r\n    var m = s.match(/P([0-9\\.]+Y)?([0-9\\.]+M)?([0-9\\.]+D)?T([0-9\\.]+H)?([0-9\\.]+M)?([0-9\\.]+S)?/);\r\n    if (!m) throw new Error(\"|\" + s + \"| is not an ISO8601 Duration\");\r\n    for (var i = 1; i != m.length; ++i) {\r\n        if (!m[i]) continue;\r\n        mt = 1;\r\n        if (i > 3) time = true;\r\n        switch (m[i].slice(m[i].length - 1)) {\r\n            case 'Y':\r\n                throw new Error(\"Unsupported ISO Duration Field: \" + m[i].slice(m[i].length - 1));\r\n            case 'D':\r\n                mt *= 24;\r\n                /* falls through */\r\n            case 'H':\r\n                mt *= 60;\r\n                /* falls through */\r\n            case 'M':\r\n                if (!time) throw new Error(\"Unsupported ISO Duration Field: M\");\r\n                else mt *= 60;\r\n                /* falls through */\r\n            case 'S':\r\n                break;\r\n        }\r\n        sec += mt * parseInt(m[i], 10);\r\n    }\r\n    return sec;\r\n}\r\nvar good_pd_date = new Date('2017-02-19T19:06:09.000Z');\r\nif (isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');\r\nvar good_pd = good_pd_date.getFullYear() == 2017;\r\n/* parses a date as a local date */\r\nfunction parseDate(str, fixdate) {\r\n    var d = new Date(str);\r\n    //console.log(d);\r\n    if (good_pd) {\r\n        if (fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);\r\n        else if (fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);\r\n        return d;\r\n    }\r\n    if (str instanceof Date) return str;\r\n    if (good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {\r\n        var s = d.getFullYear();\r\n        if (str.indexOf(\"\" + s) > -1) return d;\r\n        d.setFullYear(d.getFullYear() + 100);\r\n        return d;\r\n    }\r\n    var n = str.match(/\\d+/g) || [\"2017\", \"2\", \"19\", \"0\", \"0\", \"0\"];\r\n    var out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3] || 0), (+n[4] || 0), (+n[5] || 0));\r\n    if (str.indexOf(\"Z\") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);\r\n    return out;\r\n}\r\n\r\n/* TODO: stress test */\r\nfunction fuzzynum(s) {\r\n    var v = Number(s);\r\n    if(typeof s == \"number\"){\r\n        return s;\r\n    }\r\n    if (!isNaN(v)) return v;\r\n    var wt = 1;\r\n    var ss = s.replace(/([\\d]),([\\d])/g, \"$1$2\").replace(/[$]/g, \"\").replace(/[%]/g, function() {\r\n        wt *= 100;\r\n        return \"\";\r\n    });\r\n    if (!isNaN(v = Number(ss))) return v / wt;\r\n    ss = ss.replace(/[(](.*)[)]/, function($$, $1) {\r\n        wt = -wt;\r\n        return $1;\r\n    });\r\n    if (!isNaN(v = Number(ss))) return v / wt;\r\n    return v;\r\n}\r\n\r\nfunction fuzzydate(s) {\r\n    var o = new Date(s),\r\n        n = new Date(NaN);\r\n    var y = o.getYear(),\r\n        m = o.getMonth(),\r\n        d = o.getDate();\r\n    if (isNaN(d)) return n;\r\n    if (y < 0 || y > 8099) return n;\r\n    if ((m > 0 || d > 1) && y != 101) return o;\r\n    if (s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;\r\n    if (s.match(/[^-0-9:,\\/\\\\]/)) return n;\r\n    return o;\r\n}\r\n\r\nexport function genarate(value) {//\u4E07 \u5355\u4F4D\u683C\u5F0F\u589E\u52A0\uFF01\uFF01\uFF01\r\n    var ret = [];\r\n    var m = null, ct = {}, v = value;\r\n    \r\n    if(value == null){\r\n        return null;\r\n    }\r\n\r\n    if (/^-?[0-9]{1,}[,][0-9]{3}(.[0-9]{1,2})?$/.test(value)) { // \u8868\u8FF0\u91D1\u989D\u7684\u5B57\u7B26\u4E32\uFF0C\u5982\uFF1A12,000.00 \u6216\u8005 -12,000.00\r\n        m = value\r\n        v = Number(value.split('.')[0].replace(',', ''))\r\n        let fa = \"#,##0\"\r\n        if (value.split('.')[1]) {\r\n            fa = \"#,##0.\"\r\n            for (let i = 0; i < value.split('.')[1].length; i++) {\r\n                fa += 0\r\n            }\r\n        }\r\n        ct= {fa, t: \"n\"}\r\n    } else if(value.toString().substr(0, 1) === \"'\"){\r\n        m = value.toString().substr(1);\r\n        ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n    }\r\n    else if(value.toString().toUpperCase() === \"TRUE\"){\r\n        m = \"TRUE\";\r\n        ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        v = true;\r\n    }\r\n    else if(value.toString().toUpperCase() === \"FALSE\"){\r\n        m = \"FALSE\";\r\n        ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        v = false;\r\n    }\r\n    else if(valueIsError(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"General\", \"t\": \"e\" };\r\n    }\r\n    else if(/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n    }\r\n    else if(isRealNum(value) && Math.abs(parseFloat(value)) > 0 && (Math.abs(parseFloat(value)) >= 1e+11 || Math.abs(parseFloat(value)) < 1e-9)){\r\n        v = numeral(value).value();\r\n        var str = v.toExponential();\r\n        if(str.indexOf(\".\") > -1){\r\n            var strlen = str.split(\".\")[1].split(\"e\")[0].length;\r\n            if(strlen > 5){\r\n                strlen = 5;\r\n            }\r\n\r\n            ct = { \"fa\": \"#0.\"+ new Array(strlen + 1).join(\"0\") +\"E+00\", \"t\": \"n\" }; \r\n        }\r\n        else{\r\n            ct = { \"fa\": \"#0.E+00\", \"t\": \"n\" };\r\n        }\r\n\r\n        m = SSF.format(ct.fa, v);\r\n    }\r\n    else if(value.toString().indexOf(\"%\") > -1){\r\n        var index = value.toString().indexOf(\"%\");\r\n        var value2 = value.toString().substr(0, index);\r\n        var value3 = value2.replace(/,/g, \"\");\r\n\r\n        if(index == value.toString().length - 1 && isRealNum(value3)){\r\n            if(value2.indexOf(\".\") > -1){\r\n                if(value2.indexOf(\".\") == value2.lastIndexOf(\".\")){\r\n                    var value4 = value2.split(\".\")[0];\r\n                    var value5 = value2.split(\".\")[1];\r\n\r\n                    var len = value5.length;\r\n                    if(len > 9){\r\n                        len = 9;\r\n                    }\r\n\r\n                    if(value4.indexOf(\",\") > -1){\r\n                        var isThousands = true;\r\n                        var ThousandsArr = value4.split(\",\");\r\n\r\n                        for(var i = 1; i < ThousandsArr.length; i++){\r\n                            if(ThousandsArr[i].length < 3){\r\n                                isThousands = false;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(isThousands){\r\n                            ct = { \"fa\": \"#,##0.\" + new Array(len + 1).join(\"0\") + \"%\", \"t\": \"n\" };\r\n                            v = numeral(value).value();\r\n                            m = SSF.format(ct.fa, v);\r\n                        }\r\n                        else{\r\n                            m = value.toString();\r\n                            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                        }\r\n                    }\r\n                    else{\r\n                        ct = { \"fa\": \"0.\" + new Array(len + 1).join(\"0\") + \"%\", \"t\": \"n\" };\r\n                        v = numeral(value).value();\r\n                        m = SSF.format(ct.fa, v);\r\n                    }\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else if(value2.indexOf(\",\") > -1){\r\n                var isThousands = true;\r\n                var ThousandsArr = value2.split(\",\");\r\n\r\n                for(var i = 1; i < ThousandsArr.length; i++){\r\n                    if(ThousandsArr[i].length < 3){\r\n                        isThousands = false;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(isThousands){\r\n                    ct = { \"fa\": \"#,##0%\", \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else{\r\n                ct = { \"fa\": \"0%\", \"t\": \"n\" };\r\n                v = numeral(value).value();\r\n                m = SSF.format(ct.fa, v);\r\n            }\r\n        }\r\n        else{\r\n            m = value.toString();\r\n            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        }\r\n    }\r\n    else if(value.toString().indexOf(\".\") > -1){\r\n        if(value.toString().indexOf(\".\") == value.toString().lastIndexOf(\".\")){\r\n            var value1 = value.toString().split(\".\")[0];\r\n            var value2 = value.toString().split(\".\")[1];\r\n\r\n            var len = value2.length;\r\n            if(len > 9){\r\n                len = 9;\r\n            }\r\n\r\n            if(value1.indexOf(\",\") > -1){\r\n                var isThousands = true;\r\n                var ThousandsArr = value1.split(\",\");\r\n\r\n                for(var i = 1; i < ThousandsArr.length; i++){\r\n                    if(!isRealNum(ThousandsArr[i]) || ThousandsArr[i].length < 3){\r\n                        isThousands = false;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(isThousands){\r\n                    ct = { \"fa\": \"#,##0.\" + new Array(len + 1).join(\"0\"), \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else{\r\n                if(isRealNum(value1) && isRealNum(value2)){\r\n                    ct = { \"fa\": \"0.\" + new Array(len + 1).join(\"0\"), \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            m = value.toString();\r\n            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        }\r\n    }\r\n    else if(isRealNum(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n        v = parseFloat(value);\r\n    }\r\n    else if (isdatetime(value) && (value.toString().indexOf(\".\") > -1 || value.toString().indexOf(\":\") > -1 || value.toString().length < 16)){\r\n        v = datenum_local(parseDate(value.toString().replace(/-/g, \"/\")));\r\n\r\n        if(v.toString().indexOf(\".\") > -1){\r\n            if(value.toString().length > 18){\r\n                ct.fa = \"yyyy-MM-dd hh:mm:ss\";\r\n            }\r\n            else if(value.toString().length > 11){\r\n                ct.fa = \"yyyy-MM-dd hh:mm\";\r\n            }\r\n            else{\r\n                ct.fa = \"yyyy-MM-dd\";\r\n            }\r\n        }\r\n        else{\r\n            ct.fa = \"yyyy-MM-dd\";\r\n        }\r\n        \r\n        ct.t = \"d\";\r\n        m = SSF.format(ct.fa, v);\r\n    }\r\n    else{\r\n        m = value;\r\n        ct.fa = \"General\";\r\n        ct.t = \"g\";\r\n    }\r\n\r\n    return [m, ct, v];\r\n}\r\n\r\nexport function update(fmt, v) {\r\n    return SSF.format(fmt, v);\r\n}\r\n\r\nexport function is_date(fmt, v) {\r\n    return SSF.is_date(fmt, v);\r\n}\r\n\r\nexport function valueShowEs(r, c, d) {\r\n    var value = getcellvalue(r, c, d, \"m\");\r\n    if(value == null){\r\n        value = getcellvalue(r, c, d, \"v\");\r\n    }\r\n    else{\r\n        if (!isNaN(fuzzynum(value))){\r\n            if(typeof(value) == \"string\" && value.indexOf(\"%\") > -1){\r\n                \r\n            }\r\n            else{\r\n                value = getcellvalue(r, c, d, \"v\");\r\n            }\r\n        }\r\n        // else if (!isNaN(parseDate(value).getDate())){\r\n        else if (d[r][c].ct != null && d[r][c].ct.t == \"d\"){\r\n\r\n        }\r\n        else if (d[r][c].ct != null && d[r][c].ct.t == \"b\"){\r\n\r\n        }\r\n        else{\r\n            value = getcellvalue(r, c, d, \"v\");\r\n        }\r\n    }\r\n    return value;\r\n}\r\n", "import { getObjType } from '../utils/util';\r\nimport { isRealNull, isRealNum, valueIsError } from './validate';\r\nimport { genarate, update } from './format';\r\nimport server from '../controllers/server';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport Store from '../store/index'\r\n\r\n//Set cell value\r\nfunction setcellvalue(r, c, d, v) {\r\n    if(d == null){\r\n        d = Store.flowdata;\r\n    }\r\n    // \u82E5\u91C7\u7528\u6DF1\u62F7\u8D1D\uFF0C\u521D\u59CB\u5316\u65F6\u7684\u5355\u5143\u683C\u5C5E\u6027\u4E22\u5931\r\n    // let cell = $.extend(true, {}, d[r][c]);\r\n    let cell = d[r][c];\r\n\r\n    let vupdate;\r\n\r\n    if(getObjType(v) == \"object\"){\r\n        if(cell == null){\r\n            cell = v;\r\n        }\r\n        else{\r\n            if(v.f != null){\r\n                cell.f = v.f;\r\n            }else if(cell.hasOwnProperty('f')){\r\n                delete cell.f;\r\n            }\r\n\r\n            if(v.spl != null){\r\n                cell.spl = v.spl;\r\n            }\r\n\r\n            if(v.ct != null){\r\n                cell.ct = v.ct;\r\n            }\r\n        }\r\n\r\n\r\n        if(getObjType(v.v) == \"object\"){\r\n            vupdate = v.v.v;\r\n        }\r\n        else{\r\n            vupdate = v.v;\r\n        }\r\n    }\r\n    else{\r\n        vupdate = v;\r\n    }\r\n\r\n    if(isRealNull(vupdate)){\r\n        if(getObjType(cell) == \"object\"){\r\n            delete cell.m;\r\n            delete cell.v;\r\n        }\r\n        else{\r\n            cell = null;\r\n        }\r\n\r\n        d[r][c] = cell;\r\n\r\n        return;\r\n    }\r\n\r\n    // 1.\u4E3Anull\r\n    // 2.\u6570\u636E\u900F\u89C6\u8868\u7684\u6570\u636E\uFF0Cflowdata\u7684\u6BCF\u4E2A\u6570\u636E\u53EF\u80FD\u4E3A\u5B57\u7B26\u4E32\uFF0C\u7ED3\u679C\u5C31\u662Fcell == v == \u4E00\u4E2A\u5B57\u7B26\u4E32\u6216\u8005\u6570\u5B57\u6570\u636E\r\n    if(isRealNull(cell) || (getObjType(cell) === 'string' || getObjType(cell) === 'number') && cell === v){\r\n        cell = {};\r\n    }\r\n\r\n    let vupdateStr = vupdate.toString();\r\n\r\n    if(vupdateStr.substr(0, 1) == \"'\"){\r\n        cell.m = vupdateStr.substr(1);\r\n        cell.ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        cell.v = vupdateStr.substr(1);\r\n        cell.qp = 1;\r\n    }\r\n    else if(cell.qp == 1){\r\n        cell.m = vupdateStr;\r\n        cell.ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        cell.v = vupdateStr;\r\n    }\r\n    else if(vupdateStr.toUpperCase() === \"TRUE\"){\r\n        cell.m = \"TRUE\";\r\n        cell.ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        cell.v = true;\r\n    }\r\n    else if(vupdateStr.toUpperCase() === \"FALSE\"){\r\n        cell.m = \"FALSE\";\r\n        cell.ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        cell.v = false;\r\n    }\r\n    else if(vupdateStr.substr(-1) === \"%\" && isRealNum(vupdateStr.substring(0, vupdateStr.length-1))){\r\n            cell.ct = {fa: \"0%\", t: \"n\"};\r\n            cell.v = vupdateStr.substring(0, vupdateStr.length-1) / 100;\r\n            cell.m = vupdate;\r\n    }\r\n    else if(valueIsError(vupdate)){\r\n        cell.m = vupdateStr;\r\n        // cell.ct = { \"fa\": \"General\", \"t\": \"e\" };\r\n        if(cell.ct!=null){\r\n            cell.ct.t = \"e\";\r\n        }\r\n        else{\r\n            cell.ct = { \"fa\": \"General\", \"t\": \"e\" };\r\n        }\r\n        cell.v = vupdate;\r\n    }\r\n    else{\r\n        if(cell.f != null && isRealNum(vupdate) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(vupdate)){\r\n            cell.v = parseFloat(vupdate);\r\n            if(cell.ct==null){\r\n                cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n            }\r\n\r\n            if(cell.v == Infinity || cell.v == -Infinity){\r\n                cell.m = cell.v.toString();\r\n            }\r\n            else{\r\n                if(cell.v.toString().indexOf(\"e\") > -1){\r\n                    let len;\r\n                    if(cell.v.toString().split(\".\").length==1){\r\n                        len = 0;\r\n                    }\r\n                    else{\r\n                        len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                    }\r\n                    if(len > 5){\r\n                        len = 5;\r\n                    }\r\n\r\n                    cell.m = cell.v.toExponential(len).toString();\r\n                }\r\n                else{\r\n                    let v_p = Math.round(cell.v * 1000000000) / 1000000000;\r\n                    if(cell.ct==null){\r\n                        let mask = genarate(v_p);\r\n                        cell.m = mask[0].toString();\r\n                    }\r\n                    else{\r\n                        let mask = update(cell.ct.fa, v_p);\r\n                        cell.m = mask.toString();\r\n                    }\r\n\r\n                    // cell.m = mask[0].toString();\r\n                }\r\n            }\r\n        }\r\n        else if(cell.ct != null && cell.ct.fa == \"@\"){\r\n            cell.m = vupdateStr;\r\n            cell.v = vupdate;\r\n        }\r\n        else if(cell.ct != null && cell.ct.fa != null && cell.ct.fa != \"General\"){\r\n            if(isRealNum(vupdate)){\r\n                vupdate = parseFloat(vupdate);\r\n            }\r\n\r\n            let mask = update(cell.ct.fa, vupdate);\r\n\r\n            if(mask === vupdate){ //\u82E5\u539F\u6765\u5355\u5143\u683C\u683C\u5F0F \u5E94\u7528\u4E0D\u4E86 \u8981\u66F4\u65B0\u7684\u503C\uFF0C\u5219\u83B7\u53D6\u66F4\u65B0\u503C\u7684 \u683C\u5F0F\r\n                mask = genarate(vupdate);\r\n\r\n                cell.m = mask[0].toString();\r\n                cell.ct = mask[1];\r\n                cell.v = mask[2];\r\n            }\r\n            else{\r\n                cell.m = mask.toString();\r\n                cell.v = vupdate;\r\n            }\r\n        }\r\n        else{\r\n            if(isRealNum(vupdate) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(vupdate)){\r\n\r\n                if(typeof vupdate === \"string\"){\r\n                    let flag = vupdate.split(\"\").every(ele=>ele == \"0\" || ele == \".\");\r\n                    if(flag){\r\n                        vupdate = parseFloat(vupdate);\r\n                    }\r\n                }\r\n                cell.v = vupdate;   /* \u5907\u6CE8\uFF1A\u5982\u679C\u4F7F\u7528parseFloat\uFF0C1.1111111111111111\u4F1A\u8F6C\u6362\u4E3A1.1111111111111112 ? */\r\n                cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                if(cell.v == Infinity || cell.v == -Infinity){\r\n                    cell.m = cell.v.toString();\r\n                }\r\n                else{\r\n                    let mask = genarate(cell.v);\r\n\r\n                    cell.m = mask[0].toString();\r\n                }\r\n            }\r\n            else{\r\n                let mask = genarate(vupdate);\r\n\r\n                cell.m = mask[0].toString();\r\n                cell.ct = mask[1];\r\n                cell.v = mask[2];\r\n            }\r\n        }\r\n    }\r\n\r\n    if(!server.allowUpdate && !luckysheetConfigsetting.pointEdit){\r\n        if(cell.ct != null && /^(w|W)((0?)|(0\\.0+))$/.test(cell.ct.fa) == false && cell.ct.t == \"n\" && cell.v != null && parseInt(cell.v).toString().length > 4){\r\n            let autoFormatw = luckysheetConfigsetting.autoFormatw.toString().toUpperCase();\r\n            let accuracy = luckysheetConfigsetting.accuracy;\r\n\r\n            let sfmt = setAccuracy(autoFormatw, accuracy);\r\n\r\n            if(sfmt != \"General\") {\r\n                cell.ct.fa = sfmt;\r\n                cell.m = update(sfmt, cell.v);\r\n            }\r\n        }\r\n    }\r\n\r\n    d[r][c] = cell;\r\n}\r\n\r\n//new runze \u6839\u636E\u4EBF\u4E07\u683C\u5F0FautoFormatw\u548C\u7CBE\u786E\u5EA6accuracy \u8F6C\u6362\u6210 w/w0/w0.00 or 0/0.0\u683C\u5F0F\r\nfunction setAccuracy(autoFormatw, accuracy) {\r\n    let acc = \"0.\";\r\n    let fmt;\r\n\r\n    if(autoFormatw == \"TRUE\"){\r\n        if(accuracy == undefined){\r\n            return \"w\";\r\n        }\r\n        else{\r\n            let alength = parseInt(accuracy);\r\n\r\n            if(alength == 0){\r\n                return \"w0\";\r\n            }\r\n            else{\r\n                acc = \"w0.\";\r\n\r\n                for(let i = 0; i < alength; i++){\r\n                    acc += \"0\";\r\n                }\r\n\r\n                fmt = acc;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        if(accuracy == undefined){\r\n            return \"General\";\r\n        }\r\n        else{\r\n            let alength = parseInt(accuracy);\r\n\r\n            if(alength == 0){\r\n                return \"0\";\r\n            }\r\n            else{\r\n                for(let i = 0; i < alength; i++){\r\n                    acc += \"0\";\r\n                }\r\n\r\n                fmt = acc;\r\n            }\r\n\r\n        }\r\n    }\r\n\r\n    return fmt.toString();\r\n}\r\n\r\nexport {\r\n    setcellvalue,\r\n    setAccuracy,\r\n}\r\n", "import Store from '../store';\r\nimport { getdatabyselectionNoCopy } from './getdata';\r\nimport { isRealNull, isRealNum } from './validate';\r\nimport { update } from './format';\r\nimport locale from '../locale/locale';\r\n\r\n//\u8868\u683C\u8BA1\u6570\u680F\r\nexport function countfunc() {\r\n    if(Store.luckysheet_select_save.length == 0){\r\n        return;\r\n    }\r\n\r\n    let min = Infinity,   //\u6700\u5C0F\u503C\r\n    \tmax = -Infinity,  //\u6700\u5927\u503C\r\n    \tsum = 0,          //\u6C42\u548C \r\n    \tcount = 0,        //\u8BA1\u6570\uFF08\u975E\u7A7A\u5355\u5143\u683C\uFF09\r\n    \tmean = 0;         //\u5E73\u5747\u503C\r\n\r\n    for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n        let data = getdatabyselectionNoCopy(Store.luckysheet_select_save[s]);\r\n\r\n        for (let r = 0; r < data.length; r++) {\r\n            for (let c = 0; c < data[0].length; c++) {\r\n                if(isRealNull(data[r][c])){\r\n                    continue;\r\n                }\r\n\r\n                count++;\r\n\r\n                if(data[r][c].ct != null && data[r][c].ct.t == \"d\"){\r\n                    continue;\r\n                }\r\n\r\n                let value = data[r][c].v;\r\n\r\n                if(!isRealNum(value)){\r\n                    continue;\r\n                }\r\n\r\n                value = parseFloat(value);\r\n\r\n                sum += value;\r\n\r\n                if(value < min){\r\n                    min = value;\r\n                }\r\n\r\n                if(value > max){\r\n                    max = value;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let locale_formula = locale().formula;\r\n\r\n    let ret = \"\";\r\n    ret += \"<span>\"+locale_formula.count+\":\" + count + \"</span>\";\r\n\r\n    //\u5904\u7406\u6210\u4EBF\u4E07\u683C\u5F0F\r\n    if (isFinite(max) || isFinite(min)) {\r\n        ret += \"<span>\"+locale_formula.sum+\":\" + update(\"w\", sum) + \"</span>\";\r\n        ret += \"<span>\"+locale_formula.average+\":\" + update(\"w\", Math.round(sum / count * 10000) / 10000) + \"</span>\";\r\n    }\r\n\r\n    if (isFinite(max)) {\r\n        ret += \"<span>\"+locale_formula.max+\":\" + update(\"w\", max) + \"</span>\";\r\n    }\r\n\r\n    if (isFinite(min)) {\r\n        ret += \"<span>\"+locale_formula.min+\":\" + update(\"w\", min) + \"</span>\";\r\n    }\r\n\r\n    $(\"#luckysheet-sta-content\").html(ret);\r\n}\r\n", "import { getObjType } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNull } from '../global/validate';\r\nimport { countfunc } from '../global/count';\r\nimport menuButton from './menuButton';\r\nimport { selectHightlightShow } from './select';\r\nimport pivotTable from './pivotTable';\r\nimport Store from '../store';\r\nimport server from './server';\r\n\r\nfunction luckysheetMoveEndCell(postion, type, isScroll, terminal, onlyvalue) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion = \"down\";\r\n    }\r\n\r\n    if (!type) {\r\n        type = \"cell\";\r\n    }\r\n\r\n    if (onlyvalue == null) {\r\n        onlyvalue = false;\r\n    }\r\n\r\n    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n    let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n    let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n\r\n    let startR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n    let startC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n\r\n    let endR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n    let endC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n\r\n    formula.fucntionboxshow(curR, curC);\r\n\r\n    if (type == \"range\") {\r\n        // need var\r\n        var p_startR = Store.luckysheet_shiftpositon[\"row\"][0];\r\n        var p_startC = Store.luckysheet_shiftpositon[\"column\"][0];\r\n\r\n        let p_endR = Store.luckysheet_shiftpositon[\"row\"][1];\r\n        let p_endC = Store.luckysheet_shiftpositon[\"column\"][1];\r\n\r\n        if (postion == \"down\" || postion == \"up\") {\r\n            if (p_endR < endR) {\r\n                curR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n            }\r\n            else if (p_startR > startR) {\r\n                curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n            }\r\n            else if (p_endR == endR && p_startR == startR) {\r\n                if (postion == \"down\") {\r\n                    curR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n                }\r\n                else {\r\n                    curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"right\" || postion == \"left\") {\r\n            if (p_endC < endC) {\r\n                curC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n            }\r\n            else if (p_startC > startC) {\r\n                curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n            }\r\n            else if (p_endC == endC && p_startC == startC) {\r\n                if (postion == \"right\") {\r\n                    curC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n                }\r\n                else {\r\n                    curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let datarowlen = Store.flowdata.length, \r\n        datacolumnlen = Store.flowdata[0].length;\r\n\r\n    let data = Store.flowdata, moveP = \"\", moveV = 0;\r\n\r\n    if (postion == \"up\") {\r\n        if (curR == 0) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let c = startC; c <= endC; c++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let r = curR - 1; r >= 0; r--) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = r;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = r + 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = 0;\r\n                }\r\n\r\n                if (p_pre == null || p < p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"down\";\r\n            moveV = p_pre - curR;\r\n        }\r\n    }\r\n    else if (postion == \"down\") {\r\n        if (curR == datarowlen - 1) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let c = startC; c <= endC; c++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let r = curR + 1; r < data.length; r++) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n                    \r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = r;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = r - 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = data.length - 1;\r\n                }\r\n\r\n                if (p_pre == null || p > p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"down\";\r\n            moveV = p_pre - curR;\r\n        }\r\n    }\r\n    else if (postion == \"left\") {\r\n        if (curC == 0) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let r = startR; r <= endR; r++) {\r\n                stvalue = [];\r\n                i = 0;\r\n                for (let c = curC - 1; c >= 0; c--) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = c;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = c + 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = 0;\r\n                }\r\n\r\n                if (p_pre == null || p < p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"right\";\r\n            moveV = p_pre - curC;\r\n        }\r\n    }\r\n    else if (postion == \"right\") {\r\n        if (curC == datacolumnlen - 1) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let r = startR; r <= endR; r++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let c = curC + 1; c < data[0].length; c++) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = c;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = c - 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = data[0].length - 1;\r\n                }\r\n\r\n                if (p_pre == null || p > p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n\r\n            moveP = \"right\";\r\n            moveV = p_pre - curC;\r\n        }\r\n    }\r\n\r\n    if (type == \"range\") {\r\n        if (postion == \"up\") {\r\n            if (p_endR < endR) {\r\n                if (moveV + curR < p_endR) {\r\n                    moveV = p_endR - curR;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"down\") {\r\n            if (p_startR > startR) {\r\n                if (moveV + curR > p_startR) {\r\n                    moveV = p_startR - curR;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"left\") {\r\n            if (p_endC < endC) {\r\n                if (moveV + curC < p_endC) {\r\n                    moveV = p_endC - curC;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"right\") {\r\n            if (p_startC > startC) {\r\n                if (moveV + curC > p_startC) {\r\n                    moveV = p_startC - curC;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (terminal != null && Math.abs(moveV) > Math.abs(terminal)) {\r\n            moveV = terminal;\r\n        }\r\n    }\r\n\r\n    if (!onlyvalue) {\r\n        if (type == \"cell\") {\r\n            luckysheetMoveHighlightCell(moveP, moveV, \"rangeOfSelect\", isScroll);\r\n        }\r\n        else if (type == \"range\") {\r\n            luckysheetMoveHighlightRange(moveP, moveV, \"rangeOfSelect\", isScroll);\r\n        }\r\n    }\r\n    else {\r\n        return moveV;\r\n    }\r\n}\r\n\r\n//\u65B9\u5411\u952E  \u8C03\u6574\u5355\u5143\u683C\r\nfunction luckysheetMoveHighlightCell(postion, index, type, isScroll) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion == \"down\";\r\n    }\r\n\r\n    let datarowlen = Store.flowdata.length, \r\n        datacolumnlen = Store.flowdata[0].length;\r\n\r\n    let row, row_pre, row_index, row_index_ed;\r\n    let col, col_pre, col_index, col_index_ed;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        \r\n        let curR;\r\n        if(last[\"row_focus\"] == null){\r\n            curR = last[\"row\"][0];    \r\n        }\r\n        else{\r\n            curR = last[\"row_focus\"];    \r\n        }\r\n\r\n        let curC;\r\n        if(last[\"column_focus\"] == null){\r\n            curC = last[\"column\"][0];\r\n        }\r\n        else{\r\n            curC = last[\"column_focus\"];    \r\n        }\r\n        \r\n        //focus\u5355\u5143\u683C \u662F\u5426\u662F\u5408\u5E76\u5355\u5143\u683C\r\n        let margeset = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset){\r\n            let str_r = margeset.row[2];\r\n            let end_r = margeset.row[3];\r\n\r\n            let str_c = margeset.column[2];\r\n            let end_c = margeset.column[3];\r\n\r\n            if(index > 0){\r\n                if(postion == \"down\"){\r\n                    curR = end_r;\r\n                    curC = str_c;\r\n                }\r\n                else if(postion == \"right\"){\r\n                    curR = str_r;\r\n                    curC = end_c;\r\n                }\r\n            }\r\n            else{\r\n                curR = str_r;\r\n                curC = str_c;\r\n            }\r\n        }\r\n\r\n        let moveX = last[\"moveXY\"] == null ? curR : last[\"moveXY\"].x;\r\n        let moveY = last[\"moveXY\"] == null ? curC : last[\"moveXY\"].y;\r\n\r\n        if (postion == \"down\") {\r\n            curR += index;\r\n            moveX = curR;\r\n        }\r\n        else if (postion == \"right\") {\r\n            curC += index;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curR >= datarowlen) {\r\n            curR = datarowlen - 1;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curR < 0) {\r\n            curR = 0;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curC >= datacolumnlen) {\r\n            curC = datacolumnlen - 1;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curC < 0) {\r\n            curC = 0;\r\n            moveY = curC;\r\n        }\r\n\r\n        //\u79FB\u52A8\u7684\u4E0B\u4E00\u4E2A\u5355\u5143\u683C\u662F\u5426\u662F\u5408\u5E76\u7684\u5355\u5143\u683C\r\n        let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset2){\r\n            row = margeset2.row[1];\r\n            row_pre = margeset2.row[0];\r\n            row_index = margeset2.row[2];\r\n            row_index_ed = margeset2.row[3];\r\n\r\n            col = margeset2.column[1];\r\n            col_pre = margeset2.column[0];\r\n            col_index = margeset2.column[2];\r\n            col_index_ed = margeset2.column[3];\r\n        }\r\n        else{\r\n            row = Store.visibledatarow[moveX]; \r\n            row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1];\r\n            // row_index = moveX;\r\n            // row_index_ed = moveX;\r\n\r\n            col = Store.visibledatacolumn[moveY]; \r\n            col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1];\r\n            // col_index = moveY;\r\n            // col_index_ed = moveY;\r\n            \r\n            row_index = row_index_ed = curR;\r\n            col_index = col_index_ed = curC;\r\n        }\r\n\r\n        last[\"row\"] = [row_index, row_index_ed];\r\n        last[\"column\"] = [col_index, col_index_ed];\r\n        last[\"row_focus\"] = row_index;\r\n        last[\"column_focus\"] = col_index;\r\n        last[\"moveXY\"] = {\"x\": moveX,\"y\": moveY};\r\n\r\n        selectHightlightShow();\r\n        pivotTable.pivotclick(row_index, col_index);\r\n        formula.fucntionboxshow(row_index, col_index);\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        \r\n        let curR;\r\n        if(last[\"row_focus\"] == null){\r\n            curR = last[\"row\"][0];    \r\n        }\r\n        else{\r\n            curR = last[\"row_focus\"];    \r\n        }\r\n\r\n        let curC;\r\n        if(last[\"column_focus\"] == null){\r\n            curC = last[\"column\"][0];\r\n        }\r\n        else{\r\n            curC = last[\"column_focus\"];    \r\n        }\r\n        \r\n        //focus\u5355\u5143\u683C \u662F\u5426\u662F\u5408\u5E76\u5355\u5143\u683C\r\n        let margeset = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset){\r\n            let str_r = margeset.row[2];\r\n            let end_r = margeset.row[3];\r\n\r\n            let str_c = margeset.column[2];\r\n            let end_c = margeset.column[3];\r\n\r\n            if(index > 0){\r\n                if(postion == \"down\"){\r\n                    curR = end_r;\r\n                    curC = str_c;\r\n                }\r\n                else if(postion == \"right\"){\r\n                    curR = str_r;\r\n                    curC = end_c;\r\n                }\r\n            }\r\n            else{\r\n                curR = str_r;\r\n                curC = str_c;\r\n            }\r\n        }\r\n\r\n        let moveX = last[\"moveXY\"] == null ? curR : last[\"moveXY\"].x;\r\n        let moveY = last[\"moveXY\"] == null ? curC : last[\"moveXY\"].y;\r\n\r\n        if (postion == \"down\") {\r\n            curR += index;\r\n            moveX = curR;\r\n        }\r\n        else if (postion == \"right\") {\r\n            curC += index;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curR >= datarowlen) {\r\n            curR = datarowlen - 1;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curR < 0) {\r\n            curR = 0;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curC >= datacolumnlen) {\r\n            curC = datacolumnlen - 1;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curC < 0) {\r\n            curC = 0;\r\n            moveY = curC;\r\n        }\r\n\r\n        //\u79FB\u52A8\u7684\u4E0B\u4E00\u4E2A\u5355\u5143\u683C\u662F\u5426\u662F\u5408\u5E76\u7684\u5355\u5143\u683C\r\n        let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset2){\r\n            row = margeset2.row[1];\r\n            row_pre = margeset2.row[0];\r\n            row_index = margeset2.row[2];\r\n            row_index_ed = margeset2.row[3];\r\n\r\n            col = margeset2.column[1];\r\n            col_pre = margeset2.column[0];\r\n            col_index = margeset2.column[2];\r\n            col_index_ed = margeset2.column[3];\r\n        }\r\n        else{\r\n            row = Store.visibledatarow[moveX]; \r\n            row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1];\r\n            row_index = moveX;\r\n            row_index_ed = moveX;\r\n\r\n            col = Store.visibledatacolumn[moveY];\r\n            col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1];\r\n            col_index = moveY;\r\n            col_index_ed = moveY;\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1,\r\n            \"left_move\": col_pre,\r\n            \"width_move\": col - col_pre - 1,\r\n            \"top_move\": row_pre,\r\n            \"height_move\": row - row_pre - 1,\r\n            \"row\": [row_index, row_index_ed],\r\n            \"column\": [col_index, col_index_ed],\r\n            \"row_focus\": row_index,\r\n            \"column_focus\": col_index,\r\n            \"moveXY\": {\"x\": moveX, \"y\": moveY}\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": [row_index, row_index_ed],\r\n            \"column\": [col_index, col_index_ed]\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n    \r\n    // \u79FB\u52A8\u5355\u5143\u683C\u901A\u77E5\u540E\u53F0\r\n    server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n}\r\n\r\n//ctrl + \u65B9\u5411\u952E  \u8C03\u6574\u5355\u5143\u683C\r\nfunction luckysheetMoveHighlightCell2(postion, type, isScroll) {\r\n    if(!isScroll){\r\n        isScroll = true;\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let focusIsMerge = false, mc = {};\r\n        if(Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]){\r\n            focusIsMerge = true;\r\n            mc = Store.config[\"merge\"][rf + \"_\" + cf];\r\n        }\r\n\r\n        if(postion == \"down\"){\r\n            if(rf == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"down\", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"down\", cf, rf, Store.flowdata.length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(rf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"up\", cf, 0, mc.r);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"up\", cf, 0, rf);\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(cf == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"right\", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"right\", rf, cf, Store.flowdata[0].length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(cf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"left\", rf, 0, mc.c);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"left\", rf, 0, cf);\r\n            }\r\n        }\r\n\r\n        let rowseleted = [rf, rf];\r\n        let columnseleted = [cf, cf];\r\n\r\n        row = Store.visibledatarow[rf];\r\n        row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n        col = Store.visibledatacolumn[cf];\r\n        col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{\"row\": rowseleted, \"column\": columnseleted}];\r\n        selectHightlightShow();\r\n        pivotTable.pivotclick(rf, cf);\r\n        formula.fucntionboxshow(rf, cf);\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let focusIsMerge = false, mc = {};\r\n        if(Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]){\r\n            focusIsMerge = true;\r\n            mc = Store.config[\"merge\"][rf + \"_\" + cf];\r\n        }\r\n\r\n        if(postion == \"down\"){\r\n            if(rf == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"down\", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"down\", cf, rf, Store.flowdata.length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(rf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"up\", cf, 0, mc.r);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"up\", cf, 0, rf);\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(cf == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"right\", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"right\", rf, cf, Store.flowdata[0].length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(cf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"left\", rf, 0, mc.c);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"left\", rf, 0, cf);\r\n            }\r\n        }\r\n\r\n        let rowseleted = [rf, rf];\r\n        let columnseleted = [cf, cf];\r\n\r\n        row = Store.visibledatarow[rf];\r\n        row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n        col = Store.visibledatacolumn[cf]; \r\n        col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//shift + \u65B9\u5411\u952E  \u8C03\u6574\u9009\u533A\r\nfunction luckysheetMoveHighlightRange(postion, index, type, isScroll) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion == \"down\";\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let curR = last[\"row\"][0], endR = last[\"row\"][1];\r\n        let curC = last[\"column\"][0], endC = last[\"column\"][1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let datarowlen = Store.flowdata.length, \r\n            datacolumnlen = Store.flowdata[0].length;\r\n\r\n        if(postion == \"down\"){ //\u9009\u533A\u4E0A\u4E0B\u53D8\u52A8\r\n            if(rowHasMerge(rf, curC, endC)){ //focus\u5355\u5143\u683C\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, curC, endC);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > curR && rf_end == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf_end < endR && rf_str == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(rf > curR && rf == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf < endR && rf == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else if(rf == curR && rf == endR){\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (endR >= datarowlen) {\r\n                endR = datarowlen - 1;\r\n            }\r\n\r\n            if (endR < 0) {\r\n                endR = 0;\r\n            }\r\n\r\n            if (curR >= datarowlen) {\r\n                curR = datarowlen - 1;\r\n            }\r\n\r\n            if (curR < 0) {\r\n                curR = 0;\r\n            }\r\n        }\r\n        else{\r\n            if(colHasMerge(cf, curR, endR)){ //focus\u5355\u5143\u683C\u6240\u5728\u5217\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, curR, endR);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > curC && cf_end == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf_end < endC && cf_str == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(cf > curC && cf == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf < endC && cf == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else if(cf == curC && cf == endC){\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            } \r\n\r\n            if (endC >= datacolumnlen) {\r\n                endC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (endC < 0) {\r\n                endC = 0;\r\n            }\r\n\r\n            if (curC >= datacolumnlen) {\r\n                curC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (curC < 0) {\r\n                curC = 0;\r\n            }\r\n        }\r\n\r\n        let rowseleted = [curR, endR];\r\n        let columnseleted = [curC, endC];\r\n\r\n        row = Store.visibledatarow[endR]; \r\n        row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1];\r\n        col = Store.visibledatacolumn[endC]; \r\n        col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        last[\"row\"] = rowseleted;\r\n        last[\"column\"] = columnseleted;\r\n\r\n        selectHightlightShow();\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n\r\n        let curR = last[\"row\"][0], endR = last[\"row\"][1];\r\n        let curC = last[\"column\"][0], endC = last[\"column\"][1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let datarowlen = Store.flowdata.length, \r\n            datacolumnlen = Store.flowdata[0].length;\r\n\r\n        if(postion == \"down\"){ //\u9009\u533A\u4E0A\u4E0B\u53D8\u52A8\r\n            if(rowHasMerge(rf, curC, endC)){ //focus\u5355\u5143\u683C\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, curC, endC);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > curR && rf_end == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf_end < endR && rf_str == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(rf > curR && rf == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf < endR && rf == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else if(rf == curR && rf == endR){\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (endR >= datarowlen) {\r\n                endR = datarowlen - 1;\r\n            }\r\n\r\n            if (endR < 0) {\r\n                endR = 0;\r\n            }\r\n\r\n            if (curR >= datarowlen) {\r\n                curR = datarowlen - 1;\r\n            }\r\n\r\n            if (curR < 0) {\r\n                curR = 0;\r\n            }\r\n        }\r\n        else{\r\n            if(colHasMerge(cf, curR, endR)){ //focus\u5355\u5143\u683C\u6240\u5728\u5217\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, curR, endR);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > curC && cf_end == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf_end < endC && cf_str == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(cf > curC && cf == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf < endC && cf == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else if(cf == curC && cf == endC){\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            } \r\n\r\n            if (endC >= datacolumnlen) {\r\n                endC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (endC < 0) {\r\n                endC = 0;\r\n            }\r\n\r\n            if (curC >= datacolumnlen) {\r\n                curC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (curC < 0) {\r\n                curC = 0;\r\n            }\r\n        }\r\n\r\n        let rowseleted = [curR, endR];\r\n        let columnseleted = [curC, endC];\r\n\r\n        row = Store.visibledatarow[endR]; \r\n        row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1];\r\n        col = Store.visibledatacolumn[endC]; \r\n        col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//ctrl + shift + \u65B9\u5411\u952E  \u8C03\u6574\u9009\u533A\r\nfunction luckysheetMoveHighlightRange2(postion, type, isScroll) {\r\n    if(!isScroll){\r\n        isScroll = true;\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if(postion == \"down\"){\r\n            if(r2 == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > r1 && rf_end == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf > r1 && rf == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(r1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_end < r2 && rf_str == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf < r2 && rf == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(c2 == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > c1 && cf_end == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf > c1 && cf == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(c1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_end < c2 && cf_str == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf < c2 && cf == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n        }\r\n\r\n        let rowseleted = [r1, r2];\r\n        let columnseleted = [c1, c2];\r\n\r\n        row = Store.visibledatarow[r2]; \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        col = Store.visibledatacolumn[c2]; \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        last[\"row\"] = rowseleted;\r\n        last[\"column\"] = columnseleted;\r\n\r\n        selectHightlightShow();\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if(postion == \"down\"){\r\n            if(r2 == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > r1 && rf_end == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf > r1 && rf == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(r1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_end < r2 && rf_str == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf < r2 && rf == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(c2 == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > c1 && cf_end == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf > c1 && cf == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(c1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus\u6240\u5728\u884C\u6709\u5408\u5E76\u5355\u5143\u683C\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_end < c2 && cf_str == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf < c2 && cf == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n        }\r\n\r\n        let rowseleted = [r1, r2];\r\n        let columnseleted = [c1, c2];\r\n\r\n        row = Store.visibledatarow[r2]; \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        col = Store.visibledatacolumn[c2]; \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//shift + \u65B9\u5411\u952E / ctrl + shift + \u65B9\u5411\u952E \u529F\u80FD\r\nfunction rowHasMerge(r, c1, c2){\r\n    let rowHasMerge = false;\r\n\r\n    for(let c = c1; c <= c2; c++){\r\n        let cell = Store.flowdata[r][c];\r\n\r\n        if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n            rowHasMerge = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return rowHasMerge;\r\n}\r\nfunction colHasMerge(c, r1, r2){\r\n    let colHasMerge = false;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        let cell = Store.flowdata[r][c];\r\n\r\n        if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n            colHasMerge = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return colHasMerge;\r\n}\r\nfunction getRowMerge(rIndex, c1, c2){\r\n    let r1 = 0, r2 = Store.flowdata.length - 1;\r\n\r\n    let str = null;\r\n    if(rIndex > r1){\r\n        for(let r = rIndex; r >= r1; r--){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(str == null || mc.r < str){\r\n                        str = mc.r;\r\n                    }\r\n                }    \r\n            }\r\n\r\n            if(rowHasMerge(str - 1, c1, c2) && str > r1){\r\n                r = str - 1;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        str = r1;\r\n    }\r\n\r\n    let end = null;\r\n    if(rIndex < r2){\r\n        for(let r = rIndex; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(end == null || (mc.r + mc.rs - 1) > end){\r\n                        end = mc.r + mc.rs - 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(rowHasMerge(end + 1, c1, c2) && end < r2){\r\n                r = end + 1;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        end = r2;\r\n    }\r\n\r\n    return [str, end];\r\n}\r\nfunction getColMerge(cIndex, r1, r2){\r\n    let c1 = 0, c2 = Store.flowdata[0].length - 1;\r\n\r\n    let str = null;\r\n    if(cIndex > c1){\r\n        for(let c = cIndex; c >= c1; c--){\r\n            for(let r = r1; r <= r2; r++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(str == null || mc.c < str){\r\n                        str = mc.c;\r\n                    }\r\n                }    \r\n            }\r\n\r\n            if(colHasMerge(str - 1, r1, r2) && str > c1){\r\n                c = str - 1;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        str = c1;\r\n    }\r\n\r\n    let end = null;\r\n    if(cIndex < c2){\r\n        for(let c = cIndex; c <= c2; c++){\r\n            for(let r = r1; r <= r2; r++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(end == null || (mc.c + mc.cs - 1) > end){\r\n                        end = mc.c + mc.cs - 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(colHasMerge(end + 1, r1, r2) && end < c2){\r\n                c = end + 1;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        end = c2;\r\n    }\r\n\r\n    return [str, end];\r\n}\r\nfunction getNextIndex(direction, focusIndex, strIndex, endIndex) {\r\n    let index = null;\r\n\r\n    let stNull;\r\n    if(direction == \"down\"){\r\n        let stValue = Store.flowdata[strIndex][focusIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        console.log(stNull, \"stNull\");\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let r = strIndex + 1; r <= endIndex; r++){\r\n            let cell = Store.flowdata[r][focusIndex];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull==true && cellNull[i] == false){\r\n                index = strIndex + i + 1;\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //\u8D77\u59CB\u662F\u7A7A\uFF0C\u627E\u7B2C\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    index = strIndex + i + 1;\r\n                    break;\r\n                }\r\n                else if(!stNull){ //\u8D77\u59CB\u6709\u503C\uFF0C\u627E\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //\u524D\u9762\u4E3A\u7A7A\r\n                        index = strIndex + i + 1;\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //\u540E\u9762\u4E3A\u7A7A\r\n                        index = strIndex + i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r == endIndex){\r\n                index = endIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"up\"){\r\n        let stValue = Store.flowdata[endIndex][focusIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let r = endIndex - 1; r >= strIndex; r--){\r\n            let cell = Store.flowdata[r][focusIndex];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = endIndex - (i + 1);\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //\u8D77\u59CB\u662F\u7A7A\uFF0C\u627E\u7B2C\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    index = endIndex - (i + 1);\r\n                    break;\r\n                }\r\n                else if(!stNull){ //\u8D77\u59CB\u6709\u503C\uFF0C\u627E\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //\u524D\u9762\u4E3A\u7A7A\r\n                        index = endIndex - (i + 1);\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //\u540E\u9762\u4E3A\u7A7A\r\n                        index = endIndex - i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r == strIndex){\r\n                index = strIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"right\"){\r\n        let stValue = Store.flowdata[focusIndex][strIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let c = strIndex + 1; c <= endIndex; c++){\r\n            let cell = Store.flowdata[focusIndex][c];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = strIndex + i + 1;\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //\u8D77\u59CB\u662F\u7A7A\uFF0C\u627E\u7B2C\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    index = strIndex + i + 1;\r\n                    break;\r\n                }\r\n                else if(!stNull){ //\u8D77\u59CB\u6709\u503C\uFF0C\u627E\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //\u524D\u9762\u4E3A\u7A7A\r\n                        index = strIndex + i + 1;\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //\u540E\u9762\u4E3A\u7A7A\r\n                        index = strIndex + i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(c == endIndex){\r\n                index = endIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"left\"){\r\n        let stValue = Store.flowdata[focusIndex][endIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let c = endIndex - 1; c >= strIndex; c--){\r\n            let cell = Store.flowdata[focusIndex][c];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = endIndex - (i + 1);\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //\u8D77\u59CB\u662F\u7A7A\uFF0C\u627E\u7B2C\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    index = endIndex - (i + 1);\r\n                    break;\r\n                }\r\n                else if(!stNull){ //\u8D77\u59CB\u6709\u503C\uFF0C\u627E\u4E00\u4E2A\u6709\u503C\u7684\u4F4D\u7F6E\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //\u524D\u9762\u4E3A\u7A7A\r\n                        index = endIndex - (i + 1);\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //\u540E\u9762\u4E3A\u7A7A\r\n                        index = endIndex - i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(c == strIndex){\r\n                index = strIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\nexport {\r\n    luckysheetMoveEndCell,\r\n    luckysheetMoveHighlightCell,\r\n    luckysheetMoveHighlightCell2,\r\n    luckysheetMoveHighlightRange,\r\n    luckysheetMoveHighlightRange2,\r\n}", "\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { replaceHtml } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { luckysheetAlternateformatHtml, modelHTML } from './constant';\r\nimport luckysheetsizeauto from './resize';\r\nimport server from './server';\r\nimport { selectHightlightShow } from './select';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//\u4EA4\u66FF\u989C\u8272\r\nconst alternateformat = {\r\n    rangefocus: false,\r\n    modelfocusIndex: null,\r\n    FixedModelColor: [\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#bfbdbe\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f8f3f7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#dde2de\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#4bd4e7\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#eaf7ff\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#aae9f8\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#5ed593\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#e5fbee\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#a5efcc\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f6cb4b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fff9e7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ffebac\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f96420\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ffe5d9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ffcfba\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#5599fc\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ecf2fe\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#afcbfa\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#22a69b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#dff2f8\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#8dd4d0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#7a939a\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0eff7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#bdcad0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#d7a270\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fdf3f1\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ead2b6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#89c54b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f1f7e9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#c5e3a7\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#8f88f0\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0e5ff\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#c6c4f6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#fd1664\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#feddee\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f98ab5\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#da96d3\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fce8fb\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f2caee\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b49191\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f5ebe8\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d8c3c3\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#91b493\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0fbf0\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#b4cfb6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b4a891\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f8f6f1\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d3cab8\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#91abb4\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#eff7fa\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#b7cbd3\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b7ba82\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fafbeb\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#dadcb4\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#df3e3e\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fde9e9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f89292\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f2711c\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fef0d7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#fbb335\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b5cc18\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f9fbd4\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#e2ed2a\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#00b5ad\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ccfaf9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#00e4df\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#2185d0\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#d8f3fc\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#3cc4f0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#a5673f\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f6ede5\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d3a47c\" }\r\n        }            \r\n    ],\r\n    getModelBox: function(hasRowHeader, hasRowFooter){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList\").empty();\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom\").empty();\r\n\r\n        //\u683C\u5F0F\u6837\u5F0F \u6A21\u677F\r\n        let modelListHtml = '';\r\n\r\n        for(let i = 0; i < _this.FixedModelColor.length; i++){\r\n            let obj = _this.FixedModelColor[i];\r\n\r\n            let color1, color2, color3, color4;\r\n\r\n            if(hasRowHeader && hasRowFooter){\r\n                color1 = obj[\"head\"];\r\n                color2 = obj[\"one\"];\r\n                color3 = obj[\"two\"];\r\n                color4 = obj[\"foot\"];\r\n            }\r\n            else if(hasRowHeader){\r\n                color1 = obj[\"head\"];\r\n                color2 = obj[\"one\"];\r\n                color3 = obj[\"two\"];\r\n                color4 = obj[\"one\"];\r\n            }\r\n            else if(hasRowFooter){\r\n                color1 = obj[\"one\"];\r\n                color2 = obj[\"two\"];\r\n                color3 = obj[\"one\"];\r\n                color4 = obj[\"foot\"];\r\n            }\r\n            else{\r\n                color1 = obj[\"one\"];\r\n                color2 = obj[\"two\"];\r\n                color3 = obj[\"one\"];\r\n                color4 = obj[\"two\"];\r\n            }\r\n\r\n            modelListHtml += '<div class=\"modelbox\">'+\r\n                                '<div class=\"box\">'+\r\n                                    '<span style=\"color:'+ color1[\"fc\"] +';background-color:'+ color1[\"bc\"] +'\"> \u2014 </span>'+\r\n                                    '<span style=\"color:'+ color2[\"fc\"] +';background-color:'+ color2[\"bc\"] +'\"> \u2014 </span>'+\r\n                                    '<span style=\"color:'+ color3[\"fc\"] +';background-color:'+ color3[\"bc\"] +'\"> \u2014 </span>'+\r\n                                    '<span style=\"color:'+ color4[\"fc\"] +';background-color:'+ color4[\"bc\"] +'\"> \u2014 </span>'+\r\n                                '</div>'+\r\n                             '</div>';\r\n        }\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList\").append(modelListHtml);\r\n\r\n        //\u81EA\u5B9A\u4E49 \u6A21\u677F\r\n        let modelCustom = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"];\r\n        if(modelCustom != null && modelCustom.length > 0){\r\n            let modelCustomHtml = '';\r\n\r\n            for(let i = 0; i < modelCustom.length; i++){\r\n                let obj = modelCustom[i];\r\n\r\n                let color1, color2, color3, color4;\r\n\r\n                if(hasRowHeader && hasRowFooter){\r\n                    color1 = obj[\"head\"];\r\n                    color2 = obj[\"one\"];\r\n                    color3 = obj[\"two\"];\r\n                    color4 = obj[\"foot\"];\r\n                }\r\n                else if(hasRowHeader){\r\n                    color1 = obj[\"head\"];\r\n                    color2 = obj[\"one\"];\r\n                    color3 = obj[\"two\"];\r\n                    color4 = obj[\"one\"];\r\n                }\r\n                else if(hasRowFooter){\r\n                    color1 = obj[\"one\"];\r\n                    color2 = obj[\"two\"];\r\n                    color3 = obj[\"one\"];\r\n                    color4 = obj[\"foot\"];\r\n                }\r\n                else{\r\n                    color1 = obj[\"one\"];\r\n                    color2 = obj[\"two\"];\r\n                    color3 = obj[\"one\"];\r\n                    color4 = obj[\"two\"];\r\n                }\r\n\r\n                modelCustomHtml +=  '<div class=\"modelbox\">'+\r\n                                        '<div class=\"box\">'+\r\n                                            '<span style=\"color:'+ color1[\"fc\"] +';background-color:'+ color1[\"bc\"] +'\"> \u2014 </span>'+\r\n                                            '<span style=\"color:'+ color2[\"fc\"] +';background-color:'+ color2[\"bc\"] +'\"> \u2014 </span>'+\r\n                                            '<span style=\"color:'+ color3[\"fc\"] +';background-color:'+ color3[\"bc\"] +'\"> \u2014 </span>'+\r\n                                            '<span style=\"color:'+ color4[\"fc\"] +';background-color:'+ color4[\"bc\"] +'\"> \u2014 </span>'+\r\n                                        '</div>'+\r\n                                    '</div>';\r\n            }\r\n\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom\").append(modelCustomHtml);\r\n        }\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat\").remove();\r\n        $(\"body\").append(luckysheetAlternateformatHtml());\r\n        luckysheetsizeauto();\r\n\r\n        //\u5173\u95ED\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat .luckysheet-model-close-btn\").click(function () {\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //\u5E94\u7528\u8303\u56F4\r\n        $(document).off(\"focus.AFrangeInput\").on(\"focus.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(){\r\n            _this.rangefocus = true;\r\n        });\r\n        $(document).off(\"blur.AFrangeInput\").on(\"blur.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(){\r\n            _this.rangefocus = false;\r\n        });\r\n\r\n        $(document).off(\"keydown.AFrangeInput\").on(\"keydown.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(e){\r\n            let rangeValue = $(this).val().trim();\r\n            if(e.keyCode == 13){\r\n                _this.update();\r\n            }\r\n        });\r\n        $(document).off(\"click.AFrangeIcon\").on(\"click.AFrangeIcon\", \"#luckysheet-alternateformat-range .fa-table\", function(){\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n            luckysheetsizeauto();\r\n\r\n            let rangeValue = $(this).parents(\"#luckysheet-alternateformat-range\").find(\"input\").val().trim();\r\n            _this.rangeDialog(rangeValue);\r\n        });\r\n        $(document).off(\"click.AFrDCf\").on(\"click.AFrDCf\", \"#luckysheet-alternateformat-rangeDialog-confirm\", function(){\r\n            let rangeValue = $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").find(\"input\").val().trim();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input\").val(rangeValue);\r\n\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n\r\n            _this.update();\r\n        });\r\n        $(document).off(\"click.AFrDCl\").on(\"click.AFrDCl\", \"#luckysheet-alternateformat-rangeDialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n        });\r\n        $(document).off(\"click.AFrDTitle\").on(\"click.AFrDTitle\", \"#luckysheet-alternateformat-rangeDialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //\u9875\u7709\u3001\u9875\u811A\u9009\u4E2D\r\n        $(document).off(\"change.AFrowHeader\").on(\"change.AFrowHeader\", \"#luckysheet-alternateformat-rowHeader\", function(){\r\n            let hasRowHeader;\r\n            if($(this).is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(\"#luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n        $(document).off(\"change.AFrowFooter\").on(\"change.AFrowFooter\", \"#luckysheet-alternateformat-rowFooter\", function(){\r\n            let hasRowHeader;\r\n            if($(\"#luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(this).is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n\r\n        //\u70B9\u51FB\u6837\u5F0F\u6A21\u677F\r\n        $(document).off(\"click.AFmodelbox\").on(\"click.AFmodelbox\", \"#luckysheet-modal-dialog-slider-alternateformat .modelbox\", function(){\r\n            let index = $(this).index();\r\n            let $id = $(this).parents(\".cf\").attr(\"id\");\r\n\r\n            if($id == \"luckysheet-alternateformat-modelList\"){\r\n                _this.modelfocusIndex = index;\r\n            }\r\n            else if($id == \"luckysheet-alternateformat-modelCustom\"){\r\n                let len = _this.FixedModelColor.length;\r\n                _this.modelfocusIndex = index + len;\r\n            }\r\n\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n\r\n        //\u70B9\u51FB\u9009\u62E9\u6587\u672C/\u5355\u5143\u683C\u989C\u8272\r\n        $(document).off(\"click.AFselectColor\").on(\"click.AFselectColor\", \"#luckysheet-modal-dialog-slider-alternateformat .luckysheet-color-menu-button-indicator\", function(){\r\n            let $parent = $(this).closest(\".toningbox\");\r\n\r\n            let colorType, currenColor;\r\n            if($(this).find(\".luckysheet-icon-img\").hasClass(\"luckysheet-icon-text-color\")){\r\n                colorType = \"fc\";\r\n                currenColor = $parent.find(\".toningShow\").data(\"fc\");\r\n            }\r\n            else if($(this).find(\".luckysheet-icon-img\").hasClass(\"luckysheet-icon-cell-color\")){\r\n                colorType = \"bc\";\r\n                currenColor = $parent.find(\".toningShow\").data(\"bc\");\r\n            }\r\n\r\n            //source\r\n            let source;\r\n            if($parent.hasClass(\"header\")){\r\n                source = \"0\";\r\n            }\r\n            else if($parent.hasClass(\"ctOne\")){\r\n                source = \"1\";\r\n            }\r\n            else if($parent.hasClass(\"ctTwo\")){\r\n                source = \"2\";\r\n            }\r\n            else if($parent.hasClass(\"footer\")){\r\n                source = \"3\";\r\n            }\r\n\r\n            _this.colorSelectDialog(currenColor, colorType, source);\r\n        });\r\n\r\n        //\u9009\u62E9\u989C\u8272 \u786E\u5B9A \u6DFB\u52A0\u81EA\u5B9A\u4E49\u6A21\u677F\r\n        $(document).off(\"click.AFselectColorConfirm\").on(\"click.AFselectColorConfirm\", \"#luckysheet-alternateformat-colorSelect-dialog-confirm\", function(){\r\n            let $parent = $(this).parents(\"#luckysheet-alternateformat-colorSelect-dialog\");\r\n            const _locale = locale()\r\n            const alternatingColors =_locale.alternatingColors;\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $parent.hide();\r\n\r\n            //\u83B7\u53D6currenColor colorType source\r\n            let currenColor = $parent.find(\".currenColor span\").attr(\"title\");\r\n\r\n            let colorType;\r\n            if($parent.find(\".luckysheet-modal-dialog-title-text\").text() == alternatingColors.selectionTextColor){\r\n                colorType = \"fc\";\r\n            }\r\n            else if($parent.find(\".luckysheet-modal-dialog-title-text\").text() == alternatingColors.selectionCellColor){\r\n                colorType = \"bc\";\r\n            }\r\n\r\n            let source = $parent.find(\".currenColor\").attr(\"data-source\");\r\n            \r\n            //\u8D4B\u7ED9\u989C\u8272\r\n            if(source == \"0\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"1\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"2\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"3\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            \r\n            //\u82E5\u6A21\u677F\u805A\u7126\u5728\u56FA\u6709\u6A21\u677F\uFF0C\u5219\u65B0\u52A0\u6A21\u677F\uFF1B\u82E5\u6A21\u677F\u805A\u7126\u5728\u81EA\u5B9A\u4E49\u6A21\u677F\uFF0C\u5219\u4FEE\u6539\u8BE5\u6A21\u677F\r\n            let hasRowHeader;\r\n            if($(\"#luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(\"#luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            let index = _this.modelfocusIndex;\r\n            let len = _this.FixedModelColor.length;\r\n\r\n            let format, file;\r\n            if(index < len){\r\n                format = $.extend(true, {}, _this.getFormatByIndex());\r\n            }\r\n            else{\r\n                file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                let modelCustom = file[\"luckysheet_alternateformat_save_modelCustom\"];\r\n\r\n                format = $.extend(true, {}, modelCustom[index - len]);\r\n            }\r\n\r\n            if(source == \"0\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"head\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"head\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"1\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"one\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"one\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"2\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"two\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"two\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"3\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"foot\"][\"fc\"] = currenColor;\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    format[\"foot\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n\r\n            if(_this.modelfocusIndex < len){\r\n                _this.addCustomModel(format);\r\n                _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n            }\r\n            else{\r\n                file[\"luckysheet_alternateformat_save_modelCustom\"][index - len] = format;\r\n\r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", Store.currentSheetIndex, file[\"luckysheet_alternateformat_save_modelCustom\"], { \"k\": \"luckysheet_alternateformat_save_modelCustom\" });\r\n                }\r\n            }\r\n\r\n            _this.getModelBox(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n        \r\n        //\u70B9\u51FB \u79FB\u9664\u4EA4\u66FF\u989C\u8272 \u6309\u94AE\r\n        $(document).off(\"click.AFremove\").on(\"click.AFremove\", \"#luckysheet-alternateformat-remove\", function(){\r\n            let dataIndex = $(this).data(\"index\");\r\n\r\n            let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n\r\n            //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n            let historyRules = $.extend(true, [], ruleArr);\r\n\r\n            //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n            if(ruleArr.length > 1){\r\n                ruleArr.splice(dataIndex, 1);\r\n            }\r\n            else{\r\n                ruleArr = [];\r\n            }\r\n\r\n            let currentRules = $.extend(true, [], ruleArr);\r\n            \r\n            //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n            }\r\n\r\n            //\u9690\u85CF\u4E00\u4E9Bdom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n\r\n            luckysheetsizeauto();\r\n        });\r\n    },\r\n    perfect: function(){\r\n        let _this = this;\r\n\r\n        let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n        let existsIndex = _this.rangeIsExists(range)[1];\r\n        \r\n        let obj = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save\"][existsIndex]);\r\n        \r\n        //\u5E94\u7528\u8303\u56F4\r\n        let cellrange = obj[\"cellrange\"];\r\n        $(\"#luckysheet-alternateformat-range input\").val(getRangetxt(Store.currentSheetIndex, { \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"] }, Store.currentSheetIndex));\r\n        \r\n        Store.luckysheet_select_save = [{ \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"] }];\r\n        selectHightlightShow();\r\n\r\n        //\u9875\u7709\u3001\u9875\u811A\r\n        let hasRowHeader = obj[\"hasRowHeader\"];\r\n        let hasRowFooter = obj[\"hasRowFooter\"];\r\n        \r\n        //\u6A21\u677F\u805A\u7126\r\n        let format = obj[\"format\"];\r\n        _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n\r\n        if(_this.modelfocusIndex == null){\r\n            _this.addCustomModel(format);\r\n            _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n        }\r\n\r\n        _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n        _this.modelboxOn();\r\n\r\n        //\u6807\u8BC6 \u4EA4\u66FF\u989C\u8272\u7684index\r\n        $(\"#luckysheet-alternateformat-remove\").data(\"index\", existsIndex);\r\n    },\r\n    checkboxChange: function(hasRowHeader, hasRowFooter){\r\n        if(hasRowHeader){\r\n            $(\"#luckysheet-alternateformat-rowHeader\").prop(\"checked\", true);\r\n            $(\"#luckysheet-alternateformat-modelToning .header\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-rowHeader\").removeAttr(\"checked\");  \r\n            $(\"#luckysheet-alternateformat-modelToning .header\").hide(); \r\n        }\r\n\r\n        if(hasRowFooter){\r\n            $(\"#luckysheet-alternateformat-rowFooter\").prop(\"checked\", true);\r\n            $(\"#luckysheet-alternateformat-modelToning .footer\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-rowFooter\").removeAttr(\"checked\"); \r\n            $(\"#luckysheet-alternateformat-modelToning .footer\").hide();  \r\n        }\r\n\r\n        this.getModelBox(hasRowHeader, hasRowFooter);\r\n    },\r\n    modelboxOn: function(){\r\n        let _this = this;\r\n\r\n        //\u6A21\u677F foucs\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat .modelbox\").removeClass(\"on\");\r\n\r\n        let index = _this.modelfocusIndex;\r\n        let len = _this.FixedModelColor.length;\r\n        \r\n        if(index < len){\r\n            $(\"#luckysheet-alternateformat-modelList .modelbox\").eq(index).addClass(\"on\");\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-modelCustom .modelbox\").eq(index - len).addClass(\"on\");\r\n        }\r\n\r\n        //\u7F16\u8F91 \u5BF9\u5E94\u989C\u8272\u6539\u53D8\r\n        _this.modelToningColor();\r\n    },\r\n    modelToningColor: function(){\r\n        let format = this.getFormatByIndex();\r\n\r\n        //\u9875\u7709\r\n        $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css({\"color\": format[\"head\"].fc, \"background-color\": format[\"head\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"fc\", format[\"head\"].fc).data(\"bc\", format[\"head\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"head\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"head\"].bc);\r\n\r\n        //\u989C\u82721\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css({\"color\": format[\"one\"].fc, \"background-color\": format[\"one\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"fc\", format[\"one\"].fc).data(\"bc\", format[\"one\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"one\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"one\"].bc);\r\n\r\n        //\u989C\u82722\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css({\"color\": format[\"two\"].fc, \"background-color\": format[\"two\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"fc\", format[\"two\"].fc).data(\"bc\", format[\"two\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"two\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"two\"].bc);\r\n\r\n        //\u9875\u811A\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css({\"color\": format[\"foot\"].fc, \"background-color\": format[\"foot\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"fc\", format[\"foot\"].fc).data(\"bc\", format[\"foot\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"foot\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"foot\"].bc);\r\n    },\r\n    addCustomModel: function(format){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        if(file[\"luckysheet_alternateformat_save_modelCustom\"] == null){\r\n            file[\"luckysheet_alternateformat_save_modelCustom\"] = [];\r\n        }\r\n\r\n        file[\"luckysheet_alternateformat_save_modelCustom\"].push(format);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, file[\"luckysheet_alternateformat_save_modelCustom\"], { \"k\": \"luckysheet_alternateformat_save_modelCustom\" });\r\n        }\r\n    },\r\n    colorSelectDialog: function(currenColor, colorType, source){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").remove();\r\n\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        const locale_button = _locale.button;\r\n        const locale_toolbar = _locale.toolbar;\r\n\r\n        let title;\r\n        if(colorType == \"fc\"){\r\n            title = alternatingColors.selectionTextColor;\r\n        }\r\n        else if(colorType == \"bc\"){\r\n            title = alternatingColors.selectionCellColor;\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-alternateformat-colorSelect-dialog\", \r\n            \"addclass\": \"luckysheet-alternateformat-colorSelect-dialog\", \r\n            \"title\": title, \r\n            \"content\": \"<div class='currenColor' data-source='\"+ source +\"'>\"+ alternatingColors.currentColor +\"\uFF1A<span title='\"+ currenColor +\"' style='background-color:\"+ currenColor +\"'></span></div><div class='colorshowbox'></div>\", \r\n            \"botton\": '<button id=\"luckysheet-alternateformat-colorSelect-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-alternateformat-colorSelect-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n        \r\n        //\u521D\u59CB\u5316\u9009\u62E9\u989C\u8272\u63D2\u4EF6\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").find(\".colorshowbox\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            showButtons: false,//\u9690\u85CF\u9009\u62E9\u53D6\u6D88\u6309\u94AE\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            color: currenColor,\r\n            cancelText: locale_button.cancel,\r\n            chooseText: locale_toolbar.confirmColor,\r\n            togglePaletteMoreText: locale_toolbar.customColor,\r\n            togglePaletteLessText: locale_toolbar.collapse,\r\n            togglePaletteOnly: true,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [\r\n                [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n            ],\r\n            move: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"#000\";\r\n                }\r\n\r\n                $(\"#luckysheet-alternateformat-colorSelect-dialog .currenColor span\").css(\"background-color\", color).attr(\"title\", color);\r\n            }\r\n        });\r\n    },\r\n    rangeDialog: function(value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-alternateformat-rangeDialog\").remove();\r\n\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-alternateformat-rangeDialog\", \r\n            \"addclass\": \"luckysheet-alternateformat-rangeDialog\", \r\n            \"title\": alternatingColors.selectRange, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+alternatingColors.tipSelectRange+'\" value=\"'+value+'\"/>', \r\n            \"botton\": '<button id=\"luckysheet-alternateformat-rangeDialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-alternateformat-rangeDialog-close\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-alternateformat-rangeDialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-alternateformat-rangeDialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n    },\r\n    rangeIsExists: function(range, index){\r\n        let _this = this;\r\n\r\n        let isExists = false;\r\n        let existsIndex = null;\r\n\r\n        //\u83B7\u53D6\u5DF2\u6709\u4EA4\u66FF\u989C\u8272\u6240\u6709\u5E94\u7528\u8303\u56F4\r\n        let AFarr = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save\"]);\r\n\r\n        if(index != undefined && index != null){\r\n            if(AFarr.length > 1){\r\n                AFarr.splice(index, 1);\r\n            }\r\n            else{\r\n                AFarr = [];\r\n            }\r\n        }\r\n\r\n        if(AFarr.length > 0){\r\n            let arr = [];\r\n            for(let i = 0; i < AFarr.length; i++){\r\n                let obj = {\r\n                    \"index\": i,\r\n                    \"map\": _this.getRangeMap(AFarr[i][\"cellrange\"][\"row\"], AFarr[i][\"cellrange\"][\"column\"])\r\n                }\r\n\r\n                arr.push(obj);\r\n            }\r\n            \r\n            //\u83B7\u53D6\u5F53\u524D\u9009\u533A\r\n            let rangeMap = _this.getRangeMap(range[\"row\"], range[\"column\"]);\r\n            \r\n            //\u904D\u5386\r\n            for(let x in rangeMap){\r\n                if(isExists){\r\n                    break;\r\n                } \r\n\r\n                for(let j = 0; j < arr.length; j++){\r\n                    if(x in arr[j][\"map\"]){\r\n                        isExists = true;\r\n                        existsIndex = arr[j][\"index\"];\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return [isExists, existsIndex];\r\n    },\r\n    getRangeMap: function(row, column){\r\n        let map = {};\r\n        let st_r = row[0], ed_r = row[1], st_c = column[0], ed_c = column[1];\r\n        \r\n        for(let r = st_r; r <= ed_r; r++){\r\n            for(let c = st_c; c <= ed_c; c++){\r\n                map[r + \"_\" + c] = 0;\r\n            }\r\n        }\r\n        \r\n        return map;\r\n    },\r\n    getIndexByFormat: function(format){\r\n        let _this = this;\r\n        let index = null;\r\n\r\n        //\u683C\u5F0F\u6837\u5F0F \u6A21\u677F\r\n        let modelList = _this.FixedModelColor;\r\n        for(let i = 0; i < modelList.length; i++){\r\n            let obj = modelList[i];\r\n\r\n            if(format[\"head\"].fc == obj[\"head\"].fc && format[\"head\"].bc == obj[\"head\"].bc){\r\n                if(format[\"one\"].fc == obj[\"one\"].fc && format[\"one\"].bc == obj[\"one\"].bc){\r\n                    if(format[\"two\"].fc == obj[\"two\"].fc && format[\"two\"].bc == obj[\"two\"].bc){\r\n                        if(format[\"foot\"].fc == obj[\"foot\"].fc && format[\"foot\"].bc == obj[\"foot\"].bc){\r\n                            index = i;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        //\u81EA\u5B9A\u4E49 \u6A21\u677F\r\n        let modelCustom = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"];\r\n        if(modelCustom != null && modelCustom.length > 0){\r\n            for(let j = 0; j < modelCustom.length; j++){\r\n                let obj = modelCustom[j];\r\n\r\n                if(format[\"head\"].fc == obj[\"head\"].fc && format[\"head\"].bc == obj[\"head\"].bc){\r\n                    if(format[\"one\"].fc == obj[\"one\"].fc && format[\"one\"].bc == obj[\"one\"].bc){\r\n                        if(format[\"two\"].fc == obj[\"two\"].fc && format[\"two\"].bc == obj[\"two\"].bc){\r\n                            if(format[\"foot\"].fc == obj[\"foot\"].fc && format[\"foot\"].bc == obj[\"foot\"].bc){\r\n                                index = modelList.length + j;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n       \r\n        return index;\r\n    },\r\n    getFormatByIndex: function(){\r\n        let _this = this;\r\n\r\n        let index = _this.modelfocusIndex;\r\n        let len = _this.FixedModelColor.length;\r\n\r\n        let format = {};\r\n\r\n        if(index < len){\r\n            format = _this.FixedModelColor[index];\r\n        }\r\n        else{\r\n            format = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"][index - len];\r\n        }\r\n\r\n        return format;\r\n    },\r\n    new: function(cellrange){\r\n        let _this = this;\r\n\r\n        let format = _this.getFormatByIndex();\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n        \r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n\r\n        //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n        let historyRules = $.extend(true, [], ruleArr);\r\n        \r\n        //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n        let obj = {\r\n            \"cellrange\": {\r\n                \"row\": cellrange[\"row\"],\r\n                \"column\": cellrange[\"column\"]\r\n            },\r\n            \"format\": format,\r\n            \"hasRowHeader\": true,\r\n            \"hasRowFooter\": false\r\n        }\r\n\r\n        ruleArr.push(obj);\r\n\r\n        let currentRules = $.extend(true, [], ruleArr);\r\n        \r\n        //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n        }\r\n    },\r\n    update: function(){\r\n        let _this = this;\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        //\u83B7\u53D6\u6807\u8BC6\r\n        let dataIndex = $(\"#luckysheet-alternateformat-remove\").data(\"index\");\r\n        \r\n        //\u5E94\u7528\u8303\u56F4\r\n        let rangeValue = $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input\").val().trim();\r\n        \r\n        if(!formula.iscelldata(rangeValue)){\r\n            if(isEditMode()){\r\n                alert(alternatingColors.errorNoRange);\r\n            }\r\n            else{\r\n                tooltip.info(alternatingColors.errorNoRange, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n        \r\n        let cellrange = formula.getcellrange(rangeValue);\r\n        let isExists = _this.rangeIsExists(cellrange, dataIndex)[0];\r\n\r\n        if(isExists){\r\n            if(isEditMode()){\r\n                alert(alternatingColors.errorExistColors);\r\n            }\r\n            else{\r\n                tooltip.info(alternatingColors.errorExistColors, \"\"); \r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //\u9875\u7709\u3001\u9875\u811A\r\n        let hasRowHeader;\r\n        if($(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n            hasRowHeader = true;\r\n        }\r\n        else{\r\n            hasRowHeader = false;    \r\n        }\r\n\r\n        let hasRowFooter;\r\n        if($(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n            hasRowFooter = true;\r\n        }\r\n        else{\r\n            hasRowFooter = false;    \r\n        }\r\n\r\n        //\u83B7\u53D6\u9009\u4E2D\u6837\u5F0F\u6A21\u677F\u7684\u989C\u8272\r\n        let format = _this.getFormatByIndex();\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        \r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n        \r\n        //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n        let historyRules = $.extend(true, [], ruleArr);\r\n        \r\n        //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n        let obj = {\r\n            \"cellrange\": {\r\n                \"row\": cellrange[\"row\"],\r\n                \"column\": cellrange[\"column\"]\r\n            },\r\n            \"format\": format,\r\n            \"hasRowHeader\": hasRowHeader,\r\n            \"hasRowFooter\": hasRowFooter\r\n        }\r\n        \r\n        ruleArr[dataIndex] = obj;\r\n\r\n        let currentRules = $.extend(true, [], ruleArr);\r\n        \r\n        //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n        }\r\n    },\r\n    checksAF: function(r, c, computeMap){\r\n        if((r + \"_\" + c) in computeMap){\r\n            //\u8FD4\u56DE\u503C\uFF08fc  bc\uFF09\r\n            return computeMap[r + \"_\" + c];\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    getComputeMap: function(){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n\r\n        let computeMap = this.compute(ruleArr);\r\n\r\n        return computeMap;\r\n    },\r\n    compute: function(obj){\r\n        //\u8BA1\u7B97\u5B58\u50A8\r\n        let computeMap = {};\r\n\r\n        if(obj != null && obj.length > 0){\r\n            for(let i = 0; i < obj.length; i++){\r\n                let cellrange = obj[i][\"cellrange\"];\r\n                let format = obj[i][\"format\"];\r\n                let hasRowHeader = obj[i][\"hasRowHeader\"];\r\n                let hasRowFooter = obj[i][\"hasRowFooter\"];\r\n                let st_r = cellrange[\"row\"][0], \r\n                    ed_r = cellrange[\"row\"][1], \r\n                    st_c = cellrange[\"column\"][0], \r\n                    ed_c = cellrange[\"column\"][1];\r\n                \r\n                if(hasRowHeader && hasRowFooter){\r\n                    //\u9875\u7709\u6240\u5728\u884C\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[st_r + \"_\" + c] = [format[\"head\"].fc, format[\"head\"].bc];\r\n                    }\r\n\r\n                    //\u4E2D\u95F4\u884C\r\n                    if(ed_r - st_r > 1){\r\n                        for(let r = st_r + 1; r < ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 != 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            } \r\n                        }\r\n                    }\r\n\r\n                    //\u9875\u811A\u6240\u5728\u884C\r\n                    if(ed_r > st_r){\r\n                        for(let c = st_c; c <= ed_c; c++){\r\n                            computeMap[ed_r + \"_\" + c] = [format[\"foot\"].fc, format[\"foot\"].bc];\r\n                        }\r\n                    }\r\n                }\r\n                else if(hasRowHeader){\r\n                    //\u9875\u7709\u6240\u5728\u884C\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[st_r + \"_\" + c] = [format[\"head\"].fc, format[\"head\"].bc];\r\n                    }\r\n\r\n                    //\u4E2D\u95F4\u884C\r\n                    if(ed_r > st_r){\r\n                        for(let r = st_r + 1; r <= ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 != 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            } \r\n                        }\r\n                    }\r\n                }\r\n                else if(hasRowFooter){\r\n                    //\u4E2D\u95F4\u884C\r\n                    if(ed_r > st_r){\r\n                        for(let r = st_r; r < ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 == 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    //\u9875\u811A\u6240\u5728\u884C\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[ed_r + \"_\" + c] = [format[\"foot\"].fc, format[\"foot\"].bc];\r\n                    }\r\n                }\r\n                else{\r\n                    //\u4E2D\u95F4\u884C\r\n                    for(let r = st_r; r <= ed_r; r++){\r\n                        let fc, bc;\r\n                        if((r - st_r) % 2 == 0){\r\n                            fc = format[\"one\"].fc;\r\n                            bc = format[\"one\"].bc;\r\n                        }\r\n                        else{\r\n                            fc = format[\"two\"].fc;\r\n                            bc = format[\"two\"].bc;\r\n                        }\r\n\r\n                        for(let c = st_c; c <= ed_c; c++){\r\n                            computeMap[r + \"_\" + c] = [fc, bc];\r\n                        } \r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return computeMap;\r\n    },\r\n    ref: function(historyRules, currentRules){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateAF\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n            redo[\"data\"] = {\"historyRules\": historyRules, \"currentRules\": currentRules};\r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n        Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = currentRules;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default alternateformat;", "import { getObjType } from '../utils/util';\r\n\r\nconst json = {\r\n    parseJsonParm: function(obj){\r\n        if(obj == null){\r\n            return {};\r\n        }\r\n        else if(getObjType(obj) == \"string\"){\r\n            try {\r\n                let json = new Function(\"return \" + obj)(); \r\n                return json;\r\n            } \r\n            catch(e) {\r\n                return {};\r\n            }\r\n        }\r\n        else{\r\n            return obj;\r\n        }\r\n    },\r\n    hasKey: function(obj){\r\n        let _this = this;\r\n        let json = _this.parseJsonParm(obj);\r\n        \r\n        for(let item in json){\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n}\r\n\r\nexport default json;", "import { getSheetIndex } from '../methods/get';\r\nimport editor from '../global/editor';\r\nimport { isRealNull, isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport { selectHightlightShow } from './select';\r\nimport { luckysheetMoveEndCell } from './sheetMove';\r\nimport { luckysheetlodingHTML } from '../controllers/constant';\r\nimport server from './server';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport alternateformat from './alternateformat';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { \r\n    rgbTohex, \r\n    showrightclickmenu, \r\n} from '../utils/util';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgrid_rhcw,\r\n} from '../global/refresh';\r\nimport { orderbydata, orderbydata1D } from '../global/sort';\r\nimport json from '../global/json';\r\nimport { update, genarate } from '../global/format';\r\n\r\n//\u7B5B\u9009\u914D\u7F6E\u72B6\u6001\r\nfunction labelFilterOptionState($top, optionstate, rowhidden, caljs, notSave, str, edr, cindex, stc, edc) {\r\n    if (optionstate) {\r\n        $top.addClass(\"luckysheet-filter-options-active\").data(\"rowhidden\", JSON.stringify(rowhidden)).data(\"caljs\", JSON.stringify(caljs)).html('<i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>');\r\n\r\n        if (caljs != null) {\r\n            $top.data(\"byconditionvalue\", caljs[\"value\"]).data(\"byconditiontype\", caljs[\"type\"]).data(\"byconditiontext\", caljs[\"text\"]);\r\n            \r\n            if (caljs[\"value1\"] != null) {\r\n                $top.data(\"byconditionvalue1\", caljs[\"value1\"]);\r\n            }\r\n\r\n            if (caljs[\"value2\"] != null) {\r\n                $top.data(\"byconditionvalue2\", caljs[\"value2\"]);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        $top.removeClass(\"luckysheet-filter-options-active\").data(\"rowhidden\", \"\").data(\"caljs\", \"\").html('<i class=\"fa fa-caret-down luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>');\r\n\r\n        $top.data(\"byconditionvalue\", \"null\").data(\"byconditiontype\", \"0\").data(\"byconditiontext\", \"\u65E0\").data(\"byconditionvalue1\", \"\").data(\"byconditionvalue2\", \"\");\r\n    }\r\n\r\n    if(!!notSave){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        if(file.filter == null){\r\n            file.filter = {};\r\n        }\r\n\r\n        if (optionstate) {\r\n            let param = {\r\n                \"caljs\": caljs, \r\n                \"rowhidden\": rowhidden, \r\n                \"optionstate\": optionstate,\r\n                \"str\": str,\r\n                \"edr\": edr,\r\n                \"cindex\": cindex,\r\n                \"stc\": stc,\r\n                \"edc\": edc\r\n            };\r\n            file.filter[cindex - stc] = param;\r\n        }\r\n        else {\r\n            delete file.filter[cindex - stc];\r\n        }\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n    }\r\n}\r\n\r\n//\u7B5B\u9009\u6392\u5E8F\r\nfunction orderbydatafiler(str, stc, edr, edc, index, asc) {\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    str = str + 1;\r\n\r\n    let hasMc = false; //\u6392\u5E8F\u9009\u533A\u662F\u5426\u6709\u5408\u5E76\u5355\u5143\u683C\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = stc; c <= edc; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        const locale_filter = locale().filter;\r\n\r\n        if(isEditMode()){\r\n            alert(locale_filter.mergeError);\r\n        }\r\n        else{\r\n            tooltip.info(locale_filter.mergeError, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, index - stc, asc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            d[r][c] = data[r - str][c - stc];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [stc, edc] }], allParam);\r\n}\r\n\r\n//\u521B\u5EFA\u7B5B\u9009\u6309\u94AE\r\nfunction createFilter() {\r\n\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n        return;\r\n    }\r\n\r\n    if(Store.luckysheet_select_save.length > 1){\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        $(\"#\" + Store.container).attr(\"tabindex\", 0).focus();\r\n\r\n        const locale_splitText = locale().splitText;\r\n\r\n        if(isEditMode()){\r\n            alert(locale_splitText.tipNoMulti);\r\n        }\r\n        else{\r\n            tooltip.info(locale_splitText.tipNoMulti, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    if(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].isPivotTable){\r\n        return;\r\n    }\r\n\r\n    $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n\r\n    let last = Store.luckysheet_select_save[0];\r\n    if (last[\"row\"][0] == last[\"row\"][1] && last[\"column\"][0] == last[\"column\"][1]) {\r\n        let st_c, ed_c, curR = last[\"row\"][1];\r\n\r\n        for (let c = 0; c < Store.flowdata[curR].length; c++) {\r\n            let cell = Store.flowdata[curR][c];\r\n\r\n            if (cell != null && !isRealNull(cell.v)) {\r\n                if (st_c == null) {\r\n                    st_c = c;\r\n                }\r\n            }\r\n            else if (st_c != null) {\r\n                ed_c = c - 1;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (ed_c == null) {\r\n            ed_c = Store.flowdata[curR].length - 1;\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [curR, curR], \"column\": [st_c, ed_c] }];\r\n        selectHightlightShow();\r\n\r\n        Store.luckysheet_shiftpositon = $.extend(true, {}, last);\r\n        luckysheetMoveEndCell(\"down\", \"range\");\r\n    }\r\n    else if (last[\"row\"][1] - last[\"row\"][0] < 2) {\r\n        Store.luckysheet_shiftpositon = $.extend(true, {}, last);\r\n        luckysheetMoveEndCell(\"down\", \"range\");\r\n    }\r\n\r\n    Store.luckysheet_filter_save = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n    createFilterOptions(Store.luckysheet_filter_save);\r\n\r\n    server.saveParam(\"all\", Store.currentSheetIndex, Store.luckysheet_filter_save, { \"k\": \"filter_select\" });\r\n\r\n    if (Store.filterchage) {\r\n        Store.jfredo.push({ \r\n            \"type\": \"filtershow\", \r\n            \"data\": [], \r\n            \"curdata\": [], \r\n            \"sheetIndex\": Store.currentSheetIndex, \r\n            \"filter_save\": Store.luckysheet_filter_save \r\n        });\r\n    }\r\n}\r\n\r\n//\u521B\u5EFA\u7B5B\u9009\u914D\u7F6E\r\nfunction createFilterOptions(luckysheet_filter_save, filterObj) {\r\n    $(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).remove();\r\n    $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex).remove();\r\n    \r\n    if(luckysheet_filter_save == null || JSON.stringify(luckysheet_filter_save) == \"{}\"){\r\n        return;\r\n    }\r\n\r\n    let r1 = luckysheet_filter_save.row[0], \r\n        r2 = luckysheet_filter_save.row[1];\r\n    let c1 = luckysheet_filter_save.column[0], \r\n        c2 = luckysheet_filter_save.column[1];\r\n\r\n    let row = Store.visibledatarow[r2], \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n    let col = Store.visibledatacolumn[c2], \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n    \r\n    let newSelectedHTML = '<div id=\"luckysheet-filter-selected-sheet'+ Store.currentSheetIndex +'\" class=\"luckysheet-cell-selected luckysheet-filter-selected\"  style=\"left:'+ col_pre +'px;width:'+ (col - col_pre - 1) +'px;top:'+ row_pre +'px;height:'+ (row - row_pre - 1) +'px;display:block;border-color:#897BFF;z-index:20;background:none;\"></div>';\r\n    $(\"#luckysheet-cell-main\").append(newSelectedHTML);\r\n    \r\n    let optionHTML = \"\";\r\n\r\n    for (let c = c1; c <= c2; c++) {\r\n        if(filterObj == null || filterObj[c - c1] == null){\r\n            optionHTML += '<div data-rowhidden=\"\" data-str=\"'+ r1 +'\" data-edr=\"'+ r2 +'\" data-cindex=\"'+ c +'\" data-stc=\"'+ c1 +'\" data-edc=\"'+ c2 +'\" class=\"luckysheet-filter-options\" style=\"left:'+ (Store.visibledatacolumn[c] - 20) +'px;top:'+ row_pre +'px;display:block;\"><i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i></div>';\r\n        }\r\n        else{\r\n            let caljs_data;\r\n\r\n            if(filterObj[c - c1].caljs != null){\r\n                let caljs_value1_data;\r\n                if (filterObj[c - c1].caljs[\"value1\"] != null) {\r\n                    caljs_value1_data = 'data-byconditionvalue1=\"'+ filterObj[c - c1].caljs[\"value1\"] +'\" ';\r\n                }\r\n                else{\r\n                    caljs_value1_data = '';\r\n                }\r\n\r\n                let caljs_value2_data;\r\n                if (filterObj[c - c1].caljs[\"value2\"] != null) {\r\n                    caljs_value2_data = 'data-byconditionvalue2=\"'+ filterObj[c - c1].caljs[\"value2\"] +'\" ';\r\n                }\r\n                else{\r\n                    caljs_value2_data = '';\r\n                }\r\n\r\n                caljs_data = 'data-caljs=\"'+ JSON.stringify(filterObj[c - c1].caljs) +'\" ' +\r\n                                 'data-byconditionvalue=\"'+ filterObj[c - c1].caljs[\"value\"] +'\" ' + \r\n                                 'data-byconditiontype=\"'+ filterObj[c - c1].caljs[\"type\"] +'\" ' +\r\n                                 'data-byconditiontext=\"'+ filterObj[c - c1].caljs[\"text\"] +'\" ' +\r\n                                 caljs_value1_data + caljs_value2_data;\r\n            }\r\n            else{\r\n                caljs_data = '';\r\n            }\r\n\r\n            optionHTML += '<div data-rowhidden=\"'+ JSON.stringify(filterObj[c - c1].rowhidden).replace(/\\\"/g, \"'\") +'\" '+ caljs_data +' data-str=\"'+ r1 +'\" data-edr=\"'+ r2 +'\" data-cindex=\"'+ c +'\" data-stc=\"'+ c1 +'\" data-edc=\"'+ c2 +'\" class=\"luckysheet-filter-options luckysheet-filter-options-active\" style=\"left:'+ (Store.visibledatacolumn[c] - 20) +'px;top:'+ row_pre +'px;display:block;\"><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div>';\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-filter-options-sheet'+ Store.currentSheetIndex +'\" class=\"luckysheet-filter-options-c\">' + optionHTML + '</div>');\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n    $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n    if ($(\"#luckysheet-cell-main\").scrollTop() > luckysheet_filter_save[\"top_move\"]) {\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(luckysheet_filter_save[\"top_move\"]);\r\n    }\r\n\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n    file.filter_select = luckysheet_filter_save;\r\n}\r\n\r\nfunction initialFilterHandler(){\r\n    //filter event handler\r\n    let hidefilersubmenu = null;\r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n    const locale_button= _locale.button;\r\n    $(\"#luckysheetfilter\").click(createFilter);\r\n\r\n    //\u53F3\u952E\u83DC\u5355 \u83DC\u5355\u9879hover\r\n    let submenuhide = null, rightclickmenu = null;\r\n    $(\".luckysheet-cols-menu .luckysheet-cols-submenu\").hover(\r\n        function () {\r\n            let $t = $(this), attrid = $t.attr(\"id\"), $attr = $(\"#\" + attrid + \"_sub\"), $con = $t.parent();\r\n            let winW = $(window).width(), winH = $(window).height();\r\n            let menuW = $con.width(), attrH = $attr.height() + 25, attrW = $attr.width() + 5;\r\n            let offset = $t.offset();\r\n            let top = offset.top, left = offset.left + menuW;\r\n\r\n            if (left + attrW > winW) {\r\n                left = offset.left - attrW;\r\n            }\r\n\r\n            if (top + attrH > winH) {\r\n                top = winH - attrH;\r\n            }\r\n\r\n            $attr.css({ \"top\": top, \"left\": left }).show();\r\n            rightclickmenu = $t;\r\n        },\r\n        function () {\r\n            let $t = $(this), attrid = $t.attr(\"id\"), $attr = $(\"#\" + attrid + \"_sub\");\r\n            submenuhide = setTimeout(function () { $attr.hide(); }, 200);\r\n        }\r\n    );\r\n\r\n    $(\".luckysheet-rightgclick-menu-sub\").hover(\r\n        function () {\r\n            rightclickmenu.addClass(\"luckysheet-cols-menuitem-hover\");\r\n            clearTimeout(submenuhide);\r\n        },\r\n        function () {\r\n            rightclickmenu.removeClass(\"luckysheet-cols-menuitem-hover\");\r\n            $(this).hide();\r\n        }\r\n    );\r\n\r\n    $(\"#luckysheet-filter-menu\").mouseover(function () {\r\n        clearTimeout(hidefilersubmenu);\r\n        \r\n        hidefilersubmenu = setTimeout(function () {\r\n            $(\"#luckysheet-filter-submenu\").hide();\r\n        }, 500);\r\n    });\r\n    \r\n\r\n    $(\"#luckysheet-filter-submenu\").mouseover(function () {\r\n        clearTimeout(hidefilersubmenu);\r\n    }).find(\".luckysheet-cols-menuitem\").click(function (e) {\r\n        $(\"#luckysheet-filter-selected span\").html($(this).find(\".luckysheet-cols-menuitem-content\").text()).data(\"value\", $(this).data(\"value\"));\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide();\r\n\r\n        let $type = $(this).data(\"type\");\r\n        let $value = $(this).attr(\"data-value\");\r\n        \r\n        if ($type == \"2\") {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"2\");\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2\").show();\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"number\");\r\n        }\r\n        else if ($type == \"0\") {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\");\r\n        }\r\n        else {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"1\");\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).show();\r\n            \r\n            //\u82E5\u662F\u65E5\u671F \u6539\u53D8input type\u7C7B\u578B\u4E3Adate\r\n            if($value == \"dateequal\" || $value == \"datelessthan\" || $value == \"datemorethan\"){\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"date\");\r\n            }\r\n            else if($value == \"morethan\" || $value == \"moreequalthan\" || $value == \"lessthan\" || $value == \"lessequalthan\" || $value == \"equal\" || $value == \"noequal\"){\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"number\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"text\");\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-filter-byvalue\").next().slideUp();\r\n        $(\"#luckysheet-filter-submenu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheet-filter-bycondition, #luckysheet-filter-byvalue\").click(function () {\r\n        let $t = $(this);\r\n        $t.next().slideToggle(200);\r\n\r\n        setTimeout(function () {\r\n            if ($t.attr(\"id\") == \"luckysheet-filter-bycondition\" && $(\"#luckysheet-filter-bycondition\").next().is(\":visible\")) {\r\n                if ($(\"#luckysheet-filter-selected span\").text() != locale_filter.filiterInputNone) {\r\n                    $(\"#luckysheet-filter-byvalue\").next().slideUp(200);\r\n                }\r\n            }\r\n\r\n            if ($t.is($(\"#luckysheet-filter-bycondition\"))) {\r\n                if ($(\"#luckysheet-filter-bycondition\").next().is(\":hidden\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\")) {\r\n                    $(\"#luckysheet-filter-byvalue\").next().slideDown(200);\r\n                }\r\n            }\r\n        }, 300);\r\n    });\r\n\r\n    $(\"#luckysheet-filter-selected\").click(function () {\r\n        let $t = $(this), toffset = $t.offset(), $menu = $(\"#luckysheet-filter-submenu\");\r\n        $menu.hide();\r\n    \r\n        let winH = $(window).height(), winW = $(window).width();\r\n        let menuW = $menu.width(), menuH = $menu.height();\r\n        let top = toffset.top, left = toffset.left, mheight = winH - toffset.top - 20;\r\n        \r\n        if (toffset.left + menuW > winW) {\r\n            left = toffset.left - menuW;\r\n        }\r\n    \r\n        if (toffset.top > winH / 2) {\r\n            top = winH - toffset.top;\r\n            \r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n    \r\n            mheight = toffset.top - 20;\r\n        }\r\n    \r\n        $menu.css({ \"top\": top, \"left\": left, \"height\": mheight }).show();\r\n        clearTimeout(hidefilersubmenu);\r\n    });\r\n\r\n    //\u7B5B\u9009\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6\r\n    $(\"#luckysheet-cell-main\").on(\"click\", \".luckysheet-filter-options\", function (e) {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n            return;\r\n        }\r\n        let $t = $(e.currentTarget), \r\n            toffset = $t.offset(), \r\n            $menu = $(\"#luckysheet-filter-menu\"), \r\n            winH = $(window).height(), \r\n            winW = $(window).width();\r\n\r\n        let st_r = $t.data(\"str\"), \r\n            ed_r = $t.data(\"edr\"), \r\n            cindex = $t.data(\"cindex\"), \r\n            st_c = $t.data(\"stc\"), \r\n            ed_c = $t.data(\"edc\"), \r\n            rowhidden = $t.data(\"rowhidden\") == \"\" ? {} : JSON.parse($t.data(\"rowhidden\").replace(/\\'/g, '\"'));\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        $(\"#luckysheet-filter-byvalue-input\").val(\"\");\r\n        $(\"#luckysheet-filter-bycondition\").next().hide();\r\n        $(\"#luckysheet-filter-byvalue\").next().show();\r\n        \r\n        $menu.data(\"str\", st_r);\r\n        $menu.data(\"edr\", ed_r);\r\n        $menu.data(\"cindex\", cindex);\r\n        $menu.data(\"stc\", st_c);\r\n        $menu.data(\"edc\", ed_c);\r\n\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n        $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.filiterInputNone);\r\n\r\n        let byconditiontype = $t.data(\"byconditiontype\");\r\n        $(\"#luckysheet-filter-selected span\").data(\"value\", $t.data(\"byconditionvalue\")).data(\"type\", byconditiontype).text($t.data(\"byconditiontext\"));\r\n\r\n        if (byconditiontype == \"2\") {\r\n            let $input = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2\").show().find(\"input\");\r\n            $input.eq(0).val($t.data(\"byconditionvalue1\"));\r\n            $input.eq(1).val($t.data(\"byconditionvalue2\"));\r\n        }\r\n        else if (byconditiontype == \"1\") {\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).show().find(\"input\").val($t.data(\"byconditionvalue1\"));\r\n        }\r\n\r\n        $(\"#luckysheet-filter-orderby-asc\").off(\"click\").on(\"click\", function () {\r\n            orderbydatafiler(st_r, st_c, ed_r, ed_c, cindex, true);\r\n        });\r\n\r\n        $(\"#luckysheet-filter-orderby-desc\").off(\"click\").on(\"click\", function () {\r\n            orderbydatafiler(st_r, st_c, ed_r, ed_c, cindex, false);\r\n        });\r\n\r\n        const loadingObj = luckysheetlodingHTML(\"#luckysheet-filter-byvalue-select\",{text:locale_filter.filiterMoreDataTip});\r\n        $(\"#luckysheet-filter-byvalue-select\").empty().append(loadingObj.el);\r\n\r\n        let rowhiddenother = {}; //\u5176\u5B83\u7B5B\u9009\u5217\u7684\u9690\u85CF\u884C\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not(this).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n            \r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n\r\n            rh = JSON.parse(rh.replace(/\\'/g, '\"'));\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n\r\n        let data = Store.flowdata;\r\n\r\n        setTimeout(function () {\r\n            //\u65E5\u671F\u503C\r\n            let dvmap = {};  \r\n            let dvmap_uncheck = {};\r\n\r\n            //\u9664\u65E5\u671F\u4EE5\u5916\u7684\u503C\r\n            let vmap = {}; \r\n            let vmap_uncheck = {};  \r\n\r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n\r\n                if(cell != null && !isRealNull(cell.v) && cell.ct != null && cell.ct.t == \"d\" ){ //\u5355\u5143\u683C\u662F\u65E5\u671F\r\n                    let v = update(\"YYYY-MM-DD\", cell.v);\r\n\r\n                    let y = v.split(\"-\")[0];\r\n                    let m = v.split(\"-\")[1];\r\n                    let d = v.split(\"-\")[2];\r\n\r\n                    if(!(y in dvmap)){\r\n                        dvmap[y] = {};\r\n                    }\r\n\r\n                    if(!(m in dvmap[y])){\r\n                        dvmap[y][m] = {};\r\n                    }\r\n\r\n                    if(!(d in dvmap[y][m])){\r\n                        dvmap[y][m][d] = 0;\r\n                    }\r\n                    \r\n                    dvmap[y][m][d]++;\r\n\r\n                    if(r in rowhidden){\r\n                        dvmap_uncheck[y] = 0;\r\n                        dvmap_uncheck[m] = 0;\r\n                        dvmap_uncheck[d] = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    let v, m;\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        v = null;\r\n                        m = null;\r\n                    }\r\n                    else{\r\n                        v = cell.v;\r\n                        m = cell.m;\r\n                    }\r\n\r\n                    if(!(v in vmap)){\r\n                        vmap[v] = {};\r\n                    }\r\n\r\n                    if(!(m in vmap[v])){\r\n                        vmap[v][m] = 0;                            \r\n                    }\r\n\r\n                    vmap[v][m]++;\r\n\r\n                    if(r in rowhidden){\r\n                        vmap_uncheck[v + \"#$$$#\" + m] = 0;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u904D\u5386\u6570\u636E\u52A0\u5230\u9875\u9762\r\n            let item = [];\r\n\r\n            if(JSON.stringify(dvmap).length > 2){\r\n                for(let y in dvmap){\r\n                    let ysum = 0;\r\n                    let monthHtml = '';\r\n\r\n                    for(let m in dvmap[y]){\r\n                        let msum = 0;\r\n                        let dayHtml = '';\r\n\r\n                        for(let d in dvmap[y][m]){\r\n                            let dayL = dvmap[y][m][d];\r\n                            msum += dayL;\r\n\r\n                            //\u6708 \u5C0F\u4E8E 10\r\n                            let mT;\r\n                            if(Number(m) < 10){\r\n                                mT = \"0\" + Number(m);\r\n                            }\r\n                            else{\r\n                                mT = m;    \r\n                            }\r\n\r\n                            //\u65E5 \u5C0F\u4E8E 10\r\n                            let dT;\r\n                            if(Number(d) < 10){\r\n                                dT = \"0\" + Number(d);\r\n                            }\r\n                            else{\r\n                                dT = d;    \r\n                            }\r\n\r\n                            //\u65E5\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                            if((y in dvmap_uncheck) && (m in dvmap_uncheck) && (d in dvmap_uncheck)){\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                            else{\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                        }\r\n\r\n                        ysum += msum;\r\n                        \r\n                        //\u6708 \u5C0F\u4E8E 10\r\n                        let mT2;\r\n                        if(Number(m) < 10){\r\n                            mT2 = \"0\" + Number(m);\r\n                        }\r\n                        else{\r\n                            mT2 = m;    \r\n                        }\r\n\r\n                        //\u6708\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                        if((y in dvmap_uncheck) && (m in dvmap_uncheck)){\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+ locale_filter.filiterMonthText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                        '</div>';\r\n                        }\r\n                        else{\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+ locale_filter.filiterMonthText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                        '</div>';\r\n                        }\r\n                    }\r\n\r\n                    //\u5E74\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                    let yearHtml;\r\n                    if(y in dvmap_uncheck){\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+ locale_filter.filiterYearText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n                    else{\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+ locale_filter.filiterYearText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n\r\n                    item.unshift(yearHtml);\r\n                }\r\n            }\r\n\r\n            if(JSON.stringify(vmap).length > 2){\r\n                let vmapKeys = Object.keys(vmap);\r\n                vmapKeys = orderbydata1D(vmapKeys, true);\r\n\r\n                for(let i = 0; i < vmapKeys.length; i++){\r\n                    let v = vmapKeys[i];\r\n\r\n                    for(let x in vmap[v]){\r\n                        let text;\r\n                        if((v + \"#$$$#\" + x) == \"null#$$$#null\"){\r\n                            text = locale_filter.valueBlank;\r\n                        }\r\n                        else{\r\n                            text = x;\r\n                        }\r\n\r\n                        //\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                        let dataHtml;\r\n                        if((v + \"#$$$#\" + x) in vmap_uncheck){\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"false\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ text +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n                        else{\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"true\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ text +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n\r\n                        item.push(dataHtml);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // \u9002\u914D\u5C0F\u5C4F\u8BBE\u5907\r\n            let containerH = winH - toffset.top - 350\r\n            if (containerH < 0) containerH = 100\r\n            //$(\"#luckysheet-filter-byvalue-select\").html(\"<div class='ListBox luckysheet-mousedown-cancel' style='min-height: 100px; max-height: \" + containerH + \"px; overflow-y: auto; overflow-x: hidden;'><table cellspacing='0' style='width:100%;' class='luckysheet-mousedown-cancel'>\" + item.join(\"\") + \"</table></div>\");\r\n\r\n            $(\"#luckysheet-filter-byvalue-select\").append(\"<div class='ListBox luckysheet-mousedown-cancel' style='min-height: 100px; max-height: \" + containerH + \"px; overflow-y: auto; overflow-x: hidden;'><table cellspacing='0' style='width:100%;' class='luckysheet-mousedown-cancel'>\" + item.join(\"\") + \"</table></div>\");\r\n            loadingObj.close();\r\n        }, 1);\r\n\r\n        showrightclickmenu($menu, toffset.left, toffset.top + 20);\r\n\r\n        e.stopPropagation();\r\n        return false;\r\n    });\r\n\r\n    //\u6309\u989C\u8272\u7B5B\u9009\r\n    $(\"#luckysheet-filter-orderby-color\").hover(\r\n        function(){\r\n            //\u904D\u5386\u7B5B\u9009\u5217\u989C\u8272\r\n            let $menu = $(\"#luckysheet-filter-menu\");\r\n            let st_r = $menu.data(\"str\"), \r\n                ed_r = $menu.data(\"edr\"), \r\n                cindex = $menu.data(\"cindex\"), \r\n                st_c = $menu.data(\"stc\"), \r\n                ed_c = $menu.data(\"edc\");\r\n            let bgMap = {}; //\u5355\u5143\u683C\u989C\u8272\r\n            let fcMap = {}; //\u5B57\u4F53\u989C\u8272\r\n    \r\n            let af_compute = alternateformat.getComputeMap();\r\n            let cf_compute = conditionformat.getComputeMap();\r\n    \r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                let cell = Store.flowdata[r][cindex];\r\n    \r\n                //\u5355\u5143\u683C\u989C\u8272\r\n                let bg = menuButton.checkstatus(Store.flowdata, r, cindex , \"bg\");\r\n\r\n                if(bg == null){\r\n                    bg = \"#ffffff\";\r\n                }\r\n    \r\n                let checksAF = alternateformat.checksAF(r, cindex, af_compute);\r\n                if(checksAF != null){//\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272\r\n                    bg = checksAF[1];\r\n                }\r\n    \r\n                let checksCF = conditionformat.checksCF(r, cindex, cf_compute);\r\n                if(checksCF != null && checksCF[\"cellColor\"] != null){//\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\r\n                    bg = checksCF[\"cellColor\"];\r\n                }\r\n    \r\n                if(bg.indexOf(\"rgb\") > -1){\r\n                    bg = rgbTohex(bg);\r\n                }\r\n    \r\n                if(bg.length == 4){\r\n                    bg = bg.substr(0, 1) + bg.substr(1, 1).repeat(2) + bg.substr(2, 1).repeat(2) + bg.substr(3, 1).repeat(2);\r\n                }\r\n    \r\n                //\u5B57\u4F53\u989C\u8272\r\n                let fc = menuButton.checkstatus(Store.flowdata, r, cindex , \"fc\");\r\n                \r\n                if(checksAF != null){//\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272\r\n                    fc = checksAF[0];\r\n                }\r\n    \r\n                if(checksCF != null && checksCF[\"textColor\"] != null){//\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\r\n                    fc = checksCF[\"textColor\"];\r\n                }\r\n    \r\n                if(fc.indexOf(\"rgb\") > -1){\r\n                    fc = rgbTohex(fc);\r\n                }\r\n    \r\n                if(fc.length == 4){\r\n                    fc = fc.substr(0, 1) + fc.substr(1, 1).repeat(2) + fc.substr(2, 1).repeat(2) + fc.substr(3, 1).repeat(2);\r\n                }\r\n    \r\n                if(Store.config != null && Store.config[\"rowhidden\"] != null && r in Store.config[\"rowhidden\"]){\r\n                    bgMap[bg] = 1;\r\n    \r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        fcMap[fc] = 1;\r\n                    }\r\n                }\r\n                else{\r\n                    bgMap[bg] = 0;\r\n    \r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        fcMap[fc] = 0;\r\n                    }\r\n                }\r\n            }\r\n            //\r\n            let filterBgColorHtml = '';\r\n            if(JSON.stringify(bgMap).length > 2 && Object.keys(bgMap).length > 1){\r\n                let bgColorItemHtml = '';\r\n                for(let b in bgMap){\r\n                    if(bgMap[b] == 0){\r\n                        bgColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + b + '\" title=\"' + b + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/></div>';\r\n                    }\r\n                    else{\r\n                        bgColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + b + '\" title=\"' + b + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/></div>';\r\n                    }\r\n                }\r\n                filterBgColorHtml = '<div id=\"filterBgColor\" class=\"box luckysheet-mousedown-cancel\"><div class=\"title luckysheet-mousedown-cancel\">'+locale_filter.filiterByColorTip+'</div><div style=\"max-height:128px;overflow:auto;\" class=\"luckysheet-mousedown-cancel\">' + bgColorItemHtml + '</div></div>';\r\n            }\r\n    \r\n            let filterFcColorHtml = '';\r\n            if(JSON.stringify(fcMap).length > 2 && Object.keys(fcMap).length > 1){\r\n                let fcColorItemHtml = '';\r\n                for(let f in fcMap){\r\n                    if(fcMap[f] == 0){\r\n                        fcColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + f + '\" title=\"' + f + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/></div>';\r\n                    }\r\n                    else{\r\n                        fcColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + f + '\" title=\"' + f + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/></div>';\r\n                    }\r\n                }\r\n                filterFcColorHtml = '<div id=\"filterFcColor\" class=\"box luckysheet-mousedown-cancel\"><div class=\"title luckysheet-mousedown-cancel\">'+locale_filter.filiterByTextColorTip+'</div><div style=\"max-height:128px;overflow:auto;\" class=\"luckysheet-mousedown-cancel\">' + fcColorItemHtml + '</div></div>';\r\n            }\r\n            //\r\n            let content;\r\n            if(filterBgColorHtml == '' && filterFcColorHtml == ''){\r\n                content = '<div class=\"luckysheet-mousedown-cancel\" style=\"padding: 10px 30px;text-align: center;\">'+locale_filter.filterContainerOneColorTip+'</div>';\r\n            }\r\n            else{\r\n                content = filterBgColorHtml + filterFcColorHtml + '<div class=\"luckysheet-mousedown-cancel\"><button id=\"luckysheet-filter-orderby-color-confirm\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin: 5px 20px;width: 70px;\">'+locale_button.confirm+'</button></div>';\r\n            }\r\n            //\u989C\u8272\u7B5B\u9009\u5B50\u83DC\u5355\r\n            $(\"#luckysheet-filter-orderby-color-submenu\").remove();\r\n            $(\"body\").append('<div id=\"luckysheet-filter-orderby-color-submenu\" class=\"luckysheet-cols-menu luckysheet-mousedown-cancel\">'+content+'</div>');\r\n            let $t = $(\"#luckysheet-filter-orderby-color-submenu\").end();\r\n            let $con = $(this).parent();\r\n            let winW = $(window).width(), winH = $(window).height();\r\n            let menuW = $con.width(), \r\n                myh = $t.height() + 25, \r\n                myw = $t.width() + 5;\r\n            let offset = $(this).offset();\r\n            let top = offset.top, left = offset.left + menuW;\r\n    \r\n            if (left + myw > winW) {\r\n                left = offset.left - myw;\r\n            }\r\n    \r\n            if (top + myh > winH) {\r\n                top = winH - myh;\r\n            }\r\n    \r\n            $(\"#luckysheet-filter-orderby-color-submenu\").css({ \"top\": top, \"left\": left }).show();\r\n        },\r\n        function(){\r\n            submenuhide = setTimeout(function () { $(\"#luckysheet-filter-orderby-color-submenu\").hide(); }, 200);\r\n        }\r\n    );\r\n\r\n    $(document).on(\"mouseover mouseleave\", \"#luckysheet-filter-orderby-color-submenu\", function(e){\r\n        if (e.type === \"mouseover\") {\r\n            clearTimeout(submenuhide);\r\n        } \r\n        else {\r\n            $(this).hide();\r\n        }\r\n    });\r\n    $(document).on(\"click\", \"#luckysheet-filter-orderby-color-submenu .item label\", function(){\r\n        $(this).siblings(\"input[type='checkbox']\").click();\r\n    });\r\n    $(document).off(\"click.orderbyColorConfirm\").on(\"click.orderbyColorConfirm\", \"#luckysheet-filter-orderby-color-submenu #luckysheet-filter-orderby-color-confirm\", function(){\r\n        let bg_colorMap = {};\r\n        let fc_colorMap = {};\r\n        \r\n        $(\"#luckysheet-filter-orderby-color-submenu .item\").each(function(i, e){\r\n            if($(e).find(\"input[type='checkbox']\").is(\":checked\")){\r\n                let color = $(this).find(\"label\").attr(\"title\");\r\n                let $id = $(this).closest(\".box\").attr(\"id\");\r\n    \r\n                if($id == \"filterBgColor\"){\r\n                    bg_colorMap[color] = 0;\r\n                }\r\n                else if($id == \"filterFcColor\"){\r\n                    fc_colorMap[color] = 0;\r\n                }\r\n            }\r\n        });\r\n        \r\n        let bg_filter;\r\n        if($(\"#luckysheet-filter-orderby-color-submenu #filterBgColor\").length > 0){\r\n            bg_filter = true;\r\n        }\r\n        else{\r\n            bg_filter = false;\r\n        }\r\n        \r\n        let fc_filter;\r\n        if($(\"#luckysheet-filter-orderby-color-submenu #filterFcColor\").length > 0){\r\n            fc_filter = true;\r\n        }\r\n        else{\r\n            fc_filter = false;\r\n        }\r\n    \r\n        let $menu = $(\"#luckysheet-filter-menu\");\r\n        let st_r = $menu.data(\"str\"), \r\n            ed_r = $menu.data(\"edr\"), \r\n            cindex = $menu.data(\"cindex\"), \r\n            st_c = $menu.data(\"stc\"), \r\n            ed_c = $menu.data(\"edc\");\r\n    \r\n        let rowhiddenother = {}; //\u5176\u5B83\u7B5B\u9009\u5217\u7684\u9690\u85CF\u884C\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c).get(0)).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n    \r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n    \r\n            rh = JSON.parse(rh);\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n    \r\n        let filterdata = {};\r\n        let rowhidden = {};\r\n        let caljs = {};\r\n    \r\n        let af_compute = alternateformat.getComputeMap();\r\n        let cf_compute = conditionformat.getComputeMap();\r\n    \r\n        for (let r = st_r + 1; r <= ed_r; r++) {\r\n            if(r in rowhiddenother){\r\n                continue;\r\n            }\r\n    \r\n            if(Store.flowdata[r] == null){\r\n                continue;\r\n            }\r\n    \r\n            let cell = Store.flowdata[r][cindex];\r\n    \r\n            //\u5355\u5143\u683C\u989C\u8272\r\n            let bg = menuButton.checkstatus(Store.flowdata, r, cindex , \"bg\");\r\n    \r\n            let checksAF = alternateformat.checksAF(r, cindex, af_compute);\r\n            if(checksAF != null){//\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272\r\n                bg = checksAF[1];\r\n            }\r\n    \r\n            let checksCF = conditionformat.checksCF(r, cindex, cf_compute);\r\n            if(checksCF != null && checksCF[\"cellColor\"] != null){//\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\r\n                bg = checksCF[\"cellColor\"];\r\n            }\r\n            \r\n            // bg maybe null\r\n            bg = bg == null ? '#ffffff' : bg;\r\n\r\n            if(bg.indexOf(\"rgb\") > -1){\r\n                bg = rgbTohex(bg);\r\n            }\r\n    \r\n            if(bg.length == 4){\r\n                bg = bg.substr(0, 1) + bg.substr(1, 1).repeat(2) + bg.substr(2, 1).repeat(2) + bg.substr(3, 1).repeat(2);\r\n            }\r\n    \r\n            //\u6587\u672C\u989C\u8272\r\n            let fc = menuButton.checkstatus(Store.flowdata, r, cindex , \"fc\");\r\n    \r\n            if(checksAF != null){//\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272\r\n                fc = checksAF[0];\r\n            }\r\n    \r\n            if(checksCF != null && checksCF[\"textColor\"] != null){//\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\r\n                fc = checksCF[\"textColor\"];\r\n            }\r\n    \r\n            if(fc.indexOf(\"rgb\") > -1){\r\n                fc = rgbTohex(fc);\r\n            }\r\n    \r\n            if(fc.length == 4){\r\n                fc = fc.substr(0, 1) + fc.substr(1, 1).repeat(2) + fc.substr(2, 1).repeat(2) + fc.substr(3, 1).repeat(2);\r\n            }\r\n    \r\n            if(bg_filter && fc_filter){\r\n                if(!(bg in bg_colorMap) && (!(fc in fc_colorMap) || cell == null || isRealNull(cell.v))){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n            else if(bg_filter){\r\n                if(!(bg in bg_colorMap)){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n            else if(fc_filter){\r\n                if(!(fc in fc_colorMap) || cell == null || isRealNull(cell.v)){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n        }\r\n    \r\n        let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c);\r\n    \r\n        let optionstate = Object.keys(rowhidden).length > 0;\r\n    \r\n        let rowhiddenall = $.extend(true, rowhiddenother, rowhidden), \r\n            rowhidenPre = json.parseJsonParm($top.data(\"rowhidden\"));\r\n    \r\n        labelFilterOptionState($top, optionstate, rowhidden, caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n    \r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg[\"rowhidden\"] = rowhiddenall;\r\n    \r\n        //\u4FDD\u5B58\u64A4\u9500\r\n        if(Store.clearjfundo){\r\n            let redo = {};\r\n            redo[\"type\"] = \"datachangeAll_filter\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    \r\n            redo[\"config\"] = $.extend(true, {}, Store.config);\r\n            redo[\"curconfig\"] = cfg;\r\n    \r\n            redo[\"optionstate\"] = optionstate;\r\n            redo[\"optionsindex\"] = cindex - st_c;\r\n    \r\n            redo[\"rowhidden\"] = $.extend(true, {}, rowhidden);\r\n            redo[\"rowhidenPre\"] = $.extend(true, {}, rowhidenPre);\r\n    \r\n            if (caljs != null) {\r\n                redo[\"caljs\"] = caljs;\r\n            }\r\n    \r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n    \r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n        server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n    \r\n        //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    \r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu, #luckysheet-filter-orderby-color-submenu\").hide();\r\n        cleargridelement();\r\n    });\r\n\r\n    //\u70B9\u51FB\u590D\u9009\u6846\r\n    $(document).off(\"click.filterCheckbox1\").on(\"click.filterCheckbox1\", \"#luckysheet-filter-byvalue-select .textBox\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox2\").on(\"click.filterCheckbox2\", \"#luckysheet-filter-byvalue-select .year\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox3\").on(\"click.filterCheckbox3\", \"#luckysheet-filter-byvalue-select .month\",function(){\r\n        //\u6708\u4EFD \u5BF9\u5E94\u7684 \u5929\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        //\u6708\u4EFD \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n        let yearDayAllCheck = true;\r\n        let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n        $yearDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                yearDayAllCheck = false;\r\n            }\r\n        });\r\n        if(yearDayAllCheck){\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox4\").on(\"click.filterCheckbox4\", \"#luckysheet-filter-byvalue-select .day\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n        let monthDayAllCheck = true;\r\n        let $monthDay = $(this).parents(\".monthBox\").find(\".day\");\r\n        $monthDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                monthDayAllCheck = false;\r\n            }\r\n        });\r\n        if(monthDayAllCheck){\r\n            $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n        let yearDayAllCheck = true;\r\n        let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n        $yearDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                yearDayAllCheck = false;\r\n            }\r\n        });\r\n        if(yearDayAllCheck){\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n    })\r\n\r\n    //\u65E5\u671F \u4E09\u7EA7\u4E0B\u62C9\u663E\u793A\r\n    $(document).off(\"click.filterYearDropdown\").on(\"click.filterYearDropdown\", \"#luckysheet-filter-byvalue-select .yearBox .fa-caret-right\",function(event){\r\n        let $p = $(this).parents(\".luckysheet-mousedown-cancel\");\r\n        if($p.hasClass(\"year\")){\r\n            $(this).parents(\".yearBox\").find(\".monthList\").slideToggle();\r\n        }\r\n        if($p.hasClass(\"month\")){\r\n            $(this).parents(\".monthBox\").find(\".dayList\").slideToggle();\r\n        }\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //\u5168\u9009\r\n    $(\"#luckysheet-filter-byvalue-btn-all\").click(function () {\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").prop(\"checked\", true);\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n    });\r\n\r\n    //\u6E05\u9664\r\n    $(\"#luckysheet-filter-byvalue-btn-clear\").click(function () {\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").removeAttr(\"checked\");\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n    });\r\n\r\n    //\u53CD\u9009\r\n    $(\"#luckysheet-filter-byvalue-btn-contra\").click(function () {\r\n        let $input = $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\");\r\n        $input.each(function(i, e){\r\n            if($(e).is(\":checked\")){\r\n                $(e).removeAttr(\"checked\");\r\n                $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n            }\r\n            else{\r\n                $(e).prop(\"checked\", true);\r\n                $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n            }\r\n        });\r\n        //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n        let $month = $(\"#luckysheet-filter-byvalue-select .ListBox .monthBox\");\r\n        $month.each(function(index, event){\r\n            let monthDayAllCheck = true;\r\n            let $monthDay = $(event).find(\".day input[type='checkbox']\");\r\n            $monthDay.each(function(i,e){\r\n                if($(e).is(\":checked\")){\r\n                    \r\n                }\r\n                else{\r\n                    monthDayAllCheck = false;\r\n                }\r\n            });\r\n            if(monthDayAllCheck){\r\n                $(event).find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n                $(event).attr(\"data-check\", \"true\");\r\n            }\r\n            else{\r\n                $(event).find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(event).attr(\"data-check\", \"false\");\r\n            }\r\n        });\r\n        //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n        let $year = $(\"#luckysheet-filter-byvalue-select .ListBox .yearBox\");\r\n        $year.each(function(index, event){\r\n            let yearDayAllCheck = true;\r\n            let $yearDay = $(event).find(\".day input[type='checkbox']\");\r\n            $yearDay.each(function(i,e){\r\n                if($(e).is(\":checked\")){\r\n                    \r\n                }\r\n                else{\r\n                    yearDayAllCheck = false;\r\n                }\r\n            });\r\n            if(yearDayAllCheck){\r\n                $(event).find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n                $(event).attr(\"data-check\", \"true\");\r\n            }\r\n            else{\r\n                $(event).find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(event).attr(\"data-check\", \"false\");\r\n            }\r\n        });\r\n    });\r\n\r\n    //\u6E05\u9664\u7B5B\u9009\r\n    $(\"#luckysheet-filter-initial\").click(function () {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n        $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.conditionNone);\r\n\r\n        let redo = {};\r\n        redo[\"type\"] = \"datachangeAll_filter_clear\";\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        Store.config[\"rowhidden\"] = {};\r\n        redo[\"curconfig\"] = $.extend(true, {}, Store.config);\r\n\r\n        redo[\"filter_save\"] = $.extend(true, {}, Store.luckysheet_filter_save);\r\n\r\n        let optiongroups = [];\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function () {\r\n            let $t = $(this);\r\n\r\n            let optionstate = $t.hasClass(\"luckysheet-filter-options-active\");\r\n            let rowhidden = json.parseJsonParm($t.data(\"rowhidden\"));\r\n            let caljs = json.parseJsonParm($t.data(\"caljs\"));\r\n\r\n            optiongroups.push({\r\n                \"optionstate\":optionstate,\r\n                \"rowhidden\": rowhidden, \r\n                \"caljs\":caljs, \r\n                \"str\": $t.data(\"str\"),\r\n                \"edr\": $t.data(\"edr\"),\r\n                \"cindex\": $t.data(\"cindex\"),\r\n                \"stc\": $t.data(\"stc\"),\r\n                \"edc\": $t.data(\"edc\")\r\n            });\r\n        });\r\n        redo[\"optiongroups\"] = optiongroups;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n\r\n        $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n        //\u6E05\u9664\u7B5B\u9009\u53D1\u9001\u7ED9\u540E\u53F0\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter = null;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select = null;\r\n\r\n        server.saveParam(\"fsc\", Store.currentSheetIndex, null);\r\n\r\n        //config\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, {}, { \"k\": \"rowhidden\" });\r\n\r\n        //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    });\r\n\r\n    //\u6309\u7167\u503C\u8FDB\u884C\u7B5B\u9009\r\n    $(\"#luckysheet-filter-byvalue-input\").on('input propertychange', function () {\r\n        let v = $(this).val().toString();\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox .luckysheet-mousedown-cancel\").show();\r\n        \r\n        if(v != \"\"){\r\n            $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").each(function(i, e){\r\n                if($(e).closest(\".day\").length > 0){\r\n                    let day = $(e).siblings(\"label\").text().toString();\r\n                    let month = $(e).closest(\".monthBox\").find(\".month label\").text().toString();\r\n                    let year = $(e).closest(\".yearBox\").find(\".year label\").text().toString();\r\n                    let itemV = year + \"-\" + month + \"-\" + day;\r\n\r\n                    if(itemV.indexOf(v) == -1){\r\n                        $(e).closest(\".day\").hide();\r\n                        \r\n                        //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n                        let $monthDay = $(e).closest(\".dayList\").find(\".day:visible\");\r\n                        if($monthDay.length == 0){\r\n                            $(e).closest(\".monthBox\").find(\".month\").hide();\r\n                        }\r\n\r\n                        //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n                        let $yearDay = $(e).closest(\".monthList\").find(\".day:visible\");\r\n                        if($yearDay.length == 0){\r\n                            $(e).closest(\".yearBox\").find(\".year\").hide();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if($(e).closest(\".textBox\").length > 0){\r\n                    let itemV = $(e).siblings(\"label\").text().toString();\r\n                    \r\n                    if(itemV.indexOf(v) == -1){\r\n                        $(e).parents(\".textBox\").hide();\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    //\u7B5B\u9009\u53D6\u6D88\r\n    $(\"#luckysheet-filter-cancel\").click(function () {\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n    });\r\n\r\n    //\u7B5B\u9009 \u786E\u8BA4\r\n    $(\"#luckysheet-filter-confirm\").click(function () {\r\n        let $menu = $(\"#luckysheet-filter-menu\");\r\n        let st_r = $menu.data(\"str\"), \r\n            ed_r = $menu.data(\"edr\"), \r\n            cindex = $menu.data(\"cindex\"), \r\n            st_c = $menu.data(\"stc\"), \r\n            ed_c = $menu.data(\"edc\");\r\n\r\n        let rowhiddenother = {}; //\u5176\u5B83\u7B5B\u9009\u5217\u7684\u9690\u85CF\u884C\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c).get(0)).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n\r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n\r\n            rh = JSON.parse(rh.replace(/\\'/g, '\"'));\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n\r\n        let filterdata = {};\r\n        let rowhidden = {};\r\n        let caljs = {};\r\n\r\n        if ($(\"#luckysheet-filter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-filter-selected span\").data(\"value\") != \"null\") {\r\n            let $t = $(\"#luckysheet-filter-selected span\");\r\n            let type = $t.data(\"type\"), value = $t.data(\"value\");\r\n\r\n            caljs[\"value\"] = value;\r\n            caljs[\"text\"] = $t.text();\r\n\r\n            if (type == \"0\") {\r\n                caljs[\"type\"] = \"0\";\r\n            }\r\n            else if (type == \"2\") {\r\n                let $input = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2 input\");\r\n                caljs[\"type\"] = \"2\";\r\n                caljs[\"value1\"] = $input.eq(0).val();\r\n                caljs[\"value2\"] = $input.eq(1).val();\r\n            }\r\n            else {\r\n                caljs[\"type\"] = \"1\";\r\n                caljs[\"value1\"] = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).find(\"input\").val();\r\n            }\r\n\r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n                \r\n                if (value == \"cellnull\") { //\u5355\u5143\u683C\u4E3A\u7A7A\r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"cellnonull\") { //\u5355\u5143\u683C\u6709\u6570\u636E\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"textinclude\") { //\u6587\u672C\u5305\u542B \r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m.indexOf(value1) == -1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textnotinclude\") { //\u6587\u672C\u4E0D\u5305\u542B\r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n\r\n                    }\r\n                    else{\r\n                        if(cell.m.indexOf(value1) > -1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textstart\") { //\u6587\u672C\u5F00\u5934\u4E3A\r\n                    let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m.substr(0, valuelen) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textend\") { //\u6587\u672C\u7ED3\u5C3E\u4E3A\r\n                    let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(valuelen > cell.m.length || cell.m.substr(cell.m.length - valuelen, valuelen) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textequal\") { //\u6587\u672C\u7B49\u4E8E\r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"dateequal\") { //\u65E5\u671F\u7B49\u4E8E\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"datelessthan\") { //\u65E5\u671F\u65E9\u4E8E\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) >= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"datemorethan\") { //\u65E5\u671F\u665A\u4E8E\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) <= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"morethan\") { //\u5927\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v <= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"moreequalthan\") { //\u5927\u4E8E\u7B49\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v < value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"lessthan\") { //\u5C0F\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v >= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"lessequalthan\") { //\u5C0F\u4E8E\u7B49\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v > value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"equal\") { //\u7B49\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"noequal\") { //\u4E0D\u7B49\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v == value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"include\") { //\u4ECB\u4E8E\r\n                    let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                    let min, max;\r\n                    if(value1 < value2){\r\n                        min = value1;\r\n                        max = value2;\r\n                    }\r\n                    else{\r\n                        max = value1;\r\n                        min = value2;   \r\n                    }\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v < min || cell.v > max){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"noinclude\") { //\u4E0D\u5728\u5176\u4E2D\r\n                    let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                    let min, max;\r\n                    if(value1 < value2){\r\n                        min = value1;\r\n                        max = value2;\r\n                    }\r\n                    else{\r\n                        max = value1;\r\n                        min = value2;   \r\n                    }\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v >= min && cell.v <= max){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").each(function(i, e){\r\n                if($(e).is(\":visible\") && $(e).is(\":checked\")){\r\n                    return true;\r\n                }\r\n\r\n                if($(e).closest(\".day\").length > 0){\r\n                    let day = $(e).siblings(\"label\").text();\r\n                    if(Number(day) < 10){\r\n                        day = \"0\" + Number(day);\r\n                    }\r\n\r\n                    let month = $(e).closest(\".monthBox\").find(\".month label\").text().replace(locale_filter.filiterMonthText, \"\");\r\n                    if(Number(month) < 10){\r\n                        month = \"0\" + Number(month);\r\n                    }\r\n\r\n                    let year = $(e).closest(\".yearBox\").find(\".year label\").text().replace(locale_filter.filiterYearText, \"\");\r\n\r\n                    let itemV = locale_filter.filterDateFormatTip +\"#$$$#\" + year + \"-\" + month + \"-\" + day;\r\n\r\n                    filterdata[itemV] = \"1\";\r\n                }\r\n\r\n                if($(e).closest(\".textBox\").length > 0){\r\n                    let itemV = $(e).closest(\".textBox\").data(\"filter\");\r\n\r\n                    filterdata[itemV] = \"1\";\r\n                }\r\n            });\r\n            \r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n\r\n                let value;\r\n                if(cell == null || isRealNull(cell.v)){\r\n                    value = \"null#$$$#null\";\r\n                }\r\n                else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                    let fmt = update(\"YYYY-MM-DD\", cell.v);\r\n                    value = locale_filter.filterDateFormatTip +\"#$$$#\" + fmt;\r\n                }\r\n                else{\r\n                    value = cell.v + \"#$$$#\" + cell.m;\r\n                }\r\n\r\n                if(value in filterdata){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c);\r\n\r\n        let optionstate = $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible:checked\").length < $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible\").length || $(\"#luckysheet-filter-byvalue-input\").val().length > 0 || ($(\"#luckysheet-filter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-filter-selected span\").data(\"value\") != \"null\");\r\n\r\n        let rowhiddenall = $.extend(true, rowhiddenother, rowhidden), \r\n            rowhidenPre = json.parseJsonParm($top.data(\"rowhidden\"));\r\n\r\n        labelFilterOptionState($top, optionstate, rowhidden, caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg[\"rowhidden\"] = rowhiddenall;\r\n\r\n        //\u4FDD\u5B58\u64A4\u9500\r\n        if(Store.clearjfundo){\r\n            let redo = {};\r\n            redo[\"type\"] = \"datachangeAll_filter\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n            redo[\"config\"] = $.extend(true, {}, Store.config);\r\n            redo[\"curconfig\"] = cfg;\r\n\r\n            redo[\"optionstate\"] = optionstate;\r\n            redo[\"optionsindex\"] = cindex - st_c;\r\n\r\n            redo[\"rowhidden\"] = $.extend(true, {}, rowhidden);\r\n            redo[\"rowhidenPre\"] = $.extend(true, {}, rowhidenPre);\r\n\r\n            if (caljs != null) {\r\n                redo[\"caljs\"] = caljs;\r\n            }\r\n\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n        //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        cleargridelement();\r\n    });\r\n}\r\n\r\nexport {\r\n    labelFilterOptionState,\r\n    orderbydatafiler,\r\n    createFilter,\r\n    createFilterOptions,\r\n    initialFilterHandler\r\n}", "import { mouseposition } from '../global/location';\r\nimport server from './server';\r\nimport luckysheetsizeauto from './resize';\r\nimport { modelHTML } from './constant';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\nconst imageCtrl = {\r\n    imgItem: {\r\n        type: '3',  //1\u79FB\u52A8\u5E76\u8C03\u6574\u5355\u5143\u683C\u5927\u5C0F 2\u79FB\u52A8\u5E76\u4E14\u4E0D\u8C03\u6574\u5355\u5143\u683C\u7684\u5927\u5C0F 3\u4E0D\u8981\u79FB\u52A8\u5355\u5143\u683C\u5E76\u8C03\u6574\u5176\u5927\u5C0F\r\n        src: '',  //\u56FE\u7247url\r\n        originWidth: null,  //\u56FE\u7247\u539F\u59CB\u5BBD\u5EA6\r\n        originHeight: null,  //\u56FE\u7247\u539F\u59CB\u9AD8\u5EA6\r\n        default: {\r\n            width: null,  //\u56FE\u7247 \u5BBD\u5EA6\r\n            height: null,  //\u56FE\u7247 \u9AD8\u5EA6\r\n            left: null,  //\u56FE\u7247\u79BB\u8868\u683C\u5DE6\u8FB9\u7684 \u4F4D\u7F6E\r\n            top: null,  //\u56FE\u7247\u79BB\u8868\u683C\u9876\u90E8\u7684 \u4F4D\u7F6E\r\n        },\r\n        crop: {\r\n            width: null,  //\u56FE\u7247\u88C1\u526A\u540E \u5BBD\u5EA6\r\n            height: null,  //\u56FE\u7247\u88C1\u526A\u540E \u9AD8\u5EA6\r\n            offsetLeft: 0,  //\u56FE\u7247\u88C1\u526A\u540E\u79BB\u672A\u88C1\u526A\u65F6 \u5DE6\u8FB9\u7684\u4F4D\u79FB\r\n            offsetTop: 0,  //\u56FE\u7247\u88C1\u526A\u540E\u79BB\u672A\u88C1\u526A\u65F6 \u9876\u90E8\u7684\u4F4D\u79FB\r\n        },\r\n        isFixedPos: false,  //\u56FA\u5B9A\u4F4D\u7F6E\r\n        fixedLeft: null,  //\u56FA\u5B9A\u4F4D\u7F6E \u5DE6\u4F4D\u79FB\r\n        fixedTop: null,  //\u56FA\u5B9A\u4F4D\u7F6E \u53F3\u4F4D\u79FB\r\n        border: {\r\n            width: 0,  //\u8FB9\u6846\u5BBD\u5EA6\r\n            radius: 0,  //\u8FB9\u6846\u534A\u5F84\r\n            style: 'solid',  //\u8FB9\u6846\u7C7B\u578B\r\n            color: '#000',  //\u8FB9\u6846\u989C\u8272\r\n        }\r\n    },\r\n    images: null,\r\n    currentImgId: null,\r\n    currentWinW: null,\r\n    currentWinH: null,\r\n    resize: null,  \r\n    resizeXY: null,\r\n    move: false,\r\n    moveXY: null,\r\n    cropChange: null,  \r\n    cropChangeXY: null,\r\n    cropChangeObj: null,\r\n    copyImgItemObj: null,\r\n    inserImg: function(src){\r\n        let _this = this;\r\n        \r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus || 0;\r\n        let colIndex = last.column_focus || 0;\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let width = image.width,\r\n                height = image.height;\r\n\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: width,\r\n                originHeight: height\r\n            }\r\n\r\n            _this.addImgItem(img);\r\n        }\r\n        image.src = src;\r\n    },\r\n    generateRandomId: function(prefix) {\r\n        if(prefix == null){\r\n            prefix = \"img\";\r\n        }\r\n\r\n        let userAgent = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, \"\").split(\"\");\r\n\r\n        let mid = \"\";\r\n\r\n        for(let i = 0; i < 12; i++){\r\n            mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];\r\n        }\r\n\r\n        let time = new Date().getTime();\r\n\r\n        return prefix + \"_\" + mid + \"_\" + time;\r\n    },\r\n    modelHtml: function(id, imgItem) {\r\n        let _this = this;\r\n\r\n        let src = imgItem.src;\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width * Store.zoomRatio;\r\n        let height = imgItemParam.height * Store.zoomRatio;\r\n        let left = imgItemParam.left * Store.zoomRatio;\r\n        let top = imgItemParam.top * Store.zoomRatio;\r\n        let position = imgItemParam.position;\r\n\r\n        let borderWidth = imgItem.border.width;\r\n\r\n        return  `<div id=\"${id}\" class=\"luckysheet-modal-dialog luckysheet-modal-dialog-image\" style=\"width:${width}px;height:${height}px;padding:0;position:${position};left:${left}px;top:${top}px;z-index:200;\">\r\n                    <div class=\"luckysheet-modal-dialog-content\" style=\"width:100%;height:100%;overflow:hidden;position:relative;\">\r\n                        <img src=\"${src}\" style=\"position:absolute;width:${imgItem.default.width * Store.zoomRatio}px;height:${imgItem.default.height * Store.zoomRatio}px;left:${-imgItem.crop.offsetLeft * Store.zoomRatio}px;top:${-imgItem.crop.offsetTop * Store.zoomRatio}px;\" />\r\n                    </div>\r\n                    <div class=\"luckysheet-modal-dialog-border\" style=\"border:${borderWidth}px ${imgItem.border.style} ${imgItem.border.color};border-radius:${imgItem.border.radius * Store.zoomRatio}px;position:absolute;left:${-borderWidth}px;right:${-borderWidth}px;top:${-borderWidth}px;bottom:${-borderWidth}px;\"></div>\r\n                </div>`;\r\n    },\r\n    getSliderHtml: function() {\r\n        let imageText = locale().imageText;\r\n\r\n        return `<div id=\"luckysheet-modal-dialog-slider-imageCtrl\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-imageCtrl\" style=\"display:block;\">\r\n                    <div class=\"luckysheet-modal-dialog-slider-title\">\r\n                        <span>${imageText.imageSetting}</span>\r\n                        <span class=\"luckysheet-model-close-btn\" title=\"${imageText.close}\">\r\n                            <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\r\n                        </span>\r\n                    </div>\r\n                    <div class=\"luckysheet-modal-dialog-slider-content\">\r\n                        <div class=\"slider-box\">\r\n                            <div class=\"slider-box-title\">${imageText.conventional}</div>\r\n                            <div class=\"slider-box-radios\">\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType1\" name=\"imgItemType\" value=\"1\">\r\n                                    <label for=\"imgItemType1\">${imageText.moveCell1}</label>\r\n                                </div>\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType2\" name=\"imgItemType\" value=\"2\">\r\n                                    <label for=\"imgItemType2\">${imageText.moveCell2}</label>\r\n                                </div>\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType3\" name=\"imgItemType\" value=\"3\">\r\n                                    <label for=\"imgItemType3\">${imageText.moveCell3}</label>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"slider-box-checkbox\">\r\n                                <input type=\"checkbox\" id=\"imgItemIsFixedPos\">\r\n                                <label for=\"imgItemIsFixedPos\">${imageText.fixedPos}</label>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"slider-box\">\r\n                            <div class=\"slider-box-title\">${imageText.border}</div>\r\n                            <div class=\"slider-box-borderConfig\">\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.width}</label>\r\n                                    <input type=\"number\" id=\"imgItemBorderWidth\" min=\"0\">\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.radius}</label>\r\n                                    <input type=\"number\" id=\"imgItemBorderRadius\" min=\"0\">\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.style}</label>\r\n                                    <select id=\"imgItemBorderStyle\">\r\n                                        <option value=\"solid\">${imageText.solid}</option>\r\n                                        <option value=\"dashed\">${imageText.dashed}</option>\r\n                                        <option value=\"dotted\">${imageText.dotted}</option>\r\n                                        <option value=\"double\">${imageText.double}</option>\r\n                                    </select>\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.color}</label>\r\n                                    <div id=\"imgItemBorderColor\" class=\"imgItemBorderColor\">\r\n                                        <span></span>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    sliderHtmlShow: function() {\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").remove();\r\n\r\n        let sliderHtml = _this.getSliderHtml();\r\n        $(\"body\").append(sliderHtml);\r\n        luckysheetsizeauto();\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        //\u7C7B\u578B\r\n        let type = imgItem.type;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemType\" + type).prop(\"checked\", true);\r\n\r\n        //\u56FA\u5B9A\u4F4D\u7F6E\r\n        let isFixedPos = imgItem.isFixedPos;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemIsFixedPos\").prop(\"checked\", isFixedPos);\r\n\r\n        //\u8FB9\u6846\u5BBD\u5EA6\r\n        let border = imgItem.border;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderWidth\").val(border.width);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderRadius\").val(border.radius);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderStyle\").val(border.style);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span\").css(\"background-color\", border.color).attr(\"title\", border.color);\r\n    \r\n        _this.init();\r\n    },\r\n    colorSelectDialog: function(currenColor){\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n        const locale_toolbar = _locale.toolbar;\r\n        const locale_imageCtrl = _locale.imageCtrl;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-imageCtrl-colorSelect-dialog\", \r\n            \"addclass\": \"luckysheet-imageCtrl-colorSelect-dialog\", \r\n            \"title\": locale_imageCtrl.borderTile, \r\n            \"content\": `<div class=\"currenColor\">\r\n                            ${locale_imageCtrl.borderCur}:<span title=\"${currenColor}\" style=\"background-color:${currenColor}\"></span>\r\n                        </div>\r\n                        <div class=\"colorshowbox\"></div>`, \r\n            \"botton\":  `<button id=\"luckysheet-imageCtrl-colorSelect-dialog-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-imageCtrl-colorSelect-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n        \r\n        //\u521D\u59CB\u5316\u9009\u62E9\u989C\u8272\u63D2\u4EF6\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").find(\".colorshowbox\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            showButtons: false,//\u9690\u85CF\u9009\u62E9\u53D6\u6D88\u6309\u94AE\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            color: currenColor,\r\n            cancelText: locale_button.cancel,\r\n            chooseText: locale_toolbar.confirmColor,\r\n            togglePaletteMoreText: locale_toolbar.customColor,\r\n            togglePaletteLessText: locale_toolbar.collapse,\r\n            togglePaletteOnly: true,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [\r\n                [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n            ],\r\n            move: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"#000\";\r\n                }\r\n\r\n                $(\"#luckysheet-imageCtrl-colorSelect-dialog .currenColor span\").css(\"background-color\", color).attr(\"title\", color);\r\n            }\r\n        });\r\n    },\r\n    init: function() {\r\n        let _this = this;\r\n\r\n        //\u5173\u95ED\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl .luckysheet-model-close-btn\").click(function () {\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //\u5E38\u89C4\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.radio\").on(\"change.radio\", \".radio-item input[type=radio][name=imgItemType]\", function() {\r\n            _this.configChange(\"type\", this.value);\r\n        })\r\n\r\n        //\u56FA\u5B9A\u4F4D\u7F6E\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.checkbox\").on(\"change.checkbox\", \".slider-box-checkbox input[type=checkbox]\", function() {\r\n            _this.configChange(\"fixedPos\", this.checked);\r\n        })\r\n\r\n        //\u8FB9\u6846\u5BBD\u5EA6\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderWidth\").on(\"change.borderWidth\", \"#imgItemBorderWidth\", function() {\r\n            _this.configChange(\"border-width\", this.valueAsNumber);\r\n        })\r\n\r\n        //\u8FB9\u6846\u534A\u5F84\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderRadius\").on(\"change.borderRadius\", \"#imgItemBorderRadius\", function() {\r\n            _this.configChange(\"border-radius\", this.valueAsNumber);\r\n        })\r\n\r\n        //\u8FB9\u6846\u6837\u5F0F\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderStyle\").on(\"change.borderStyle\", \"#imgItemBorderStyle\", function() {\r\n            _this.configChange(\"border-style\", this.value);\r\n        })\r\n\r\n        //\u8FB9\u6846\u989C\u8272 \u9009\u62E9\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"click.color\").on(\"click.color\", \"#imgItemBorderColor\", function() {\r\n            let currenColor = $(this).find(\"span\").attr(\"title\");\r\n            _this.colorSelectDialog(currenColor);\r\n        })\r\n\r\n        //\u8FB9\u6846\u9009\u62E9\u989C\u8272 \u786E\u5B9A \r\n        $(document).off(\"click.selectColorConfirm\").on(\"click.selectColorConfirm\", \"#luckysheet-imageCtrl-colorSelect-dialog-confirm\", function(){\r\n            let $parent = $(this).parents(\"#luckysheet-imageCtrl-colorSelect-dialog\");\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $parent.hide();\r\n\r\n            let currenColor = $parent.find(\".currenColor span\").attr(\"title\");\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span\").css(\"background-color\", currenColor).attr(\"title\", currenColor);\r\n\r\n            _this.configChange(\"border-color\", currenColor);            \r\n        });\r\n\r\n        //image active\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.active\").on(\"mousedown.active\", \".luckysheet-modal-dialog-image\", function(e) {\r\n            \r\n\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n\r\n            $(this).hide();\r\n            let id = $(this).attr(\"id\");\r\n\r\n            if(_this.currentImgId != null && _this.currentImgId != id){\r\n                _this.cancelActiveImgItem();\r\n            }\r\n\r\n            _this.currentImgId = id;\r\n\r\n            let item = _this.images[id];\r\n            let imgItemParam = _this.getImgItemParam(item);\r\n\r\n            let width = imgItemParam.width * Store.zoomRatio;\r\n            let height = imgItemParam.height * Store.zoomRatio;\r\n            let left = imgItemParam.left * Store.zoomRatio;\r\n            let top = imgItemParam.top * Store.zoomRatio;\r\n            let position = imgItemParam.position;\r\n        \r\n            $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n                \"width\": width,\r\n                \"height\": height,\r\n                \"left\": left,\r\n                \"top\": top,\r\n                \"position\": position\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n                \"background-image\": \"url(\" + item.src + \")\",\r\n                \"background-size\": item.default.width * Store.zoomRatio + \"px \" + item.default.height * Store.zoomRatio + \"px\",\r\n                \"background-position\": -item.crop.offsetLeft * Store.zoomRatio + \"px \" + -item.crop.offsetTop * Store.zoomRatio + \"px\"\r\n            })\r\n\r\n            $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css({\r\n                \"border-width\": item.border.width * Store.zoomRatio,\r\n                \"border-style\": item.border.style,\r\n                \"border-color\": item.border.color,\r\n                \"border-radius\": item.border.radius * Store.zoomRatio,\r\n                \"left\": -item.border.width * Store.zoomRatio,\r\n                \"right\": -item.border.width * Store.zoomRatio,\r\n                \"top\": -item.border.width * Store.zoomRatio,\r\n                \"bottom\": -item.border.width * Store.zoomRatio,\r\n            })\r\n\r\n            _this.sliderHtmlShow();\r\n\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image move\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.move\").on(\"mousedown.move\", \".luckysheet-modal-dialog-content\", function(e) {\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            if(!$(\"#luckysheet-modal-dialog-slider-imageCtrl\").is(\":visible\")){\r\n                _this.sliderHtmlShow();\r\n            }\r\n            \r\n            _this.move = true;\r\n            \r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            let offset = $(\"#luckysheet-modal-dialog-activeImage\").offset();\r\n\r\n            _this.moveXY = [\r\n                e.pageX - offset.left, \r\n                e.pageY - offset.top, \r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image resize\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.resize\").on(\"mousedown.resize\", \".luckysheet-modal-dialog-resize-item\", function(e) {\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.resize = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(e.pageX, e.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let position = $(\"#luckysheet-modal-dialog-activeImage\").position();\r\n            let width = $(\"#luckysheet-modal-dialog-activeImage\").width();\r\n            let height = $(\"#luckysheet-modal-dialog-activeImage\").height();\r\n\r\n            _this.resizeXY = [\r\n                x, \r\n                y, \r\n                width, \r\n                height, \r\n                position.left + scrollLeft, \r\n                position.top + scrollTop, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n            \r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image croppingEnter\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.croppingEnter\").on(\"mousedown.croppingEnter\", \".luckysheet-modal-controll-crop\", function(e) {\r\n            _this.croppingEnter();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image croppingExit\r\n        $(\"#luckysheet-modal-dialog-cropping\").off(\"mousedown.croppingExit\").on(\"mousedown.croppingExit\", \".luckysheet-modal-controll-crop\", function(e) {\r\n            _this.croppingExit();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image crop change\r\n        $(\"#luckysheet-modal-dialog-cropping\").off(\"mousedown.cropChange\").on(\"mousedown.cropChange\", \".resize-item\", function(e) {\r\n            _this.cropChange = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(e.pageX, e.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            _this.cropChangeXY = [\r\n                x, \r\n                y\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n            \r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image restore\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.restore\").on(\"mousedown.restore\", \".luckysheet-modal-controll-restore\", function(e) {\r\n            _this.restoreImgItem();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image delete\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.delete\").on(\"mousedown.delete\", \".luckysheet-modal-controll-del\", function(e) {\r\n            _this.removeImgItem();\r\n            e.stopPropagation();\r\n        })\r\n    },\r\n    configChange: function(type, value){\r\n        let _this = this;\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        switch(type){\r\n            case \"type\":\r\n                imgItem.type = value;\r\n                break;\r\n            case \"fixedPos\":\r\n                imgItem.isFixedPos = value;\r\n\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let width = imgItemParam.width;\r\n                let height = imgItemParam.height;\r\n                let left = imgItemParam.left;\r\n                let top = imgItemParam.top;\r\n                let position = imgItemParam.position;\r\n            \r\n                $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n                    \"width\": width,\r\n                    \"height\": height,\r\n                    \"left\": left,\r\n                    \"top\": top,\r\n                    \"position\": position\r\n                });\r\n                break;\r\n            case \"border-width\":\r\n                imgItem.border.width = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css({\r\n                    \"border-width\": value,\r\n                    \"left\": -value,\r\n                    \"right\": -value,\r\n                    \"top\": -value,\r\n                    \"bottom\": -value\r\n                });\r\n                break;\r\n            case \"border-radius\":\r\n                imgItem.border.radius = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-radius\", value);\r\n                break;\r\n            case \"border-style\":\r\n                imgItem.border.style = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-style\", value);\r\n                break;\r\n            case \"border-color\":\r\n                imgItem.border.color = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-color\", value);\r\n                break;\r\n        }\r\n        \r\n        _this.ref();\r\n    },\r\n    getImgItemParam(imgItem){\r\n        let isFixedPos = imgItem.isFixedPos;\r\n\r\n        let width = imgItem.default.width,\r\n            height = imgItem.default.height,\r\n            left = imgItem.default.left,\r\n            top = imgItem.default.top;\r\n\r\n        if(imgItem.crop.width != width || imgItem.crop.height != height){\r\n            width = imgItem.crop.width;\r\n            height = imgItem.crop.height;\r\n            left += imgItem.crop.offsetLeft;\r\n            top += imgItem.crop.offsetTop;\r\n        }\r\n\r\n        let position = 'absolute';\r\n        if(isFixedPos){\r\n            position = 'fixed';\r\n            left = imgItem.fixedLeft + imgItem.crop.offsetLeft;\r\n            top = imgItem.fixedTop + imgItem.crop.offsetTop;\r\n        }\r\n\r\n        return {\r\n            width: width,\r\n            height: height,\r\n            left: left,\r\n            top: top,\r\n            position: position\r\n        }\r\n    },\r\n    cancelActiveImgItem: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width * Store.zoomRatio;\r\n        let height = imgItemParam.height * Store.zoomRatio;\r\n        let left = imgItemParam.left * Store.zoomRatio;\r\n        let top = imgItemParam.top * Store.zoomRatio;\r\n        let position = imgItemParam.position;\r\n\r\n        $(\"#\" + _this.currentImgId).show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n        $(\"#\" + _this.currentImgId + \" img\").css({\r\n            \"width\": imgItem.default.width * Store.zoomRatio,\r\n            \"height\": imgItem.default.height * Store.zoomRatio,\r\n            \"left\": -imgItem.crop.offsetLeft * Store.zoomRatio,\r\n            \"top\": -imgItem.crop.offsetTop * Store.zoomRatio\r\n        });\r\n        $(\"#\" + _this.currentImgId + \" .luckysheet-modal-dialog-border\").css({\r\n            \"border-width\": imgItem.border.width * Store.zoomRatio,\r\n            \"border-style\": imgItem.border.style,\r\n            \"border-color\": imgItem.border.color,\r\n            \"border-radius\": imgItem.border.radius * Store.zoomRatio,\r\n            \"left\": -imgItem.border.width * Store.zoomRatio,\r\n            \"right\": -imgItem.border.width * Store.zoomRatio,\r\n            \"top\": -imgItem.border.width * Store.zoomRatio,\r\n            \"bottom\": -imgItem.border.width * Store.zoomRatio,\r\n        })\r\n\r\n        _this.currentImgId = null;\r\n    },\r\n    addImgItem: function(img) {\r\n        let _this = this;\r\n\r\n        let width, height;\r\n        let max = 400;\r\n\r\n        if(img.originHeight < img.originWidth){\r\n            height = Math.round(img.originHeight * (max / img.originWidth));\r\n            width = max;\r\n        }\r\n        else{\r\n            width = Math.round(img.originWidth * (max / img.originHeight));\r\n            height = max;\r\n        }\r\n\r\n        if(_this.images == null){\r\n            _this.images = {};\r\n        }\r\n\r\n        let imgItem = $.extend(true, {}, _this.imgItem);\r\n        imgItem.src = img.src;\r\n        imgItem.originWidth = img.originWidth;\r\n        imgItem.originHeight = img.originHeight;\r\n        imgItem.default.width = width;\r\n        imgItem.default.height = height;\r\n        imgItem.default.left = img.left;\r\n        imgItem.default.top = img.top;\r\n        imgItem.crop.width = width;\r\n        imgItem.crop.height = height;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        imgItem.fixedLeft = img.left - scrollLeft + Store.rowHeaderWidth;\r\n        imgItem.fixedTop = img.top - scrollTop + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n\r\n        let id = _this.generateRandomId();\r\n        let modelHtml = _this.modelHtml(id, imgItem);\r\n\r\n        $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n\r\n        _this.images[id] = imgItem;\r\n        _this.ref();\r\n\r\n        _this.init();\r\n    },\r\n    moveImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.move = false;\r\n\r\n        let obj = $(\"#luckysheet-modal-dialog-activeImage\")[0];\r\n        let item = _this.images[_this.currentImgId];\r\n\r\n        if(item.isFixedPos){\r\n            item.fixedLeft = obj.offsetLeft - item.crop.offsetLeft;\r\n            item.fixedTop = obj.offsetTop - item.crop.offsetTop;\r\n        }\r\n        else{\r\n            item.default.left = obj.offsetLeft - item.crop.offsetLeft;\r\n            item.default.top = obj.offsetTop - item.crop.offsetTop;\r\n        }\r\n\r\n        _this.ref();\r\n    },\r\n    resizeImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.resize = null;\r\n\r\n        let obj = $(\"#luckysheet-modal-dialog-activeImage\")[0];\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let scaleX = obj.clientWidth / item.crop.width;\r\n        let scaleY = obj.clientHeight / item.crop.height;\r\n\r\n        item.default.width = Math.round(item.default.width * scaleX);\r\n        item.default.height = Math.round(item.default.height * scaleY);\r\n\r\n        item.crop.width = Math.round(item.crop.width * scaleX);\r\n        item.crop.height = Math.round(item.crop.height * scaleY);\r\n        item.crop.offsetLeft = Math.round(item.crop.offsetLeft * scaleX);\r\n        item.crop.offsetTop = Math.round(item.crop.offsetTop * scaleY);\r\n\r\n        if(item.isFixedPos){\r\n            item.fixedLeft = obj.offsetLeft;\r\n            item.fixedTop = obj.offsetTop;\r\n        }\r\n        else{\r\n            item.default.left = obj.offsetLeft - item.crop.offsetLeft;\r\n            item.default.top = obj.offsetTop - item.crop.offsetTop;\r\n        }\r\n\r\n        _this.ref();\r\n    },\r\n    croppingEnter: function() {\r\n        let _this = this;\r\n        _this.cropping = true;\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(item);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n    \r\n        $(\"#luckysheet-modal-dialog-cropping\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .cropping-mask\").css({\r\n            \"width\": item.default.width,\r\n            \"height\": item.default.height,\r\n            \"background-image\": \"url(\" + item.src + \")\",\r\n            \"left\": -item.crop.offsetLeft,\r\n            \"top\": -item.crop.offsetTop\r\n        })\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .cropping-content\").css({\r\n            \"background-image\": \"url(\" + item.src + \")\",\r\n            \"background-size\": item.default.width + \"px \" + item.default.height + \"px\",\r\n            \"background-position\": -item.crop.offsetLeft + \"px \" + -item.crop.offsetTop + \"px\"\r\n        })\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-border\").css({\r\n            \"border-width\": item.border.width,\r\n            \"border-style\": item.border.style,\r\n            \"border-color\": item.border.color,\r\n            \"border-radius\": item.border.radius,\r\n            \"left\": -item.border.width,\r\n            \"right\": -item.border.width,\r\n            \"top\": -item.border.width,\r\n            \"bottom\": -item.border.width,\r\n        })\r\n    },\r\n    croppingExit: function() {\r\n        let _this = this;\r\n        _this.cropping = false;\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(item);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n            \"background-image\": \"url(\" + item.src + \")\",\r\n            \"background-size\": item.default.width + \"px \" + item.default.height + \"px\",\r\n            \"background-position\": -item.crop.offsetLeft + \"px \" + -item.crop.offsetTop + \"px\"\r\n        })\r\n    },\r\n    cropChangeImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.cropChange = null;\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        item.crop.width = _this.cropChangeObj.width;\r\n        item.crop.height = _this.cropChangeObj.height;\r\n        item.crop.offsetLeft = _this.cropChangeObj.offsetLeft;\r\n        item.crop.offsetTop = _this.cropChangeObj.offsetTop;\r\n\r\n        _this.ref();\r\n    },\r\n    restoreImgItem: function() {\r\n        let _this = this;\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        imgItem.default.width = imgItem.originWidth;\r\n        imgItem.default.height = imgItem.originHeight;\r\n\r\n        imgItem.crop.width = imgItem.originWidth;\r\n        imgItem.crop.height = imgItem.originHeight;\r\n        imgItem.crop.offsetLeft = 0;\r\n        imgItem.crop.offsetTop = 0;\r\n\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n            \"background-image\": \"url(\" + imgItem.src + \")\",\r\n            \"background-size\": imgItem.default.width + \"px \" + imgItem.default.height + \"px\",\r\n            \"background-position\": -imgItem.crop.offsetLeft + \"px \" + -imgItem.crop.offsetTop + \"px\"\r\n        })\r\n\r\n        _this.ref();\r\n    },\r\n    removeImgItem: function() {\r\n        let _this = this;\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        $(\"#\" + _this.currentImgId).remove();\r\n\r\n        delete _this.images[_this.currentImgId];\r\n        _this.currentImgId = null;\r\n\r\n        _this.ref();\r\n    },\r\n    copyImgItem: function(e) {\r\n        let _this = this;\r\n\r\n        _this.copyImgItemObj = $.extend(true, {}, _this.images[_this.currentImgId]);\r\n\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) { // for chrome\r\n            clipboardData = e.originalEvent.clipboardData;\r\n        }\r\n\r\n        let cpdata = '<table data-type=\"luckysheet_copy_action_image\"><tr><td><td></tr></table>';\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.html(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n            // \u7B4950\u6BEB\u79D2\uFF0CkeyPress\u4E8B\u4EF6\u53D1\u751F\u4E86\u518D\u53BB\u5904\u7406\u6570\u636E\r\n            setTimeout(function () { \r\n                $(\"#luckysheet-copy-content\").blur(); \r\n            }, 10);\r\n        }\r\n        else {\r\n            clipboardData.setData('Text', cpdata);\r\n            return false;//\u5426\u5219\u8BBE\u4E0D\u751F\u6548\r\n        }\r\n    },\r\n    pasteImgItem: function() {\r\n        let _this = this;\r\n\r\n        if(_this.images == null){\r\n            _this.images = {};\r\n        }\r\n\r\n        let rowIndex = Store.luckysheet_select_save[0].row_focus || 0;\r\n        let colIndex = Store.luckysheet_select_save[0].column_focus || 0;\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let img = $.extend(true, {}, _this.copyImgItemObj);\r\n        \r\n        img.default.left = left - img.crop.offsetLeft;\r\n        img.default.top = top - img.crop.offsetTop;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        img.fixedLeft = img.default.left - scrollLeft + Store.rowHeaderWidth;\r\n        img.fixedTop = img.default.top - scrollTop + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n\r\n        let id = _this.generateRandomId();\r\n        let modelHtml = _this.modelHtml(id, img);\r\n\r\n        $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n\r\n        _this.images[id] = img;\r\n        _this.ref();\r\n\r\n        _this.init();\r\n    },\r\n    allImagesShow: function() {\r\n        let _this = this;\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        $(\"#luckysheet-image-showBoxs .img-list\").empty();\r\n\r\n        if(_this.images == null){\r\n            return;\r\n        }\r\n\r\n        for(let imgId in _this.images){\r\n            let imgItem = _this.images[imgId];\r\n            let modelHtml = _this.modelHtml(imgId, imgItem);\r\n            $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n        }\r\n    },\r\n    moveChangeSize: function(rc, index, size) {\r\n        let _this = this;\r\n        let images = $.extend(true, {}, _this.images);\r\n\r\n        if(rc == \"row\"){\r\n            let row = Store.visibledatarow[index], \r\n                row_pre = index - 1 == -1 ? 0 : Store.visibledatarow[index - 1];\r\n            let changeSize = size - (row - row_pre - 1);\r\n            \r\n            for(let imgId in images){\r\n                let imgItem = images[imgId];\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let type = imgItem.type;\r\n\r\n                if(type == \"1\"){\r\n                    if(imgItemParam.top >= row){\r\n                        imgItem.default.top = imgItemParam.top + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                    else{\r\n                        if(imgItemParam.top + imgItemParam.height >= row-2){\r\n                            if(imgItemParam.top < row + changeSize){\r\n                                let scaleY = (imgItemParam.height + changeSize) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                            }\r\n                            else{\r\n                                let scaleY = (imgItemParam.top + imgItemParam.height - row) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                                imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(imgItemParam.top > row + changeSize){\r\n                                let scaleY = 1 / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                                imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                            }\r\n                            else if(imgItemParam.top + imgItemParam.height > row + changeSize){\r\n                                let scaleY = (row + changeSize - imgItemParam.top) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"2\"){\r\n                    if(imgItemParam.top >= row){\r\n                        imgItem.default.top = imgItemParam.top + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                    else if(imgItemParam.top > row + changeSize){\r\n                        imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(rc == \"column\"){\r\n            let col = Store.visibledatacolumn[index], \r\n                col_pre = index - 1 == -1 ? 0 : Store.visibledatacolumn[index - 1];\r\n            let changeSize = size - (col - col_pre - 1);\r\n\r\n            for(let imgId in images){\r\n                let imgItem = images[imgId];\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let type = imgItem.type;\r\n\r\n                if(type == \"1\"){\r\n                    if(imgItemParam.left >= col){\r\n                        imgItem.default.left = imgItemParam.left + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                    else{\r\n                        if(imgItemParam.left + imgItemParam.width >= col-2){\r\n                            if(imgItemParam.left < col + changeSize){\r\n                                let scaleX = (imgItemParam.width + changeSize) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                            }\r\n                            else{\r\n                                let scaleX = (imgItemParam.left + imgItemParam.width - col) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                                imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(imgItemParam.left > col + changeSize){\r\n                                let scaleX = 1 / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                                imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                            }\r\n                            else if(imgItemParam.left + imgItemParam.width > col + changeSize){\r\n                                let scaleX = (col + changeSize - imgItemParam.left) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"2\"){\r\n                    if(imgItemParam.left >= col){\r\n                        imgItem.default.left = imgItemParam.left + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                    else if(imgItemParam.left > col + changeSize){\r\n                        imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return images;\r\n    },\r\n    ref: function() {\r\n        let _this = this;\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let images = _this.images;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            Store.jfredo.push({\r\n                \"type\": \"imageCtrl\",\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"images\": file.images == null ? null : $.extend(true, {}, file.images),\r\n                \"curImages\": images\r\n            });\r\n        }\r\n\r\n        file.images = $.extend(true, {}, images);\r\n        server.saveParam(\"all\", Store.currentSheetIndex, file.images, { \"k\": \"images\" });\r\n    },\r\n}\r\n\r\nexport default imageCtrl;", "import { replaceHtml } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNum, isRealNull } from '../global/validate';\r\nimport { isdatetime, diff } from '../global/datecontroll';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport tooltip from '../global/tooltip';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport editor from '../global/editor';\r\nimport { modelHTML } from './constant';\r\nimport { selectionCopyShow } from './select';\r\nimport server from './server';\r\nimport menuButton from './menuButton';\r\nimport sheetmanage from './sheetmanage';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nconst dataVerificationCtrl = {\r\n    defaultItem: {\r\n        type: 'dropdown',  //\u7C7B\u578B\r\n        type2: null,  //\r\n        value1: '',  //\r\n        value2: '',  //\r\n        checked: false,\r\n        remote: false,  //\u81EA\u52A8\u8FDC\u7A0B\u83B7\u53D6\u9009\u9879\r\n        prohibitInput: false,  //\u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165\r\n        hintShow: false,  //\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED\r\n        hintText: '',  //\r\n    },\r\n    curItem: null,\r\n    dataVerification: null,\r\n    selectRange: [],\r\n    selectStatus: false,\r\n    optionLabel: {\r\n        'number': '\u6570\u503C',\r\n        'number_integer': '\u6574\u6570',\r\n        'number_decimal': '\u5C0F\u6570',\r\n        'bw': '\u4ECB\u4E8E',\r\n        'nb': '\u4E0D\u4ECB\u4E8E',\r\n        'eq': '\u7B49\u4E8E',\r\n        'ne': '\u4E0D\u7B49\u4E8E',\r\n        'gt': '\u5927\u4E8E',\r\n        'lt': '\u5C0F\u4E8E',\r\n        'gte': '\u5927\u4E8E\u7B49\u4E8E',\r\n        'lte': '\u5C0F\u4E8E\u7B49\u4E8E',\r\n        'include': '\u5305\u62EC',\r\n        'exclude': '\u4E0D\u5305\u62EC',\r\n        'equal': '\u7B49\u4E8E',\r\n        'bf': '\u65E9\u4E8E',\r\n        'nbf': '\u4E0D\u65E9\u4E8E',\r\n        'af': '\u665A\u4E8E',\r\n        'naf': '\u4E0D\u665A\u4E8E',\r\n        'card': '\u8EAB\u4EFD\u8BC1\u53F7\u7801',\r\n        'phone': '\u624B\u673A\u53F7'\r\n    },\r\n    optionLabel_en: {\r\n        'number': 'numeric',\r\n        'number_integer': 'integer',\r\n        'number_decimal': 'decimal',\r\n        'bw': 'between',\r\n        'nb': 'not between',\r\n        'eq': 'equal to',\r\n        'ne': 'not equal to',\r\n        'gt': 'greater',\r\n        'lt': 'less than',\r\n        'gte': 'greater or equal to',\r\n        'lte': 'less than or equal to',\r\n        'include': 'include',\r\n        'exclude': 'not include',\r\n        'equal': 'equal to',\r\n        'bf': 'earlier than',\r\n        'nbf': 'not earlier than',\r\n        'af': 'later than',\r\n        'naf': 'not later than',\r\n        'card': 'identification number',\r\n        'phone': 'phone number'\r\n    },\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const dvText = _locale.dataVerification;\r\n        const toolbarText = _locale.toolbar;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-dataVerification-dialog\").remove();\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div class=\"box-item\" style=\"border-top:1px solid #E1E4E8;\">\r\n                                <div class=\"box-item-title\">${dvText.cellRange}</div>\r\n                                <div id=\"data-verification-range\" class=\"range\">\r\n                                    <input class=\"formulaInputFocus\" spellcheck=\"false\">\r\n                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${dvText.selectCellRange}\"></i>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <div class=\"box-item-title\">${dvText.verificationCondition}</div>\r\n                                <select id=\"data-verification-type-select\">\r\n                                    <option value=\"dropdown\">${dvText.dropdown}</option>\r\n                                    <option value=\"checkbox\">${dvText.checkbox}</option>\r\n                                    <option value=\"number\">${dvText.number}</option>\r\n                                    <option value=\"number_integer\">${dvText.number_integer}</option>\r\n                                    <option value=\"number_decimal\">${dvText.number_decimal}</option>\r\n                                    <option value=\"text_content\">${dvText.text_content}</option>\r\n                                    <option value=\"text_length\">${dvText.text_length}</option>\r\n                                    <option value=\"date\">${dvText.date}</option>\r\n                                    <option value=\"validity\">${dvText.validity}</option>\r\n                                </select>\r\n                                <div class=\"show-box\">\r\n                                    <div class=\"show-box-item show-box-item-dropdown\">\r\n                                        <div class=\"range\">\r\n                                            <input class=\"formulaInputFocus data-verification-value1\" placeholder=\"${dvText.placeholder1}\" spellcheck=\"false\">\r\n                                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${dvText.selectCellRange}\"></i>\r\n                                        </div>\r\n                                        <div class=\"multi\">\r\n                                            <input type=\"checkbox\" id=\"data-verification-multi\" class=\"data-verification-multi\">\r\n                                            <label for=\"data-verification-multi\">${dvText.allowMultiSelect}</label>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-checkbox\">\r\n                                        <div class=\"check-box\">\r\n                                            <span>${dvText.selected} \u2014\u2014</span>\r\n                                            <input type=\"text\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder2}\">\r\n                                        </div>\r\n                                        <div class=\"check-box\">\r\n                                            <span>${dvText.notSelected} \u2014\u2014</span>\r\n                                            <input type=\"text\" class=\"data-verification-value2\" placeholder=\"${dvText.placeholder2}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-number\">\r\n                                        <select id=\"data-verification-number-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"gt\">${dvText.moreThanThe}</option>\r\n                                            <option value=\"lt\">${dvText.lessThan}</option>\r\n                                            <option value=\"gte\">${dvText.greaterOrEqualTo}</option>\r\n                                            <option value=\"lte\">${dvText.lessThanOrEqualTo}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"1\">\r\n                                            <span>-</span>\r\n                                            <input type=\"number\" class=\"data-verification-value2\" placeholder=\"100\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder3}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-text\">\r\n                                        <select id=\"data-verification-text-select\">\r\n                                            <option value=\"include\">${dvText.include}</option>\r\n                                            <option value=\"exclude\">${dvText.exclude}</option>\r\n                                            <option value=\"equal\">${dvText.equal}</option>\r\n                                        </select>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"text\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder4}\"/>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-textLength\">\r\n                                        <select id=\"data-verification-textLength-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"gt\">${dvText.moreThanThe}</option>\r\n                                            <option value=\"lt\">${dvText.lessThan}</option>\r\n                                            <option value=\"gte\">${dvText.greaterOrEqualTo}</option>\r\n                                            <option value=\"lte\">${dvText.lessThanOrEqualTo}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"1\">\r\n                                            <span>-</span>\r\n                                            <input type=\"number\" class=\"data-verification-value2\" placeholder=\"100\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder3}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-date\">\r\n                                        <select id=\"data-verification-date-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"bf\">${dvText.earlierThan}</option>\r\n                                            <option value=\"nbf\">${dvText.noEarlierThan}</option>\r\n                                            <option value=\"af\">${dvText.laterThan}</option>\r\n                                            <option value=\"naf\">${dvText.noLaterThan}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"date\" class=\"data-verification-value1\" placeholder=\"2020/9/10\">\r\n                                            <span>-</span>\r\n                                            <input type=\"date\" class=\"data-verification-value2\" placeholder=\"2020/9/10\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"date\" class=\"data-verification-value1\" placeholder=\"2020/9/10\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-validity\">\r\n                                        <select id=\"data-verification-validity-select\">\r\n                                            <option value=\"card\">${dvText.identificationNumber}</option>\r\n                                            <option value=\"phone\">${dvText.phoneNumber}</option>\r\n                                        </select>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-remote\" class=\"data-verification-remote\">\r\n                                    <label for=\"data-verification-remote\">${dvText.remote}</label>\r\n                                </div>\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-prohibitInput\">\r\n                                    <label for=\"data-verification-prohibitInput\">${dvText.prohibitInput}</label>\r\n                                </div>\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-hint-show\">\r\n                                    <label for=\"data-verification-hint-show\">${dvText.hintShow}</label>\r\n                                </div>\r\n                                <div class=\"data-verification-hint-text\">\r\n                                    <input type=\"text\" placeholder=\"${dvText.placeholder5}\">\r\n                                </div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-dataVerification-dialog\", \r\n            \"addclass\": \"luckysheet-dataVerification-dialog\", \r\n            \"title\": toolbarText.dataVerification, \r\n            \"content\": content, \r\n            \"botton\":  `<button id=\"luckysheet-dataVerification-dialog-confirm\" class=\"btn btn-primary\">${buttonText.confirm}</button>\r\n                        <button id=\"luckysheet-dataVerification-dialog-delete\" class=\"btn btn-default\">${dvText.deleteVerification}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${buttonText.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-dataVerification-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 350).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), \r\n            winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), \r\n            scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-dataVerification-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n\r\n        _this.dataAllocation();\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const dvText = locale().dataVerification; \r\n\r\n        //\u5355\u5143\u683C\u6570\u636E\u9A8C\u8BC1 \u7C7B\u578B\u662F \u4E0B\u62C9\u5217\u8868\r\n        $(document).off(\"click.dropdownBtn\").on(\"click.dropdownBtn\", \"#luckysheet-dataVerification-dropdown-btn\", function(e) {\r\n            _this.dropdownListShow();\r\n            e.stopPropagation();\r\n        });\r\n        $(document).off(\"click.dropdownListItem\").on(\"click.dropdownListItem\", \"#luckysheet-dataVerification-dropdown-List .dropdown-List-item\", function(e) {\r\n            var $item = $(this);\r\n            let value = e.target.innerText;\r\n            if ($item.hasClass('multi')) {\r\n                $item.toggleClass('checked');\r\n                value = $.map($(\"#luckysheet-dataVerification-dropdown-List\").children().filter('.checked'), function(el) {\r\n                    return el.innerText;\r\n                }).join(',');\r\n            } else {\r\n                $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n            }\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let rowIndex = last.row_focus;\r\n            let colIndex = last.column_focus;\r\n\r\n            $(\"#luckysheet-rich-text-editor\").text(value);\r\n            formula.updatecell(rowIndex, colIndex);\r\n\r\n            e.stopPropagation();\r\n        });\r\n\r\n        //\u5355\u5143\u683C\u8303\u56F4\r\n        $(document).off(\"click.dvRange\").on(\"click.dvRange\", \"#data-verification-range .fa-table\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n\r\n            let dataSource = \"0\";\r\n            let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n            _this.rangeDialog(dataSource, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n\r\n            formula.rangetosheet = Store.currentSheetIndex;\r\n\r\n            if(range[0].sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(range[0].sheetIndex);\r\n            }\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2], \r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2], \r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({ \r\n                        \"left\": col_pre, \r\n                        \"width\": col - col_pre - 1, \r\n                        \"top\": row_pre, \r\n                        \"height\": row - row_pre - 1, \r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [r1, r2], \r\n                        \"column\": [c1, c2], \r\n                        \"row_focus\": r1, \r\n                        \"column_focus\": c1 \r\n                    });\r\n                }\r\n            }\r\n            \r\n            selectionCopyShow(_this.selectRange);\r\n        }); \r\n        $(document).off(\"click.dvRange2\").on(\"click.dvRange2\", \"#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n\r\n            let dataSource = \"1\";\r\n            let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n            _this.rangeDialog(dataSource, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n\r\n            formula.rangetosheet = Store.currentSheetIndex;\r\n\r\n            if(range[0].sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(range[0].sheetIndex);\r\n            }\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2], \r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2], \r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({ \r\n                        \"left\": col_pre, \r\n                        \"width\": col - col_pre - 1, \r\n                        \"top\": row_pre, \r\n                        \"height\": row - row_pre - 1, \r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [r1, r2], \r\n                        \"column\": [c1, c2], \r\n                        \"row_focus\": r1, \r\n                        \"column_focus\": c1 \r\n                    });\r\n                }\r\n            }\r\n            \r\n            selectionCopyShow(_this.selectRange);\r\n        });\r\n        $(document).off(\"click.dvRangeConfirm\").on(\"click.dvRangeConfirm\", \"#luckysheet-dataVerificationRange-dialog-confirm\", function(e) {\r\n            let dataSource = $(this).attr(\"data-source\");\r\n            let txt = $(this).parents(\"#luckysheet-dataVerificationRange-dialog\").find(\"input\").val();\r\n\r\n            if(_this.getRangeByTxt(txt).length > 1){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', '\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5');\r\n                return;\r\n            }\r\n\r\n            if(dataSource == '0'){\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val(txt);\r\n            }\r\n            else if(dataSource == '1'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input\").val(txt);\r\n            }\r\n            \r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).off(\"click.dvRangeClose\").on(\"click.dvRangeClose\", \"#luckysheet-dataVerificationRange-dialog-close\", function(e) {\r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close\", function(e) {\r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        })\r\n\r\n        //\u9A8C\u8BC1\u6761\u4EF6 \u4E0B\u62C9\u6846\r\n        $(document).off(\"change.typeSelect\").on(\"change.typeSelect\", \"#data-verification-type-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item\").hide();\r\n\r\n            let value = this.value;\r\n            let item = _this.curItem;\r\n\r\n            if(value == 'dropdown'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown\").show();\r\n\r\n                let value1 = \"\";\r\n\r\n                if(value == item.type){\r\n                    value1 = item.value1;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val(value1);\r\n                \r\n                $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false);\r\n            }\r\n            else if(value == 'checkbox'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox\").show();\r\n\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'number' || value == 'number_integer' || value == 'number_decimal'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val(type2);\r\n            \r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'text_content'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-text\").show();\r\n\r\n                let type2 = \"include\";\r\n                let value1 = \"\";\r\n                \r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                }\r\n                \r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val(type2);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val(value1);\r\n            }\r\n            else if(value == 'text_length'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val(type2);\r\n            \r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'date'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val(type2);\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'validity'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-validity\").show();\r\n\r\n                let type2 = \"card\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val(type2);\r\n            }\r\n        });\r\n\r\n        $(document).off(\"change.numberSelect\").on(\"change.numberSelect\", \"#data-verification-number-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n            }\r\n        });\r\n        // \u6587\u672C\u957F\u5EA6\u9009\u62E9\u53D8\u5316\r\n        $(document).off(\"change.textLengthSelect\").on(\"change.textLengthSelect\", \"#data-verification-textLength-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n            }\r\n        });\r\n\r\n        $(document).off(\"change.dateSelect\").on(\"change.dateSelect\", \"#data-verification-date-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n            }\r\n        });\r\n\r\n        //\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED\r\n        $(document).off(\"change.hintShow\").on(\"change.hintShow\", \"#data-verification-hint-show\", function(e) {\r\n            if(this.checked){\r\n                $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").hide();\r\n            }\r\n        });\r\n\r\n        //\u786E\u8BA4\u6309\u94AE\r\n        $(document).off(\"click.dvSaveConfirm\").on(\"click.dvSaveConfirm\", \"#luckysheet-dataVerification-dialog-confirm\", function(e) {\r\n            let rangeTxt = $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val().trim();\r\n            let range = _this.getRangeByTxt(rangeTxt);\r\n\r\n            if(range.length == 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.selectCellRange2);\r\n                return;\r\n            }\r\n\r\n            let str = range[range.length - 1].row[0],\r\n                edr = range[range.length - 1].row[1],\r\n                stc = range[range.length - 1].column[0],\r\n                edc = range[range.length - 1].column[1];\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            if(str < 0){\r\n                str = 0;\r\n            }\r\n\r\n            if(edr > d.length - 1){\r\n                edr = d.length - 1;\r\n            }\r\n\r\n            if(stc < 0){\r\n                stc = 0;\r\n            }\r\n\r\n            if(edc > d[0].length - 1){\r\n                edc = d[0].length - 1;\r\n            }\r\n\r\n            let type = $(\"#luckysheet-dataVerification-dialog #data-verification-type-select\").val();\r\n            let type2 = null, value1 = \"\", value2 = \"\";\r\n\r\n            if(type == 'dropdown'){\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val().trim();\r\n            \r\n                if(value1.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo1);\r\n                    return;\r\n                }\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-multi\").is(':checked');\r\n            }\r\n            else if(type == 'checkbox'){\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val().trim();\r\n                value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val().trim();\r\n            \r\n                if(value1.length == 0 || value2.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo2);\r\n                    return;\r\n                }\r\n            }\r\n            else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isRealNum(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isRealNum(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                        return;\r\n                    }\r\n\r\n                    if(Number(value2) < Number(value1)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'text_content'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val().trim();\r\n            \r\n                if(value1.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo5);\r\n                    return;\r\n                }\r\n            }\r\n            else if(type == 'text_length'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isRealNum(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                    return;\r\n                }\r\n\r\n                if (!Number.isInteger(Number(value1)) || Number(value1) < 0) {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.textlengthInteger);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isRealNum(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                        return;\r\n                    }\r\n                    if (!Number.isInteger(Number(value2)) || Number(value2) < 0) {\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.textlengthInteger);\r\n                        return;\r\n                    }\r\n\r\n                    if(Number(value2) < Number(value1)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'date'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isdatetime(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isdatetime(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                        return;\r\n                    }\r\n\r\n                    if(diff(value1, value2) > 0){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo7);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'validity'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val();\r\n            }\r\n\r\n            let remote = $(\"#luckysheet-dataVerification-dialog #data-verification-remote\").is(\":checked\");\r\n            let prohibitInput = $(\"#luckysheet-dataVerification-dialog #data-verification-prohibitInput\").is(\":checked\");\r\n            let hintShow = $(\"#luckysheet-dataVerification-dialog #data-verification-hint-show\").is(\":checked\");\r\n            let hintText = \"\";\r\n\r\n            if(hintShow){\r\n                hintText = $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text input\").val().trim();\r\n            }\r\n\r\n            let item = {\r\n                type: type,\r\n                type2: type2,  \r\n                value1: value1,  \r\n                value2: value2, \r\n                checked: false, \r\n                remote: remote, \r\n                prohibitInput: prohibitInput,  \r\n                hintShow: hintShow, \r\n                hintText: hintText,\r\n            }\r\n           \r\n            let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n            let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n            for(let r = str; r <= edr; r++){\r\n                for(let c = stc; c <= edc; c++){\r\n                    currentDataVerification[r + '_' + c] = item;\r\n\r\n                    if(type == 'checkbox'){\r\n                        setcellvalue(r, c, d, item.value2);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(type == 'checkbox'){\r\n                _this.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, d, range[range.length - 1]);\r\n            }\r\n            else{\r\n                _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n            }\r\n            \r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n        });\r\n\r\n        //\u5220\u9664\u9A8C\u8BC1\u6309\u94AE\r\n        $(document).off(\"click.delete\").on(\"click.delete\", \"#luckysheet-dataVerification-dialog-delete\", function(e) {\r\n            let rangeTxt = $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val().trim();\r\n            let range = _this.getRangeByTxt(rangeTxt);\r\n\r\n            if(range.length == 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.selectCellRange2);\r\n                return;\r\n            }\r\n            \r\n            let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n            let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n            let str = range[range.length - 1].row[0],\r\n                edr = range[range.length - 1].row[1],\r\n                stc = range[range.length - 1].column[0],\r\n                edc = range[range.length - 1].column[1];\r\n\r\n            for(let r = str; r <= edr; r++){\r\n                for(let c = stc; c <= edc; c++){\r\n                    delete currentDataVerification[r + '_' + c];\r\n                }\r\n            }\r\n\r\n            _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n            \r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n        });\r\n\r\n        //info\u63D0\u793A\u5F39\u6846 \u5173\u95ED\r\n        $(document).on(\"click\", \"#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn\", function(e) {\r\n            $(this).parents(\"#luckysheet-info\").hide();\r\n\r\n            if($(\"#luckysheet-dataVerification-dialog\").is(\":visible\")){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n            }\r\n            e.stopPropagation();\r\n        });\r\n    },\r\n    dataAllocation: function(){\r\n        let _this = this;\r\n\r\n        //\u5355\u5143\u683C\u8303\u56F4\r\n        let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rangeTxt = getRangetxt(Store.currentSheetIndex, range, Store.currentSheetIndex);\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val(rangeTxt);\r\n\r\n        //focus\u5355\u5143\u683C\r\n        let rowIndex = range.row_focus || range.row[0];\r\n        let colIndex = range.column_focus || range.column[0];\r\n        let dataVerification = $.extend(true, {}, _this.dataVerification); \r\n        let item = dataVerification[rowIndex + '_' + colIndex];\r\n\r\n        if(item == null){\r\n            item = $.extend(true, {}, _this.defaultItem);\r\n        }\r\n\r\n        _this.curItem = item;\r\n        \r\n        //\u9A8C\u8BC1\u6761\u4EF6\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-type-select\").val(item.type);\r\n        $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item\").hide();\r\n\r\n        if(item.type == 'dropdown'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown\").show();\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val(item.value1);\r\n            $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false);\r\n        }\r\n        else if(item.type == 'checkbox'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox\").show();\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n            \r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'text_content'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-text\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val(item.value1);\r\n        }\r\n        else if(item.type == 'text_length'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'date'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'validity'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-validity\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val(item.type2);\r\n        }\r\n\r\n        //\u81EA\u52A8\u8FDC\u7A0B\u83B7\u53D6\u9009\u9879\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-remote\").prop(\"checked\", item.remote);\r\n\r\n        //\u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-prohibitInput\").prop(\"checked\", item.prohibitInput);\r\n\r\n        //\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-hint-show\").prop(\"checked\", item.hintShow);\r\n        \r\n        if(item.hintShow){\r\n            $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").hide();\r\n        }\r\n        \r\n        $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text input\").val(item.hintText);\r\n    },\r\n    rangeDialog: function(dataSource, txt){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const dvText = _locale.dataVerification;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-dataVerificationRange-dialog\", \r\n            \"addclass\": \"luckysheet-dataVerificationRange-dialog\", \r\n            \"title\": dvText.selectCellRange, \r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${dvText.selectCellRange2}\" value=\"${txt}\"/>`, \r\n            \"botton\":  `<button id=\"luckysheet-dataVerificationRange-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${dataSource}\">${buttonText.confirm}</button>\r\n                        <button id=\"luckysheet-dataVerificationRange-dialog-close\" class=\"btn btn-default\">${buttonText.close}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-dataVerificationRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n    },\r\n    getTxtByRange: function(range){\r\n        if(range.length > 0){\r\n            let txt = [];\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n                \r\n                txt.push(getRangetxt(Store.currentSheetIndex, { \"row\": [r1, r2], \"column\": [c1, c2] }, Store.currentSheetIndex));\r\n            }\r\n\r\n            return txt.join(\",\");\r\n        }\r\n    },\r\n    getRangeByTxt: function(txt){\r\n        let range = [];\r\n\r\n        if(txt.indexOf(\",\") != -1){\r\n            let arr = txt.split(\",\");\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(formula.iscelldata(arr[i])){\r\n                    range.push(formula.getcellrange(arr[i]));\r\n                }\r\n                else{\r\n                    range = [];\r\n                    break;    \r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(formula.iscelldata(txt)){\r\n                range.push(formula.getcellrange(txt));\r\n            }\r\n        }\r\n\r\n        return range;\r\n    },\r\n    cellFocus: function(r, c, clickMode){\r\n        $(\"#luckysheet-dataVerification-dropdown-btn\").hide();\r\n        $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n        let _this = this;\r\n\r\n        if(_this.dataVerification == null || _this.dataVerification[r + '_' + c] == null){\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n            return;\r\n        }\r\n\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let item = _this.dataVerification[r + '_' + c];\r\n\r\n        //\u5355\u5143\u683C\u6570\u636E\u9A8C\u8BC1 \u7C7B\u578B\u662F \u590D\u9009\u6846\r\n        if(clickMode && item.type == 'checkbox'){\r\n            _this.checkboxChange(r, c);\r\n            return;\r\n        }\r\n\r\n        //\u5355\u5143\u683C\u6570\u636E\u9A8C\u8BC1 \u7C7B\u578B\u662F \u4E0B\u62C9\u5217\u8868\r\n        if(item.type == 'dropdown'){\r\n            $(\"#luckysheet-dataVerification-dropdown-btn\").show().css({\r\n                'max-width': col - col_pre,\r\n                'max-height': row - row_pre,\r\n                'left': col - 20,\r\n                'top': row_pre + (row - row_pre - 20) / 2\r\n            })\r\n\r\n            if($(\"#luckysheet-dataVerification-dropdown-List\").is(\":visible\")){\r\n                let dataIndex = $(\"#luckysheet-dataVerification-dropdown-List\").prop(\"data-index\");\r\n                \r\n                if(dataIndex != (r + '_' + c)){\r\n                    $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n        }\r\n\r\n        //\u63D0\u793A\u8BED\r\n        if(item.hintShow){\r\n            let hintText;\r\n\r\n            if(Store.lang == 'en'){\r\n                hintText = '<span style=\"color:#f5a623;\">Hint: </span>';\r\n            }\r\n            else{\r\n                hintText = '<span style=\"color:#f5a623;\">\u63D0\u793A\uFF1A</span>';\r\n            }\r\n\r\n            hintText += _this.getHintText(item);\r\n\r\n            $(\"#luckysheet-dataVerification-showHintBox\").html(hintText).show().css({\r\n                'left': col_pre,\r\n                'top': row\r\n            });\r\n\r\n            return;\r\n        }\r\n        \r\n        //\u6570\u636E\u9A8C\u8BC1\u672A\u901A\u8FC7\r\n        let cellValue = getcellvalue(r, c, null);\r\n\r\n        if(isRealNull(cellValue)){\r\n            return;\r\n        }\r\n\r\n        let validate = _this.validateCellData(cellValue, item);\r\n\r\n        if(!validate){\r\n            let failureText;\r\n\r\n            if(Store.lang == 'en'){\r\n                failureText = '<span style=\"color:#f72626;\">Failure: </span>';\r\n            }\r\n            else{\r\n                failureText = '<span style=\"color:#f72626;\">\u5931\u6548\uFF1A</span>';\r\n            }\r\n\r\n            failureText += _this.getFailureText(item);\r\n\r\n            $(\"#luckysheet-dataVerification-showHintBox\").html(failureText).show().css({\r\n                'left': col_pre,\r\n                'top': row\r\n            });\r\n        }\r\n    },\r\n    getHintText: function(item) {\r\n        let _this = this;\r\n\r\n        let hintText = item.hintText || '';\r\n\r\n        if(hintText.length == 0){\r\n            if(Store.lang == 'en'){\r\n                if(item.type == 'dropdown'){\r\n                    hintText += 'please select an option in the drop-down list';\r\n                }\r\n                else if(item.type == 'checkbox'){\r\n\r\n                }\r\n                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    hintText += 'please enter a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'text_content'){\r\n                    hintText += 'please enter text ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                }\r\n                else if(item.type == 'text_length'){\r\n                    hintText += 'please enter text with length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                    \r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'date'){\r\n                    hintText += 'please enter a date ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'validity'){\r\n                    hintText += 'please enter the correct ' + _this.optionLabel_en[item.type2];\r\n                }\r\n            }\r\n            else{\r\n                if(item.type == 'dropdown'){\r\n                    hintText += '\u8BF7\u9009\u62E9\u4E0B\u62C9\u5217\u8868\u4E2D\u7684\u9009\u9879';\r\n                }\r\n                else if(item.type == 'checkbox'){\r\n\r\n                }\r\n                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    hintText += '\u8BF7\u8F93\u5165' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                    }\r\n\r\n                    hintText += '\u7684' + _this.optionLabel[item.type];\r\n                }\r\n                else if(item.type == 'text_content'){\r\n                    hintText += '\u8BF7\u8F93\u5165\u5185\u5BB9' + _this.optionLabel[item.type2] + item.value1 + '\u7684\u6587\u672C';\r\n                }\r\n                else if(item.type == 'text_length'){\r\n                    hintText += '\u8BF7\u8F93\u5165\u957F\u5EA6' + _this.optionLabel[item.type2] + item.value1;\r\n                    \r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                    }\r\n\r\n                    hintText += '\u7684\u6587\u672C';\r\n                }\r\n                else if(item.type == 'date'){\r\n                    hintText += '\u8BF7\u8F93\u5165' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                    }\r\n\r\n                    hintText += '\u7684\u65E5\u671F';\r\n                }\r\n                else if(item.type == 'validity'){\r\n                    hintText += '\u8BF7\u8F93\u5165\u6B63\u786E\u7684' + _this.optionLabel[item.type2];\r\n                }\r\n            }\r\n        }\r\n\r\n        return hintText;\r\n    },\r\n    getFailureText: function(item) {\r\n        let _this = this;\r\n\r\n        let failureText = '';\r\n\r\n        if(Store.lang == 'en'){\r\n            if(item.type == 'dropdown'){\r\n                failureText += 'what you selected is not an option in the drop-down list';\r\n            }\r\n            else if(item.type == 'checkbox'){\r\n\r\n            }\r\n            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                failureText += 'what you entered is not a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'text_content'){\r\n                failureText += 'what you entered is not text that ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n            }\r\n            else if(item.type == 'text_length'){\r\n                failureText += 'the text you entered is not length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                \r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'date'){\r\n                failureText += 'the date you entered is not ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'validity'){\r\n                failureText += 'what you entered is not a correct ' + _this.optionLabel_en[item.type2];\r\n            }\r\n        }\r\n        else{\r\n            if(item.type == 'dropdown'){\r\n                failureText += '\u4F60\u9009\u62E9\u7684\u4E0D\u662F\u4E0B\u62C9\u5217\u8868\u4E2D\u7684\u9009\u9879';\r\n            }\r\n            else if(item.type == 'checkbox'){\r\n\r\n            }\r\n            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                failureText += '\u4F60\u8F93\u5165\u7684\u4E0D\u662F' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                }\r\n\r\n                failureText += '\u7684' + _this.optionLabel[item.type];\r\n            }\r\n            else if(item.type == 'text_content'){\r\n                failureText += '\u4F60\u8F93\u5165\u7684\u4E0D\u662F\u5185\u5BB9' + _this.optionLabel[item.type2] + item.value1 + '\u7684\u6587\u672C';\r\n            }\r\n            else if(item.type == 'text_length'){\r\n                failureText += '\u4F60\u8F93\u5165\u7684\u4E0D\u662F\u957F\u5EA6' + _this.optionLabel[item.type2] + item.value1;\r\n                \r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                }\r\n\r\n                failureText += '\u7684\u6587\u672C';\r\n            }\r\n            else if(item.type == 'date'){\r\n                failureText += '\u4F60\u8F93\u5165\u7684\u4E0D\u662F' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '\u548C' + item.value2 + '\u4E4B\u95F4';\r\n                }\r\n\r\n                failureText += '\u7684\u65E5\u671F';\r\n            }\r\n            else if(item.type == 'validity'){\r\n                failureText += '\u4F60\u8F93\u5165\u7684\u4E0D\u662F\u4E00\u4E2A\u6B63\u786E\u7684' + _this.optionLabel[item.type2];\r\n            }\r\n        }\r\n\r\n        return failureText;\r\n    },\r\n    validateCellData: function(cellValue, item){\r\n        let _this = this;\r\n\r\n        let type = item.type,\r\n            type2 = item.type2,\r\n            value1 = item.value1,\r\n            value2 = item.value2;\r\n\r\n        if(type == 'dropdown'){\r\n            let list = _this.getDropdownList(value1);\r\n\r\n            // \u591A\u9009\u7684\u60C5\u51B5 \u68C0\u67E5\u6BCF\u4E2A\u90FD\u5728\u4E0B\u62C9\u5217\u8868\u4E2D\r\n            if(type2 && cellValue){\r\n                return cellValue.split(',').every(function (i) {\r\n                    return list.indexOf(i) !== -1;\r\n                });\r\n            }\r\n\r\n            let result = false;\r\n\r\n            for(let i = 0; i < list.length; i++){\r\n                if(list[i] == cellValue){\r\n                    result = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(type == 'checkbox'){\r\n\r\n        }\r\n        else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n            if(!isRealNum(cellValue)){\r\n                return false;\r\n            }\r\n            \r\n            cellValue = Number(cellValue);\r\n\r\n            if(type == 'number_integer' && cellValue % 1 !== 0){\r\n                return false;\r\n            }\r\n\r\n            if(type == 'number_decimal' && cellValue % 1 === 0){\r\n                return false;\r\n            }\r\n\r\n            value1 = Number(value1);\r\n            value2 = Number(value2);\r\n\r\n            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && cellValue != value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && cellValue == value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gt' && cellValue <= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lt' && cellValue >= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gte' && cellValue < value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lte' && cellValue > value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'text_content'){\r\n            cellValue = cellValue.toString();\r\n            value1 = value1.toString();\r\n\r\n            if(type2 == 'include' && cellValue.indexOf(value1) == -1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'exclude' && cellValue.indexOf(value1) > -1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'equal' && cellValue != value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'text_length'){\r\n            cellValue = cellValue.toString().length;\r\n\r\n            value1 = Number(value1);\r\n            value2 = Number(value2);\r\n\r\n            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && cellValue != value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && cellValue == value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gt' && cellValue <= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lt' && cellValue >= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gte' && cellValue < value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lte' && cellValue > value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'date'){\r\n            if(!isdatetime(cellValue)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'bw' && (diff(cellValue, value1) < 0 || diff(cellValue, value2) > 0)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (diff(cellValue, value1) >= 0 && diff(cellValue, value2) <= 0)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && diff(cellValue, value1) != 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && diff(cellValue, value1) == 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'bf' && diff(cellValue, value1) >= 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nbf' && diff(cellValue, value1) < 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'af' && diff(cellValue, value1) <= 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'naf' && diff(cellValue, value1) > 0){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'validity'){\r\n            if(type2 == 'card' && !validateIdCard(cellValue)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'phone' && !/^1[3456789]\\d{9}$/.test(cellValue)){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    },\r\n    dropdownListShow: function(){\r\n        $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n        let _this = this;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus;\r\n        let colIndex = last.column_focus;\r\n\r\n        let row = Store.visibledatarow[rowIndex],\r\n            row_pre = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n        let col = Store.visibledatacolumn[colIndex],\r\n            col_pre = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let item = _this.dataVerification[rowIndex + '_' + colIndex];\r\n        let list = _this.getDropdownList(item.value1);\r\n\r\n        let optionHtml = '';\r\n        if (item.type === 'dropdown' && item.type2) {\r\n            // \u4E0B\u62C9\u591A\u9009\u7684\u60C5\u51B5\u4E0B \u5C06\u5DF2\u7ECF\u9009\u62E9\u7684\u6807\u51FA\u6765\r\n            let cellValue = getcellvalue(rowIndex, colIndex, null);\r\n            let valueArr = isRealNull(cellValue) ? [] : cellValue.split(',');\r\n            list.forEach(i => {\r\n                let checked = valueArr.indexOf(i) !== -1;\r\n                optionHtml += `<div class=\"dropdown-List-item  luckysheet-mousedown-cancel multi${checked ? ' checked': ''}\">${i}</div>`;\r\n            });\r\n        } else {\r\n            list.forEach(i => {\r\n                optionHtml += `<div class=\"dropdown-List-item luckysheet-mousedown-cancel\">${i}</div>`;\r\n            });\r\n        }\r\n\r\n        $(\"#luckysheet-dataVerification-dropdown-List\")\r\n        .html(optionHtml)\r\n        .prop(\"data-index\", rowIndex + '_' + colIndex)\r\n        .show()\r\n        .css({\r\n            'width': col - col_pre - 1,\r\n            'left': col_pre,\r\n            'top': row,\r\n        });\r\n\r\n        let myh = $(\"#luckysheet-dataVerification-dropdown-List\").outerHeight();\r\n        let currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n        if(row + myh > currentWinH - 42 - 6){\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").css({\r\n                'top': row_pre - myh,\r\n            })\r\n        }\r\n    },\r\n    getDropdownList: function(txt){\r\n        let list = [];\r\n\r\n        if(formula.iscelldata(txt)){\r\n            let range = formula.getcellrange(txt);\r\n            let d = Store.luckysheetfile[getSheetIndex(range.sheetIndex)].data;\r\n\r\n            for(let r = range.row[0]; r <= range.row[1]; r++){\r\n                for(let c = range.column[0]; c <= range.column[1]; c++){\r\n                    if(d[r] == null){\r\n                        continue;\r\n                    }\r\n\r\n                    let cell = d[r][c];\r\n\r\n                    if(cell == null || cell.v == null){\r\n                        continue;\r\n                    }\r\n\r\n                    let v = cell.m || cell.v;\r\n\r\n                    if(!list.includes(v)){\r\n                        list.push(v);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            let arr = txt.split(\",\");\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                let v = arr[i];\r\n\r\n                if(v.length == 0){\r\n                    continue;\r\n                }\r\n\r\n                if(!list.includes(v)){\r\n                    list.push(v);\r\n                }\r\n            }\r\n        }\r\n\r\n        return list;\r\n    },\r\n    checkboxChange: function(r, c){\r\n        let _this = this;\r\n\r\n        let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n        let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n        let item = currentDataVerification[r + '_' + c];\r\n        item.checked = !item.checked;\r\n\r\n        let value = item.value2;\r\n        if(item.checked){\r\n            value = item.value1;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        setcellvalue(r, c, d, value);\r\n\r\n        _this.refOfCheckbox(\r\n            historyDataVerification, \r\n            currentDataVerification, \r\n            Store.currentSheetIndex, \r\n            d, \r\n            { \"row\": [r, r], \"column\": [c, c] }\r\n        );\r\n    },\r\n    ref: function(historyDataVerification, currentDataVerification, sheetIndex){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateDataVerification\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyDataVerification\"] = historyDataVerification;\r\n            redo[\"currentDataVerification\"] = currentDataVerification;\r\n            Store.jfredo.push(redo); \r\n        }\r\n        \r\n        _this.dataVerification = currentDataVerification;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;\r\n\r\n        //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentDataVerification, { \"k\": \"dataVerification\" });\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n    refOfCheckbox: function(historyDataVerification, currentDataVerification, sheetIndex, d, range){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateDataVerificationOfCheckbox\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyDataVerification\"] = historyDataVerification;\r\n            redo[\"currentDataVerification\"] = currentDataVerification;\r\n            redo[\"data\"] = Store.flowdata; \r\n            redo[\"curData\"] = d;\r\n            redo[\"range\"] = range; \r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        _this.dataVerification = currentDataVerification;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;\r\n\r\n        Store.flowdata = d;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata;\r\n\r\n        //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentDataVerification, { \"k\": \"dataVerification\" });\r\n            server.historyParam(Store.flowdata, sheetIndex, range);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n}\r\n\r\nfunction validateIdCard(idCard) {\r\n    // 15\u4F4D\u548C18\u4F4D\u8EAB\u4EFD\u8BC1\u53F7\u7801\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\r\n    var regIdCard = /^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/;\r\n\r\n    // \u5982\u679C\u901A\u8FC7\u8BE5\u9A8C\u8BC1\uFF0C\u8BF4\u660E\u8EAB\u4EFD\u8BC1\u683C\u5F0F\u6B63\u786E\uFF0C\u4F46\u51C6\u786E\u6027\u8FD8\u9700\u8BA1\u7B97\r\n    if (regIdCard.test(idCard)) {\r\n        if (idCard.length == 18) {\r\n            var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // \u5C06\u524D17\u4F4D\u52A0\u6743\u56E0\u5B50\u4FDD\u5B58\u5728\u6570\u7EC4\u91CC\r\n            var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // \u8FD9\u662F\u9664\u4EE511\u540E\uFF0C\u53EF\u80FD\u4EA7\u751F\u768411\u4F4D\u4F59\u6570\u3001\u9A8C\u8BC1\u7801\uFF0C\u4E5F\u4FDD\u5B58\u6210\u6570\u7EC4\r\n            var idCardWiSum = 0; // \u7528\u6765\u4FDD\u5B58\u524D17\u4F4D\u5404\u81EA\u4E56\u4EE5\u52A0\u6743\u56E0\u5B50\u540E\u7684\u603B\u548C\r\n            for (var i = 0; i < 17; i++) {\r\n                idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];\r\n            }\r\n\r\n            var idCardMod = idCardWiSum % 11; // \u8BA1\u7B97\u51FA\u6821\u9A8C\u7801\u6240\u5728\u6570\u7EC4\u7684\u4F4D\u7F6E\r\n            var idCardLast = idCard.substring(17); // \u5F97\u5230\u6700\u540E\u4E00\u4F4D\u8EAB\u4EFD\u8BC1\u53F7\u7801\r\n\r\n            // \u5982\u679C\u7B49\u4E8E2\uFF0C\u5219\u8BF4\u660E\u6821\u9A8C\u7801\u662F10\uFF0C\u8EAB\u4EFD\u8BC1\u53F7\u7801\u6700\u540E\u4E00\u4F4D\u5E94\u8BE5\u662FX\r\n            if (idCardMod == 2) {\r\n                if (idCardLast == \"X\" || idCardLast == \"x\") {\r\n                    return true;\r\n                } else {\r\n                    return false;\r\n                }\r\n            } else {\r\n                // \u7528\u8BA1\u7B97\u51FA\u7684\u9A8C\u8BC1\u7801\u4E0E\u6700\u540E\u4E00\u4F4D\u8EAB\u4EFD\u8BC1\u53F7\u7801\u5339\u914D\uFF0C\u5982\u679C\u4E00\u81F4\uFF0C\u8BF4\u660E\u901A\u8FC7\uFF0C\u5426\u5219\u662F\u65E0\u6548\u7684\u8EAB\u4EFD\u8BC1\u53F7\u7801\r\n                if (idCardLast == idCardY[idCardMod]) {\r\n                    return true;\r\n                } else {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    } else {\r\n        return false;\r\n    }\r\n}\r\n\r\nexport default dataVerificationCtrl;", "import editor from './editor';\r\nimport formula from './formula';\r\nimport { jfrefreshgrid_adRC, jfrefreshgrid_deleteCell, jfrefreshgrid_rhcw } from './refresh';\r\nimport { datagridgrowth, getcellFormula } from './getdata';\r\nimport { setcellvalue } from './setdata';\r\nimport conditionformat from '../controllers/conditionformat';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport { selectHightlightShow } from '../controllers/select';\r\nimport { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport {checkProtectionAuthorityNormal,checkProtectionNotEnable} from '../controllers/protection';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\n/**\r\n * \u589E\u52A0\u884C\u5217\r\n * @param {string} type \u884C\u6216\u5217 ['row', 'column'] \u4E4B\u4E00\r\n * @param {number} index \u63D2\u5165\u7684\u4F4D\u7F6E index\r\n * @param {number} value \u63D2\u5165 \u591A\u5C11 \u884C\uFF08\u5217\uFF09\r\n * @param {string} direction \u54EA\u4E2A\u65B9\u5411\u63D2\u5165 ['lefttop','rightbottom'] \u4E4B\u4E00\r\n * @param {string | number} sheetIndex \u64CD\u4F5C\u7684 sheet \u7684 index \u5C5E\u6027\r\n * @returns \r\n */\r\nfunction luckysheetextendtable(type, index, value, direction, sheetIndex) {\r\n    sheetIndex = sheetIndex || Store.currentSheetIndex;\r\n\r\n    if(type=='row' && !checkProtectionAuthorityNormal(sheetIndex, \"insertRows\")){\r\n        return;\r\n    }\r\n    else if(type=='column' && !checkProtectionAuthorityNormal(sheetIndex, \"insertColumns\")){\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n    let file = Store.luckysheetfile[curOrder];\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    value = Math.floor(value);\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    //\u5408\u5E76\u5355\u5143\u683C\u914D\u7F6E\u53D8\u52A8\r\n    if(cfg[\"merge\"] == null){\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for(let m in cfg[\"merge\"]){\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if(type == \"row\"){\r\n            if(index < r){\r\n                merge_new[(r + value) + \"_\" + c] = { \"r\": r + value, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else if(index == r){\r\n                if(direction == \"lefttop\"){\r\n                    merge_new[(r + value) + \"_\" + c] = { \"r\": r + value, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n                }\r\n                else{\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs + value, \"cs\": cs };\r\n                }\r\n            }\r\n            else if(index < r + rs - 1){\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs + value, \"cs\": cs };\r\n            }\r\n            else if(index == r + rs - 1){\r\n                if(direction == \"lefttop\"){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs + value, \"cs\": cs };\r\n                }\r\n                else{\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n                }\r\n            }\r\n            else{\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n        }\r\n        else if(type == \"column\"){\r\n            if(index < c){\r\n                merge_new[r + \"_\" + (c + value)] = { \"r\": r, \"c\": c + value, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else if(index == c){\r\n                if(direction == \"lefttop\"){\r\n                    merge_new[r + \"_\" + (c + value)] = { \"r\": r, \"c\": c + value, \"rs\": rs, \"cs\": cs };\r\n                }\r\n                else{\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs + value };\r\n                }\r\n            }\r\n            else if(index < c + cs - 1){\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs + value };\r\n            }\r\n            else if(index == c + cs - 1){\r\n                if(direction == \"lefttop\"){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs + value };\r\n                }\r\n                else{\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n                }\r\n            }\r\n            else{\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //\u516C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if(calcChain != null && calcChain.length > 0){\r\n        for(let i = 0; i < calcChain.length; i++){\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r, calc_c = calc.c, calc_i = calc.index, calc_funcStr =  getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n            if(type == \"row\"){\r\n                let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"add\", \"row\", direction, index, value);\r\n\r\n                if(d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr){\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                if(direction == \"lefttop\"){\r\n                    if(calc_r >= index){\r\n                        calc.r += value;\r\n                    }\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    if(calc_r > index){\r\n                        calc.r += value;\r\n                    }\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            }\r\n            else if(type == \"column\"){\r\n                let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"add\", \"col\", direction, index, value);\r\n\r\n                if(d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr){\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                if(direction == \"lefttop\"){\r\n                    if(calc_c >= index){\r\n                        calc.c += value;\r\n                    }\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    if(calc_c > index){\r\n                        calc.c += value;\r\n                    }\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u7B5B\u9009\u914D\u7F6E\u53D8\u52A8\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if(filter_select != null && JSON.stringify(filter_select) != \"{}\"){\r\n        newFilterObj = { \"filter_select\": null, \"filter\": null };\r\n\r\n        let f_r1 = filter_select.row[0], f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0], f_c2 = filter_select.column[1];\r\n\r\n        if(type == \"row\"){\r\n            if(f_r1 < index){\r\n                if(f_r2 == index && direction == \"lefttop\"){\r\n                    f_r2 += value; \r\n                }\r\n                else if(f_r2 > index){\r\n                    f_r2 += value;   \r\n                }\r\n            }\r\n            else if(f_r1 == index){\r\n                if(direction == \"lefttop\"){\r\n                    f_r1 += value;\r\n                    f_r2 += value;\r\n                }\r\n                else if(direction == \"rightbottom\" && f_r2 > index){\r\n                    f_r2 += value;\r\n                }\r\n            }\r\n            else{\r\n                f_r1 += value;\r\n                f_r2 += value;\r\n            }\r\n\r\n            if(filter != null){\r\n                newFilterObj.filter = {};\r\n\r\n                for(let k in filter){\r\n                    let f_rowhidden = filter[k].rowhidden;\r\n                    let f_rowhidden_new = {};\r\n\r\n                    for(let n in f_rowhidden){\r\n                        n = parseFloat(n);\r\n\r\n                        if(n < index){\r\n                            f_rowhidden_new[n] = 0;\r\n                        }\r\n                        else if(n == index){\r\n                            if(direction == \"lefttop\"){\r\n                                f_rowhidden_new[n + value] = 0;\r\n                            }\r\n                            else if(direction == \"rightbottom\"){\r\n                                f_rowhidden_new[n] = 0;\r\n                            }\r\n                        }\r\n                        else{\r\n                            f_rowhidden_new[n + value] = 0;\r\n                        }\r\n                    }\r\n\r\n                    newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n                    newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                    newFilterObj.filter[k].str = f_r1;\r\n                    newFilterObj.filter[k].edr = f_r2;\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"column\"){\r\n            if(f_c1 < index){\r\n                if(f_c2 == index && direction == \"lefttop\"){\r\n                    f_c2 += value; \r\n                }\r\n                else if(f_c2 > index){\r\n                    f_c2 += value;   \r\n                }\r\n            }\r\n            else if(f_c1 == index){\r\n                if(direction == \"lefttop\"){\r\n                    f_c1 += value;\r\n                    f_c2 += value;\r\n                }\r\n                else if(direction == \"rightbottom\" && f_c2 > index){\r\n                    f_c2 += value;\r\n                }\r\n            }\r\n            else{\r\n                f_c1 += value;\r\n                f_c2 += value;\r\n            }\r\n\r\n            if(filter != null){\r\n                newFilterObj.filter = {};\r\n\r\n                for(let k in filter){\r\n                    let f_cindex = filter[k].cindex;\r\n\r\n                    if(f_cindex == index && direction == \"lefttop\"){\r\n                        f_cindex += value;\r\n                    }\r\n                    else if(f_cindex > index){\r\n                        f_cindex += value;\r\n                    }\r\n\r\n                    newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                    newFilterObj.filter[f_cindex - f_c1].cindex = f_cindex;\r\n                    newFilterObj.filter[f_cindex - f_c1].stc = f_c1;\r\n                    newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                }\r\n            }\r\n        }\r\n\r\n        newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n    }\r\n\r\n    if(newFilterObj != null && newFilterObj.filter != null){\r\n        if(cfg[\"rowhidden\"] == null){\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for(let k in newFilterObj.filter){\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for(let n in f_rowhidden){\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if(CFarr != null && CFarr.length > 0){\r\n        for(let i = 0; i < CFarr.length; i++){\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for(let j = 0; j < cf_range.length; j++){\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n\r\n                if(type == \"row\"){\r\n                    if(CFr1 < index){\r\n                        if(CFr2 == index && direction == \"lefttop\"){\r\n                            CFr2 += value; \r\n                        }\r\n                        else if(CFr2 > index){\r\n                            CFr2 += value;   \r\n                        }\r\n                    }\r\n                    else if(CFr1 == index){\r\n                        if(direction == \"lefttop\"){\r\n                            CFr1 += value;\r\n                            CFr2 += value;\r\n                        }\r\n                        else if(direction == \"rightbottom\" && CFr2 > index){\r\n                            CFr2 += value;\r\n                        }\r\n                    }\r\n                    else{\r\n                        CFr1 += value;\r\n                        CFr2 += value;\r\n                    }\r\n                }\r\n                else if(type == \"column\"){\r\n                    if(CFc1 < index){\r\n                        if(CFc2 == index && direction == \"lefttop\"){\r\n                            CFc2 += value; \r\n                        }\r\n                        else if(CFc2 > index){\r\n                            CFc2 += value;   \r\n                        }\r\n                    }\r\n                    else if(CFc1 == index){\r\n                        if(direction == \"lefttop\"){\r\n                            CFc1 += value;\r\n                            CFc2 += value;\r\n                        }\r\n                        else if(direction == \"rightbottom\" && CFc2 > index){\r\n                            CFc2 += value;\r\n                        }\r\n                    }\r\n                    else{\r\n                        CFc1 += value;\r\n                        CFc2 += value;\r\n                    }\r\n                }\r\n\r\n                cf_new_range.push({ \"row\": [CFr1, CFr2], \"column\": [CFc1, CFc2] });\r\n            }\r\n\r\n            let cf = $.extend(true, {}, CFarr[i]);\r\n            cf.cellrange = cf_new_range;\r\n\r\n            newCFarr.push(cf);\r\n        }\r\n    }\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\u914D\u7F6E\u53D8\u52A8\r\n    let AFarr = file.luckysheet_alternateformat_save;\r\n    let newAFarr = [];\r\n    if(AFarr != null && AFarr.length > 0){\r\n        for(let i = 0; i < AFarr.length; i++){\r\n            let AFr1 = AFarr[i].cellrange.row[0],\r\n                AFr2 = AFarr[i].cellrange.row[1],\r\n                AFc1 = AFarr[i].cellrange.column[0],\r\n                AFc2 = AFarr[i].cellrange.column[1];\r\n\r\n            let af = $.extend(true, {}, AFarr[i]);\r\n\r\n            if(type == \"row\"){\r\n                if(AFr1 < index){\r\n                    if(AFr2 == index && direction == \"lefttop\"){\r\n                        AFr2 += value; \r\n                    }\r\n                    else if(AFr2 > index){\r\n                        AFr2 += value;   \r\n                    }\r\n                }\r\n                else if(AFr1 == index){\r\n                    if(direction == \"lefttop\"){\r\n                        AFr1 += value;\r\n                        AFr2 += value;\r\n                    }\r\n                    else if(direction == \"rightbottom\" && AFr2 > index){\r\n                        AFr2 += value;\r\n                    }\r\n                }\r\n                else{\r\n                    AFr1 += value;\r\n                    AFr2 += value;\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(AFc1 < index){\r\n                    if(AFc2 == index && direction == \"lefttop\"){\r\n                        AFc2 += value; \r\n                    }\r\n                    else if(AFc2 > index){\r\n                        AFc2 += value;   \r\n                    }\r\n                }\r\n                else if(AFc1 == index){\r\n                    if(direction == \"lefttop\"){\r\n                        AFc1 += value;\r\n                        AFc2 += value;\r\n                    }\r\n                    else if(direction == \"rightbottom\" && AFc2 > index){\r\n                        AFc2 += value;\r\n                    }\r\n                }\r\n                else{\r\n                    AFc1 += value;\r\n                    AFc2 += value;\r\n                }\r\n            }\r\n\r\n            af.cellrange = { \"row\": [AFr1, AFr2], \"column\": [AFc1, AFc2] };\r\n\r\n            newAFarr.push(af);\r\n        }\r\n    }\r\n\r\n    //\u51BB\u7ED3\u914D\u7F6E\u53D8\u52A8\r\n    let newFreezen = { \"freezenhorizontaldata\": null, \"freezenverticaldata\": null };\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && type == \"row\"){\r\n        let freezen_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let freezen_row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n\r\n        if(freezen_row_st == index && direction == \"lefttop\"){\r\n            freezen_row_st += value;\r\n        }\r\n        else if(freezen_row_st > index){\r\n            freezen_row_st += value;\r\n        }\r\n\r\n        let freezen_top = Store.visibledatarow[freezen_row_st] - 2 - freezen_scrollTop + Store.columnHeaderHeight;\r\n\r\n        newFreezen.freezenhorizontaldata = [\r\n            Store.visibledatarow[freezen_row_st], \r\n            freezen_row_st + 1, \r\n            freezen_scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, freezen_row_st + 1), \r\n            freezen_top\r\n        ];\r\n    }\r\n    else{\r\n        newFreezen.freezenhorizontaldata = luckysheetFreezen.freezenhorizontaldata;\r\n    }\r\n\r\n    if(luckysheetFreezen.freezenverticaldata != null && type == \"column\"){\r\n        let freezen_scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n        let freezen_col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        if(freezen_col_st == index && direction == \"lefttop\"){\r\n            freezen_col_st += value;\r\n        }\r\n        else if(freezen_col_st > index){\r\n            freezen_col_st += value;\r\n        }\r\n\r\n        let freezen_left = Store.visibledatacolumn[freezen_col_st] - 2 - freezen_scrollLeft + Store.rowHeaderWidth;\r\n\r\n        newFreezen.freezenverticaldata = [\r\n            Store.visibledatacolumn[freezen_col_st], \r\n            freezen_col_st + 1, \r\n            freezen_scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, freezen_col_st + 1), \r\n            freezen_left\r\n        ];\r\n    }\r\n    else{\r\n        newFreezen.freezenverticaldata = luckysheetFreezen.freezenverticaldata;\r\n    }\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\u914D\u7F6E\u53D8\u52A8\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if(dataVerification != null){\r\n        for(let key in dataVerification){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = dataVerification[key];\r\n            \r\n            if(type == \"row\"){\r\n                if(index < r){\r\n                    newDataVerification[(r + value) + \"_\" + c] = item;\r\n                }\r\n                else if(index == r){\r\n                    if(direction == \"lefttop\"){\r\n                        newDataVerification[(r + value) + \"_\" + c] = item;\r\n\r\n                        for(let i = 0; i < value; i++){\r\n                            newDataVerification[(r + i) + \"_\" + c] = item;\r\n                        }\r\n                    }\r\n                    else{\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n\r\n                        for(let i = 0; i < value; i++){\r\n                            newDataVerification[(r + i + 1) + \"_\" + c] = item;\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(index < c){\r\n                    newDataVerification[r + \"_\" + (c + value)] = item;\r\n                }\r\n                else if(index == c){\r\n                    if(direction == \"lefttop\"){\r\n                        newDataVerification[r + \"_\" + (c + value)] = item;\r\n\r\n                        for(let i = 0; i < value; i++){\r\n                            newDataVerification[r + \"_\" + (c + i)] = item;\r\n                        }\r\n                    }\r\n                    else{\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n\r\n                        for(let i = 0; i < value; i++){\r\n                            newDataVerification[r + \"_\" + (c + i + 1)] = item;\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u8D85\u94FE\u63A5\u914D\u7F6E\u53D8\u52A8\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if(hyperlink != null){\r\n        for(let key in hyperlink){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = hyperlink[key];\r\n            \r\n            if(type == \"row\"){\r\n                if(index < r){\r\n                    newHyperlink[(r + value) + \"_\" + c] = item;\r\n                }\r\n                else if(index == r){\r\n                    if(direction == \"lefttop\"){\r\n                        newHyperlink[(r + value) + \"_\" + c] = item;\r\n                    }\r\n                    else{\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n                else{\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(index < c){\r\n                    newHyperlink[r + \"_\" + (c + value)] = item;\r\n                }\r\n                else if(index == c){\r\n                    if(direction == \"lefttop\"){\r\n                        newHyperlink[r + \"_\" + (c + value)] = item;\r\n                    }\r\n                    else{\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n                else{\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let type1;\r\n    if (type == \"row\") {\r\n        type1 = \"r\";\r\n\r\n        //\u884C\u9AD8\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"rowlen\"] != null){\r\n            let rowlen_new = {};\r\n\r\n            for(let r in cfg[\"rowlen\"]){\r\n                r = parseFloat(r);\r\n\r\n                if(r < index){\r\n                    rowlen_new[r] = cfg[\"rowlen\"][r];\r\n                }\r\n                else if(r == index){\r\n                    if(direction == \"lefttop\"){\r\n                        rowlen_new[(r + value)] = cfg[\"rowlen\"][r];\r\n                    }\r\n                    else if(direction == \"rightbottom\"){\r\n                        rowlen_new[r] = cfg[\"rowlen\"][r];\r\n                    }\r\n                }\r\n                else{\r\n                    rowlen_new[(r + value)] = cfg[\"rowlen\"][r];\r\n                }\r\n            }\r\n\r\n            cfg[\"rowlen\"] = rowlen_new;\r\n        }\r\n\r\n        //\u9690\u85CF\u884C\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"rowhidden\"] != null){\r\n            let rowhidden_new = {};\r\n\r\n            for(let r in cfg[\"rowhidden\"]){\r\n                r = parseFloat(r);\r\n\r\n                if(r < index){\r\n                    rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n                }\r\n                else if(r == index){\r\n                    if(direction == \"lefttop\"){\r\n                        rowhidden_new[(r + value)] = cfg[\"rowhidden\"][r];\r\n                    }\r\n                    else if(direction == \"rightbottom\"){\r\n                        rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n                    }\r\n                }\r\n                else{\r\n                    rowhidden_new[(r + value)] = cfg[\"rowhidden\"][r];\r\n                }\r\n            }\r\n\r\n            cfg[\"rowhidden\"] = rowhidden_new;\r\n        }\r\n\r\n        //\u7A7A\u884C\u6A21\u677F\r\n        let row = [],\r\n            curRow = [...d][index]\r\n        for(let c = 0; c < d[0].length; c++){\r\n            let cell = curRow[c],\r\n            templateCell = cell ?  {...cell, v: '', m: ''} : Store.defaultCell;\r\n            delete templateCell.ps;\r\n            row.push(templateCell);\r\n        }\r\n        var cellBorderConfig = [];\r\n        //\u8FB9\u6846\r\n        if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n            let borderInfo = []; \r\n\r\n            for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if(rangeType == \"range\"){\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for(let j = 0; j < borderRange.length; j++){\r\n                        let bd_r1 = borderRange[j].row[0],\r\n                            bd_r2 = borderRange[j].row[1];\r\n\r\n                        if(direction == \"lefttop\"){\r\n                            if(index <= bd_r1){\r\n                                bd_r1 += value;\r\n                                bd_r2 += value;\r\n                            }\r\n                            else if(index <= bd_r2){\r\n                                bd_r2 += value;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(index < bd_r1){\r\n                                bd_r1 += value;\r\n                                bd_r2 += value;\r\n                            }\r\n                            else if(index < bd_r2){\r\n                                bd_r2 += value;\r\n                            }\r\n                        }\r\n\r\n                        if(bd_r2 >= bd_r1){\r\n                            emptyRange.push({ \"row\": [bd_r1, bd_r2], \"column\": borderRange[j].column });\r\n                        }   \r\n                    }\r\n\r\n                    if(emptyRange.length > 0){\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"range\",\r\n                            \"borderType\": cfg[\"borderInfo\"][i].borderType,\r\n                            \"style\": cfg[\"borderInfo\"][i].style,\r\n                            \"color\": cfg[\"borderInfo\"][i].color,\r\n                            \"range\": emptyRange\r\n                        }\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                }\r\n                else if(rangeType == \"cell\"){\r\n                    let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n                    // \u4F4D\u7F6E\u76F8\u540C\u6807\u8BC6\u8FB9\u6846\u76F8\u5173 \u5148\u7F13\u5B58\r\n                    if (row_index === index) {\r\n                        cellBorderConfig.push(JSON.parse(JSON.stringify(cfg[\"borderInfo\"][i])));\r\n                    }\r\n\r\n                    if(direction == \"lefttop\"){\r\n                        if(index <= row_index){\r\n                            row_index += value;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(index < row_index){\r\n                            row_index += value;\r\n                        }\r\n                    }\r\n                    \r\n                    cfg[\"borderInfo\"][i].value.row_index = row_index;\r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n        \r\n        let arr = [];\r\n        for (let r = 0; r < value; r++) {\r\n            arr.push(JSON.stringify(row));\r\n            // \u540C\u6B65\u62F7\u8D1D type \u4E3A cell \u7C7B\u578B\u7684\u8FB9\u6846\r\n            if (cellBorderConfig.length) {\r\n                var cellBorderConfigCopy = JSON.parse(JSON.stringify(cellBorderConfig));\r\n                cellBorderConfigCopy.forEach(item=>{\r\n                    if (direction === 'rightbottom') {\r\n                        // \u5411\u4E0B\u63D2\u5165\u65F6 \u57FA\u4E8E\u6A21\u677F\u884C\u4F4D\u7F6E\u76F4\u63A5\u9012\u589E\u5373\u53EF\r\n                        item.value.row_index += (r + 1);\r\n                    } else if (direction === 'lefttop') {\r\n                        // \u5411\u4E0A\u63D2\u5165\u65F6 \u76EE\u6807\u884C\u79FB\u52A8\u5230\u540E\u9762 \u65B0\u589En\u884C\u5230\u524D\u9762 \u5BF9\u4E8E\u65B0\u589E\u7684\u884C\u6765\u8BF4 \u4E5F\u662F\u9012\u589E\uFF0C\u4E0D\u8FC7\u662F\u4ECE0\u5F00\u59CB\r\n                        item.value.row_index += r;\r\n                    }\r\n                });\r\n                cfg[\"borderInfo\"].push(...cellBorderConfigCopy);\r\n            }\r\n        }\r\n\r\n        if(direction == \"lefttop\"){\r\n            if(index == 0){\r\n                new Function(\"d\",\"return \" + 'd.unshift(' + arr.join(\",\") + ')')(d);\r\n            }\r\n            else{\r\n                new Function(\"d\",\"return \" + 'd.splice(' + index + ', 0, ' + arr.join(\",\") + ')')(d);\r\n            }\r\n        }\r\n        else{ \r\n            new Function(\"d\",\"return \" + 'd.splice(' + (index + 1) + ', 0, ' + arr.join(\",\") + ')')(d); \r\n        }\r\n    }\r\n    else {\r\n        type1 = \"c\";\r\n\r\n        //\u884C\u9AD8\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"columnlen\"] != null){\r\n            let columnlen_new = {};\r\n\r\n            for(let c in cfg[\"columnlen\"]){\r\n                c = parseFloat(c);\r\n                \r\n                if(c < index){\r\n                    columnlen_new[c] = cfg[\"columnlen\"][c];\r\n                }\r\n                else if(c == index){\r\n                    if(direction == \"lefttop\"){\r\n                        columnlen_new[(c + value)] = cfg[\"columnlen\"][c];\r\n                    }\r\n                    else if(direction == \"rightbottom\"){\r\n                        columnlen_new[c] = cfg[\"columnlen\"][c];\r\n                    }\r\n                }\r\n                else{\r\n                    columnlen_new[(c + value)] = cfg[\"columnlen\"][c];\r\n                }\r\n            }\r\n\r\n            cfg[\"columnlen\"] = columnlen_new;\r\n        }\r\n\r\n        //\u9690\u85CF\u5217\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"colhidden\"] != null){\r\n            let colhidden_new = {};\r\n\r\n            for(let c in cfg[\"colhidden\"]){\r\n                c = parseFloat(c);\r\n                \r\n                if(c < index){\r\n                    colhidden_new[c] = cfg[\"colhidden\"][c];\r\n                }\r\n                else if(c == index){\r\n                    if(direction == \"lefttop\"){\r\n                        colhidden_new[(c + value)] = cfg[\"colhidden\"][c];\r\n                    }\r\n                    else if(direction == \"rightbottom\"){\r\n                        colhidden_new[c] = cfg[\"colhidden\"][c];\r\n                    }\r\n                }\r\n                else{\r\n                    colhidden_new[(c + value)] = cfg[\"colhidden\"][c];\r\n                }\r\n            }\r\n\r\n            cfg[\"colhidden\"] = colhidden_new;\r\n        }\r\n\r\n        //\u7A7A\u5217\u6A21\u677F\r\n        let col = [],\r\n            curd= [...d];\r\n        for(let r = 0; r < d.length; r++){\r\n            let cell = curd[r][index],\r\n            templateCell = cell ?  {...cell, v: '', m: ''} : Store.defaultCell;\r\n            delete templateCell.ps;\r\n            col.push(templateCell);\r\n        }\r\n        var cellBorderConfig = [];\r\n        //\u8FB9\u6846\r\n        if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n            let borderInfo = []; \r\n\r\n            for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if(rangeType == \"range\"){\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for(let j = 0; j < borderRange.length; j++){\r\n                        let bd_c1 = borderRange[j].column[0],\r\n                            bd_c2 = borderRange[j].column[1];\r\n\r\n                        if(direction == \"lefttop\"){\r\n                            if(index <= bd_c1){\r\n                                bd_c1 += value;\r\n                                bd_c2 += value;\r\n                            }\r\n                            else if(index <= bd_c2){\r\n                                bd_c2 += value;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(index < bd_c1){\r\n                                bd_c1 += value;\r\n                                bd_c2 += value;\r\n                            }\r\n                            else if(index < bd_c2){\r\n                                bd_c2 += value;\r\n                            }\r\n                        }\r\n\r\n                        if(bd_c2 >= bd_c1){\r\n                            emptyRange.push({ \"row\": borderRange[j].row, \"column\": [bd_c1, bd_c2] });\r\n                        }   \r\n                    }\r\n\r\n                    if(emptyRange.length > 0){\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"range\",\r\n                            \"borderType\": cfg[\"borderInfo\"][i].borderType,\r\n                            \"style\": cfg[\"borderInfo\"][i].style,\r\n                            \"color\": cfg[\"borderInfo\"][i].color,\r\n                            \"range\": emptyRange\r\n                        }\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                }\r\n                else if(rangeType == \"cell\"){\r\n                    let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n                    // \u4F4D\u7F6E\u76F8\u540C\u6807\u8BC6\u8FB9\u6846\u76F8\u5173 \u5148\u7F13\u5B58\r\n                    if (col_index === index) {\r\n                        cellBorderConfig.push(JSON.parse(JSON.stringify(cfg[\"borderInfo\"][i])));\r\n                    }\r\n\r\n                    if(direction == \"lefttop\"){\r\n                        if(index <= col_index){\r\n                            col_index += value;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(index < col_index){\r\n                            col_index += value;\r\n                        }\r\n                    }\r\n                    \r\n                    cfg[\"borderInfo\"][i].value.col_index = col_index;\r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        // \u5904\u7406\u76F8\u5173\u7684 type \u4E3A cell \u7C7B\u578B\u7684\u8FB9\u6846\r\n        if (cellBorderConfig.length) {\r\n            for (let i = 0; i < value; i++) {\r\n                var cellBorderConfigCopy = JSON.parse(JSON.stringify(cellBorderConfig));\r\n                cellBorderConfigCopy.forEach(item=>{\r\n                    if (direction === 'rightbottom') {\r\n                        // \u5411\u53F3\u63D2\u5165\u65F6 \u57FA\u4E8E\u6A21\u677F\u5217\u4F4D\u7F6E\u76F4\u63A5\u9012\u589E\u5373\u53EF\r\n                        item.value.col_index += (i + 1);\r\n                    } else if (direction === 'lefttop') {\r\n                        // \u5411\u5DE6\u63D2\u5165\u65F6 \u76EE\u6807\u5217\u79FB\u52A8\u5230\u540E\u9762 \u65B0\u589En\u5217\u5230\u524D\u9762 \u5BF9\u4E8E\u65B0\u589E\u7684\u5217\u6765\u8BF4 \u4E5F\u662F\u9012\u589E\uFF0C\u4E0D\u8FC7\u662F\u4ECE0\u5F00\u59CB\r\n                        item.value.col_index += i;\r\n                    }\r\n                });\r\n                cfg[\"borderInfo\"].push(...cellBorderConfigCopy);\r\n            }\r\n        }\r\n        \r\n        for (let r = 0; r < d.length; r++) {\r\n            let row = d[r];\r\n\r\n            for(let i = 0; i < value; i++){\r\n                if(direction == \"lefttop\"){\r\n                    if(index == 0){\r\n                        row.unshift(col[r]);\r\n                    }\r\n                    else{\r\n                        row.splice(index, 0, col[r]);\r\n                    }\r\n                }\r\n                else{\r\n                    row.splice((index + 1), 0, col[r]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // \u4FEE\u6539\u5F53\u524Dsheet\u9875\u65F6\u5237\u65B0\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid_adRC(\r\n            d, \r\n            cfg, \r\n            \"addRC\", \r\n            { \"index\": index, \"len\": value, \"direction\": direction, \"rc\": type1, \"restore\": false }, \r\n            newCalcChain, \r\n            newFilterObj, \r\n            newCFarr, \r\n            newAFarr, \r\n            newFreezen,\r\n            newDataVerification,\r\n            newHyperlink\r\n        );\r\n\r\n    }\r\n    else{\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.luckysheet_alternateformat_save = newAFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n    \r\n    let range = null;\r\n    if(type == \"row\"){\r\n        if(direction == \"lefttop\"){\r\n            range = [{ \"row\": [index, index + value - 1], \"column\": [0 , d[0].length - 1] }];\r\n        }\r\n        else{\r\n            range = [{ \"row\": [index + 1, index + value], \"column\": [0 , d[0].length - 1] }];\r\n        }\r\n    }\r\n    else{\r\n        if(direction == \"lefttop\"){\r\n            range = [{ \"row\": [0, d.length - 1], \"column\": [index, index + value - 1] }];\r\n        }\r\n        else{\r\n            range = [{ \"row\": [0, d.length - 1], \"column\": [index + 1, index + value] }];\r\n        }\r\n    }\r\n    \r\n    file.luckysheet_select_save = range;\r\n    if (file.index == Store.currentSheetIndex) {\r\n        Store.luckysheet_select_save = range;\r\n        selectHightlightShow();\r\n    }\r\n\r\n    if (type == \"row\"){\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(), \r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[range[0].row[1]], \r\n            row_pre = range[0].row[0] - 1 == -1 ? 0 : Store.visibledatarow[range[0].row[0] - 1];\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        }\r\n        else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n\r\n        if(value > 30){\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        }\r\n    }\r\n}\r\n\r\nfunction luckysheetextendData(rowlen, newData) {\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let cfg = $.extend(true, {}, Store.config);\r\n    if(cfg[\"merge\"] == null){\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let collen = d[0].length;\r\n    let addNullData = datagridgrowth([], rowlen, collen);\r\n\r\n    d = d.concat(addNullData);\r\n\r\n    for(let i = 0; i < newData.length; i++){\r\n        let r = newData[i].r,\r\n            c = newData[i].c,\r\n            v = newData[i].v;\r\n\r\n        setcellvalue(r, c, d, v);\r\n\r\n        if(v != null && v.mc != null && v.mc.rs != null){\r\n            cfg[\"merge\"][v.mc.r + \"_\" + v.mc.c] = $.extend(true, {}, v.mc);\r\n        }\r\n    }\r\n\r\n    //luckysheet.flowdata\r\n    Store.flowdata = d;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = d;           \r\n\r\n    //config\r\n    Store.config = cfg;\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //\u884C\u9AD8\u3001\u5217\u5BBD\u5237\u65B0\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n}\r\n\r\n//\u5220\u9664\u884C\u5217\r\nfunction luckysheetdeletetable(type, st, ed, sheetIndex) {\r\n\r\n    sheetIndex = sheetIndex || Store.currentSheetIndex;\r\n    \r\n    if(type=='row' && !checkProtectionAuthorityNormal(sheetIndex, \"deleteRows\")){\r\n        return;\r\n    }\r\n    else if(type=='column' && !checkProtectionAuthorityNormal(sheetIndex, \"deleteColumns\")){\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n\r\n    let file = Store.luckysheetfile[curOrder];\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    if(st < 0){\r\n        st = 0;\r\n    }\r\n\r\n    if(ed < 0){\r\n        ed = 0;\r\n    }\r\n\r\n    if(type == \"row\"){\r\n        if(st > d.length - 1){\r\n            st = d.length - 1;\r\n        }\r\n\r\n        if(ed > d.length - 1){\r\n            ed = d.length - 1;\r\n        }\r\n    }\r\n    else{\r\n        if(st > d[0].length - 1){\r\n            st = d[0].length - 1;\r\n        }\r\n\r\n        if(ed > d[0].length - 1){\r\n            ed = d[0].length - 1;\r\n        }\r\n    }\r\n\r\n    if(st > ed){\r\n        return\r\n    }\r\n\r\n    let slen = ed - st + 1;\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    //\u5408\u5E76\u5355\u5143\u683C\u914D\u7F6E\u53D8\u52A8\r\n    if(cfg[\"merge\"] == null){\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for(let m in cfg[\"merge\"]){\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if(type == \"row\"){\r\n            if(r < st){\r\n                if(r + rs - 1 < st){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n                }\r\n                else if(r + rs - 1 >= st && r + rs - 1 < ed){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": st - r, \"cs\": cs };\r\n                }\r\n                else if(r + rs - 1 >= ed){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs - slen, \"cs\": cs };\r\n                }\r\n            }\r\n            else if(r >= st && r <= ed){\r\n                if(r + rs - 1 > ed){\r\n                    merge_new[st + \"_\" + c] = { \"r\": st, \"c\": c, \"rs\": r + rs - 1 - ed, \"cs\": cs };\r\n                }\r\n            }\r\n            else if(r > ed){\r\n                merge_new[(r - slen) + \"_\" + c] = { \"r\": r - slen, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n        }\r\n        else if(type == \"column\"){\r\n            if(c < st){\r\n                if(c + cs - 1 < st){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n                }\r\n                else if(c + cs - 1 >= st && c + cs - 1 < ed){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": st - c };\r\n                }\r\n                else if(c + cs - 1 >= ed){\r\n                    merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs - slen };\r\n                }\r\n            }\r\n            else if(c >= st && c <= ed){\r\n                if(c + cs - 1 > ed){\r\n                    merge_new[r + \"_\" + st] = { \"r\": r, \"c\": st, \"rs\": rs, \"cs\": c + cs - 1 - ed };\r\n                }\r\n            }\r\n            else if(c > ed){\r\n                merge_new[r + \"_\" + (c - slen)] = { \"r\": r, \"c\": c - slen, \"rs\": rs, \"cs\": cs };\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //\u516C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if(calcChain != null && calcChain.length > 0){\r\n        for(let i = 0; i < calcChain.length; i++){\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r, calc_c = calc.c, calc_i = calc.index, calc_funcStr =  getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n            if(type == \"row\"){\r\n                if(calc_r < st || calc_r > ed){\r\n                    let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"row\", null, st, slen);\r\n\r\n                    if(d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr){\r\n                        d[calc_r][calc_c].f = functionStr;\r\n                    }\r\n\r\n                    if(calc_r > ed){\r\n                        calc.r = calc_r - slen;\r\n                    }\r\n\r\n                    newCalcChain.push(calc);\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(calc_c < st || calc_c > ed){\r\n                    let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"col\", null, st, slen);\r\n\r\n                    if(d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr){\r\n                        d[calc_r][calc_c].f = functionStr;\r\n                    }\r\n\r\n                    if(calc_c > ed){\r\n                        calc.c = calc_c - slen;\r\n                    }\r\n\r\n                    newCalcChain.push(calc);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u7B5B\u9009\u914D\u7F6E\u53D8\u52A8\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if(filter_select != null && JSON.stringify(filter_select) != \"{}\"){\r\n        newFilterObj = { \"filter_select\": null, \"filter\": null };\r\n\r\n        let f_r1 = filter_select.row[0], f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0], f_c2 = filter_select.column[1];\r\n\r\n        if(type == \"row\"){\r\n            if(f_r1 > ed){\r\n                f_r1 -= slen;\r\n                f_r2 -= slen;\r\n\r\n                newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n            }\r\n            else if(f_r1 < st){\r\n                if(f_r2 < st){\r\n\r\n                }\r\n                else if(f_r2 <= ed){\r\n                    f_r2 = st - 1;\r\n                }\r\n                else{\r\n                    f_r2 -= slen;\r\n                }\r\n\r\n                newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n            }\r\n\r\n            if(newFilterObj.filter_select != null && filter != null){\r\n                for(let k in filter){\r\n                    let f_rowhidden = filter[k].rowhidden;\r\n                    let f_rowhidden_new = {};\r\n\r\n                    for(let n in f_rowhidden){\r\n                        if(n < st){\r\n                            f_rowhidden_new[n] = 0;\r\n                        }\r\n                        else if(n > ed){\r\n                            f_rowhidden_new[n - slen] = 0;\r\n                        }\r\n                    }\r\n\r\n                    if(JSON.stringify(f_rowhidden_new) != \"{}\"){\r\n                        if(newFilterObj.filter == null){\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                        newFilterObj.filter[k].str = f_r1;\r\n                        newFilterObj.filter[k].edr = f_r2;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"column\"){\r\n            if(f_c1 > ed){\r\n                f_c1 -= slen;\r\n                f_c2 -= slen;\r\n\r\n                newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n            }\r\n            else if(f_c1 < st){\r\n                if(f_c2 < st){\r\n\r\n                }\r\n                else if(f_c2 <= ed){\r\n                    f_c2 = st - 1;\r\n                }\r\n                else{\r\n                    f_c2 -= slen;\r\n                }\r\n\r\n                newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n            }\r\n            else{\r\n                if(f_c2 > ed){\r\n                    f_c1 = st;\r\n                    f_c2 -= slen;\r\n\r\n                    newFilterObj.filter_select = { \"row\": [f_r1, f_r2], \"column\": [f_c1, f_c2] };\r\n                }\r\n            }\r\n\r\n            if(newFilterObj.filter_select != null && filter != null){\r\n                for(let k in filter){\r\n                    let f_cindex = filter[k].cindex;\r\n\r\n                    if(f_cindex < st){\r\n                        if(newFilterObj.filter == null){\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                    }\r\n                    else if(f_cindex > ed){\r\n                        f_cindex -= slen;\r\n\r\n                        if(newFilterObj.filter == null){\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[f_cindex - f_c1].cindex = f_cindex;\r\n                        newFilterObj.filter[f_cindex - f_c1].stc = f_c1;\r\n                        newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(newFilterObj != null && newFilterObj.filter != null){\r\n        if(cfg[\"rowhidden\"] == null){\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for(let k in newFilterObj.filter){\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for(let n in f_rowhidden){\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if(CFarr != null && CFarr.length > 0){\r\n        for(let i = 0; i < CFarr.length; i++){\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for(let j = 0; j < cf_range.length; j++){\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n\r\n                if(type == \"row\"){\r\n                    if(!(CFr1 >= st && CFr2 <= ed)){\r\n                        if(CFr1 > ed){\r\n                            CFr1 -= slen;\r\n                            CFr2 -= slen;\r\n                        }\r\n                        else if(CFr1 < st){\r\n                            if(CFr2 < st){\r\n\r\n                            }\r\n                            else if(CFr2 <= ed){\r\n                                CFr2 = st - 1;\r\n                            }\r\n                            else{\r\n                                CFr2 -= slen;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(CFr2 > ed){\r\n                                CFr1 = st;\r\n                                CFr2 -= slen;\r\n                            }\r\n                        }\r\n\r\n                        cf_new_range.push({ \"row\": [CFr1, CFr2], \"column\": [CFc1, CFc2] });\r\n                    }\r\n                }\r\n                else if(type == \"column\"){\r\n                    if(!(CFc1 >= st && CFc2 <= ed)){\r\n                        if(CFc1 > ed){\r\n                            CFc1 -= slen;\r\n                            CFc2 -= slen;\r\n                        }\r\n                        else if(CFc1 < st){\r\n                            if(CFc2 < st){\r\n\r\n                            }\r\n                            else if(CFc2 <= ed){\r\n                                CFc2 = st - 1;\r\n                            }\r\n                            else{\r\n                                CFc2 -= slen;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(CFc2 > ed){\r\n                                CFc1 = st;\r\n                                CFc2 -= slen;\r\n                            }\r\n                        }\r\n\r\n                        cf_new_range.push({ \"row\": [CFr1, CFr2], \"column\": [CFc1, CFc2] });\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(cf_new_range.length > 0){\r\n                let cf = $.extend(true, {}, CFarr[i]);\r\n                cf.cellrange = cf_new_range;\r\n\r\n                newCFarr.push(cf);\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\u914D\u7F6E\u53D8\u52A8\r\n    let AFarr = file.luckysheet_alternateformat_save;\r\n    let newAFarr = [];\r\n    if(AFarr != null && AFarr.length > 0){\r\n        for(let i = 0; i < AFarr.length; i++){\r\n            let AFr1 = AFarr[i].cellrange.row[0],\r\n                AFr2 = AFarr[i].cellrange.row[1],\r\n                AFc1 = AFarr[i].cellrange.column[0],\r\n                AFc2 = AFarr[i].cellrange.column[1];\r\n\r\n            if(type == \"row\"){\r\n                if(!(AFr1 >= st && AFr2 <= ed)){\r\n                    let af = $.extend(true, {}, AFarr[i]);\r\n\r\n                    if(AFr1 > ed){\r\n                        AFr1 -= slen;\r\n                        AFr2 -= slen;\r\n                    }\r\n                    else if(AFr1 < st){\r\n                        if(AFr2 < st){\r\n\r\n                        }\r\n                        else if(AFr2 <= ed){\r\n                            AFr2 = st - 1;\r\n                        }\r\n                        else{\r\n                            AFr2 -= slen;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(AFr2 > ed){\r\n                            AFr1 = st;\r\n                            AFr2 -= slen;\r\n                        }\r\n                    }\r\n\r\n                    af.cellrange = { \"row\": [AFr1, AFr2], \"column\": [AFc1, AFc2] };\r\n\r\n                    newAFarr.push(af);\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(!(AFc1 >= st && AFc2 <= ed)){\r\n                    let af = $.extend(true, {}, AFarr[i]);\r\n\r\n                    if(AFc1 > ed){\r\n                        AFc1 -= slen;\r\n                        AFc2 -= slen;\r\n                    }\r\n                    else if(AFc1 < st){\r\n                        if(AFc2 < st){\r\n\r\n                        }\r\n                        else if(AFc2 <= ed){\r\n                            AFc2 = st - 1;\r\n                        }\r\n                        else{\r\n                            AFc2 -= slen;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(AFc2 > ed){\r\n                            AFc1 = st;\r\n                            AFc2 -= slen;\r\n                        }\r\n                    }\r\n\r\n                    af.cellrange = { \"row\": [AFr1, AFr2], \"column\": [AFc1, AFc2] };\r\n\r\n                    newAFarr.push(af);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u51BB\u7ED3\u914D\u7F6E\u53D8\u52A8\r\n    let newFreezen = { \"freezenhorizontaldata\": null, \"freezenverticaldata\": null };\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && type == \"row\"){\r\n        let freezen_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let freezen_st = luckysheet_searcharray(Store.visibledatarow, freezen_scrollTop);\r\n        if(freezen_st == -1){\r\n            freezen_st = 0;\r\n        }\r\n\r\n        let freezen_row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n\r\n        if(freezen_row_st >= st){\r\n            if(freezen_row_st < ed){\r\n                freezen_row_st = st - 1;\r\n            }\r\n            else{\r\n                freezen_row_st -= slen;\r\n            }\r\n        }\r\n\r\n        if(freezen_row_st < freezen_st){\r\n            freezen_row_st = freezen_st;\r\n        }\r\n\r\n        let freezen_top = Store.visibledatarow[freezen_row_st] - 2 - freezen_scrollTop + Store.columnHeaderHeight;\r\n\r\n        newFreezen.freezenhorizontaldata = [\r\n            Store.visibledatarow[freezen_row_st], \r\n            freezen_row_st + 1, \r\n            freezen_scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, freezen_row_st + 1), \r\n            freezen_top\r\n        ];\r\n    }\r\n    else{\r\n        newFreezen.freezenhorizontaldata = luckysheetFreezen.freezenhorizontaldata;\r\n    }\r\n\r\n    if(luckysheetFreezen.freezenverticaldata != null && type == \"column\"){\r\n        let freezen_scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n        let freezen_st2 = luckysheet_searcharray(Store.visibledatacolumn, freezen_scrollLeft);\r\n        if(freezen_st2 == -1){\r\n            freezen_st2 = 0;\r\n        }\r\n\r\n        let freezen_col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        if(freezen_col_st >= st){\r\n            if(freezen_col_st < ed){\r\n                freezen_col_st = st - 1;\r\n            }\r\n            else{\r\n                freezen_col_st -= slen;\r\n            }\r\n        }\r\n\r\n        if(freezen_col_st < freezen_st2){\r\n            freezen_col_st = freezen_st2;\r\n        }\r\n\r\n        let freezen_left = Store.visibledatacolumn[freezen_col_st] - 2 - freezen_scrollLeft + Store.rowHeaderWidth;\r\n\r\n        newFreezen.freezenverticaldata = [\r\n            Store.visibledatacolumn[freezen_col_st], \r\n            freezen_col_st + 1, \r\n            freezen_scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, freezen_col_st + 1), \r\n            freezen_left\r\n        ];\r\n    }\r\n    else{\r\n        newFreezen.freezenverticaldata = luckysheetFreezen.freezenverticaldata;\r\n    }\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\u914D\u7F6E\u53D8\u52A8\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if(dataVerification != null){\r\n        for(let key in dataVerification){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = dataVerification[key];\r\n            \r\n            if(type == \"row\"){\r\n                if(r < st){\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n                else if(r > ed){\r\n                    newDataVerification[(r - slen) + \"_\" + c] = item;\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(c < st){\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n                else if(c > ed){\r\n                    newDataVerification[r + \"_\" + (c - slen)] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u8D85\u94FE\u63A5\u914D\u7F6E\u53D8\u52A8\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if(hyperlink != null){\r\n        for(let key in hyperlink){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = hyperlink[key];\r\n            \r\n            if(type == \"row\"){\r\n                if(r < st){\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n                else if(r > ed){\r\n                    newHyperlink[(r - slen) + \"_\" + c] = item;\r\n                }\r\n            }\r\n            else if(type == \"column\"){\r\n                if(c < st){\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n                else if(c > ed){\r\n                    newHyperlink[r + \"_\" + (c - slen)] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u4E3B\u903B\u8F91\r\n    let type1;\r\n    if (type == \"row\") {\r\n        type1 = \"r\";\r\n\r\n        //\u884C\u9AD8\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"rowlen\"] == null){\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        let rowlen_new = {};\r\n        for(let r in cfg[\"rowlen\"]){\r\n            if(r < st){\r\n                rowlen_new[r] = cfg[\"rowlen\"][r];\r\n            }\r\n            else if(r > ed){\r\n                rowlen_new[r - slen] = cfg[\"rowlen\"][r];\r\n            }\r\n        }\r\n\r\n        cfg[\"rowlen\"] = rowlen_new;\r\n\r\n        //\u9690\u85CF\u884C\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"rowhidden\"] == null){\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        let rowhidden_new = {};\r\n        for(let r in cfg[\"rowhidden\"]){\r\n            if(r < st){\r\n                rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n            }\r\n            else if(r > ed){\r\n                rowhidden_new[r - slen] = cfg[\"rowhidden\"][r];\r\n            }\r\n        }\r\n\r\n        cfg[\"rowhidden\"] = rowhidden_new;\r\n\r\n        //\u8FB9\u6846\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n            let borderInfo = []; \r\n\r\n            for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if(rangeType == \"range\"){\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for(let j = 0; j < borderRange.length; j++){\r\n                        let bd_r1 = borderRange[j].row[0],\r\n                            bd_r2 = borderRange[j].row[1];\r\n\r\n                        for(let r = st; r <= ed; r++){\r\n                            if(r < borderRange[j].row[0]){\r\n                                bd_r1 -= 1;\r\n                                bd_r2 -= 1;\r\n                            }\r\n                            else if(r <= borderRange[j].row[1]){\r\n                                bd_r2 -= 1;\r\n                            }\r\n                        } \r\n\r\n                        if(bd_r2 >= bd_r1){\r\n                            emptyRange.push({ \"row\": [bd_r1, bd_r2], \"column\": borderRange[j].column });\r\n                        }   \r\n                    }\r\n\r\n                    if(emptyRange.length > 0){\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"range\",\r\n                            \"borderType\": cfg[\"borderInfo\"][i].borderType,\r\n                            \"style\": cfg[\"borderInfo\"][i].style,\r\n                            \"color\": cfg[\"borderInfo\"][i].color,\r\n                            \"range\": emptyRange\r\n                        }\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                }\r\n                else if(rangeType == \"cell\"){\r\n                    let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n\r\n                    if(row_index < st){\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                    else if(row_index > ed){\r\n                        cfg[\"borderInfo\"][i].value.row_index = row_index - (ed - st + 1);\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        // \u5907\u6CE8\uFF1A\u8BE5\u5904\u7406\u65B9\u5F0F\u4F1A\u5728\u5220\u9664\u591A\u884C\u7684\u65F6\u5019\u4F1A\u5B58\u5728bug\r\n        // \u8BF4\u660E\uFF1A\u5220\u9664\u591A\u884C\u540E\uFF0C\u4F1A\u628A\u540C\u4E00\u4E2Arow\u7A7A\u6570\u7EC4(\u5F15\u7528\u7C7B\u578B)\u6DFB\u52A0\u6210\u4E3Adata\u591A\u884C\u7684\u6570\u636E\u6E90\uFF0C\u5BFC\u81F4\u8BBE\u7F6E\u8FD9\u4E9B\u884C\u6570\u636E\u65F6\u4EA7\u751F\u9519\u8BEF\u3002\r\n        //\u7A7A\u767D\u884C\u6A21\u677F\r\n        // let row = [];\r\n        // for (let c = 0; c < d[0].length; c++) {\r\n        //     row.push(null);\r\n        // }\r\n\r\n        // //\u5220\u9664\u9009\u4E2D\u884C\r\n        // d.splice(st, slen);\r\n\r\n        // //\u5220\u9664\u591A\u5C11\u884C\uFF0C\u589E\u52A0\u591A\u5C11\u884C\u7A7A\u767D\u884C                \r\n        // for (let r = 0; r < slen; r++) {\r\n        //     d.push(row);\r\n        // }\r\n\r\n        //\u5220\u9664\u9009\u4E2D\u884C\r\n        d.splice(st, slen);\r\n\r\n        //\u5220\u9664\u591A\u5C11\u884C\uFF0C\u589E\u52A0\u591A\u5C11\u884C\u7A7A\u767D\u884C                \r\n        for (let r = 0; r < slen; r++) {\r\n            let row = [];\r\n            for (let c = 0; c < d[0].length; c++) {\r\n                row.push(null);\r\n            }\r\n            d.push(row);\r\n        }\r\n    }\r\n    else {\r\n        type1 = \"c\";\r\n\r\n        //\u5217\u5BBD\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"columnlen\"] == null){\r\n            cfg[\"columnlen\"] = {};\r\n        }\r\n\r\n        let columnlen_new = {};\r\n        for(let c in cfg[\"columnlen\"]){\r\n            if(c < st){\r\n                columnlen_new[c] = cfg[\"columnlen\"][c];\r\n            }\r\n            else if(c > ed){\r\n                columnlen_new[c - slen] = cfg[\"columnlen\"][c];\r\n            }\r\n        }\r\n\r\n        cfg[\"columnlen\"] = columnlen_new;\r\n\r\n        //\u9690\u85CF\u5217\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"colhidden\"] == null){\r\n            cfg[\"colhidden\"] = {};\r\n        }\r\n\r\n        let colhidden_new = {};\r\n        for(let c in cfg[\"colhidden\"]){\r\n            if(c < st){\r\n                colhidden_new[c] = cfg[\"colhidden\"][c];\r\n            }\r\n            else if(c > ed){\r\n                colhidden_new[c - slen] = cfg[\"colhidden\"][c];\r\n            }\r\n        }\r\n\r\n        cfg[\"colhidden\"] = colhidden_new;\r\n\r\n        //\u8FB9\u6846\u914D\u7F6E\u53D8\u52A8\r\n        if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n            let borderInfo = [];\r\n\r\n            for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if(rangeType == \"range\"){\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for(let j = 0; j < borderRange.length; j++){\r\n                        let bd_c1 = borderRange[j].column[0],\r\n                            bd_c2 = borderRange[j].column[1];\r\n\r\n                        for(let c = st; c <= ed; c++){\r\n                            if(c < borderRange[j].column[0]){\r\n                                bd_c1 -= 1;\r\n                                bd_c2 -= 1;\r\n                            }\r\n                            else if(c <= borderRange[j].column[1]){\r\n                                bd_c2 -= 1;\r\n                            }\r\n                        } \r\n\r\n                        if(bd_c2 >= bd_c1){\r\n                            emptyRange.push({ \"row\": borderRange[j].row, \"column\": [bd_c1, bd_c2] });\r\n                        }   \r\n                    }\r\n\r\n                    if(emptyRange.length > 0){\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"range\",\r\n                            \"borderType\": cfg[\"borderInfo\"][i].borderType,\r\n                            \"style\": cfg[\"borderInfo\"][i].style,\r\n                            \"color\": cfg[\"borderInfo\"][i].color,\r\n                            \"range\": emptyRange\r\n                        }\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                }\r\n                else if(rangeType == \"cell\"){\r\n                    let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                    if(col_index < st){\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                    else if(col_index > ed){\r\n                        cfg[\"borderInfo\"][i].value.col_index = col_index - (ed - st + 1);\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n        \r\n        //\u7A7A\u767D\u5217\u6A21\u677F\r\n        let addcol = [];\r\n        for (let r = 0; r < slen; r++) {\r\n            addcol.push(null);\r\n        }\r\n\r\n        for (let r = 0; r < d.length; r++) {\r\n            let row = [].concat(d[r]);\r\n            \r\n            //\u5220\u9664\u9009\u4E2D\u5217\r\n            row.splice(st, slen);\r\n            \r\n            d[r] = row.concat(addcol);\r\n        }\r\n    }\r\n\r\n    // \u4FEE\u6539\u5F53\u524Dsheet\u9875\u65F6\u5237\u65B0\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid_adRC(\r\n            d, \r\n            cfg, \r\n            \"delRC\", \r\n            { \"index\": st, \"len\": ed - st + 1, \"rc\": type1 }, \r\n            newCalcChain, \r\n            newFilterObj, \r\n            newCFarr, \r\n            newAFarr, \r\n            newFreezen,\r\n            newDataVerification,\r\n            newHyperlink\r\n        );\r\n    }\r\n    else{\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.luckysheet_alternateformat_save = newAFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n}\r\n\r\n//\u5220\u9664\u5355\u5143\u683C\r\nfunction luckysheetDeleteCell(type, str, edr, stc, edc, sheetIndex) {\r\n    sheetIndex = sheetIndex || Store.currentSheetIndex;\r\n    if(!checkProtectionNotEnable(sheetIndex)){\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n    let file = Store.luckysheetfile[curOrder];\r\n\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    let rlen = edr - str + 1;\r\n    let clen = edc - stc + 1;\r\n    let cfg = $.extend(true, {}, Store.config);\r\n\r\n    //\u5408\u5E76\u5355\u5143\u683C\u914D\u7F6E\u53D8\u52A8\r\n    if(cfg[\"merge\"] == null){\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for(let m in cfg[\"merge\"]){\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if(type == \"moveLeft\"){\r\n            if(str > r + rs - 1 || edr < r || stc > c + cs - 1){\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else if(str <= r && edr >= r + rs - 1 && edc < c){\r\n                merge_new[r + \"_\" + (c - clen)] = { \"r\": r, \"c\": c - clen, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else{\r\n                for(let r_i = r; r_i <= r + rs - 1; r_i++){\r\n                    for(let c_i = c; c_i <= c + cs - 1; c_i++){\r\n                        delete d[r_i][c_i].mc;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"moveUp\"){\r\n            if(stc > c + cs - 1 || edc < c || str > r + rs - 1){\r\n                merge_new[r + \"_\" + c] = { \"r\": r, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else if(stc <= c && edc >= c + cs - 1 && edr < r){\r\n                merge_new[(r - rlen) + \"_\" + c] = { \"r\": r - rlen, \"c\": c, \"rs\": rs, \"cs\": cs };\r\n            }\r\n            else{\r\n                for(let r_i = r; r_i <= r + rs - 1; r_i++){\r\n                    for(let c_i = c; c_i <= c + cs - 1; c_i++){\r\n                        delete d[r_i][c_i].mc;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //\u516C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if(calcChain != null && calcChain.length > 0){\r\n        for(let i = 0; i < calcChain.length; i++){\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r, calc_c = calc.c, calc_i = calc.index, calc_funcStr =  getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n            if(calc_r < str || calc_r > edr || calc_c < stc || calc_c > edc){\r\n                let functionStr;\r\n\r\n                if(type == 'moveLeft'){\r\n                    functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"col\", null, stc, clen);\r\n                \r\n                    if(calc_c > edc && calc_r >= str && calc_r <= edr){\r\n                        calc.c = calc_c - clen;\r\n                    }\r\n                }\r\n                else if(type == 'moveUp'){\r\n                    functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"row\", null, str, rlen);\r\n                \r\n                    if(calc_r > edr && calc_c >= stc && calc_c <= edc){\r\n                        calc.r = calc_r - rlen;\r\n                    }\r\n                }\r\n\r\n                if(d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr){\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u7B5B\u9009\u914D\u7F6E\u53D8\u52A8\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if(filter_select != null && JSON.stringify(filter_select) != \"{}\"){\r\n        newFilterObj = { \"filter_select\": null, \"filter\": null };\r\n\r\n        let f_r1 = filter_select.row[0], f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0], f_c2 = filter_select.column[1];\r\n        \r\n        if(type == 'moveUp'){\r\n            if(f_c1 >= stc && f_c2 <= edc){\r\n                if(f_r1 > edr){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1 - rlen, f_r2 - rlen],\r\n                        \"column\": [f_c1, f_c2]\r\n                    }\r\n                }\r\n                else if(f_r2 < str){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1, f_r2],\r\n                        \"column\": [f_c1, f_c2]\r\n                    }\r\n                }\r\n                else if(f_r1 < str){\r\n                    if(f_r2 > edr){\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2 - rlen],\r\n                            \"column\": [f_c1, f_c2]\r\n                        }\r\n                    }\r\n                    else{\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, str - 1],\r\n                            \"column\": [f_c1, f_c2]\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if(newFilterObj.filter_select != null && filter != null){\r\n                    for(let k in filter){\r\n                        let f_rowhidden = filter[k].rowhidden;\r\n                        let f_rowhidden_new = {};\r\n        \r\n                        for(let n in f_rowhidden){\r\n                            if(n < str){\r\n                                f_rowhidden_new[n] = 0;\r\n                            }\r\n                            else if(n > edr){\r\n                                f_rowhidden_new[n - slen] = 0;\r\n                            }\r\n                        }\r\n\r\n                        if(newFilterObj.filter == null){\r\n                            newFilterObj.filter = {};\r\n                        }\r\n                        newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n        \r\n                        if(JSON.stringify(f_rowhidden_new) != \"{}\"){\r\n                            newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                        }\r\n        \r\n                        newFilterObj.filter[k].str = newFilterObj.filter_select.row[0];\r\n                        newFilterObj.filter[k].edr = newFilterObj.filter_select.row[1];\r\n                    }\r\n                }\r\n            }\r\n            else if(f_r1 >= str && f_r2 <= edr){\r\n                if(f_c1 > edc){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1, f_r2],\r\n                        \"column\": [f_c1, f_c2]\r\n                    }\r\n                }\r\n                else if(f_c1 >= stc){\r\n                    if(f_c2 > edc){\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [stc, f_c2 - clen]\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(f_c2 < stc){\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [f_c1, f_c2]\r\n                        }\r\n                    }\r\n                    else if(f_c2 <= edc){\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [f_c1, stc - 1]\r\n                        }\r\n                    }\r\n                    else{\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [f_c1, f_c2 - clen]\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if(newFilterObj.filter_select != null && filter != null){\r\n                    for(let k in filter){\r\n                        let f_stc = newFilterObj.filter_select.column[0];\r\n                        let f_edc = newFilterObj.filter_select.column[1];\r\n                        let f_cindex = filter[k].cindex;\r\n\r\n                        if(f_cindex < stc || f_cindex > edc){\r\n                            if(newFilterObj.filter == null){\r\n                                newFilterObj.filter = {};\r\n                            }\r\n\r\n                            if(f_cindex > edc){\r\n                                f_cindex -= clen;\r\n                            }\r\n\r\n                            let k2 = f_cindex - f_stc;\r\n\r\n                            newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);\r\n                            newFilterObj.filter[k2].cindex = f_cindex;\r\n                            newFilterObj.filter[k2].stc = f_stc;\r\n                            newFilterObj.filter[k2].edc = f_edc;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                newFilterObj.filter_select = {\r\n                    \"row\": [f_r1, f_r2],\r\n                    \"column\": [f_c1, f_c2]\r\n                }\r\n\r\n                if(filter != null){\r\n                    newFilterObj.filter = filter;\r\n                }\r\n            }\r\n        }\r\n        else if(type == 'moveLeft'){\r\n            if(f_r1 >= str && f_r2 <= edr){\r\n                if(f_c1 > edc){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1, f_r2],\r\n                        \"column\": [f_c1 - clen, f_c2 - clen]\r\n                    }\r\n                }\r\n                else if(f_c2 < stc){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1, f_r2],\r\n                        \"column\": [f_c1, f_c2]\r\n                    }\r\n                }\r\n                else if(f_c1 < stc){\r\n                    if(f_c2 > edc){\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [f_c1, f_c2 - clen]\r\n                        }\r\n                    }\r\n                    else{\r\n                        newFilterObj.filter_select = {\r\n                            \"row\": [f_r1, f_r2],\r\n                            \"column\": [f_c1, stc - 1]\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if(newFilterObj.filter_select != null && filter != null){\r\n                    for(let k in filter){\r\n                        let f_stc = newFilterObj.filter_select.column[0];\r\n                        let f_edc = newFilterObj.filter_select.column[1];\r\n                        let f_cindex = filter[k].cindex;\r\n\r\n                        if(f_cindex < stc || f_cindex > edc){\r\n                            if(newFilterObj.filter == null){\r\n                                newFilterObj.filter = {};\r\n                            }\r\n\r\n                            if(f_cindex > edc){\r\n                                f_cindex -= clen;\r\n                            }\r\n\r\n                            let k2 = f_cindex - f_stc;\r\n\r\n                            newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);\r\n                            newFilterObj.filter[k2].cindex = f_cindex;\r\n                            newFilterObj.filter[k2].stc = f_stc;\r\n                            newFilterObj.filter[k2].edc = f_edc;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else if(f_c1 >= stc && f_c2 <= edc){\r\n                if(f_r1 < str || f_r1 > edr){\r\n                    newFilterObj.filter_select = {\r\n                        \"row\": [f_r1, f_r2],\r\n                        \"column\": [f_c1, f_c2]\r\n                    }\r\n\r\n                    if(filter != null){\r\n                        newFilterObj.filter = filter;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                newFilterObj.filter_select = {\r\n                    \"row\": [f_r1, f_r2],\r\n                    \"column\": [f_c1, f_c2]\r\n                }\r\n\r\n                if(filter != null){\r\n                    newFilterObj.filter = filter;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(newFilterObj != null && newFilterObj.filter != null){\r\n        if(cfg[\"rowhidden\"] == null){\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for(let k in newFilterObj.filter){\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for(let n in f_rowhidden){\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u914D\u7F6E\u53D8\u52A8\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if(CFarr != null && CFarr.length > 0){\r\n        for(let i = 0; i < CFarr.length; i++){\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for(let j = 0; j < cf_range.length; j++){\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n                \r\n                if(!(str <= CFr1 && edr >= CFr2 && stc <= CFc1 && edc >= CFc2)){\r\n                    cf_new_range = getMoveRange(type, str, edr, stc, edc, CFr1, CFr2, CFc1, CFc2, rlen, clen);\r\n                }\r\n            }\r\n\r\n            if(cf_new_range.length > 0){\r\n                let cf = $.extend(true, {}, CFarr[i]);\r\n                cf.cellrange = cf_new_range;\r\n\r\n                newCFarr.push(cf);\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\u914D\u7F6E\u53D8\u52A8\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if(dataVerification != null){\r\n        for(let key in dataVerification){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = dataVerification[key];\r\n\r\n            if(r < str || r > edr || c < stc || c > edc){\r\n                if(type == \"moveLeft\"){\r\n                    if(c > edc && r >= str && r <= edr){\r\n                        newDataVerification[r + \"_\" + (c - clen)] = item;\r\n                    }\r\n                    else{\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n                else if(type == \"moveUp\"){\r\n                    if(r > edr && c >= stc && c <= edc){\r\n                        newDataVerification[(r - rlen) + \"_\" + c] = item;\r\n                    }\r\n                    else{\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u8D85\u94FE\u63A5\u914D\u7F6E\u53D8\u52A8\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if(hyperlink != null){\r\n        for(let key in hyperlink){\r\n            let r = Number(key.split('_')[0]),\r\n                c = Number(key.split('_')[1]);\r\n            let item = hyperlink[key];\r\n\r\n            if(r < str || r > edr || c < stc || c > edc){\r\n                if(type == \"moveLeft\"){\r\n                    if(c > edc && r >= str && r <= edr){\r\n                        newHyperlink[r + \"_\" + (c - clen)] = item;\r\n                    }\r\n                    else{\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n                else if(type == \"moveUp\"){\r\n                    if(r > edr && c >= stc && c <= edc){\r\n                        newHyperlink[(r - rlen) + \"_\" + c] = item;\r\n                    }\r\n                    else{\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u8FB9\u6846\u914D\u7F6E\u53D8\u52A8\r\n    if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n        let borderInfo = []; \r\n\r\n        for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n            let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n            if(rangeType == \"range\"){\r\n                let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                let emptyRange = [];\r\n\r\n                for(let j = 0; j < borderRange.length; j++){\r\n                    let bd_r1 = borderRange[j].row[0],\r\n                        bd_r2 = borderRange[j].row[1],\r\n                        bd_c1 = borderRange[j].column[0],\r\n                        bd_c2 = borderRange[j].column[1];\r\n\r\n                    if(!(str <= bd_r1 && edr >= bd_r2 && stc <= bd_c1 && edc >= bd_c2)){\r\n                        emptyRange = getMoveRange(type, str, edr, stc, edc, bd_r1, bd_r2, bd_c1, bd_c2, rlen, clen);\r\n                    }\r\n                }\r\n\r\n                if(emptyRange.length > 0){\r\n                    let bd_obj = {\r\n                        \"rangeType\": \"range\",\r\n                        \"borderType\": cfg[\"borderInfo\"][i].borderType,\r\n                        \"style\": cfg[\"borderInfo\"][i].style,\r\n                        \"color\": cfg[\"borderInfo\"][i].color,\r\n                        \"range\": emptyRange\r\n                    }\r\n\r\n                    borderInfo.push(bd_obj);\r\n                }\r\n            }\r\n            else if(rangeType == \"cell\"){\r\n                let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n                let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                if(row_index < str || row_index > edr || col_index < stc || col_index > edc){\r\n                    if(type == 'moveLeft'){\r\n                        if(col_index > edc && row_index >= str && row_index <= edr){\r\n                            col_index -= clen;\r\n                            cfg[\"borderInfo\"][i].value.col_index = col_index;\r\n                        }\r\n                    }\r\n                    else if(type == 'moveUp'){\r\n                        if(row_index > edr && col_index >= stc && col_index <= edc){\r\n                            row_index -= rlen;\r\n                            cfg[\"borderInfo\"][i].value.row_index = row_index;\r\n                        }\r\n                    }\r\n    \r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        cfg[\"borderInfo\"] = borderInfo;\r\n    }\r\n    \r\n    //\u7A7A\u767D\u5217\u6A21\u677F\r\n    let addcol = [];\r\n    for (let c = stc; c <= edc; c++) {\r\n        addcol.push(null);\r\n    }\r\n\r\n    if(type == 'moveUp'){//\u4E0A\u79FB\r\n        let data = [];\r\n\r\n        for(let r = str; r <= d.length - 1; r++){\r\n            let row = [];\r\n\r\n            for(let c = stc; c <= edc; c++){\r\n                row.push(d[r][c]);\r\n            }\r\n\r\n            data.push(row);\r\n        }\r\n\r\n        data.splice(0, rlen);\r\n\r\n        //\u7A7A\u767D\u884C\u6A21\u677F\r\n        let addrow = [];\r\n        for (let r = str; r <= edr; r++) {\r\n            addrow.push(addcol);\r\n        }\r\n\r\n        data = data.concat(addrow);\r\n\r\n        for(let r = str; r <= d.length - 1; r++){\r\n            for(let c = stc; c <= edc; c++){\r\n                d[r][c] = data[r - str][c - stc];\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'moveLeft'){//\u5DE6\u79FB\r\n        for(let r = str; r <= edr; r++){\r\n            d[r].splice(stc, clen);\r\n            d[r] = d[r].concat(addcol);\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid_deleteCell(\r\n            d,\r\n            cfg,\r\n            { type: type, 'str': str, 'edr': edr, 'stc': stc, 'edc': edc },\r\n            newCalcChain,\r\n            newFilterObj,\r\n            newCFarr,\r\n            newDataVerification,\r\n            newHyperlink\r\n        );\r\n    }\r\n    else{\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n}\r\n\r\nfunction getMoveRange(type, str, edr, stc, edc, r1, r2, c1, c2, rlen, clen) {\r\n    let newRange = [];\r\n\r\n    if(type == \"moveLeft\"){\r\n        if(str > r2 || edr < r1 || stc > c2){\r\n            newRange.push({\r\n                \"row\": [r1, r2],\r\n                \"column\": [c1, c2]\r\n            });\r\n        }\r\n        else if(edc < c1){\r\n            if(str <= r1 && edr >= r2){\r\n                newRange.push({\r\n                    \"row\": [r1, r2],\r\n                    \"column\": [c1 - clen, c2 - clen]\r\n                });\r\n            }\r\n            else if(str > r1 && edr < r2){\r\n                let range= [\r\n                    { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [str, edr], \"column\": [c1 - clen, c2 - clen] }\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n            else if(str > r1){\r\n                let range= [\r\n                    { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [str, r2], \"column\": [c1 - clen, c2 - clen] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n            else if(edr < r2){\r\n                let range= [\r\n                    { \"row\": [r1, edr], \"column\": [c1 - clen, c2 - clen] },\r\n                    { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n        }\r\n        else if(edc >= c1){\r\n            if(stc <= c1 && edc >= c2){\r\n                if(str > r1 && edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(str > r1){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edr < r2){\r\n                    let range= [\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(stc > c1 && edc < c2){\r\n                if(str <= r1 && edr >= r2){\r\n                    newRange.push({\r\n                        \"row\": [r1, r2],\r\n                        \"column\": [c1, c2 - clen]\r\n                    });\r\n                }\r\n                else if(str > r1 && edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                        { \"row\": [str, edr], \"column\": [c1, c2 - clen] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(str > r1){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [str, r2], \"column\": [c1, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, edr], \"column\": [c1, c2 - clen] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(stc > c1){\r\n                if(str <= r1 && edr >= r2){\r\n                    newRange.push({\r\n                        \"row\": [r1, r2],\r\n                        \"column\": [c1, stc - 1]\r\n                    });\r\n                }\r\n                else if(str > r1 && edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                        { \"row\": [str, edr], \"column\": [c1, stc - 1] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(str > r1){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [str, r2], \"column\": [c1, stc - 1] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, edr], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(edc < c2){\r\n                if(str <= r1 && edr >= r2){\r\n                    newRange.push({\r\n                        \"row\": [r1, r2],\r\n                        \"column\": [c1 - clen, c2 - clen]\r\n                    });\r\n                }\r\n                else if(str > r1 && edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                        { \"row\": [str, edr], \"column\": [c1 - clen, c2 - clen] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(str > r1){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, c2] },\r\n                        { \"row\": [str, r2], \"column\": [c1 - clen, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edr < r2){\r\n                    let range= [\r\n                        { \"row\": [r1, edr], \"column\": [c1 - clen, c2 - clen] },\r\n                        { \"row\": [edr + 1, r2], \"column\": [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if(type == \"moveUp\"){\r\n        if(stc > c2 || edc < c1 || str > r2){\r\n            newRange.push({\r\n                \"row\": [r1, r2],\r\n                \"column\": [c1, c2]\r\n            });\r\n        }\r\n        else if(edr < r1){\r\n            if(stc <= c1 && edc >= c2){\r\n                newRange.push({\r\n                    \"row\": [r1 - rlen, r2 - rlen],\r\n                    \"column\": [c1, c2]\r\n                });\r\n            }\r\n            else if(stc > c1 && edc < c2){\r\n                let range= [\r\n                    { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                    { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    { \"row\": [r1 - rlen, r2 - rlen], \"column\": [stc, edc] }\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n            else if(stc > c1){\r\n                let range= [\r\n                    { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                    { \"row\": [r1 - rlen, r2 - rlen], \"column\": [stc, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n            else if(edc < c2){\r\n                let range= [\r\n                    { \"row\": [r1 - rlen, r2 - rlen], \"column\": [c1, edc] },\r\n                    { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n        }\r\n        else if(edr >= r1){\r\n            if(str <= r1 && edr >= r2){\r\n                if(stc > c1 && edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(stc > c1){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(str > r1 && edr < r2){\r\n                if(stc <= c1 && edc >= c2){\r\n                    newRange.push({\r\n                        \"row\": [r1, r2 - rlen],\r\n                        \"column\": [c1, c2]\r\n                    });\r\n                }\r\n                else if(stc > c1 && edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                        { \"row\": [r1, r2 - rlen], \"column\": [stc, edc] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(stc > c1){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, r2 - rlen], \"column\": [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2 - rlen], \"column\": [c1, edc] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(str > r1){\r\n                if(stc <= c1 && edc >= c2){\r\n                    newRange.push({\r\n                        \"row\": [r1, str - 1],\r\n                        \"column\": [c1, c2]\r\n                    });\r\n                }\r\n                else if(stc > c1 && edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                        { \"row\": [r1, str - 1], \"column\": [stc, edc] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(stc > c1){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, str - 1], \"column\": [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, str - 1], \"column\": [c1, edc] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n            else if(edr < r2){\r\n                if(stc <= c1 && edc >= c2){\r\n                    newRange.push({\r\n                        \"row\": [r1 - rlen, r2 - rlen],\r\n                        \"column\": [c1, c2]\r\n                    });\r\n                }\r\n                else if(stc > c1 && edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                        { \"row\": [r1 - rlen, r2 - rlen], \"column\": [stc, edc] }\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(stc > c1){\r\n                    let range= [\r\n                        { \"row\": [r1, r2], \"column\": [c1, stc - 1] },\r\n                        { \"row\": [r1 - rlen, r2 - rlen], \"column\": [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n                else if(edc < c2){\r\n                    let range= [\r\n                        { \"row\": [r1 - rlen, r2 - rlen], \"column\": [c1, edc] },\r\n                        { \"row\": [r1, r2], \"column\": [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return newRange;\r\n}\r\n\r\nexport {\r\n    luckysheetextendtable,\r\n    luckysheetextendData,\r\n    luckysheetdeletetable,\r\n    luckysheetDeleteCell,\r\n}", "import { datagridgrowth } from './getdata';\r\nimport editor from './editor';\r\nimport rhchInit from './rhchInit';\r\nimport formula from './formula';\r\nimport { luckysheetrefreshgrid } from './refresh';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport Store from '../store';\r\n\r\nexport default function luckysheetcreatesheet(colwidth, rowheight, data, cfg, active) {\r\n    if(active == null){\r\n        active = true;\r\n    }\r\n\r\n    Store.visibledatarow = [];\r\n    Store.visibledatacolumn = [];\r\n    Store.ch_width = 0;\r\n    Store.rh_height = 0;\r\n    Store.zoomRatio = 1;\r\n\r\n    if(cfg != null){\r\n        Store.config = cfg;\r\n    }\r\n    else{\r\n        Store.config = {};\r\n    }\r\n\r\n    if (data.length == 0) {\r\n        Store.flowdata = datagridgrowth(data, rowheight, colwidth);\r\n    }\r\n    else if (data.length < rowheight && data[0].length < colwidth) {\r\n        Store.flowdata = datagridgrowth(data, rowheight - data.length, colwidth - data[0].length);\r\n    }\r\n    else if (data.length < rowheight) {\r\n        Store.flowdata = datagridgrowth(data, rowheight - data.length, 0);\r\n    }\r\n    else if (data[0].length < colwidth) {\r\n        Store.flowdata = datagridgrowth(data, 0, colwidth - data[0].length);\r\n    }\r\n    else {\r\n        Store.flowdata = data;\r\n    }\r\n\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n    rhchInit(rowheight, colwidth);\r\n\r\n    if(active){\r\n        sheetmanage.showSheet();\r\n\r\n        setTimeout(function () {\r\n            sheetmanage.restoreCache();\r\n            formula.execFunctionGroup();\r\n            sheetmanage.restoreSheetAll(Store.currentSheetIndex);\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n", "import server from '../controllers/server';\r\nimport { luckysheetlodingHTML, luckyColor } from '../controllers/constant';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport luckysheetformula from './formula';\r\nimport imageCtrl from '../controllers/imageCtrl';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport pivotTable from '../controllers/pivotTable';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { luckysheetextendData } from './extend';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport editor from './editor';\r\nimport luckysheetcreatesheet from './createsheet';\r\nimport Store from '../store';\r\n\r\nconst defaultConfig = {\r\n    defaultStore:{\r\n        container: null, \r\n        luckysheetfile: null, \r\n        defaultcolumnNum: 60, \r\n        defaultrowNum: 84, \r\n        fullscreenmode: true,\r\n        devicePixelRatio: 1,\r\n    \r\n        currentSheetIndex: 0,\r\n        calculateSheetIndex: 0,\r\n        flowdata: [],\r\n        config: {},\r\n    \r\n        visibledatarow: [],\r\n        visibledatacolumn: [],\r\n        ch_width: 0,\r\n        rh_height: 0,\r\n    \r\n        cellmainWidth: 0,\r\n        cellmainHeight: 0,\r\n        toolbarHeight: 0,\r\n        infobarHeight: 0,\r\n        calculatebarHeight: 0,\r\n        rowHeaderWidth: 46,\r\n        columnHeaderHeight: 20,\r\n        cellMainSrollBarSize: 12,\r\n        sheetBarHeight: 31,\r\n        statisticBarHeight: 23,\r\n        luckysheetTableContentHW: [0, 0], \r\n    \r\n        defaultcollen: 73,\r\n        defaultrowlen: 19,\r\n    \r\n        jfcountfuncTimeout: null, \r\n        jfautoscrollTimeout: null,\r\n    \r\n        luckysheet_select_status: false,\r\n        luckysheet_select_save: [{ \"row\": [0, 0], \"column\": [0, 0] }],\r\n        luckysheet_selection_range: [],\r\n    \r\n        luckysheet_copy_save: {}, //\u590D\u5236\u7C98\u8D34\r\n        luckysheet_paste_iscut: false,\r\n    \r\n        filterchage: true, //\u7B5B\u9009\r\n        luckysheet_filter_save: { \"row\": [], \"column\": [] },\r\n    \r\n        luckysheet_sheet_move_status: false,\r\n        luckysheet_sheet_move_data: [],\r\n        luckysheet_scroll_status: false,\r\n    \r\n        luckysheetisrefreshdetail: true,\r\n        luckysheetisrefreshtheme: true,\r\n        luckysheetcurrentisPivotTable: false,\r\n    \r\n        luckysheet_rows_selected_status: false,  //\u884C\u5217\u6807\u9898\u76F8\u5173\u53C2\r\n        luckysheet_cols_selected_status: false,  \r\n        luckysheet_rows_change_size: false,\r\n        luckysheet_rows_change_size_start: [],\r\n        luckysheet_cols_change_size: false,\r\n        luckysheet_cols_change_size_start: [],\r\n        luckysheet_cols_dbclick_timeout: null,\r\n        luckysheet_cols_dbclick_times: 0,\r\n    \r\n        luckysheetCellUpdate: [],\r\n        \r\n        luckysheet_shiftpositon: null,\r\n    \r\n        iscopyself: true,\r\n    \r\n        orderbyindex: 0, //\u6392\u5E8F\u4E0B\u6807\r\n    \r\n        luckysheet_model_move_state: false, //\u6A21\u6001\u6846\u62D6\u52A8\r\n        luckysheet_model_xy: [0, 0],\r\n        luckysheet_model_move_obj: null,\r\n    \r\n        luckysheet_cell_selected_move: false,  //\u9009\u533A\u62D6\u52A8\u66FF\u6362\r\n        luckysheet_cell_selected_move_index: [],\r\n    \r\n        luckysheet_cell_selected_extend: false,  //\u9009\u533A\u4E0B\u62C9\r\n        luckysheet_cell_selected_extend_index: [],\r\n        luckysheet_cell_selected_extend_time: null,\r\n    \r\n        clearjfundo: true,\r\n        jfredo: [],\r\n        jfundo: [],\r\n        lang: 'en', //language\r\n        createChart: '',\r\n        highlightChart: '',\r\n        zIndex: 15,\r\n        chartparam: {\r\n            luckysheetCurrentChart: null, //current chart_id\r\n            luckysheetCurrentChartActive: false,\r\n            luckysheetCurrentChartMove: null, // Debounce state\r\n            luckysheetCurrentChartMoveTimeout: null,//\u62D6\u52A8\u56FE\u8868\u6846\u7684\u8282\u6D41\u5B9A\u65F6\u5668\r\n            luckysheetCurrentChartMoveObj: null, //chart DOM object\r\n            luckysheetCurrentChartMoveXy: null, //\u4E0A\u4E00\u6B21\u64CD\u4F5C\u7ED3\u675F\u7684\u56FE\u8868\u4FE1\u606F\uFF0Cx,y: chart\u6846\u4F4D\u7F6E\uFF0CscrollLeft1,scrollTop1: \u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n            luckysheetCurrentChartMoveWinH: null, //\u5DE6\u53F3\u6EDA\u52A8\u6761\u6ED1\u52A8\u8DDD\u79BB\r\n            luckysheetCurrentChartMoveWinW: null, //\u4E0A\u4E0B\u6EDA\u52A8\u6761\u6ED1\u52A8\u8DDD\u79BB\r\n            luckysheetCurrentChartResize: null,\r\n            luckysheetCurrentChartResizeObj: null,\r\n            luckysheetCurrentChartResizeXy: null,\r\n            luckysheetCurrentChartResizeWinH: null,\r\n            luckysheetCurrentChartResizeWinW: null,\r\n            luckysheetInsertChartTosheetChange: true, // \u6B63\u5728\u6267\u884C\u64A4\u9500\r\n            luckysheetCurrentChartZIndexRank : 100,\r\n            luckysheet_chart_redo_click:false, //\u64A4\u9500\u91CD\u505A\u65F6\u6807\u8BC6\r\n            luckysheetCurrentChartMaxState: false, //\u56FE\u8868\u5168\u5C4F\u72B6\u6001\r\n            jfrefreshchartall: '',\r\n            changeChartCellData: '',\r\n            renderChart: '',\r\n            getChartJson: ''\r\n        },\r\n        functionList:null, //function list explanation\r\n        luckysheet_function:null,\r\n        chart_selection: {},\r\n        currentChart: '',\r\n        scrollRefreshSwitch:true,\r\n    \r\n        measureTextCache:{},\r\n        measureTextCellInfoCache:{},\r\n        measureTextCacheTimeOut:null,\r\n        cellOverflowMapCache:{},\r\n    \r\n        zoomRatio:1,\r\n    \r\n        visibledatacolumn_unique:null,\r\n        visibledatarow_unique:null,\r\n    \r\n        showGridLines:true,\r\n    \r\n        toobarObject: {}, //toolbar constant\r\n        inlineStringEditCache:null,\r\n        inlineStringEditRange:null,\r\n    \r\n        fontList:[],\r\n\r\n        currentSheetView:\"viewNormal\",\r\n    \r\n    },    \r\n    defaultFormula:{\r\n        searchFunctionCell: null,\r\n        functionlistPosition: {},\r\n        rangechangeindex: null,\r\n        rangestart: false,\r\n        rangetosheet: null,\r\n        rangeSetValueTo: null,\r\n        func_selectedrange: {}, //\u51FD\u6570\u9009\u533A\u8303\u56F4\r\n        rangedrag_column_start: false,\r\n        rangedrag_row_start: false,\r\n        rangeResizeObj: null,\r\n        rangeResize: null,\r\n        rangeResizeIndex: null,\r\n        rangeResizexy: null,\r\n        rangeResizeWinH: null,\r\n        rangeResizeWinW: null,\r\n        rangeResizeTo: null,\r\n        rangeMovexy: null,\r\n        rangeMove: false,\r\n        rangeMoveObj: null,\r\n        rangeMoveIndex: null,\r\n        rangeMoveRangedata: null,\r\n        functionHTMLIndex: 0,\r\n        functionRangeIndex: null,\r\n        execvertex: {},\r\n        execFunctionGroupData: null,\r\n        execFunctionExist: null,\r\n        formulaContainSheetList:{},\r\n        cellTextToIndexList:{},\r\n        isFunctionRangeSave: false,\r\n        execvertex: {},\r\n        execFunctionGroupData: null,\r\n        execFunctionExist: null,\r\n        formulaContainSheetList:{},\r\n        formulaContainCellList:{},\r\n        cellTextToIndexList:{},\r\n        execFunctionGlobalData:{},\r\n        groupValuesRefreshData: [],\r\n        functionResizeData: {},\r\n        functionResizeStatus: false,\r\n        functionResizeTimeout: null,\r\n        data_parm_index: 0  //\u9009\u62E9\u516C\u5F0F\u540E\u53C2\u6570\u7D22\u5F15\u6807\u8BB0\r\n    },\r\n    defaultSheet:{\r\n        sheetMaxIndex: 0,\r\n        nulldata: null,\r\n        mergeCalculationSheet:{},\r\n        checkLoadSheetIndexToDataIndex:{},\r\n        CacheNotLoadControll:[],\r\n    },\r\n    defaultPivotTable:{\r\n        pivotDatas: null,\r\n        pivotSheetIndex: 0,\r\n        pivotDataSheetIndex: 0,\r\n        celldata: null,\r\n        origindata: null,\r\n        pivot_data_type: {},\r\n        pivot_select_save: null,\r\n        column: null,\r\n        row: null,\r\n        values: null,\r\n        filter: null,\r\n        showType: null,\r\n        rowhidden: null,\r\n        selected: null,\r\n        caljs: null,\r\n        initial: true,\r\n        filterparm: null,\r\n        luckysheet_pivotTable_select_state: false,\r\n        jgridCurrentPivotInput: null,\r\n        movestate: false,\r\n        moveitemposition: [],\r\n        movesave: {},\r\n        drawPivotTable: true,\r\n        pivotTableBoundary: [12, 6],\r\n    },\r\n    defaultImage:{\r\n        imgItem: {\r\n            type: '3',  //1\u79FB\u52A8\u5E76\u8C03\u6574\u5355\u5143\u683C\u5927\u5C0F 2\u79FB\u52A8\u5E76\u4E14\u4E0D\u8C03\u6574\u5355\u5143\u683C\u7684\u5927\u5C0F 3\u4E0D\u8981\u79FB\u52A8\u5355\u5143\u683C\u5E76\u8C03\u6574\u5176\u5927\u5C0F\r\n            src: '',  //\u56FE\u7247url\r\n            originWidth: null,  //\u56FE\u7247\u539F\u59CB\u5BBD\u5EA6\r\n            originHeight: null,  //\u56FE\u7247\u539F\u59CB\u9AD8\u5EA6\r\n            default: {\r\n                width: null,  //\u56FE\u7247 \u5BBD\u5EA6\r\n                height: null,  //\u56FE\u7247 \u9AD8\u5EA6\r\n                left: null,  //\u56FE\u7247\u79BB\u8868\u683C\u5DE6\u8FB9\u7684 \u4F4D\u7F6E\r\n                top: null,  //\u56FE\u7247\u79BB\u8868\u683C\u9876\u90E8\u7684 \u4F4D\u7F6E\r\n            },\r\n            crop: {\r\n                width: null,  //\u56FE\u7247\u88C1\u526A\u540E \u5BBD\u5EA6\r\n                height: null,  //\u56FE\u7247\u88C1\u526A\u540E \u9AD8\u5EA6\r\n                offsetLeft: 0,  //\u56FE\u7247\u88C1\u526A\u540E\u79BB\u672A\u88C1\u526A\u65F6 \u5DE6\u8FB9\u7684\u4F4D\u79FB\r\n                offsetTop: 0,  //\u56FE\u7247\u88C1\u526A\u540E\u79BB\u672A\u88C1\u526A\u65F6 \u9876\u90E8\u7684\u4F4D\u79FB\r\n            },\r\n            isFixedPos: false,  //\u56FA\u5B9A\u4F4D\u7F6E\r\n            fixedLeft: null,  //\u56FA\u5B9A\u4F4D\u7F6E \u5DE6\u4F4D\u79FB\r\n            fixedTop: null,  //\u56FA\u5B9A\u4F4D\u7F6E \u53F3\u4F4D\u79FB\r\n            border: {\r\n                width: 0,  //\u8FB9\u6846\u5BBD\u5EA6\r\n                radius: 0,  //\u8FB9\u6846\u534A\u5F84\r\n                style: 'solid',  //\u8FB9\u6846\u7C7B\u578B\r\n                color: '#000',  //\u8FB9\u6846\u989C\u8272\r\n            }\r\n        },\r\n        images: null,\r\n        currentImgId: null,\r\n        currentWinW: null,\r\n        currentWinH: null,\r\n        resize: null,  \r\n        resizeXY: null,\r\n        move: false,\r\n        moveXY: null,\r\n        cropChange: null,  \r\n        cropChangeXY: null,\r\n        cropChangeObj: null,\r\n        copyImgItemObj: null,\r\n    },\r\n    defaultDataVerification:{\r\n        defaultItem: {\r\n            type: 'dropdown',  //\u7C7B\u578B\r\n            type2: null,  //\r\n            value1: '',  //\r\n            value2: '',  //\r\n            checked: false,\r\n            remote: false,  //\u81EA\u52A8\u8FDC\u7A0B\u83B7\u53D6\u9009\u9879\r\n            prohibitInput: false,  //\u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165\r\n            hintShow: false,  //\u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED\r\n            hintText: '',  //\r\n        },\r\n        curItem: null,\r\n        dataVerification: null,\r\n        selectRange: [],\r\n        selectStatus: false,\r\n    }\r\n}\r\n\r\nconst method = {\r\n    //\u7FFB\u9875\r\n    addDataAjax: function(param, index, url, func){\r\n        let _this = this;\r\n\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if(url == null){\r\n            url = server.loadSheetUrl;\r\n        }\r\n\r\n        $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n        param.currentPage++;\r\n        \r\n        let dataType = 'application/json;charset=UTF-8';\r\n        let token = sessionStorage.getItem('x-auth-token');\r\n\r\n        $.ajax({\r\n            method: 'POST',\r\n            url: url,\r\n            headers: { \"x-auth-token\": token },\r\n            data: JSON.stringify(param),\r\n            contentType: dataType,\r\n            success: function(d) {\r\n                //d\u53EF\u80FD\u4E3Ajson\u5B57\u7B26\u4E32\r\n                if(typeof d == \"string\"){\r\n                    d = JSON.parse(d);\r\n                }\r\n\r\n                let dataset = d.data;\r\n                \r\n                let newData = dataset.celldata;\r\n                luckysheetextendData(dataset[\"row\"], newData);\r\n\r\n                setTimeout(function(){\r\n                    Store.loadingObj.close()\r\n                }, 500);\r\n\r\n                if(func && typeof(func)==\"function\"){ \r\n                    func(dataset);\r\n                }\r\n            }\r\n        })\r\n    },\r\n    //\u91CD\u8F7D\r\n    reload: function(param, index, url, func){\r\n        let _this = this;\r\n\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if(url == null){\r\n            url = server.loadSheetUrl;\r\n        }\r\n\r\n        $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n\r\n        let arg = {\"gridKey\" : server.gridKey, \"index\": index};\r\n        param = $.extend(true, param, arg);\r\n        let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n        $.post(url, param, function (d) {\r\n            let dataset = new Function(\"return \" + d)();\r\n            file.celldata = dataset[index.toString()];\r\n            let data = sheetmanage.buildGridData(file);\r\n\r\n            setTimeout(function(){\r\n                Store.loadingObj.close()\r\n            }, 500);\r\n\r\n            file[\"data\"] = data;\r\n            Store.flowdata = data;\r\n            editor.webWorkerFlowDataCache(data);//worker\u5B58\u6570\u636E\r\n\r\n            luckysheetcreatesheet(data[0].length, data.length, data, null, false);\r\n            file[\"load\"] = \"1\";\r\n\r\n            Store.luckysheet_select_save.length = 0;\r\n            Store.luckysheet_selection_range = [];\r\n\r\n            server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n\r\n            sheetmanage.changeSheet(index);\r\n\r\n            if(func && typeof(func)==\"function\"){ \r\n                func();\r\n            }\r\n        });\r\n    },\r\n    clearSheetByIndex: function(i){\r\n        let index = getSheetIndex(i);\r\n        let sheetfile = Store.luckysheetfile[index];\r\n\r\n        if(!sheetfile.isPivotTable){\r\n            sheetfile.data = [];\r\n            sheetfile.row = Store.defaultrowNum;\r\n            sheetfile.column = Store.defaultcolumnNum;\r\n\r\n            sheetfile.chart = [];\r\n            sheetfile.config = null;\r\n            sheetfile.filter = null;\r\n            sheetfile.filter_select = null;\r\n            sheetfile.celldata = [];\r\n            sheetfile.pivotTable = {};\r\n            sheetfile.calcChain = [];\r\n            sheetfile.status = 0;\r\n            sheetfile.load = 0;\r\n\r\n            Store.flowdata = [];\r\n            editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n            $(\"#\"+ Store.container +\" .luckysheet-data-visualization-chart\").remove();\r\n            $(\"#\"+ Store.container +\" .luckysheet-datavisual-selection-set\").remove();\r\n\r\n            $(\"#luckysheet-row-count-show, #luckysheet-formula-functionrange-select, #luckysheet-row-count-show, #luckysheet-column-count-show, #luckysheet-change-size-line, #luckysheet-cell-selected-focus, #luckysheet-selection-copy, #luckysheet-cell-selected-extend, #luckysheet-cell-selected-move, #luckysheet-cell-selected\").hide();\r\n\r\n            delete sheetfile.load;\r\n        }\r\n        else {\r\n            delete Store.luckysheetfile[index];\r\n        }\r\n    },\r\n    clear: function(index){\r\n        let _this = this;\r\n\r\n        if(index == \"all\"){\r\n            for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n                let sheetfile = Store.luckysheetfile[i];\r\n                _this.clearSheetByIndex(sheetfile.index);\r\n            }\r\n            \r\n        }\r\n        else{\r\n            if(index == null){\r\n                index = Store.currentSheetIndex;\r\n            }\r\n            _this.clearSheetByIndex(index);\r\n        }\r\n\r\n        sheetmanage.changeSheet(Store.luckysheetfile[0].index);\r\n    },\r\n    destroy:function(){\r\n        $(\"#\" + Store.container).empty();\r\n        $(\"body > .luckysheet-cols-menu\").remove();\r\n\r\n        $(\"#luckysheet-modal-dialog-mask, #luckysheetTextSizeTest, #luckysheet-icon-morebtn-div\").remove();\r\n        $(\"#luckysheet-input-box\").parent().remove();\r\n        $(\"#luckysheet-formula-help-c\").remove();\r\n        $(\".chartSetting, .luckysheet-modal-dialog-slider\").remove();\r\n\r\n        //document event release\r\n        $(document).off(\".luckysheetEvent\");\r\n        $(document).off(\".luckysheetProtection\");\r\n        \r\n        //\u53C2\u6570\u91CD\u7F6E\r\n        luckysheetFreezen.initialHorizontal = true;\r\n        luckysheetFreezen.initialVertical = true;\r\n\r\n        let defaultStore = $.extend(true, {}, defaultConfig.defaultStore);\r\n        for(let key in defaultStore){\r\n            if(key in Store){\r\n                Store[key] = defaultStore[key];\r\n            }\r\n        }\r\n\r\n        let defaultFormula = $.extend(true, {}, defaultConfig.defaultFormula);\r\n        for(let key in defaultFormula){\r\n            if(key in luckysheetformula){\r\n                luckysheetformula[key] = defaultFormula[key];\r\n            }\r\n        }\r\n\r\n        let defaultSheet = $.extend(true, {}, defaultConfig.defaultSheet);\r\n        for(let key in defaultSheet){\r\n            if(key in sheetmanage){\r\n                sheetmanage[key] = defaultSheet[key];\r\n            }\r\n        }\r\n\r\n        let defaultPivotTable = $.extend(true, {}, defaultConfig.defaultPivotTable);\r\n        for(let key in defaultPivotTable){\r\n            if(key in pivotTable){\r\n                pivotTable[key] = defaultPivotTable[key];\r\n            }\r\n        }\r\n\r\n        let defaultImage = $.extend(true, {}, defaultConfig.defaultImage);\r\n        for(let key in defaultImage){\r\n            if(key in imageCtrl){\r\n                imageCtrl[key] = defaultImage[key];\r\n            }\r\n        }\r\n\r\n        let defaultDataVerification = $.extend(true, {}, defaultConfig.defaultDataVerification);\r\n        for(let key in defaultDataVerification){\r\n            if(key in dataVerificationCtrl){\r\n                dataVerificationCtrl[key] = defaultDataVerification[key];\r\n            }\r\n        }\r\n\r\n        // remove proxy\r\n        Store.asyncLoad = ['core'];\r\n    },\r\n    editorChart:function(c){\r\n        let chart_selection_color = luckyColor[0];\r\n        let chart_id = \"luckysheetEditMode-datav-chart\";\r\n        let chart_selection_id = chart_id + \"_selection\";\r\n        c.chart_id = chart_id;\r\n        let chartTheme = c.chartTheme;\r\n        chartTheme = chartTheme == null ? \"default0000\" : chartTheme;\r\n\r\n        luckysheet.insertChartTosheet(c.sheetIndex, c.dataSheetIndex, c.option, c.chartType, c.selfOption, c.defaultOption, c.row, c.column, chart_selection_color, chart_id, chart_selection_id, c.chartStyle, c.rangeConfigCheck, c.rangeRowCheck, c.rangeColCheck, c.chartMarkConfig, c.chartTitleConfig, c.winWidth, c.winHeight, c.scrollLeft, c.scrollTop, chartTheme, c.myWidth, c.myHeight, c.myLeft!=null?parseFloat(c.myLeft):null, c.myTop!=null?parseFloat(c.myTop):null, c.myindexrank, true);\r\n\r\n        $(\"#\"+chart_id).find(\".luckysheet-modal-controll-update\").click();\r\n    },\r\n    /**\r\n     * \u83B7\u53D6\u5355\u5143\u683C\u7684\u503C\r\n     * @param {name} \u51FD\u6570\u540D\u79F0\r\n     * @param {arguments} \u51FD\u6570\u53C2\u6570\r\n     */\r\n    createHookFunction:function(){\r\n        let hookName = arguments[0];\r\n        if(luckysheetConfigsetting.hook && luckysheetConfigsetting.hook[hookName]!=null && (typeof luckysheetConfigsetting.hook[hookName] == \"function\")){\r\n            var args = Array.prototype.slice.apply(arguments);\r\n            args.shift();\r\n            let ret = luckysheetConfigsetting.hook[hookName].apply(this, args);\r\n            if(ret===false){\r\n                return false;\r\n            }\r\n            else{\r\n                return true;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n}\r\n\r\nexport default method;", "import { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport editor from '../global/editor';\r\nimport formula from '../global/formula';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { getObjType } from '../utils/util';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport server from './server';\r\nimport Store from '../store';\r\nimport method from '../global/method';\r\n\r\n//\u6279\u6CE8\r\nconst luckysheetPostil = {\r\n    defaultWidth: 144,\r\n    defaultHeight: 84,\r\n    currentObj: null,\r\n    currentWinW: null,\r\n    currentWinH: null,\r\n    resize: null,\r\n    resizeXY: null,\r\n    move: false,\r\n    moveXY: null,\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        //\u70B9\u51FB\u6279\u6CE8\u6846 \u805A\u7126\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.showPs\").on(\"mousedown.showPs\", \".luckysheet-postil-show\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).find(\".luckysheet-postil-show-main\");\r\n\r\n            if($(this).hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).addClass(\"luckysheet-postil-show-active\");\r\n            $(this).find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mouseup.showPs\").on(\"mouseup.showPs\", \".luckysheet-postil-show\", function(event){\r\n            if(event.which == \"3\"){\r\n                event.stopPropagation();\r\n            }\r\n        });\r\n\r\n        //\u6279\u6CE8\u6846 \u6539\u53D8\u5927\u5C0F\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.resize\").on(\"mousedown.resize\", \".luckysheet-postil-show .luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).closest(\".luckysheet-postil-show-main\");\r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.resize = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let position = _this.currentObj.position();\r\n            let width = _this.currentObj.width();\r\n            let height = _this.currentObj.height();\r\n\r\n            _this.resizeXY = [\r\n                x, \r\n                y, \r\n                width, \r\n                height, \r\n                position.left + scrollLeft, \r\n                position.top + scrollTop, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            if($(this).closest(\".luckysheet-postil-show\").hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).closest(\".luckysheet-postil-show\").addClass(\"luckysheet-postil-show-active\");\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n\r\n        //\u6279\u6CE8\u6846 \u79FB\u52A8\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.move\").on(\"mousedown.move\", \".luckysheet-postil-show .luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).closest(\".luckysheet-postil-show-main\");\r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.move = true;\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n            let offset = _this.currentObj.offset();\r\n            let position = _this.currentObj.position();\r\n\r\n            _this.moveXY = [\r\n                event.pageX - offset.left, \r\n                event.pageY - offset.top, \r\n                position.left, \r\n                position.top, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            if($(this).closest(\".luckysheet-postil-show\").hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).closest(\".luckysheet-postil-show\").addClass(\"luckysheet-postil-show-active\");\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n    },\r\n    overshow: function(event){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-postil-overshow\").remove();\r\n\r\n        if($(event.target).closest(\"#luckysheet-cell-main\").length == 0){\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0];\r\n        let y = mouse[1];\r\n        let offsetX = 0;\r\n        let offsetY = 0;\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            offsetX = scrollLeft;\r\n        } else {\r\n            x += scrollLeft;\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            offsetY = scrollTop;\r\n        } else {\r\n            y += scrollTop;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if(!!margeset){\r\n            row_index = margeset.row[2];\r\n            col_index = margeset.column[2];\r\n        }\r\n\r\n        if(Store.flowdata[row_index] == null || Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].ps == null){\r\n            return;\r\n        }\r\n\r\n        let postil = Store.flowdata[row_index][col_index].ps;\r\n\r\n        if(postil[\"isshow\"] || $(\"#luckysheet-postil-show_\"+ row_index +\"_\"+ col_index).length > 0){\r\n            return;\r\n        }\r\n\r\n        let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n        let row = Store.visibledatarow[row_index], \r\n            row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n        let col = Store.visibledatacolumn[col_index], \r\n            col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let toX = col + offsetX;\r\n        let toY = row_pre + offsetY;\r\n\r\n        let fromX = toX + 18 * Store.zoomRatio;\r\n        let fromY = toY - 18 * Store.zoomRatio;\r\n\r\n        if(fromY < 0){\r\n            fromY = 2;\r\n        }\r\n\r\n        let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n        let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n\r\n        let size = _this.getArrowCanvasSize(fromX, fromY, toX, toY);\r\n\r\n        let commentDivs = '';\r\n        let valueLines = value.split('\\n');\r\n        for (let line of valueLines) {\r\n            commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n        }\r\n\r\n        let html =  '<div id=\"luckysheet-postil-overshow\">' +\r\n                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                        '<div style=\"width:'+ (width - 12) +'px;min-height:'+ (height - 12) +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ fromX +'px;top:'+ fromY +'px;z-index:100;\">'+ commentDivs +'</div>' +\r\n                    '</div>';\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main\"));\r\n\r\n        let ctx = $(\"#luckysheet-postil-overshow .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n    },\r\n    getArrowCanvasSize: function(fromX, fromY, toX, toY){\r\n        let left = toX - 5;\r\n        \r\n        if(fromX < toX){\r\n            left = fromX - 5;\r\n        }\r\n\r\n        let top = toY - 5;\r\n        \r\n        if(fromY < toY){\r\n            top = fromY - 5;\r\n        }\r\n\r\n        let width = Math.abs(fromX - toX) + 10;\r\n        let height = Math.abs(fromY - toY) + 10;\r\n\r\n        let x1 = width - 5;\r\n        let x2 = 5;\r\n        \r\n        if(fromX < toX){\r\n            x1 = 5;\r\n            x2 = width - 5;\r\n        }\r\n\r\n        let y1 = height - 5;\r\n        let y2 = 5;\r\n\r\n        if(fromY < toY){\r\n            y1 = 5;\r\n            y2 = height - 5;\r\n        }\r\n\r\n        return [left, top, width, height, x1, y1, x2, y2];\r\n    },\r\n    drawArrow: function(ctx, fromX, fromY, toX, toY, theta, headlen, width, color){\r\n        theta = getObjType(theta) == \"undefined\" ? 30 : theta;\r\n        headlen = getObjType(headlen) == \"undefined\" ? 6 : headlen;\r\n        width = getObjType(width) == \"undefined\" ? 1 : width;\r\n        color = getObjType(color) == \"undefined\" ? \"#000\" : color;\r\n\r\n        // \u8BA1\u7B97\u5404\u89D2\u5EA6\u548C\u5BF9\u5E94\u7684P2,P3\u5750\u6807\r\n        let angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI, \r\n            angle1 = (angle + theta) * Math.PI / 180, \r\n            angle2 = (angle - theta) * Math.PI / 180, \r\n            topX = headlen * Math.cos(angle1), \r\n            topY = headlen * Math.sin(angle1), \r\n            botX = headlen * Math.cos(angle2), \r\n            botY = headlen * Math.sin(angle2);\r\n\r\n        ctx.save();\r\n        ctx.beginPath();\r\n\r\n        let arrowX = fromX - topX,\r\n            arrowY = fromY - topY;\r\n\r\n        ctx.moveTo(arrowX, arrowY); \r\n        ctx.moveTo(fromX, fromY); \r\n        ctx.lineTo(toX, toY); \r\n        \r\n        ctx.lineWidth = width;\r\n        ctx.strokeStyle = color; \r\n        ctx.stroke();\r\n\r\n        arrowX = toX + topX; \r\n        arrowY = toY + topY; \r\n        ctx.moveTo(arrowX, arrowY); \r\n        ctx.lineTo(toX, toY); \r\n        arrowX = toX + botX; \r\n        arrowY = toY + botY; \r\n        ctx.lineTo(arrowX, arrowY); \r\n        \r\n        ctx.fillStyle = color;\r\n        ctx.fill(); \r\n        ctx.restore();\r\n    },\r\n    buildAllPs: function(data){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\").empty();\r\n\r\n        for(let r = 0; r < data.length; r++){\r\n            for(let c = 0; c < data[0].length; c++){\r\n                if(data[r][c] != null && data[r][c].ps != null){\r\n                    let postil = data[r][c].ps;\r\n                    _this.buildPs(r, c, postil);\r\n                }\r\n            }\r\n        }\r\n\r\n        _this.init();\r\n    },\r\n    buildPs: function(r, c, postil){\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n\r\n        if(postil == null){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n        let isshow = postil[\"isshow\"] == null ? false : postil[\"isshow\"];\r\n\r\n        if(isshow){\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n        }\r\n    },\r\n    newPs: function(r, c){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        // Hook function\r\n        if(!method.createHookFunction('commentInsertBefore',r,c, )){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let row = Store.visibledatarow[r], \r\n            row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c], \r\n            col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let toX = col;\r\n        let toY = row_pre;\r\n\r\n        let fromX = toX + 18 * Store.zoomRatio;\r\n        let fromY = toY - 18 * Store.zoomRatio;\r\n\r\n        if(fromY < 0){\r\n            fromY = 2;\r\n        }\r\n\r\n        let width = _this.defaultWidth * Store.zoomRatio;\r\n        let height = _this.defaultHeight * Store.zoomRatio;\r\n\r\n        let size = _this.getArrowCanvasSize(fromX, fromY, toX, toY);\r\n\r\n        let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show luckysheet-postil-show-active\">' +\r\n                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                        '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ fromX +'px;top:'+ fromY +'px;box-sizing:border-box;z-index:100;\">' +\r\n                            '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                            '</div>' +\r\n                            '<div class=\"luckysheet-postil-dialog-resize\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                            '</div>' +\r\n                            '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                '<div class=\"formulaInputFocus\" style=\"width:132px;height:72px;line-height:20px;box-sizing:border-box;text-align: center;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>' +\r\n                    '</div>';\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n        let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n        $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").focus();\r\n\r\n        _this.init();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        if(d[r][c] == null){\r\n            d[r][c] = {};\r\n        }\r\n\r\n        d[r][c].ps = { \"left\": null, \"top\": null, \"width\": null, \"height\": null, \"value\": \"\", \"isshow\": false };\r\n        rc.push(r + \"_\" + c);\r\n\r\n        _this.ref(d, rc);\r\n\r\n        // Hook function\r\n        setTimeout(() => {\r\n            method.createHookFunction('commentInsertAfter',r,c, d[r][c])\r\n        }, 0);\r\n    },\r\n    editPs: function(r, c){\r\n        let _this = this;\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).show();\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).addClass(\"luckysheet-postil-show-active\");\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).find(\".luckysheet-postil-dialog-resize\").show();\r\n        }\r\n        else{\r\n            let postil = Store.flowdata[r][c].ps;\r\n\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show luckysheet-postil-show-active\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n        }\r\n\r\n        $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").focus();\r\n        luckysheetRangeLast($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").get(0));\r\n\r\n        _this.init();\r\n    },\r\n    delPs: function(r, c){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        // Hook function\r\n        if(!method.createHookFunction('commentDeleteBefore',r,c,Store.flowdata[r][c])){\r\n            return;\r\n        }\r\n\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        delete d[r][c].ps;\r\n        rc.push(r + \"_\" + c);\r\n\r\n        this.ref(d, rc);\r\n\r\n        // Hook function\r\n        setTimeout(() => {\r\n            method.createHookFunction('commentDeleteAfter',r,c, Store.flowdata[r][c])\r\n        }, 0);\r\n    },\r\n    showHidePs: function(r, c){\r\n        let _this = this;\r\n\r\n        let postil = Store.flowdata[r][c].ps;\r\n        let isshow = postil[\"isshow\"];\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        if(isshow){\r\n            d[r][c].ps.isshow = false;\r\n\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n        else{\r\n            d[r][c].ps.isshow = true;\r\n\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            if(luckysheetFreezen.freezenverticaldata != null && toX < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n                toX += scrollLeft;\r\n            }\r\n            if(luckysheetFreezen.freezenhorizontaldata != null && toY < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n                toY += scrollTop;\r\n            }\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n            _this.init();\r\n        }\r\n\r\n        rc.push(r + \"_\" + c);\r\n\r\n        _this.ref(d, rc);\r\n    },\r\n    showHideAllPs: function(){\r\n        let _this = this;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        let isAllShow = true;\r\n        let allPs = [];\r\n\r\n        for(let r = 0; r < d.length; r++){\r\n            for(let c = 0; c < d[0].length; c++){\r\n                if(d[r] != null && d[r][c] != null && d[r][c].ps != null){\r\n                    allPs.push(r + \"_\" + c);\r\n\r\n                    if(!d[r][c].ps.isshow){\r\n                        isAllShow = false;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let rc = [];\r\n        if(allPs.length > 0){\r\n            if(isAllShow){ //\u5168\u90E8\u663E\u793A\uFF0C\u64CD\u4F5C\u4E3A\u9690\u85CF\u6240\u6709\u6279\u6CE8\r\n                $(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\").empty();\r\n\r\n                for(let i = 0; i < allPs.length; i++){\r\n                    let rowIndex = allPs[i].split(\"_\")[0];\r\n                    let colIndex = allPs[i].split(\"_\")[1];\r\n\r\n                    let postil = d[rowIndex][colIndex].ps;\r\n\r\n                    if(postil[\"isshow\"]){\r\n                        d[rowIndex][colIndex].ps.isshow = false;\r\n                        rc.push(allPs[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{ //\u90E8\u5206\u663E\u793A\u6216\u5168\u90E8\u9690\u85CF\uFF0C\u64CD\u4F5C\u4F4D\u663E\u793A\u6240\u6709\u6279\u6CE8\r\n                for(let i = 0; i < allPs.length; i++){\r\n                    let rowIndex = allPs[i].split(\"_\")[0];\r\n                    let colIndex = allPs[i].split(\"_\")[1];\r\n\r\n                    let postil = d[rowIndex][colIndex].ps;\r\n\r\n                    if(!postil[\"isshow\"]){\r\n                        let row = Store.visibledatarow[rowIndex], \r\n                            row_pre = rowIndex - 1 == -1 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n                        let col = Store.visibledatacolumn[colIndex], \r\n                            col_pre = colIndex - 1 == -1 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n\r\n                        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex);\r\n                        if(!!margeset){\r\n                            row = margeset.row[1];\r\n                            row_pre = margeset.row[0];\r\n                            \r\n                            col = margeset.column[1];\r\n                            col_pre = margeset.column[0];\r\n                        }\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            \r\n                        let toX = col;\r\n                        let toY = row_pre;\r\n            \r\n                        if(luckysheetFreezen.freezenverticaldata != null && toX < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n                            toX += scrollLeft;\r\n                        }\r\n                        if(luckysheetFreezen.freezenhorizontaldata != null && toY < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n                            toY += scrollTop;\r\n                        }\r\n\r\n                        let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n                        let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n                        let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n                        let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n                        let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n                        if(top < 0){\r\n                            top = 2;\r\n                        }\r\n\r\n                        let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n                        let commentDivs = '';\r\n                        let valueLines = value.split('\\n');\r\n                        for (let line of valueLines) {\r\n                            commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n                        }\r\n\r\n                        let html =  '<div id=\"luckysheet-postil-show_'+ rowIndex +'_'+ colIndex +'\" class=\"luckysheet-postil-show\">' +\r\n                                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                                        '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                            '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                            '</div>' +\r\n                                            '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                                '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                                    commentDivs +\r\n                                                '</div>' +\r\n                                            '</div>' +\r\n                                        '</div>' +\r\n                                    '</div>';\r\n\r\n                        $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n                        let ctx = $(\"#luckysheet-postil-show_\"+ rowIndex +\"_\"+ colIndex +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n                        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n                        d[rowIndex][colIndex].ps.isshow = true;\r\n                        rc.push(allPs[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        _this.ref(d, rc);\r\n        _this.init();\r\n    },\r\n    removeActivePs: function(){\r\n        if($(\"#luckysheet-postil-showBoxs .luckysheet-postil-show-active\").length > 0){\r\n            \r\n\r\n            let id = $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show-active\").attr(\"id\");\r\n            let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            // interpret <div> as new line\r\n            let value = $(\"#\" + id).find(\".formulaInputFocus\").html().replaceAll('<div>', '\\n').replaceAll(/<(.*)>.*?|<(.*) \\/>/g, '').trim();\r\n            // Hook function\r\n            if(!method.createHookFunction('commentUpdateBefore',r,c,value)){\r\n                if (!Store.flowdata[r][c].ps.isshow) {\r\n                    $(\"#\" + id).remove();\r\n                }\r\n                return;\r\n            }\r\n\r\n            const previousCell = $.extend(true,{},Store.flowdata[r][c]);\r\n\r\n            $(\"#\" + id).removeClass(\"luckysheet-postil-show-active\");\r\n            $(\"#\" + id).find(\".luckysheet-postil-dialog-resize\").hide();\r\n            $(\"#\" + id).find(\".arrowCanvas\").css(\"z-index\", 100);\r\n            $(\"#\" + id).find(\".luckysheet-postil-show-main\").css(\"z-index\", 100);\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[r][c].ps.value = value;\r\n            rc.push(r + \"_\" + c);\r\n\r\n            this.ref(d, rc);\r\n\r\n            if(!d[r][c].ps.isshow){\r\n                $(\"#\" + id).remove();\r\n            }\r\n            // Hook function\r\n            setTimeout(() => {\r\n                method.createHookFunction('commentUpdateAfter',r,c, previousCell, d[r][c])\r\n            }, 0);\r\n        }\r\n    },\r\n    ref: function(data, rc){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            \r\n            Store.jfredo.push({ \r\n                \"type\": \"postil\", \r\n                \"data\": Store.flowdata, \r\n                \"curdata\": data, \r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"rc\": rc \r\n            });\r\n        }\r\n\r\n        //flowdata\r\n        Store.flowdata = data;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n        // formula.execFunctionGroupData = Store.flowdata;\r\n\r\n        //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n        if(server.allowUpdate){\r\n            for(let i = 0; i < rc.length; i++){\r\n                let r = rc[i].split(\"_\")[0];\r\n                let c = rc[i].split(\"_\")[1];\r\n\r\n                server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[r][c], { \"r\": r, \"c\": c });\r\n            }\r\n        }\r\n        \r\n        //\u5237\u65B0\u8868\u683C\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n    positionSync: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n            let id = $(e).attr(\"id\");\r\n\r\n            let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let cell = Store.flowdata[r][c];\r\n            \r\n            if(cell != null && cell.ps != null){\r\n                _this.buildPs(r, c, cell.ps);\r\n            }\r\n            else{\r\n                $(\"#\" + id).hide();\r\n            }\r\n        });\r\n    },\r\n    htmlEscape: function(text){\r\n        return text.replace(/[<>\"&]/g, function(match, pos, originalText){\r\n            console.log(match, pos, originalText)\r\n            switch(match){\r\n                case '<': {\r\n                    return '&lt';\r\n                }\r\n                case '>': {\r\n                    return '&gt';\r\n                }\r\n                case '&': {\r\n                    return '&amp';\r\n                }\r\n                case '\\\"': {\r\n                    return '&quot;';\r\n                }\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default luckysheetPostil;", "import { getSheetIndex } from '../methods/get';\r\nimport { getObjType } from '../utils/util';\r\nimport Store from '../store';\r\n\r\n//\u83B7\u53D6\u8868\u683C\u8FB9\u6846\u6570\u636E\u8BA1\u7B97\u503C\r\nfunction getBorderInfoComputeRange(dataset_row_st,dataset_row_ed,dataset_col_st,dataset_col_ed,sheetIndex) {\r\n    let borderInfoCompute = {};\r\n\r\n    let cfg, data; \r\n    if(sheetIndex == null){\r\n        cfg = Store.config;\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)].config;\r\n        data = Store.luckysheetfile[getSheetIndex(sheetIndex)].data;\r\n    }\r\n\r\n    let borderInfo = cfg[\"borderInfo\"];\r\n\r\n    if(borderInfo != null && borderInfo.length > 0){\r\n        for(let i = 0; i < borderInfo.length; i++){\r\n            let rangeType = borderInfo[i].rangeType;\r\n\r\n            if(rangeType == \"range\"){\r\n                let borderType = borderInfo[i].borderType;\r\n                let borderColor = borderInfo[i].color;\r\n                let borderStyle = borderInfo[i].style;\r\n\r\n                let borderRange = borderInfo[i].range;\r\n\r\n                for(let j = 0; j < borderRange.length; j++){\r\n                    let bd_r1 = borderRange[j].row[0], bd_r2 = borderRange[j].row[1];\r\n                    let bd_c1 = borderRange[j].column[0], bd_c2 = borderRange[j].column[1];\r\n\r\n                    if(bd_r1<dataset_row_st){\r\n                        bd_r1 = dataset_row_st;\r\n                    }\r\n\r\n                    if(bd_r2>dataset_row_ed){\r\n                        bd_r2 = dataset_row_ed;\r\n                    }\r\n\r\n                    if(bd_c1<dataset_col_st){\r\n                        bd_c1 = dataset_col_st;\r\n                    }\r\n\r\n                    if(bd_c2>dataset_col_ed){\r\n                        bd_c2 = dataset_col_ed;\r\n                    }\r\n\r\n                    if(borderType == \"border-left\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n                            \r\n                            if(borderInfoCompute[bd_r + \"_\" + bd_c1] == null){\r\n                                borderInfoCompute[bd_r + \"_\" + bd_c1] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c1].l = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_c_left = bd_c1 - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_c1 <= c + cs - 1 && bd_c1 > c && bd_r >= r && bd_r <= r + rs -1){\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c1].l = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-right\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n                            \r\n                            if(borderInfoCompute[bd_r + \"_\" + bd_c2] == null){\r\n                                borderInfoCompute[bd_r + \"_\" + bd_c2] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c2].r = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_c_right = bd_c2 + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_c2 < c + cs - 1 && bd_c2 >= c && bd_r >= r && bd_r <= r + rs -1){\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c2].r = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-top\"){\r\n                        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r1] != null) {\r\n                            continue;\r\n                        }\r\n\r\n                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                            if(borderInfoCompute[bd_r1 + \"_\" + bd_c] == null){\r\n                                borderInfoCompute[bd_r1 + \"_\" + bd_c] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r1 + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_r_top = bd_r1 - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_r1 <= r + rs - 1 && bd_r1 > r && bd_c >= c && bd_c <= c + cs -1){\r\n                                    borderInfoCompute[bd_r1 + \"_\" + bd_c].t = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-bottom\"){\r\n                        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r2] != null) {\r\n                            continue;\r\n                        }\r\n\r\n                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                            if(borderInfoCompute[bd_r2 + \"_\" + bd_c] == null){\r\n                                borderInfoCompute[bd_r2 + \"_\" + bd_c] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r2 + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_r_bottom = bd_r2 + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_r2 < r + rs - 1 && bd_r2 >= r && bd_c >= c && bd_c <= c + cs -1){\r\n                                    borderInfoCompute[bd_r2 + \"_\" + bd_c].b = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-all\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                    let cell = data[bd_r][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                    if(mc.r == bd_r){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                    \r\n                                    if(mc.r + mc.rs - 1 == bd_r){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n\r\n                                    if(mc.c == bd_c){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                    \r\n                                    if(mc.c + mc.cs - 1 == bd_c){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                            let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                            if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                                borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_r == bd_r2){\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                            let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                            if(mc.r == bd_r_bottom){\r\n                                                borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c1){\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                            let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                            if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c2){\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                            let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                            if(mc.c == bd_c_right){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-outside\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(!(bd_r == bd_r1 || bd_r == bd_r2 || bd_c == bd_c1 || bd_c == bd_c2)){\r\n                                    continue;\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                            let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                            if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                                borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_r == bd_r2){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                            let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                            if(mc.r == bd_r_bottom){\r\n                                                borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_c == bd_c1){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                            let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                            if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_c == bd_c2){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                            let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                            if(mc.c == bd_c_right){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-inside\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_r == bd_r1 && bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2 && bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r1 && bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2 && bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }    \r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-horizontal\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_r == bd_r1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-vertical\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c] || {};\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-none\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(borderInfoCompute[bd_r + \"_\" + bd_c] != null){\r\n                                    delete borderInfoCompute[bd_r + \"_\" + bd_c];\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        delete borderInfoCompute[bd_r_top + \"_\" + bd_c].b;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_r == bd_r2){\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        delete borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c1){\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        delete borderInfoCompute[bd_r + \"_\" + bd_c_left].r;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c2){\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        delete borderInfoCompute[bd_r + \"_\" + bd_c_right].l;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else if(rangeType == \"cell\"){\r\n                let value = borderInfo[i].value;\r\n\r\n                let bd_r = value.row_index, bd_c = value.col_index;\r\n\r\n                if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){\r\n                    continue;\r\n                }\r\n\r\n                if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if(value.l != null || value.r != null || value.t != null || value.b != null){\r\n                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                    }\r\n\r\n                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                        let cell = data[bd_r][bd_c];\r\n                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c] || {};\r\n\r\n                        if(value.l != null && bd_c == mc.c){ //\u5DE6\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": value.l.color, \"style\": value.l.style };\r\n\r\n                            let bd_c_left = bd_c - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc_l = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = null;\r\n                        }\r\n\r\n                        if(value.r != null && bd_c == mc.c + mc.cs - 1){ //\u53F3\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": value.r.color, \"style\": value.r.style };\r\n\r\n                            let bd_c_right = bd_c + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc_r = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc_r.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = null;\r\n                        }\r\n\r\n                        if(value.t != null && bd_r == mc.r){ //\u4E0A\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": value.t.color, \"style\": value.t.style };\r\n\r\n                            let bd_r_top = bd_r - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc_t = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = null;\r\n                        }\r\n\r\n                        if(value.b != null && bd_r == mc.r + mc.rs - 1){ //\u4E0B\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": value.b.color, \"style\": value.b.style };\r\n\r\n                            let bd_r_bottom = bd_r + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n                                    \r\n                                    let mc_b = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc_b.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = null;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(value.l != null){ //\u5DE6\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": value.l.color, \"style\": value.l.style };\r\n\r\n                            let bd_c_left = bd_c - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc_l = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = null;\r\n                        }\r\n\r\n                        if(value.r != null){ //\u53F3\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": value.r.color, \"style\": value.r.style };\r\n\r\n                            let bd_c_right = bd_c + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc_r = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc_r.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = null;\r\n                        }\r\n\r\n                        if(value.t != null){ //\u4E0A\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": value.t.color, \"style\": value.t.style };\r\n\r\n                            let bd_r_top = bd_r - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc_t = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = null;\r\n                        }\r\n\r\n                        if(value.b != null){ //\u4E0B\u8FB9\u6846\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": value.b.color, \"style\": value.b.style };\r\n\r\n                            let bd_r_bottom = bd_r + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n                                    \r\n                                    let mc_b = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc_b.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = null;\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    delete borderInfoCompute[bd_r + \"_\" + bd_c];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return borderInfoCompute;\r\n}\r\n\r\nfunction getBorderInfoCompute(sheetIndex) {\r\n    let borderInfoCompute = {};\r\n\r\n    let cfg, data; \r\n    if(sheetIndex == null){\r\n        cfg = Store.config;\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)].config;\r\n        data = Store.luckysheetfile[getSheetIndex(sheetIndex)].data;\r\n    }\r\n\r\n    borderInfoCompute = getBorderInfoComputeRange(0, data.length,0, data[0].length, sheetIndex);\r\n\r\n    return borderInfoCompute;\r\n}\r\n\r\nexport {\r\n    getBorderInfoCompute,\r\n    getBorderInfoComputeRange\r\n}", "import { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport { countfunc } from '../global/count';\r\nimport { getBorderInfoCompute } from '../global/border';\r\nimport { isRealNum } from '../global/validate';\r\nimport { genarate, update } from '../global/format';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport editor from '../global/editor';\r\nimport formula from '../global/formula';\r\nimport conditionformat from './conditionformat';\r\nimport {checkProtectionLockedRangeList} from './protection';\r\nimport { selectHightlightShow } from './select';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { getObjType, replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport dayjs from 'dayjs'\r\n\r\n//\u9009\u533A\u4E0B\u62C9\r\nconst luckysheetDropCell = {\r\n    iconHtml: '<div id=\"luckysheet-dropCell-icon\" style=\"position: absolute;padding: 2px;background-color: #f1f1f1;z-index: 990;cursor: pointer;\">'+\r\n                '<div id=\"icon_dropCell\"></div>'+\r\n              '</div>',\r\n    typeListHtml: '<div id=\"luckysheet-dropCell-typeList\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\">'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"0\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${copyCell}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"1\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${sequence}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"2\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${onlyFormat}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"3\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${noFormat}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"4\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${day}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"5\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${workDay}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"6\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${month}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"7\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${year}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"8\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${chineseNumber}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                  '</div>',\r\n    copyRange: {}, //\u590D\u5236\u8303\u56F4\r\n    applyRange: {}, //\u5E94\u7528\u8303\u56F4\r\n    applyType: null, //0\u590D\u5236\u5355\u5143\u683C\uFF0C1\u586B\u5145\u5E8F\u5217\uFF0C2\u4EC5\u586B\u5145\u683C\u5F0F\uFF0C3\u4E0D\u5E26\u683C\u5F0F\u586B\u5145\uFF0C4\u4EE5\u5929\u6570\u586B\u5145\uFF0C5\u4EE5\u5DE5\u4F5C\u65E5\u586B\u5145\uFF0C6\u4EE5\u6708\u586B\u5145\uFF0C7\u4EE5\u5E74\u586B\u5145\uFF0C8\u4EE5\u4E2D\u6587\u5C0F\u5199\u6570\u5B57\u5E8F\u5217\u586B\u5145\r\n    direction: null, //down-\u5F80\u4E0B\u62D6\u62FD\uFF0Cright-\u5F80\u53F3\u62D6\u62FD\uFF0Cup-\u5F80\u4E0A\u62D6\u62FD\uFF0Cleft-\u5F80\u5DE6\u62D6\u62FD\r\n    chnNumChar: {\"\u96F6\": 0, \"\u4E00\": 1, \"\u4E8C\": 2, \"\u4E09\": 3, \"\u56DB\": 4, \"\u4E94\": 5, \"\u516D\": 6, \"\u4E03\": 7, \"\u516B\": 8, \"\u4E5D\": 9},\r\n    chnNameValue: {\r\n        \"\u5341\": {value: 10, secUnit: false},\r\n        \"\u767E\": {value: 100, secUnit: false},\r\n        \"\u5343\": {value: 1000, secUnit: false},\r\n        \"\u4E07\": {value: 10000, secUnit: true},\r\n        \"\u4EBF\": {value: 100000000, secUnit: true}\r\n    },\r\n    ChineseToNumber: function(chnStr){\r\n        let _this = this;\r\n\r\n        let rtn = 0;\r\n        let section = 0;\r\n        let number = 0;\r\n        let secUnit = false;\r\n        let str = chnStr.split(\"\");\r\n\r\n        for(let i = 0; i < str.length; i++){\r\n            let num = _this.chnNumChar[str[i]];\r\n\r\n            if(typeof num != \"undefined\"){\r\n                number = num;\r\n\r\n                if(i == str.length - 1){\r\n                    section += number;\r\n                }\r\n            }\r\n            else{\r\n                let unit = _this.chnNameValue[str[i]].value;\r\n                secUnit = _this.chnNameValue[str[i]].secUnit;\r\n\r\n                if(secUnit){\r\n                    section = (section + number) * unit;\r\n                    rtn += section;\r\n                    section = 0;\r\n                }\r\n                else{\r\n                    section += (number * unit);\r\n                }\r\n\r\n                number = 0;\r\n            }\r\n        }\r\n\r\n        return rtn + section;\r\n    },\r\n    chnNumChar2: [\"\u96F6\", \"\u4E00\", \"\u4E8C\", \"\u4E09\", \"\u56DB\", \"\u4E94\", \"\u516D\", \"\u4E03\", \"\u516B\", \"\u4E5D\"],\r\n    chnUnitSection: [\"\", \"\u4E07\", \"\u4EBF\", \"\u4E07\u4EBF\", \"\u4EBF\u4EBF\"],\r\n    chnUnitChar: [\"\", \"\u5341\", \"\u767E\", \"\u5343\"],\r\n    SectionToChinese: function(section){\r\n        let _this = this;\r\n\r\n        let strIns = '', chnStr = '';\r\n        let unitPos = 0;\r\n        let zero = true;\r\n\r\n        while(section > 0){\r\n            let v = section % 10;\r\n\r\n            if(v == 0){\r\n                if(!zero){\r\n                    zero = true;\r\n                    chnStr = _this.chnNumChar2[v] + chnStr;\r\n                }\r\n            }\r\n            else{\r\n                zero = false;\r\n                strIns = _this.chnNumChar2[v];\r\n                strIns += _this.chnUnitChar[unitPos];\r\n                chnStr = strIns + chnStr;\r\n            }\r\n\r\n            unitPos++;\r\n            section = Math.floor(section / 10);\r\n        }\r\n\r\n        return chnStr;\r\n    },\r\n    NumberToChinese: function(num){\r\n        let _this = this;\r\n\r\n        let unitPos = 0;\r\n        let strIns = '', chnStr = '';\r\n        let needZero = false;\r\n\r\n        if(num == 0){\r\n            return _this.chnNumChar2[0];\r\n        }\r\n        while(num > 0){\r\n            let section = num % 10000;\r\n\r\n            if(needZero){\r\n                chnStr = _this.chnNumChar2[0] + chnStr;\r\n            }\r\n\r\n            strIns = _this.SectionToChinese(section);\r\n            strIns += (section != 0) ? _this.chnUnitSection[unitPos] : _this.chnUnitSection[0];\r\n            chnStr = strIns + chnStr;\r\n            needZero = (section < 1000) && (section > 0);\r\n            num = Math.floor(num / 10000);\r\n            unitPos++;\r\n        }\r\n\r\n        return chnStr;\r\n    },\r\n    isChnNumber: function(txt){\r\n        let _this = this;\r\n\r\n        let isChnNumber = true;\r\n\r\n        if(txt.length == 1){\r\n            if(txt == \"\u65E5\" || (txt in _this.chnNumChar)){\r\n                isChnNumber = true;\r\n            }\r\n            else{\r\n                isChnNumber = false;\r\n            }\r\n        }\r\n        else{\r\n            let str = txt.split(\"\");\r\n            for(let i = 0; i < str.length; i++){\r\n                if(!((str[i] in _this.chnNumChar) || (str[i] in _this.chnNameValue))){\r\n                    isChnNumber = false;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        return isChnNumber;\r\n    },\r\n    isExtendNumber: function(txt){\r\n        let reg = /0|([1-9]+[0-9]*)/g;\r\n        let isExtendNumber = reg.test(txt);\r\n\r\n        if(isExtendNumber){\r\n            let match = txt.match(reg);\r\n            let matchTxt = match[match.length - 1];\r\n            let matchIndex = txt.lastIndexOf(matchTxt);\r\n            let beforeTxt = txt.substr(0, matchIndex);\r\n            let afterTxt = txt.substr(matchIndex + matchTxt.length);\r\n\r\n            return [isExtendNumber, Number(matchTxt), beforeTxt, afterTxt];\r\n        }\r\n        else {\r\n            return [isExtendNumber]\r\n        }\r\n    },\r\n    isChnWeek1: function(txt){\r\n        let _this = this;\r\n\r\n        let isChnWeek1;\r\n        if(txt.length == 1){\r\n            if(txt == \"\u65E5\" || _this.ChineseToNumber(txt) < 7){\r\n                isChnWeek1 = true;\r\n            }\r\n            else{\r\n                isChnWeek1 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek1 = false;\r\n        }\r\n\r\n        return isChnWeek1;\r\n    },\r\n    isChnWeek2: function(txt){\r\n        let isChnWeek2;\r\n        if(txt.length == 2){\r\n            if(txt == \"\u5468\u4E00\" || txt == \"\u5468\u4E8C\" || txt == \"\u5468\u4E09\" || txt == \"\u5468\u56DB\" || txt == \"\u5468\u4E94\" || txt == \"\u5468\u516D\" || txt == \"\u5468\u65E5\"){\r\n                isChnWeek2 = true;\r\n            }\r\n            else{\r\n                isChnWeek2 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek2 = false;\r\n        }\r\n\r\n        return isChnWeek2;\r\n    },\r\n    isChnWeek3: function(txt){\r\n        let isChnWeek3;\r\n        if(txt.length == 3){\r\n            if(txt == \"\u661F\u671F\u4E00\" || txt == \"\u661F\u671F\u4E8C\" || txt == \"\u661F\u671F\u4E09\" || txt == \"\u661F\u671F\u56DB\" || txt == \"\u661F\u671F\u4E94\" || txt == \"\u661F\u671F\u516D\" || txt == \"\u661F\u671F\u65E5\"){\r\n                isChnWeek3 = true;\r\n            }\r\n            else{\r\n                isChnWeek3 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek3 = false;\r\n        }\r\n\r\n        return isChnWeek3;\r\n    },\r\n    createIcon: function(){\r\n        let _this = this;\r\n\r\n        let copy_r = _this.copyRange[\"row\"][1],\r\n            copy_c = _this.copyRange[\"column\"][1];\r\n        let apply_r = _this.applyRange[\"row\"][1],\r\n            apply_c = _this.applyRange[\"column\"][1];\r\n\r\n        let row_index, col_index;\r\n        if(apply_r >= copy_r && apply_c >= copy_c){\r\n            row_index = apply_r;\r\n            col_index = apply_c;\r\n        }\r\n        else{\r\n            row_index = copy_r;\r\n            col_index = copy_c;\r\n        }\r\n\r\n        let row = rowLocationByIndex(row_index)[1],\r\n            row_pre = rowLocationByIndex(row_index)[0];\r\n        let col = colLocationByIndex(col_index)[1],\r\n            col_pre = colLocationByIndex(col_index)[0];\r\n\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n        $(\"#luckysheet-cell-main\").append(_this.iconHtml);\r\n        $(\"#luckysheet-dropCell-icon\").css({\"left\": col, \"top\": row});\r\n\r\n        //\u70B9\u51FBicon\r\n        $(\"#luckysheet-dropCell-icon\").mouseover(function(){\r\n            $(this).css(\"background-color\", \"#ffe8e8\");\r\n        }).mouseleave(function(){\r\n            $(this).css(\"background-color\", \"#f1f1f1\");\r\n        }).mousedown(function(event){\r\n            $(\"#luckysheet-dropCell-typeList\").remove();\r\n            const _locale = locale();\r\n            const locale_dropCell = _locale.dropCell;\r\n            $(\"body\").append(replaceHtml(_this.typeListHtml,{\r\n                copyCell:locale_dropCell.copyCell,\r\n                sequence:locale_dropCell.sequence,\r\n                onlyFormat:locale_dropCell.onlyFormat,\r\n                noFormat:locale_dropCell.noFormat,\r\n                day:locale_dropCell.day,\r\n                workDay:locale_dropCell.workDay,\r\n                month:locale_dropCell.month,\r\n                year:locale_dropCell.year,\r\n                chineseNumber:locale_dropCell.chineseNumber,\r\n            }));\r\n\r\n            let typeItemHide = _this.typeItemHide();\r\n            if(!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=1]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]\").hide();\r\n            }\r\n\r\n            if(!typeItemHide[2]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]\").hide();\r\n            }\r\n\r\n            if(!typeItemHide[3]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]\").hide();\r\n            }\r\n\r\n            let left = $(this).offset().left;\r\n            let top = $(this).offset().top + 25;\r\n            let winH = $(window).height(), winW = $(window).width();\r\n            let menuW = $(\"#luckysheet-dropCell-typeList\").width(),\r\n                menuH = $(\"#luckysheet-dropCell-typeList\").height();\r\n\r\n            if (left + menuW > winW) {\r\n                left = left - menuW;\r\n            }\r\n\r\n            if (top + menuH > winH) {\r\n                top = top - menuH - 38;\r\n            }\r\n\r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n\r\n            $(\"#luckysheet-dropCell-typeList\").css({\"left\": left, \"top\": top}).show();\r\n            $(\"#luckysheet-dropCell-icon\").mouseleave(function(){ $(this).css(\"backgroundColor\", \"#ffe8e8\") });\r\n\r\n            let type = _this.applyType;\r\n            $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=\"+ type +\"]\").find(\"span\").append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n            event.stopPropagation();\r\n        });\r\n\r\n        //\u70B9\u51FB\u6570\u636E\u586B\u5145\u7C7B\u578B\r\n        $(document).off(\"click.dCtypeList\").on(\"click.dCtypeList\", \"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem\", function(){\r\n            $(\"#luckysheet-dropCell-typeList .fa-check\").remove();\r\n            $(this).find(\"span\").append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n\r\n            let type = $(this).attr(\"data-type\");\r\n            _this.applyType = type;\r\n\r\n            _this.update();\r\n\r\n            $(\"#luckysheet-dropCell-typeList\").hide();\r\n            $(\"#luckysheet-dropCell-icon\").css(\"backgroundColor\", \"#f1f1f1\");\r\n            $(\"#luckysheet-dropCell-icon\").mouseleave(function(){ $(this).css(\"backgroundColor\", \"#f1f1f1\") });\r\n\r\n            countfunc();\r\n        });\r\n    },\r\n    typeItemHide: function(){\r\n        let _this = this;\r\n\r\n        let copyRange = _this.copyRange;\r\n        let str_r = copyRange[\"row\"][0], end_r = copyRange[\"row\"][1];\r\n        let str_c = copyRange[\"column\"][0], end_c = copyRange[\"column\"][1];\r\n\r\n        let hasNumber = false,\r\n            hasExtendNumber = false,\r\n            hasDate = false,\r\n            hasChn = false,\r\n            hasChnWeek1 = false,\r\n            hasChnWeek2 = false,\r\n            hasChnWeek3 = false;\r\n\r\n        for(let r = str_r; r <= end_r; r++){\r\n            for(let c = str_c; c <= end_c; c++){\r\n                if(!!Store.flowdata[r][c]){\r\n                    let cell = Store.flowdata[r][c];\r\n\r\n                    if(getObjType(cell) == \"object\" && cell[\"v\"] != null && cell[\"f\"] == null){\r\n                        if(cell[\"ct\"] != null && cell[\"ct\"].t == \"n\"){\r\n                            hasNumber = true;\r\n                        }\r\n                        else if(cell[\"ct\"] != null && cell[\"ct\"].t == \"d\"){\r\n                            hasDate = true;\r\n                        }\r\n                        else if(_this.isExtendNumber(cell[\"m\"])[0]){\r\n                            hasExtendNumber = true;\r\n                        }\r\n                        else if(_this.isChnNumber(cell[\"m\"]) && cell[\"m\"] != \"\u65E5\"){\r\n                            hasChn = true;\r\n                        }\r\n                        else if(cell[\"m\"] == \"\u65E5\"){\r\n                            hasChnWeek1 = true;\r\n                        }\r\n                        else if(_this.isChnWeek2(cell[\"m\"])){\r\n                            hasChnWeek2 = true;\r\n                        }\r\n                        else if(_this.isChnWeek3(cell[\"m\"])){\r\n                            hasChnWeek3 = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return [hasNumber, hasExtendNumber, hasDate, hasChn, hasChnWeek1, hasChnWeek2, hasChnWeek3];\r\n    },\r\n    update: function(){\r\n        let _this = this;\r\n\r\n        if(!checkProtectionLockedRangeList([_this.applyRange], Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        let borderInfoCompute = getBorderInfoCompute();\r\n        let dataVerification = $.extend(true, {}, file[\"dataVerification\"]);\r\n\r\n        let direction = _this.direction;\r\n        let type = _this.applyType;\r\n\r\n        //\u590D\u5236\u8303\u56F4\r\n        let copyRange = _this.copyRange;\r\n        let copy_str_r = copyRange[\"row\"][0], copy_end_r = copyRange[\"row\"][1];\r\n        let copy_str_c = copyRange[\"column\"][0], copy_end_c = copyRange[\"column\"][1];\r\n        let copyData = _this.getCopyData(d, copy_str_r, copy_end_r, copy_str_c, copy_end_c, direction);\r\n\r\n        let csLen;\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            csLen = copy_end_r - copy_str_r + 1;\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            csLen = copy_end_c - copy_str_c + 1;\r\n        }\r\n\r\n        //\u5E94\u7528\u8303\u56F4\r\n        let applyRange = _this.applyRange;\r\n        let apply_str_r = applyRange[\"row\"][0], apply_end_r = applyRange[\"row\"][1];\r\n        let apply_str_c = applyRange[\"column\"][0], apply_end_c = applyRange[\"column\"][1];\r\n\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            let asLen = apply_end_r - apply_str_r + 1;\r\n\r\n            for(let i = apply_str_c; i <= apply_end_c; i++){\r\n                let copyD = copyData[i - apply_str_c];\r\n\r\n                let applyData = _this.getApplyData(copyD, csLen, asLen);\r\n\r\n                if(direction == \"down\"){\r\n                    for(let j = apply_str_r; j <= apply_end_r; j++){\r\n                        let cell = applyData[j - apply_str_r];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"down\", j - apply_str_r + 1);\r\n                            let v = formula.execfunction(f, j, i);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask;\r\n                                            if(cell.ct.fa === \"##0.00\"){\r\n                                               /* \u5982\u679C\u662F\u6570\u5B57\u7C7B\u578B */\r\n                                               mask = genarate(Math.round(cell.v * 1000000000) / 1000000000 + \".00\") ;\r\n                                               cell.m = mask[0].toString();\r\n                                            }else {\r\n                                                mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                                cell.m = mask[0].toString();\r\n                                            }\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = cell.ct || { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[j][i] = cell;\r\n\r\n                        //\u8FB9\u6846\r\n                        let bd_r = copy_str_r + (j - apply_str_r) % csLen;\r\n                        let bd_c = i;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[j + \"_\" + i]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[j + \"_\" + i] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n                if(direction == \"up\"){\r\n                    for(let j = apply_end_r; j >= apply_str_r; j--){\r\n                        let cell = applyData[apply_end_r - j];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"up\", apply_end_r - j + 1);\r\n                            let v = formula.execfunction(f, j, i);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[j][i] = cell;\r\n\r\n                        //\u8FB9\u6846\r\n                        let bd_r = copy_end_r - (apply_end_r - j) % csLen;\r\n                        let bd_c = i;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[j + \"_\" + i]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[j + \"_\" + i] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            let asLen = apply_end_c - apply_str_c + 1;\r\n\r\n            for(let i = apply_str_r; i <= apply_end_r; i++){\r\n                let copyD = copyData[i - apply_str_r];\r\n\r\n                let applyData = _this.getApplyData(copyD, csLen, asLen);\r\n\r\n                if(direction == \"right\"){\r\n                    for(let j = apply_str_c; j <= apply_end_c; j++){\r\n                        let cell = applyData[j - apply_str_c];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"right\", j - apply_str_c + 1);\r\n                            let v = formula.execfunction(f, i, j);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[i][j] = cell;\r\n\r\n                        //\u8FB9\u6846\r\n                        let bd_r = i;\r\n                        let bd_c = copy_str_c + (j - apply_str_c) % csLen;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[i + \"_\" + j]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[i + \"_\" + j] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n                if(direction == \"left\"){\r\n                    for(let j = apply_end_c; j >= apply_str_c; j--){\r\n                        let cell = applyData[apply_end_c - j];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"left\", apply_end_c - j + 1);\r\n                            let v = formula.execfunction(f, i, j);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[i][j] = cell;\r\n\r\n                        //\u8FB9\u6846\r\n                        let bd_r = i;\r\n                        let bd_c = copy_end_c - (apply_end_c - j) % csLen;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[i + \"_\" + j]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[i + \"_\" + j] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F\r\n        let cdformat = $.extend(true, [], file[\"luckysheet_conditionformat_save\"]);\r\n        if(cdformat != null && cdformat.length > 0){\r\n            for(let i = 0; i < cdformat.length; i++){\r\n                let cdformat_cellrange = cdformat[i].cellrange;\r\n\r\n                let emptyRange = [];\r\n\r\n                for(let j = 0; j < cdformat_cellrange.length; j++){\r\n                    let range = conditionformat.CFSplitRange(cdformat_cellrange[j], {\"row\": copyRange[\"row\"], \"column\": copyRange[\"column\"]}, {\"row\": applyRange[\"row\"], \"column\": applyRange[\"column\"]}, \"operatePart\");\r\n                    if(range.length > 0){\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                }\r\n\r\n                if(emptyRange.length > 0){\r\n                    cdformat[i].cellrange.push(applyRange);\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n        let allParam = {\r\n            \"cfg\": cfg,\r\n            \"cdformat\": cdformat,\r\n            \"dataVerification\": dataVerification\r\n        }\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n        selectHightlightShow();\r\n    },\r\n    getCopyData: function(d, r1, r2, c1, c2, direction){\r\n        let _this = this;\r\n\r\n        let copyData = [];\r\n\r\n        let a1, a2, b1, b2;\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            a1 = c1;\r\n            a2 = c2;\r\n            b1 = r1;\r\n            b2 = r2;\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            a1 = r1;\r\n            a2 = r2;\r\n            b1 = c1;\r\n            b2 = c2;\r\n        }\r\n\r\n        for(let a = a1; a <= a2; a++){\r\n            let obj = {};\r\n\r\n            let arrData = [];\r\n            let arrIndex = [];\r\n            let text = \"\";\r\n            let extendNumberBeforeStr = null;\r\n            let extendNumberAfterStr = null;\r\n            let isSameStr = true;\r\n\r\n            for(let b = b1; b <= b2; b++){\r\n                //\u5355\u5143\u683C\r\n                let data;\r\n                if(direction == \"down\" || direction == \"up\"){\r\n                    data = d[b][a];\r\n                }\r\n                else if(direction == \"right\" || direction == \"left\"){\r\n                    data = d[a][b];\r\n                }\r\n\r\n                //\u5355\u5143\u683C\u503C\u7C7B\u578B\r\n                let str;\r\n                if(!!data && !!data[\"v\"] && data[\"f\"] == null){\r\n                    if(!!data[\"ct\"] && data[\"ct\"][\"t\"] == \"n\"){\r\n                        str = \"number\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(!!data[\"ct\"] && data[\"ct\"][\"t\"] == \"d\"){\r\n                        str = \"date\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isExtendNumber(data[\"m\"])[0]){\r\n                        str = \"extendNumber\";\r\n\r\n                        let isExtendNumber = _this.isExtendNumber(data[\"m\"]);\r\n\r\n                        if(extendNumberBeforeStr == null || extendNumberAfterStr == null){\r\n                            isSameStr = true;\r\n                            extendNumberBeforeStr = isExtendNumber[2];\r\n                            extendNumberAfterStr = isExtendNumber[3];\r\n                        }\r\n                        else {\r\n                            if(isExtendNumber[2] != extendNumberBeforeStr || isExtendNumber[3] != extendNumberAfterStr){\r\n                                isSameStr = false;\r\n                                extendNumberBeforeStr = isExtendNumber[2];\r\n                                extendNumberAfterStr = isExtendNumber[3];\r\n                            }\r\n                            else {\r\n                                isSameStr = true;\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(_this.isChnNumber(data[\"m\"])){\r\n                        str = \"chnNumber\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isChnWeek2(data[\"m\"])){\r\n                        str = \"chnWeek2\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isChnWeek3(data[\"m\"])){\r\n                        str = \"chnWeek3\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else{\r\n                        str = \"other\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                }\r\n                else{\r\n                    str = \"other\";\r\n                    extendNumberBeforeStr = null;\r\n                    extendNumberAfterStr = null;\r\n                }\r\n\r\n                if(str == \"extendNumber\"){\r\n                    if(b == b1){\r\n                        if(b1 == b2){\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            obj[text] = [];\r\n                            obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                        }\r\n                        else{\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                    else if(b == b2){\r\n                        if(text == str && isSameStr){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(text == str && isSameStr){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(b == b1){\r\n                        if(b1 == b2){\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            obj[text] = [];\r\n                            obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                        }\r\n                        else{\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                    else if(b == b2){\r\n                        if(text == str){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(text == str){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            copyData.push(obj);\r\n        }\r\n\r\n        return copyData;\r\n    },\r\n    getApplyData: function(copyD, csLen, asLen){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        let direction = _this.direction;\r\n        let type = _this.applyType;\r\n\r\n        let num = Math.floor(asLen / csLen);\r\n        let rsd = asLen % csLen;\r\n\r\n        //\u7EAF\u6570\u5B57\u7C7B\u578B\r\n        let copyD_number = copyD[\"number\"];\r\n        let applyD_number = [];\r\n        if(!!copyD_number){\r\n            for(let i = 0; i < copyD_number.length; i++){\r\n                let s = _this.getLenS(copyD_number[i][\"index\"], rsd);\r\n                let len = copyD_number[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, type, \"number\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_number[i][\"index\"]);\r\n                applyD_number.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u6269\u5C55\u6570\u5B57\u578B\uFF08\u5373\u4E00\u4E32\u5B57\u7B26\u6700\u540E\u9762\u7684\u662F\u6570\u5B57\uFF09\r\n        let copyD_extendNumber = copyD[\"extendNumber\"];\r\n        let applyD_extendNumber = [];\r\n        if(!!copyD_extendNumber){\r\n            for(let i = 0; i < copyD_extendNumber.length; i++){\r\n                let s = _this.getLenS(copyD_extendNumber[i][\"index\"], rsd);\r\n                let len = copyD_extendNumber[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, type, \"extendNumber\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_extendNumber[i][\"index\"]);\r\n                applyD_extendNumber.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u65E5\u671F\u7C7B\u578B\r\n        let copyD_date = copyD[\"date\"];\r\n        let applyD_date = [];\r\n        if(!!copyD_date){\r\n            for(let i = 0; i < copyD_date.length; i++){\r\n                let s = _this.getLenS(copyD_date[i][\"index\"], rsd);\r\n                let len = copyD_date[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, type, \"date\");\r\n                }\r\n                else if(type == \"8\"){\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, \"0\");\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, type);\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_date[i][\"index\"]);\r\n                applyD_date.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u4E2D\u6587\u5C0F\u5199\u6570\u5B57 \u6216 \u4E00~\u65E5\r\n        let copyD_chnNumber = copyD[\"chnNumber\"];\r\n        let applyD_chnNumber = [];\r\n        if(!!copyD_chnNumber){\r\n            for(let i = 0; i < copyD_chnNumber.length; i++){\r\n                let s = _this.getLenS(copyD_chnNumber[i][\"index\"], rsd);\r\n                let len = copyD_chnNumber[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, type, \"chnNumber\");\r\n                }\r\n                else if(type == \"2\" || type == \"8\"){\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnNumber[i][\"index\"]);\r\n                applyD_chnNumber.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u5468\u4E00~\u5468\u65E5\r\n        let copyD_chnWeek2 = copyD[\"chnWeek2\"];\r\n        let applyD_chnWeek2 = [];\r\n        if(!!copyD_chnWeek2){\r\n            for(let i = 0; i < copyD_chnWeek2.length; i++){\r\n                let s = _this.getLenS(copyD_chnWeek2[i][\"index\"], rsd);\r\n                let len = copyD_chnWeek2[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, type, \"chnWeek2\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek2[i][\"index\"]);\r\n                applyD_chnWeek2.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u661F\u671F\u4E00~\u661F\u671F\u65E5\r\n        let copyD_chnWeek3 = copyD[\"chnWeek3\"];\r\n        let applyD_chnWeek3 = [];\r\n        if(!!copyD_chnWeek3){\r\n            for(let i = 0; i < copyD_chnWeek3.length; i++){\r\n                let s = _this.getLenS(copyD_chnWeek3[i][\"index\"], rsd);\r\n                let len = copyD_chnWeek3[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, type, \"chnWeek3\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek3[i][\"index\"]);\r\n                applyD_chnWeek3.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //\u5176\u5B83\r\n        let copyD_other = copyD[\"other\"];\r\n        let applyD_other = [];\r\n        if(!!copyD_other){\r\n            for(let i = 0; i < copyD_other.length; i++){\r\n                let s = _this.getLenS(copyD_other[i][\"index\"], rsd);\r\n                let len = copyD_other[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"2\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_other[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_other[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_other[i][\"index\"]);\r\n                applyD_other.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        for(let x = 1; x <= asLen; x++){\r\n            if(applyD_number.length > 0){\r\n                for(let y = 0; y < applyD_number.length; y++){\r\n                    if(x in applyD_number[y][\"index\"]){\r\n                        applyData.push(applyD_number[y][\"data\"][applyD_number[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_extendNumber.length > 0){\r\n                for(let y = 0; y < applyD_extendNumber.length; y++){\r\n                    if(x in applyD_extendNumber[y][\"index\"]){\r\n                        applyData.push(applyD_extendNumber[y][\"data\"][applyD_extendNumber[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_date.length > 0){\r\n                for(let y = 0; y < applyD_date.length; y++){\r\n                    if(x in applyD_date[y][\"index\"]){\r\n                        applyData.push(applyD_date[y][\"data\"][applyD_date[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnNumber.length > 0){\r\n                for(let y = 0; y < applyD_chnNumber.length; y++){\r\n                    if(x in applyD_chnNumber[y][\"index\"]){\r\n                        applyData.push(applyD_chnNumber[y][\"data\"][applyD_chnNumber[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnWeek2.length > 0){\r\n                for(let y = 0; y < applyD_chnWeek2.length; y++){\r\n                    if(x in applyD_chnWeek2[y][\"index\"]){\r\n                        applyData.push(applyD_chnWeek2[y][\"data\"][applyD_chnWeek2[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnWeek3.length > 0){\r\n                for(let y = 0; y < applyD_chnWeek3.length; y++){\r\n                    if(x in applyD_chnWeek3[y][\"index\"]){\r\n                        applyData.push(applyD_chnWeek3[y][\"data\"][applyD_chnWeek3[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_other.length > 0){\r\n                for(let y = 0; y < applyD_other.length; y++){\r\n                    if(x in applyD_other[y][\"index\"]){\r\n                        applyData.push(applyD_other[y][\"data\"][applyD_other[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    getLenS: function(indexArr, rsd){\r\n        let s = 0;\r\n\r\n        for(let j = 0; j < indexArr.length; j++){\r\n            if(indexArr[j] <= rsd){\r\n                s++;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n\r\n        return s;\r\n    },\r\n    getDataIndex: function(csLen, asLen, indexArr){\r\n        let obj = {};\r\n\r\n        let num = Math.floor(asLen / csLen);\r\n        let rsd = asLen % csLen;\r\n\r\n        let sum = 0;\r\n        if(num > 0){\r\n            for(let i = 1; i <= num; i++){\r\n                for(let j = 0; j < indexArr.length; j++){\r\n                    obj[indexArr[j] + (i - 1) * csLen] = sum;\r\n                    sum++;\r\n                }\r\n            }\r\n            for(let a = 0; a < indexArr.length; a++){\r\n                if(indexArr[a] <= rsd){\r\n                    obj[indexArr[a] + csLen * num] = sum;\r\n                    sum++;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let a = 0; a < indexArr.length; a++){\r\n                if(indexArr[a] <= rsd){\r\n                    obj[indexArr[a]] = sum;\r\n                    sum++;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        return obj;\r\n    },\r\n    getDataByType: function(data, len, direction, type ,dataType){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        if(type == \"0\"){ //\u590D\u5236\u5355\u5143\u683C\r\n            if(direction == \"up\" || direction == \"left\"){\r\n                data.reverse();\r\n            }\r\n\r\n            applyData = _this.FillCopy(data, len);\r\n        }\r\n        else if(type == \"1\"){ //\u586B\u5145\u5E8F\u5217\r\n            if(dataType == \"number\"){\r\n                //\u6570\u636E\u7C7B\u578B\u662F \u6570\u5B57\r\n                applyData = _this.FillSeries(data, len, direction);\r\n            }\r\n            else if(dataType == \"extendNumber\"){\r\n                //\u6269\u5C55\u6570\u5B57\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillExtendNumber(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let txt = data[i][\"m\"];\r\n                        dataNumArr.push(Number(_this.isExtendNumber(txt)[1]));\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u7B49\u5DEE\u4E3Astep\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillExtendNumber(data, len, step);\r\n                    }\r\n                    else{\r\n                        //\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"date\"){\r\n                //\u6570\u636E\u7C7B\u578B\u662F \u65E5\u671F\r\n                if(data.length == 1){\r\n                    //\u4EE5\u4E00\u5929\u4E3Astep\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillDays(data, len, step);\r\n                }\r\n                else{\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let judgeDate = _this.judgeDate(data);\r\n                    if(judgeDate[0] && judgeDate[3]){\r\n                        //\u65E5\u4E00\u6837\uFF0C\u6708\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\r\n                        let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                        applyData = _this.FillMonths(data, len, step);\r\n                    }\r\n                    else if(!judgeDate[0] && judgeDate[2]){\r\n                        //\u65E5\u4E0D\u4E00\u6837\uFF0C\u65E5\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u65E5\u5DEE\u4E3Astep\r\n                        let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                        applyData = _this.FillDays(data, len, step);\r\n                    }\r\n                    else{\r\n                        //\u5176\u5B83\uFF0C\u590D\u5236\u6570\u636E\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnNumber\"){\r\n                //\u6570\u636E\u7C7B\u578B\u662F \u4E2D\u6587\u5C0F\u5199\u6570\u5B57\r\n                if(data.length == 1){\r\n                    if(data[0][\"m\"] == \"\u65E5\" || _this.ChineseToNumber(data[0][\"m\"]) < 7){\r\n                        //\u6570\u5B57\u5C0F\u4E8E7\uFF0C\u4EE5\u5468\u4E00~\u5468\u65E5\u5E8F\u5217\u586B\u5145\r\n                        let step;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step = -1;\r\n                        }\r\n\r\n                        applyData = _this.FillChnWeek(data, len, step);\r\n                    }\r\n                    else{\r\n                        //\u6570\u5B57\u5927\u4E8E7\uFF0C\u4EE5\u4E2D\u6587\u5C0F\u5199\u6570\u5B57\u5E8F\u5217\u586B\u5145\r\n                        let step\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step = -1;\r\n                        }\r\n\r\n                        applyData = _this.FillChnNumber(data, len, step);\r\n                    }\r\n                }\r\n                else{\r\n                    let hasweek = false;\r\n                    for(let i = 0; i < data.length; i++){\r\n                        if(data[i][\"m\"] == \"\u65E5\"){\r\n                            hasweek = true;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n                    for(let i = 0; i < data.length; i++){\r\n                        if(data[i][\"m\"] == \"\u65E5\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else if(hasweek && _this.ChineseToNumber(data[i][\"m\"]) > 0 && _this.ChineseToNumber(data[i][\"m\"]) < 7){\r\n                            dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]) + weekIndex * 7);\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]));\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        if(hasweek || (dataNumArr[dataNumArr.length - 1] < 6 && dataNumArr[0] > 0) || (dataNumArr[0] < 6 && dataNumArr[dataNumArr.length - 1] > 0)){\r\n                            //\u4EE5\u5468\u4E00~\u5468\u65E5\u5E8F\u5217\u586B\u5145\r\n                            let step = dataNumArr[1] - dataNumArr[0];\r\n                            applyData = _this.FillChnWeek(data, len, step);\r\n                        }\r\n                        else{\r\n                            //\u4EE5\u4E2D\u6587\u5C0F\u5199\u6570\u5B57\u5E8F\u5217\u586B\u5145\r\n                            let step = dataNumArr[1] - dataNumArr[0];\r\n                            applyData = _this.FillChnNumber(data, len, step);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnWeek2\"){\r\n                //\u5468\u4E00~\u5468\u65E5\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillChnWeek2(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let lastTxt = data[i][\"m\"].substr(data[i][\"m\"].length - 1, 1);\r\n                        if(data[i][\"m\"] == \"\u5468\u65E5\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7);\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u7B49\u5DEE\u4E3Astep\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillChnWeek2(data, len, step);\r\n                    }\r\n                    else{\r\n                        //\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnWeek3\"){\r\n                //\u661F\u671F\u4E00~\u661F\u671F\u65E5\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillChnWeek3(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let lastTxt = data[i][\"m\"].substr(data[i][\"m\"].length - 1, 1);\r\n                        if(data[i][\"m\"] == \"\u661F\u671F\u65E5\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7);\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u7B49\u5DEE\u4E3Astep\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillChnWeek3(data, len, step);\r\n                    }\r\n                    else{\r\n                        //\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                //\u6570\u636E\u7C7B\u578B\u662F \u5176\u5B83\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                applyData = _this.FillCopy(data, len);\r\n            }\r\n        }\r\n        else if(type == \"2\"){ //\u4EC5\u586B\u5145\u683C\u5F0F\r\n            if(direction == \"up\" || direction == \"left\"){\r\n                data.reverse();\r\n            }\r\n\r\n            applyData = _this.FillOnlyFormat(data, len);\r\n        }\r\n        else if(type == \"3\"){ //\u4E0D\u5E26\u683C\u5F0F\u586B\u5145\r\n            let dataArr = _this.getDataByType(data, len, direction, \"1\" ,dataType);\r\n            applyData = _this.FillWithoutFormat(dataArr);\r\n        }\r\n        else if(type == \"4\"){ //\u4EE5\u5929\u6570\u586B\u5145\r\n            if(data.length == 1){\r\n                //\u4EE5\u4E00\u5929\u4E3Astep\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillDays(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                //\u4EE5\u65E5\u5DEE\u4E3Astep\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                applyData = _this.FillDays(data, len, step);\r\n            }\r\n            else{\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //\u65E5\u4E00\u6837\uFF0C\u4E14\u6708\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //\u65E5\u4E0D\u4E00\u6837\uFF0C\u4E14\u65E5\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u65E5\u5DEE\u4E3Astep\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                    applyData = _this.FillDays(data, len, step);\r\n                }\r\n                else{\r\n                    //\u65E5\u5DEE\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"5\"){ //\u4EE5\u5DE5\u4F5C\u65E5\u586B\u5145\r\n            if(data.length == 1){\r\n                //\u4EE5\u4E00\u5929\u4E3Astep\uFF08\u82E5\u90A3\u5929\u4E3A\u4F11\u606F\u65E5\uFF0C\u5219\u8DF3\u8FC7\uFF09\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                let newLen = Math.round(len * 1.5);\r\n                for(let i = 1; i <= newLen; i++){\r\n                    let d = $.extend(true, {}, data[0]);\r\n\r\n                    let day = dayjs(d[\"m\"]).add(i, \"days\").day();\r\n                    if(day == 0 || day == 6){\r\n                        continue;\r\n                    }\r\n\r\n                    let date = dayjs(d[\"m\"]).add(step * i, \"days\").format(\"YYYY-MM-DD\");\r\n                    d[\"m\"] = date;\r\n                    d[\"v\"] = genarate(date)[2];\r\n                    applyData.push(d);\r\n\r\n                    if(applyData.length == len){\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\") != 0){\r\n                    //\u65E5\u4E00\u6837\uFF0C\u4E14\u6708\u5DEE\u5927\u4E8E\u4E00\u6708\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\uFF08\u82E5\u90A3\u5929\u4E3A\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let day = dayjs(data[data.length - 1]).add(step * i, \"months\").day(),\r\n                            date;\r\n                        if(day == 0){\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else if(day == 6){\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else{\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n                        }\r\n\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //\u65E5\u4E0D\u4E00\u6837\r\n                    if(Math.abs(dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]))) > 7){\r\n                        //\u82E5\u65E5\u5DEE\u5927\u4E8E7\u5929\uFF0C\u4EE5\u4E00\u6708\u4E3Astep\uFF08\u82E5\u90A3\u5929\u662F\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                        let step_month;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_month = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_month = -1;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //\u82E5\u65E5\u5DEE\u5C0F\u4E8E\u7B49\u4E8E7\u5929\uFF0C\u4EE57\u5929\u4E3Astep\uFF08\u82E5\u90A3\u5929\u662F\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                        let step_day;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_day = 7;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_day = -7;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_day * num, \"days\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //\u65E5\u4E00\u6837\uFF0C\u4E14\u6708\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\uFF08\u82E5\u90A3\u5929\u4E3A\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let day = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").day(),\r\n                            date;\r\n                        if(day == 0){\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else if(day == 6){\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else{\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n                        }\r\n\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //\u65E5\u4E0D\u4E00\u6837\uFF0C\u4E14\u65E5\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\r\n                    if(Math.abs(dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]))) > 7){\r\n                        //\u82E5\u65E5\u5DEE\u5927\u4E8E7\u5929\uFF0C\u4EE5\u4E00\u6708\u4E3Astep\uFF08\u82E5\u90A3\u5929\u662F\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                        let step_month\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_month = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_month = -1;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //\u82E5\u65E5\u5DEE\u5C0F\u4E8E\u7B49\u4E8E7\u5929\uFF0C\u4EE57\u5929\u4E3Astep\uFF08\u82E5\u90A3\u5929\u662F\u4F11\u606F\u65E5\uFF0C\u5219\u5411\u524D\u53D6\u6700\u8FD1\u7684\u5DE5\u4F5C\u65E5\uFF09\r\n                        let step_day;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_day = 7;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_day = -7;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_day * num, \"days\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    //\u65E5\u5DEE\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"6\"){ //\u4EE5\u6708\u586B\u5145\r\n            if(data.length == 1){\r\n                //\u4EE5\u4E00\u6708\u4E3Astep\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillMonths(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\") != 0){\r\n                    //\u65E5\u4E00\u6837\uFF0C\u4E14\u6708\u5DEE\u5927\u4E8E\u4E00\u6708\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else{\r\n                    //\u4EE5\u4E00\u6708\u4E3Astep\r\n                    let step_month;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_month = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_month = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //\u65E5\u4E00\u6837\uFF0C\u4E14\u6708\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u6708\u5DEE\u4E3Astep\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //\u65E5\u4E0D\u4E00\u6837\uFF0C\u4E14\u65E5\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u4E00\u6708\u4E3Astep\r\n                    let step_month;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_month = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_month = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //\u65E5\u5DEE\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"7\"){ //\u4EE5\u5E74\u586B\u5145\r\n            if(data.length == 1){\r\n                //\u4EE5\u4E00\u5E74\u4E3Astep\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillYears(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).month() == dayjs(data[0][\"m\"]).month() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\") != 0){\r\n                    //\u65E5\u6708\u4E00\u6837\uFF0C\u4E14\u5E74\u5DEE\u5927\u4E8E\u4E00\u5E74\uFF0C\u4EE5\u5E74\u5DEE\u4E3Astep\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n                    applyData = _this.FillYears(data, len, step);\r\n                }\r\n                else{\r\n                    //\u4EE5\u4E00\u5E74\u4E3Astep\r\n                    let step_year;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_year = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_year = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_year * num, \"years\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[1] && judgeDate[4]){\r\n                    //\u65E5\u6708\u4E00\u6837\uFF0C\u4E14\u5E74\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u5E74\u5DEE\u4E3Astep\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n                    applyData = _this.FillYears(data, len, step);\r\n                }\r\n                else if((judgeDate[0] && judgeDate[3]) || judgeDate[2]){\r\n                    //\u65E5\u4E00\u6837\u4E14\u6708\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u6216\u5929\u5DEE\u4E3A\u7B49\u5DEE\u6570\u5217\uFF0C\u4EE5\u4E00\u5E74\u4E3Astep\r\n                    let step_year;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_year = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_year = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //\u4EE5\u6570\u7EC4\u7B2C\u4E00\u4E2A\u4E3A\u5BF9\u6BD4\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_year * num, \"years\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //\u65E5\u5DEE\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"8\"){ //\u4EE5\u4E2D\u6587\u5C0F\u5199\u6570\u5B57\u5E8F\u5217\u586B\u5145\r\n            if(data.length == 1){\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillChnNumber(data, len, step);\r\n            }\r\n            else{\r\n                let dataNumArr = [];\r\n                for(let i = 0; i < data.length; i++){\r\n                    dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]));\r\n                }\r\n\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                    dataNumArr.reverse();\r\n                }\r\n\r\n                if(_this.isEqualDiff(dataNumArr)){\r\n                    let step = dataNumArr[1] - dataNumArr[0];\r\n                    applyData = _this.FillChnNumber(data, len, step);\r\n                }\r\n                else{\r\n                    //\u4E0D\u662F\u7B49\u5DEE\u6570\u5217\uFF0C\u590D\u5236\u6570\u636E\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillCopy: function(data, len){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillSeries: function(data, len, direction){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        let dataNumArr = [];\r\n        for(let j = 0; j < data.length; j++){\r\n            dataNumArr.push(Number(data[j][\"v\"]));\r\n        }\r\n\r\n        if(data.length > 2 && _this.isEqualRatio(dataNumArr)){\r\n            //\u7B49\u6BD4\u6570\u5217\r\n            for(let i = 1; i <= len; i++){\r\n                let index = (i - 1) % data.length;\r\n                let d = $.extend(true, {}, data[index]);\r\n\r\n                let num;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    num = Number(data[data.length -1][\"v\"]) * Math.pow(Number(data[1][\"v\"]) / Number(data[0][\"v\"]), i);\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    num = Number(data[0][\"v\"]) / Math.pow(Number(data[1][\"v\"]) / Number(data[0][\"v\"]), i);\r\n                }\r\n\r\n                d[\"v\"] = num;\r\n                d[\"m\"] = update(d[\"ct\"][\"fa\"], num);\r\n                applyData.push(d);\r\n            }\r\n        }\r\n        else{\r\n            //\u7EBF\u6027\u6570\u5217\r\n            let xArr = _this.getXArr(data.length);\r\n            for(let i = 1; i <= len; i++){\r\n                let index = (i - 1) % data.length;\r\n                let d = $.extend(true, {}, data[index]);\r\n\r\n                let y;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    y = _this.forecast(data.length + i, dataNumArr, xArr);\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    y = _this.forecast(1 - i, dataNumArr, xArr);\r\n                }\r\n\r\n                d[\"v\"] = y;\r\n                d[\"m\"] = update(d[\"ct\"][\"fa\"], y);\r\n                applyData.push(d);\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillExtendNumber: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n        let reg = /0|([1-9]+[0-9]*)/g;\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let last = data[data.length - 1][\"m\"];\r\n            let match = last.match(reg)\r\n            let lastTxt = match[match.length -1];\r\n            \r\n            let num = Math.abs(Number(lastTxt) + step * i);\r\n            let lastIndex = last.lastIndexOf(lastTxt);\r\n            let valueTxt = last.substr(0, lastIndex) + num.toString() + last.substr(lastIndex + lastTxt.length);\r\n\r\n            d[\"v\"] = valueTxt;\r\n            d[\"m\"] = valueTxt;\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillOnlyFormat: function(data, len){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            delete d[\"f\"];\r\n            delete d[\"m\"];\r\n            delete d[\"v\"];\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillWithoutFormat: function(dataArr){\r\n        let applyData = [];\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            let d = $.extend(true, {}, dataArr[i]);\r\n\r\n            let obj;\r\n            if(d[\"f\"] == null){\r\n                obj = {\"m\": d[\"v\"].toString(), \"v\": d[\"v\"]};\r\n            }\r\n            else{\r\n                obj = {\"f\": d[\"f\"], \"m\": d[\"v\"].toString(), \"v\": d[\"v\"]};\r\n            }\r\n\r\n            applyData.push(obj);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillDays: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"days\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillMonths: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillYears: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"years\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"\u65E5\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                num = _this.ChineseToNumber(data[data.length - 1][\"m\"]) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"\u65E5\";\r\n                d[\"v\"] = \"\u65E5\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"\u4E00\";\r\n                d[\"v\"] = \"\u4E00\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"\u4E8C\";\r\n                d[\"v\"] = \"\u4E8C\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"\u4E09\";\r\n                d[\"v\"] = \"\u4E09\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"\u56DB\";\r\n                d[\"v\"] = \"\u56DB\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"\u4E94\";\r\n                d[\"v\"] = \"\u4E94\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"\u516D\";\r\n                d[\"v\"] = \"\u516D\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek2: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"\u5468\u65E5\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                let last = data[data.length - 1][\"m\"];\r\n                let txt = last.substr(last.length - 1, 1);\r\n                num = _this.ChineseToNumber(txt) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"\u5468\u65E5\";\r\n                d[\"v\"] = \"\u5468\u65E5\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"\u5468\u4E00\";\r\n                d[\"v\"] = \"\u5468\u4E00\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"\u5468\u4E8C\";\r\n                d[\"v\"] = \"\u5468\u4E8C\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"\u5468\u4E09\";\r\n                d[\"v\"] = \"\u5468\u4E09\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"\u5468\u56DB\";\r\n                d[\"v\"] = \"\u5468\u56DB\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"\u5468\u4E94\";\r\n                d[\"v\"] = \"\u5468\u4E94\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"\u5468\u516D\";\r\n                d[\"v\"] = \"\u5468\u516D\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek3: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"\u661F\u671F\u65E5\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                let last = data[data.length - 1][\"m\"];\r\n                let txt = last.substr(last.length - 1, 1);\r\n                num = _this.ChineseToNumber(txt) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"\u661F\u671F\u65E5\";\r\n                d[\"v\"] = \"\u661F\u671F\u65E5\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"\u661F\u671F\u4E00\";\r\n                d[\"v\"] = \"\u661F\u671F\u4E00\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"\u661F\u671F\u4E8C\";\r\n                d[\"v\"] = \"\u661F\u671F\u4E8C\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"\u661F\u671F\u4E09\";\r\n                d[\"v\"] = \"\u661F\u671F\u4E09\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"\u661F\u671F\u56DB\";\r\n                d[\"v\"] = \"\u661F\u671F\u56DB\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"\u661F\u671F\u4E94\";\r\n                d[\"v\"] = \"\u661F\u671F\u4E94\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"\u661F\u671F\u516D\";\r\n                d[\"v\"] = \"\u661F\u671F\u516D\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnNumber: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num = _this.ChineseToNumber(data[data.length - 1][\"m\"]) + step * i,\r\n                txt;\r\n            if(num <= 0){\r\n                txt = \"\u96F6\";\r\n            }\r\n            else{\r\n                txt = _this.NumberToChinese(num);\r\n            }\r\n\r\n            d[\"v\"] = txt;\r\n            d[\"m\"] = txt.toString();\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    isEqualDiff: function(arr){\r\n        let diff = true;\r\n        let step = arr[1] - arr[0];\r\n\r\n        for(let i = 1; i < arr.length; i++){\r\n            if(arr[i] - arr[i - 1] != step){\r\n                diff = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return diff;\r\n    },\r\n    isEqualRatio: function(arr){\r\n        let ratio = true;\r\n        let step = arr[1] / arr[0];\r\n\r\n        for(let i = 1; i < arr.length; i++){\r\n            if(arr[i] / arr[i - 1] != step){\r\n                ratio = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return ratio;\r\n    },\r\n    getXArr: function(len){\r\n        let xArr = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            xArr.push(i);\r\n        }\r\n\r\n        return xArr;\r\n    },\r\n    forecast: function(x, yArr, xArr){\r\n        function getAverage(arr){\r\n            let sum = 0;\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                sum += arr[i];\r\n            }\r\n\r\n            return sum / arr.length;\r\n        }\r\n\r\n        let ax = getAverage(xArr); //x\u6570\u7EC4 \u5E73\u5747\u503C\r\n        let ay = getAverage(yArr); //y\u6570\u7EC4 \u5E73\u5747\u503C\r\n\r\n        let sum_d = 0, sum_n = 0;\r\n        for(let j = 0; j < xArr.length; j++){\r\n            //\u5206\u6BCD\u548C\r\n            sum_d += (xArr[j] - ax)*(yArr[j] - ay);\r\n            //\u5206\u5B50\u548C\r\n            sum_n += (xArr[j] - ax)*(xArr[j] - ax);\r\n        }\r\n\r\n        let b;\r\n        if(sum_n == 0){\r\n            b = 1;\r\n        }\r\n        else{\r\n            b = sum_d / sum_n;\r\n        }\r\n\r\n        let a = ay - b * ax;\r\n\r\n        return Math.round((a + b * x) * 100000) / 100000;\r\n    },\r\n    judgeDate: function(data){\r\n        let isSameDay = true,\r\n            isSameMonth = true,\r\n            isEqualDiffDays = true,\r\n            isEqualDiffMonths = true,\r\n            isEqualDiffYears = true;\r\n        let sameDay = dayjs(data[0][\"m\"]).date(),\r\n            sameMonth = dayjs(data[0][\"m\"]).month();\r\n        let equalDiffDays = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n        let equalDiffMonths = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n        let equalDiffYears = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n\r\n        for(let i = 1; i < data.length; i++){\r\n            //\u65E5\u662F\u5426\u4E00\u6837\r\n            if(dayjs(data[i][\"m\"]).date() != sameDay){\r\n                isSameDay = false;\r\n            }\r\n            //\u6708\u662F\u5426\u4E00\u6837\r\n            if(dayjs(data[i][\"m\"]).month() != sameMonth){\r\n                isSameMonth = false;\r\n            }\r\n            //\u65E5\u5DEE\u662F\u5426\u662F \u7B49\u5DEE\u6570\u5217\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"days\") != equalDiffDays){\r\n                isEqualDiffDays = false;\r\n            }\r\n            //\u6708\u5DEE\u662F\u5426\u662F \u7B49\u5DEE\u6570\u5217\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"months\") != equalDiffMonths){\r\n                isEqualDiffMonths = false;\r\n            }\r\n            //\u5E74\u5DEE\u662F\u5426\u662F \u7B49\u5DEE\u6570\u5217\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"years\") != equalDiffYears){\r\n                isEqualDiffYears = false;\r\n            }\r\n        }\r\n\r\n        if(equalDiffDays == 0){\r\n            isEqualDiffDays = false;\r\n        }\r\n        if(equalDiffMonths == 0){\r\n            isEqualDiffMonths = false;\r\n        }\r\n        if(equalDiffYears == 0){\r\n            isEqualDiffYears = false;\r\n        }\r\n\r\n        return [isSameDay, isSameMonth, isEqualDiffDays, isEqualDiffMonths, isEqualDiffYears];\r\n    }\r\n}\r\n\r\nexport default luckysheetDropCell;\r\n", "import { getSheetIndex } from '../methods/get';\r\nimport { luckysheet_searcharray } from './sheetSearch';\r\nimport { selectHightlightShow } from './select';\r\nimport { createFilterOptions } from './filter';\r\nimport server from './server';\r\nimport menuButton from './menuButton';\r\nimport luckysheetPostil from './postil';\r\nimport luckysheetDropCell from './dropCell';\r\nimport { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\nconst luckysheetFreezen = {\r\n    freezenHorizontalHTML: '<div id=\"luckysheet-freezebar-horizontal\" class=\"luckysheet-freezebar\" tabindex=\"0\"><div class=\"luckysheet-freezebar-handle luckysheet-freezebar-horizontal-handle\" ><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-title\" ></div><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-bar\" ></div></div><div class=\"luckysheet-freezebar-drop luckysheet-freezebar-horizontal-drop\" ><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-title\" ></div><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-bar\" >&nbsp;</div></div></div>',\r\n    freezenVerticalHTML: '<div id=\"luckysheet-freezebar-vertical\" class=\"luckysheet-freezebar\" tabindex=\"0\"><div class=\"luckysheet-freezebar-handle luckysheet-freezebar-vertical-handle\" ><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-title\" ></div><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-bar\" ></div></div><div class=\"luckysheet-freezebar-drop luckysheet-freezebar-vertical-drop\" ><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-title\" ></div><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-bar\" >&nbsp;</div></div></div>',\r\n    initialHorizontal: true,\r\n    initialVertical: true,\r\n    horizontalmovestate: false,\r\n    horizontalmoveposition: null,\r\n    verticalmovestate: false,\r\n    verticalmoveposition: null,\r\n    windowHeight: null,\r\n    windowWidth: null,\r\n    freezenhorizontaldata: null,\r\n    freezenverticaldata: null,\r\n    cutVolumn: function (arr, cutindex) {\r\n        if(cutindex <= 0){\r\n            return arr;\r\n        }\r\n\r\n        let pre = arr.slice(0, cutindex);\r\n        let premax = pre[pre.length - 1];\r\n        let ret = arr.slice(cutindex);\r\n        \r\n        // for (let i = 0; i < ret.length; i++) {\r\n        //     ret[i] -= premax;\r\n        // }\r\n\r\n        return ret;\r\n    },\r\n    cancelFreezenVertical: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_freezen = _locale.freezen;\r\n\r\n        $(\"#luckysheet-freezen-btn-vertical\").html('<i class=\"fa fa-indent\"></i> '+locale_freezen.freezenColumn);\r\n        _this.freezenverticaldata = null;\r\n        let isvertical = $(\"#luckysheet-freezebar-vertical\").is(\":visible\");\r\n        $(\"#luckysheet-freezebar-vertical\").hide();\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null) {\r\n            currentSheet.freezen.vertical = null;\r\n        }\r\n\r\n        if(currentSheet.frozen != null && isvertical){\r\n            server.saveParam(\"all\", sheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    createFreezenVertical: function (freezenverticaldata, left) {\r\n        let _this = this;\r\n\r\n        if (_this.initialVertical) {\r\n            _this.initialVertical = false;\r\n            $(\"#luckysheet-grid-window-1\").append(_this.freezenVerticalHTML);\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-drop\").hover(function () {\r\n                $(this).parent().addClass(\"luckysheet-freezebar-hover\");\r\n            }, function () {\r\n                $(this).parent().removeClass(\"luckysheet-freezebar-hover\");\r\n            });\r\n\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-drop\").mousedown(function () {\r\n                _this.verticalmovestate = true;\r\n                _this.verticalmoveposition = $(this).position().left;\r\n                _this.windowWidth = $(\"#luckysheet-grid-window-1\").width();\r\n\r\n                $(this).parent().addClass(\"luckysheet-freezebar-active\");\r\n                $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css(\"cursor\", \"-webkit-grabbing\");\r\n            });\r\n\r\n            let gridheight = $(\"#luckysheet-grid-window-1\").height();\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css({ \r\n                \"height\": gridheight - 10, \r\n                \"width\": \"4px\", \r\n                \"cursor\": \"-webkit-grab\", \r\n                \"top\": \"0px\" \r\n            }).end().find(\".luckysheet-freezebar-vertical-drop\").css({ \r\n                \"height\": gridheight - 10, \r\n                \"width\": \"4px\", \r\n                \"top\": \"0px\", \r\n                \"cursor\": \"-webkit-grab\" \r\n            });\r\n        }\r\n\r\n        if (freezenverticaldata == null) {\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if (dataset_col_st == -1) {\r\n                dataset_col_st = 0;\r\n            }\r\n\r\n            left = Store.visibledatacolumn[dataset_col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            freezenverticaldata = [\r\n                Store.visibledatacolumn[dataset_col_st], \r\n                dataset_col_st + 1, \r\n                scrollLeft, \r\n                _this.cutVolumn(Store.visibledatacolumn, dataset_col_st + 1), \r\n                left\r\n            ];\r\n            _this.saveFreezen(null, null, freezenverticaldata, left);\r\n        }\r\n\r\n        _this.freezenverticaldata = freezenverticaldata;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        // \u89E3\u51B3freeze \u4E0D\u5782\u76F4\u5C45\u4E2D\u7684\u95EE\u9898\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.freezenCancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        $(\"#luckysheet-freezebar-vertical\").show().find(\".luckysheet-freezebar-vertical-handle\").css({ \"left\": left }).end().find(\".luckysheet-freezebar-vertical-drop\").css({ \"left\": left });\r\n    },\r\n    saveFreezen: function (freezenhorizontaldata, top, freezenverticaldata, left) {\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        if (currentSheet.freezen == null) {\r\n            currentSheet.freezen = {};\r\n        }\r\n\r\n        if (freezenhorizontaldata != null) {\r\n            if (currentSheet.freezen.horizontal == null) {\r\n                currentSheet.freezen.horizontal = {};\r\n            }\r\n\r\n            currentSheet.freezen.horizontal.freezenhorizontaldata = freezenhorizontaldata;\r\n            currentSheet.freezen.horizontal.top = top;\r\n        }\r\n\r\n        if (freezenverticaldata != null) {\r\n            if (currentSheet.freezen.vertical == null) {\r\n                currentSheet.freezen.vertical = {};\r\n            }\r\n\r\n            currentSheet.freezen.vertical.freezenverticaldata = freezenverticaldata;\r\n            currentSheet.freezen.vertical.left = left;\r\n        }\r\n\r\n        // if(currentSheet.freezen != null){\r\n        //     server.saveParam(\"all\", Store.currentSheetIndex, currentSheet.freezen, { \"k\": \"freezen\" });\r\n        // }\r\n\r\n        // use new property frozen\r\n        if(currentSheet.frozen != null){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    initialFreezen: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        // when init ,we get frozen, but here, we need freezen,so tranform it\r\n        _this.frozenTofreezen();\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null && currentSheet.freezen.horizontal != null && currentSheet.freezen.horizontal.freezenhorizontaldata != null) {\r\n            _this.createFreezenHorizontal(currentSheet.freezen.horizontal.freezenhorizontaldata, currentSheet.freezen.horizontal.top);\r\n        }\r\n        else {\r\n            _this.cancelFreezenHorizontal(sheetIndex);\r\n        }\r\n\r\n        if (currentSheet.freezen != null && currentSheet.freezen.vertical != null && currentSheet.freezen.vertical.freezenverticaldata != null) {\r\n            _this.createFreezenVertical(currentSheet.freezen.vertical.freezenverticaldata, currentSheet.freezen.vertical.left);\r\n        }\r\n        else {\r\n            _this.cancelFreezenVertical(sheetIndex);\r\n        }\r\n\r\n        _this.createAssistCanvas();\r\n    },\r\n    changeFreezenIndex: function (originindex, type) {\r\n        let _this = this;\r\n\r\n        if (type == \"v\" && _this.freezenverticaldata != null) {\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offset = luckysheet_searcharray(Store.visibledatacolumn, $(\"#luckysheet-cell-main\").scrollLeft());\r\n\r\n            if (originindex - offset < freezen_colindex) {\r\n                originindex = originindex - offset;\r\n            }\r\n        }\r\n        else if (type == \"h\" && _this.freezenhorizontaldata != null) {\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offset = luckysheet_searcharray(Store.visibledatarow, $(\"#luckysheet-cell-main\").scrollTop());\r\n            \r\n            if (originindex - offset < freezen_rowindex) {\r\n                originindex = originindex - offset;\r\n            }\r\n        }\r\n        \r\n        return originindex;\r\n    },\r\n    scrollFreezen: function () {\r\n        let _this = this;\r\n\r\n        let row;\r\n        let row_focus = Store.luckysheet_select_save[0][\"row_focus\"];\r\n        if(row_focus == Store.luckysheet_select_save[0][\"row\"][0]){\r\n            row = Store.luckysheet_select_save[0][\"row\"][1];\r\n        }\r\n        else if(row_focus == Store.luckysheet_select_save[0][\"row\"][1]){\r\n            row = Store.luckysheet_select_save[0][\"row\"][0];\r\n        }\r\n\r\n        let column;\r\n        let column_focus = Store.luckysheet_select_save[0][\"column_focus\"];\r\n        if(column_focus == Store.luckysheet_select_save[0][\"column\"][0]){\r\n            column = Store.luckysheet_select_save[0][\"column\"][1];\r\n        }\r\n        else if(column_focus == Store.luckysheet_select_save[0][\"column\"][1]){\r\n            column = Store.luckysheet_select_save[0][\"column\"][0];\r\n        }\r\n\r\n        if (_this.freezenverticaldata != null) {\r\n            let freezen_colindex = _this.freezenverticaldata[1];            \r\n\r\n            let offset = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft());\r\n\r\n            let top = _this.freezenverticaldata[4];\r\n\r\n            freezen_colindex += offset;\r\n\r\n            if(column>=Store.visibledatacolumn.length){\r\n                column = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            if(freezen_colindex>=Store.visibledatacolumn.length){\r\n                freezen_colindex = Store.visibledatacolumn.length - 1;\r\n            }\r\n            \r\n            let column_px = Store.visibledatacolumn[column], freezen_px = Store.visibledatacolumn[freezen_colindex];\r\n\r\n            if (column_px <= freezen_px+top) {\r\n                setTimeout(function () { $(\"#luckysheet-scrollbar-x\").scrollLeft(0); }, 100);\r\n            }\r\n        }\r\n\r\n        if (_this.freezenhorizontaldata != null) {\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            \r\n            let offset = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop());\r\n\r\n            let left = _this.freezenhorizontaldata[4];\r\n\r\n            freezen_rowindex += offset;\r\n\r\n            if(row>=Store.visibledatarow.length){\r\n                row = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if(freezen_rowindex>=Store.visibledatarow.length){\r\n                freezen_rowindex = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            let row_px = Store.visibledatarow[row], freezen_px = Store.visibledatarow[freezen_rowindex];\r\n\r\n            if (row_px <= freezen_px+left) {\r\n                setTimeout(function () {$(\"#luckysheet-scrollbar-y\").scrollTop(0);}, 100);\r\n            }\r\n        }\r\n    },\r\n    cancelFreezenHorizontal: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.default);\r\n\r\n        // \u89E3\u51B3freeze \u4E0D\u5782\u76F4\u5C45\u4E2D\u7684\u95EE\u9898\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.default}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        _this.freezenhorizontaldata = null;\r\n        let ishorizontal = $(\"#luckysheet-freezebar-horizontal\").is(\":visible\");\r\n        $(\"#luckysheet-freezebar-horizontal\").hide();\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null) {\r\n            currentSheet.freezen.horizontal = null;\r\n        }\r\n\r\n        if(currentSheet.frozen != null && ishorizontal){\r\n            server.saveParam(\"all\", sheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    createFreezenHorizontal: function (freezenhorizontaldata, top) {\r\n        let _this = this;\r\n\r\n        if (_this.initialHorizontal) {\r\n            _this.initialHorizontal = false;\r\n            $(\"#luckysheet-grid-window-1\").append(_this.freezenHorizontalHTML);\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-drop\").hover(function () {\r\n                $(this).parent().addClass(\"luckysheet-freezebar-hover\");\r\n            }, function () {\r\n                $(this).parent().removeClass(\"luckysheet-freezebar-hover\");\r\n            });\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-drop\").mousedown(function () {\r\n                _this.horizontalmovestate = true;\r\n                _this.horizontalmoveposition = $(this).position().top;\r\n                _this.windowHeight = $(\"#luckysheet-grid-window-1\").height();\r\n\r\n                $(this).parent().addClass(\"luckysheet-freezebar-active\");\r\n                $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css(\"cursor\", \"-webkit-grabbing\");\r\n            });\r\n\r\n            let gridwidth = $(\"#luckysheet-grid-window-1\").width();\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css({ \r\n                \"width\": gridwidth - 10, \r\n                \"height\": \"4px\", \r\n                \"cursor\": \"-webkit-grab\", \r\n                \"left\": \"0px\" \r\n            }).end().find(\".luckysheet-freezebar-horizontal-drop\").css({ \r\n                \"width\": gridwidth - 10, \r\n                \"height\": \"4px\", \r\n                \"left\": \"0px\", \r\n                \"cursor\": \"-webkit-grab\" \r\n            });\r\n        }\r\n\r\n        if (freezenhorizontaldata == null) {\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if (dataset_row_st == -1) {\r\n                dataset_row_st = 0;\r\n            }\r\n\r\n            top = Store.visibledatarow[dataset_row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            freezenhorizontaldata = [\r\n                Store.visibledatarow[dataset_row_st], \r\n                dataset_row_st + 1, \r\n                scrollTop, \r\n                _this.cutVolumn(Store.visibledatarow, dataset_row_st + 1), \r\n                top\r\n            ];\r\n            _this.saveFreezen(freezenhorizontaldata, top, null, null);\r\n        }\r\n\r\n        _this.freezenhorizontaldata = freezenhorizontaldata;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"fa fa-list-alt\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.freezenCancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        $(\"#luckysheet-freezebar-horizontal\").show().find(\".luckysheet-freezebar-horizontal-handle\").css({ \"top\": top }).end().find(\".luckysheet-freezebar-horizontal-drop\").css({ \"top\": top });\r\n    },\r\n    createAssistCanvas: function(){\r\n        let _this = this;\r\n        _this.removeAssistCanvas();\r\n\r\n        if (_this.freezenverticaldata != null || _this.freezenhorizontaldata != null) {\r\n            let freezen_horizon_px, freezen_horizon_ed, freezen_horizon_scrollTop;\r\n            let freezen_vertical_px, freezen_vertical_ed, freezen_vertical_scrollTop;\r\n            let drawWidth = Store.luckysheetTableContentHW[0], \r\n                drawHeight = Store.luckysheetTableContentHW[1];\r\n\r\n            //\u53CC\u5411freezen\r\n            if (_this.freezenverticaldata != null && _this.freezenhorizontaldata != null) {\r\n                freezen_horizon_px = _this.freezenhorizontaldata[0];\r\n                freezen_horizon_ed = _this.freezenhorizontaldata[1];\r\n                freezen_horizon_scrollTop = _this.freezenhorizontaldata[2];\r\n\r\n                freezen_vertical_px = _this.freezenverticaldata[0];\r\n                freezen_vertical_ed = _this.freezenverticaldata[1];\r\n                freezen_vertical_scrollTop = _this.freezenverticaldata[2];\r\n\r\n                //3\r\n                _this.createCanvas(\"freezen_3\", freezen_vertical_px - freezen_vertical_scrollTop, freezen_horizon_px - freezen_horizon_scrollTop + 1, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n                //4\r\n                _this.createCanvas(\"freezen_4\", drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, freezen_horizon_px - freezen_horizon_scrollTop + 1, freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n                //7\r\n                _this.createCanvas(\"freezen_7\", freezen_vertical_px - freezen_vertical_scrollTop, drawHeight - freezen_horizon_px + freezen_horizon_scrollTop - Store.columnHeaderHeight, Store.rowHeaderWidth - 1, freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight - 1);\r\n            }\r\n            //\u6C34\u5E73freezen\r\n            else if (_this.freezenhorizontaldata != null) {\r\n                freezen_horizon_px = _this.freezenhorizontaldata[0];\r\n                freezen_horizon_ed = _this.freezenhorizontaldata[1];\r\n                freezen_horizon_scrollTop = _this.freezenhorizontaldata[2];\r\n\r\n                _this.createCanvas(\"freezen_h\", drawWidth, freezen_horizon_px - freezen_horizon_scrollTop + 1, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n            }\r\n            //\u5782\u76F4freezen\r\n            else if (_this.freezenverticaldata != null) {\r\n                freezen_vertical_px = _this.freezenverticaldata[0];\r\n                freezen_vertical_ed = _this.freezenverticaldata[1];\r\n                freezen_vertical_scrollTop = _this.freezenverticaldata[2];\r\n\r\n                _this.createCanvas(\"freezen_v\", freezen_vertical_px - freezen_vertical_scrollTop, drawHeight, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n            }\r\n\r\n            _this.scrollAdapt();\r\n        }\r\n    },\r\n    createCanvas: function(id, width, height, left, top){\r\n        let c = $(\"<canvas/>\").appendTo(\"#luckysheet-grid-window-1\").attr({\r\n            \"id\": id, \r\n            \"width\": Math.ceil(width * Store.devicePixelRatio), \r\n            \"height\": Math.ceil(height * Store.devicePixelRatio)\r\n        }).css({\r\n            \"user-select\": \"none\",\r\n            \"postion\": \"absolute\",\r\n            \"left\": left, \r\n            \"top\": top,\r\n            \"width\": width, \r\n            \"height\": height, \r\n            \"z-index\": 10, \r\n            \"pointer-events\": \"none\"\r\n        });\r\n    },\r\n    removeAssistCanvas: function(){\r\n        $(\"#luckysheet-grid-window-1 > canvas\").not($(\"#luckysheetTableContent\")).remove();\r\n        $(\"#luckysheet-cell-selected\").css(\"z-index\", 15);\r\n    },\r\n    scrollAdapt: function(){\r\n        let _this = this;\r\n\r\n        //\u6709\u51BB\u7ED3\u65F6 \u9009\u533A\u6846 \u6EDA\u52A8\u9002\u5E94\r\n        if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n            _this.scrollAdaptOfselect();    \r\n        }\r\n\r\n        //\u6709\u51BB\u7ED3\u65F6 \u56FE\u8868\u6846 \u6EDA\u52A8\u9002\u5E94\r\n        if($(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").length > 0){\r\n\r\n            // \u5F53\u524Dsheet\u6709\u56FE\u8868\u624D\u9700\u8981\u6EDA\u52A8\u9002\u5E94\r\n            const chart = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"chart\"];\r\n            \r\n            if(chart != null && chart.length > 0){\r\n                _this.scrollAdaptOfchart();\r\n            }\r\n        }\r\n\r\n        //\u6709\u51BB\u7ED3\u65F6 \u6279\u6CE8\u6846 \u6EDA\u52A8\u9002\u5E94\r\n        if($(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").length > 0){\r\n            _this.scrollAdaptOfpostil();               \r\n        }\r\n\r\n        //\u6709\u51BB\u7ED3\u65F6 \u4E0B\u62C9\u9009\u533A\u56FE\u6807 \u6EDA\u52A8\u9002\u5E94\r\n        if($(\"#luckysheet-dropCell-icon\").length > 0){\r\n            _this.scrollAdaptOfdpicon();\r\n        }\r\n\r\n        //\u6709\u51BB\u7ED3\u65F6 \u7B5B\u9009\u4E0B\u62C9\u6309\u94AE \u6EDA\u52A8\u9002\u5E94\r\n        if($(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").length > 0){\r\n            _this.scrollAdaptOffilteroptions();\r\n        }\r\n    },\r\n    scrollAdaptOfselect: function(){\r\n        let _this = this;\r\n\r\n        if($(\"#luckysheet-row-count-show\").is(\":visible\")){\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n        }\r\n\r\n        if($(\"#luckysheet-column-count-show\").is(\":visible\")){\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        }\r\n\r\n        $(\"#luckysheet-rows-h-selected\").empty();\r\n        $(\"#luckysheet-cols-h-selected\").empty();\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if (_this.freezenhorizontaldata != null && _this.freezenverticaldata != null) {\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let r1 = obj.row[0], \r\n                    r2 = obj.row[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n\r\n                let top_move = row_pre;\r\n                let height_move = row - row_pre - 1;\r\n\r\n                let rangeshow = true;\r\n\r\n                if(r1 >= freezen_rowindex){//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5916\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        rangeshow = false;\r\n                    }\r\n                    else if(top_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": freezenTop + offTop,\r\n                            \"height\": height_move - (freezenTop + offTop - top_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move,\r\n                            \"height\": height_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(r2 >= freezen_rowindex){//\u539F\u9009\u533A\u6709\u4E00\u90E8\u5206\u5728\u51BB\u7ED3\u533A\u5185\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": freezenTop - top_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": height_move - offTop\r\n                        });\r\n                    }\r\n                }\r\n                else{//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5185\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"top\", top_move + offTop);\r\n                }\r\n\r\n                let c1 = obj.column[0], \r\n                    c2 = obj.column[1];\r\n\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                let left_move = col_pre;\r\n                let width_move = col - col_pre - 1;\r\n\r\n                if(c1 >= freezen_colindex){//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5916\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        rangeshow = false;\r\n                    }\r\n                    else if(left_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": freezenLeft + offLeft,\r\n                            \"width\": width_move - (freezenLeft + offLeft - left_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move,\r\n                            \"width\": width_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(c2 >= freezen_colindex){//\u539F\u9009\u533A\u6709\u4E00\u90E8\u5206\u5728\u51BB\u7ED3\u533A\u5185\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": freezenLeft - left_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": width_move - offLeft\r\n                        });\r\n                    }\r\n                }\r\n                else{//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5185\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"left\", left_move + offLeft);\r\n                }\r\n\r\n                if(!rangeshow){\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? r1 : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? c1 : obj.column_focus;\r\n                    \r\n                    let row_f = Store.visibledatarow[rf], \r\n                        row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n                    let col_f = Store.visibledatacolumn[cf], \r\n                        col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        row_f = margeset.row[1];\r\n                        row_pre_f = margeset.row[0];\r\n\r\n                        col_f = margeset.column[1];\r\n                        col_pre_f = margeset.column[0];\r\n                    }\r\n\r\n                    let top = row_pre_f;\r\n                    let height = row_f - row_pre_f - 1;\r\n\r\n                    let left = col_pre_f;\r\n                    let width = col_f - col_pre_f - 1;\r\n\r\n                    let focuscell = true;\r\n\r\n                    if(top >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            focuscell = false;\r\n                        }\r\n                        else if(top < freezenTop + offTop){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": freezenTop + offTop,\r\n                                \"height\": height - (freezenTop + offTop - top)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top,\r\n                                \"height\": height\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(top + height >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": freezenTop - top\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": height - offTop\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"top\", top + offTop);\r\n                    }\r\n\r\n                    if(left >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            focuscell = false;\r\n                        }\r\n                        else if(left < freezenLeft + offLeft){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": freezenLeft + offLeft,\r\n                                \"width\": width - (freezenLeft + offLeft - left)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left,\r\n                                \"width\": width\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(left + width >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": freezenLeft - left\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": width - offLeft\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"left\", left + offLeft);\r\n                    }\r\n\r\n                    if(!focuscell){\r\n                        $(\"#luckysheet-cell-selected-focus\").hide();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (_this.freezenhorizontaldata != null) {\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let r1 = obj.row[0], \r\n                    r2 = obj.row[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n\r\n                let top_move = row_pre;\r\n                let height_move = row - row_pre - 1;\r\n\r\n                if(r1 >= freezen_rowindex){//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5916\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                    }\r\n                    else if(top_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": freezenTop + offTop,\r\n                            \"height\": height_move - (freezenTop + offTop - top_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move,\r\n                            \"height\": height_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(r2 >= freezen_rowindex){//\u539F\u9009\u533A\u6709\u4E00\u90E8\u5206\u5728\u51BB\u7ED3\u533A\u5185\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": freezenTop - top_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": height_move - offTop\r\n                        });\r\n                    }\r\n                }\r\n                else{//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5185\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"top\", top_move + offTop);\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? r1 : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? obj.column[0] : obj.column_focus;\r\n                    \r\n                    let row_f = Store.visibledatarow[rf], \r\n                        row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        row_f = margeset.row[1];\r\n                        row_pre_f = margeset.row[0];\r\n                    }\r\n\r\n                    let top = row_pre_f;\r\n                    let height = row_f - row_pre_f - 1;\r\n\r\n                    if(top >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").hide();\r\n                        }\r\n                        else if(top < freezenTop + offTop){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": freezenTop + offTop,\r\n                                \"height\": height - (freezenTop + offTop - top)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top,\r\n                                \"height\": height\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(top + height >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": freezenTop - top\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": height - offTop\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"top\", top + offTop);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (_this.freezenverticaldata != null) {\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let c1 = obj.column[0], \r\n                    c2 = obj.column[1];\r\n\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                let left_move = col_pre;\r\n                let width_move = col - col_pre - 1;\r\n\r\n                if(c1 >= freezen_colindex){//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5916\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                    }\r\n                    else if(left_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": freezenLeft + offLeft,\r\n                            \"width\": width_move - (freezenLeft + offLeft - left_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move,\r\n                            \"width\": width_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(c2 >= freezen_colindex){//\u539F\u9009\u533A\u6709\u4E00\u90E8\u5206\u5728\u51BB\u7ED3\u533A\u5185\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": freezenLeft - left_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": width_move - offLeft\r\n                        });\r\n                    }\r\n                }\r\n                else{//\u539F\u9009\u533A\u5728\u51BB\u7ED3\u533A\u5185\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"left\", left_move + offLeft);\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? obj.row[0] : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? c1 : obj.column_focus;\r\n                    \r\n                    let col_f = Store.visibledatacolumn[cf], \r\n                        col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        col_f = margeset.column[1];\r\n                        col_pre_f = margeset.column[0];\r\n                    }\r\n\r\n                    let left = col_pre_f;\r\n                    let width = col_f - col_pre_f - 1;\r\n\r\n                    if(left >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").hide();\r\n                        }\r\n                        else if(left < freezenLeft + offLeft){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": freezenLeft + offLeft,\r\n                                \"width\": width - (freezenLeft + offLeft - left)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left,\r\n                                \"width\": width\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(left + width >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": freezenLeft - left\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": width - offLeft\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"left\", left + offLeft);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    scrollAdaptOfchart: function(){\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2];\r\n            let freezenLeft = _this.freezenverticaldata[0] - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n                let height = $(e).height();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n                let width_diff = $canvas_width - width;\r\n\r\n                if((x.top - height_diff) < freezenTop){\r\n                    let size = freezenTop - (x.top - height_diff);\r\n\r\n                    if(size > ($canvas_height + 40 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"top\": freezenTop + scrollTop,\r\n                            \"height\": $canvas_height - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"top\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"top\": x.top - height_diff + scrollTop,\r\n                        \"height\": $canvas_height,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"top\", 0);\r\n                }\r\n\r\n                if((x.left - width_diff) < freezenLeft){\r\n                    let size = freezenLeft - (x.left - width_diff);\r\n\r\n                    if(size > ($canvas_width + 20 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"left\": freezenLeft + scrollLeft,\r\n                            \"width\": $canvas_width - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"left\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"left\": x.left - width_diff + scrollLeft,\r\n                        \"width\": $canvas_width,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"left\", 0);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let height = $(e).height();\r\n                \r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n\r\n                if((x.top - height_diff) < freezenTop){\r\n                    let size = freezenTop - (x.top - height_diff);\r\n\r\n                    if(size > ($canvas_height + 40 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"top\": freezenTop + scrollTop,\r\n                            \"height\": $canvas_height - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"top\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"top\": x.top - height_diff + scrollTop,\r\n                        \"height\": $canvas_height,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"top\", 0);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezenLeft = _this.freezenverticaldata[0] - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n\r\n                let width_diff = $canvas_width - width;\r\n\r\n                if((x.left - width_diff) < freezenLeft){\r\n                    let size = freezenLeft - (x.left - width_diff);\r\n\r\n                    if(size > ($canvas_width + 20 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"left\": freezenLeft + scrollLeft,\r\n                            \"width\": $canvas_width - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"left\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"left\": x.left - width_diff + scrollLeft,\r\n                        \"width\": $canvas_width,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"left\", 0);\r\n                }\r\n            })\r\n        }\r\n        else{\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n                let height = $(e).height();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n                let width_diff = $canvas_width - width;\r\n\r\n                $(e).css({\r\n                    \"top\": x.top - height_diff + scrollTop,\r\n                    \"height\": $canvas_height,\r\n                    \"left\": x.left - width_diff + scrollLeft,\r\n                    \"width\": $canvas_width,\r\n                    \"visibility\": \"visible\"\r\n                }); \r\n\r\n                $(e).find(\"canvas\").css({\r\n                    \"top\": 0,\r\n                    \"left\": 0\r\n                });\r\n            })\r\n        }\r\n    },\r\n    scrollAdaptOfpostil: function(){\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n                let show = true;\r\n                let show2 = true;\r\n\r\n                if(r >= _this.freezenhorizontaldata[1]){\r\n                    if(postil_top + postil_height < freezenTop){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                    }\r\n                    else{\r\n                        if(postil_top < freezenTop + offTop){\r\n                            if(postil_top + postil_height <= freezenTop + offTop){\r\n                                show = false;\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"top\": freezenTop + offTop, \"height\": postil_height - (freezenTop + offTop - postil_top) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", -(freezenTop + offTop - postil_top));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n\r\n                                show2 = false;\r\n                            }\r\n                        }\r\n                        else{\r\n                            $(e).show().find(\".luckysheet-postil-show-main\").css({\r\n                                \"top\": postil_top,\r\n                                \"height\": postil_height\r\n                            });\r\n                            $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", 0);\r\n                            $(e).show().find(\".arrowCanvas\").css(\"top\", size[1]);\r\n                            // luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                }\r\n\r\n                if(c >= _this.freezenverticaldata[1]){\r\n                    if(postil_left + postil_width < freezenLeft){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                    }\r\n                    else{\r\n                        if(postil_left < freezenLeft + offLeft){\r\n                            if(postil_left + postil_width <= freezenLeft + offLeft){\r\n                                show = false;\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"left\": freezenLeft + offLeft, \"width\": postil_width - (freezenLeft + offLeft - postil_left) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", -(freezenLeft + offLeft - postil_left));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n\r\n                                show2 = false;\r\n                            }\r\n                        }\r\n                        else{\r\n                            $(e).show().find(\".luckysheet-postil-show-main\").css({\r\n                                \"left\": postil_left,\r\n                                \"width\": postil_width   \r\n                            });\r\n                            $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", 0);\r\n                            $(e).show().find(\".arrowCanvas\").css(\"left\", size[0]);\r\n                            // luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                }\r\n\r\n                if(!show){\r\n                    $(e).hide();\r\n                }\r\n\r\n                if(show && show2){\r\n                    $(e).show().find(\".arrowCanvas\").show();\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n\r\n                if(r >= _this.freezenhorizontaldata[1]){\r\n                    if(postil_top + postil_height < freezenTop){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                    }\r\n                    else{\r\n                        if(postil_top < freezenTop + offTop){\r\n                            if(postil_top + postil_height <= freezenTop + offTop){\r\n                                $(e).hide();\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"top\": freezenTop + offTop, \"height\": postil_height - (freezenTop + offTop - postil_top) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", -(freezenTop + offTop - postil_top));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n                            }\r\n                        }\r\n                        else{\r\n                            luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n\r\n                if(c >= _this.freezenverticaldata[1]){\r\n                    if(postil_left + postil_width < freezenLeft){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                    }\r\n                    else{\r\n                        if(postil_left < freezenLeft + offLeft){\r\n                            if(postil_left + postil_width <= freezenLeft + offLeft){\r\n                                $(e).hide();\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"left\": freezenLeft + offLeft, \"width\": postil_width - (freezenLeft + offLeft - postil_left) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", -(freezenLeft + offLeft - postil_left));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n                            }\r\n                        }\r\n                        else{\r\n                            luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                }\r\n            })\r\n        }\r\n        else{\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                luckysheetPostil.buildPs(r, c, postil);\r\n            })\r\n        }\r\n    },\r\n    scrollAdaptOfdpicon: function(){\r\n        let _this = this;\r\n\r\n        let copy_r = luckysheetDropCell.copyRange[\"row\"][1], \r\n            copy_c = luckysheetDropCell.copyRange[\"column\"][1];\r\n        \r\n        let apply_r = luckysheetDropCell.applyRange[\"row\"][1], \r\n            apply_c = luckysheetDropCell.applyRange[\"column\"][1];\r\n        \r\n        let row_index, col_index;\r\n        if(apply_r >= copy_r && apply_c >= copy_c){\r\n            row_index = apply_r;\r\n            col_index = apply_c;\r\n        }\r\n        else{\r\n            row_index = copy_r;\r\n            col_index = copy_c;   \r\n        }\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offsetRow = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop() - _this.freezenhorizontaldata[2]);\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            if(row_index >= freezen_rowindex && col_index >= freezen_colindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1) || col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else if(row_index >= freezen_rowindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    let col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                    $(\"#luckysheet-dropCell-icon\").show().css(\"left\", col);\r\n                }\r\n            }\r\n            else if(col_index >= freezen_colindex){\r\n                if(col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    let row = rowLocationByIndex(row_index + offsetRow)[1];\r\n\r\n                    $(\"#luckysheet-dropCell-icon\").show().css(\"top\", row);\r\n                }\r\n            }\r\n            else{\r\n                let row = rowLocationByIndex(row_index + offsetRow)[1],\r\n                    col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css({ \"left\": col, \"top\": row });\r\n            }\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offsetRow = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop() - _this.freezenhorizontaldata[2]);\r\n\r\n            if(row_index >= freezen_rowindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else{\r\n                let row = rowLocationByIndex(row_index + offsetRow)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css(\"top\", row);\r\n            }\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            if(col_index >= freezen_colindex){\r\n                if(col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else{\r\n                let col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css(\"left\", col);\r\n            }\r\n        }\r\n        else{\r\n            let row = rowLocationByIndex(row_index)[1],\r\n                col = colLocationByIndex(col_index)[1];\r\n\r\n            $(\"#luckysheet-dropCell-icon\").show().css({ \"left\": col, \"top\": row });\r\n        }\r\n    },\r\n    scrollAdaptOffilteroptions: function(){\r\n        let _this = this;\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let freezen_top = _this.freezenhorizontaldata[0] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let row_index = $(e).data(\"str\");\r\n                let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n\r\n                let col_index = $(e).data(\"cindex\");\r\n\r\n                if(row_index >= freezen_rowindex && col_index >= freezen_colindex){\r\n                    if(top < freezen_top || col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else if(row_index >= freezen_rowindex){\r\n                    if(top < freezen_top){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                        $(e).show().css(\"left\", left);\r\n                    }\r\n                }\r\n                else if(col_index >= freezen_colindex){\r\n                    if(col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show().css(\"top\", top + $(\"#luckysheet-cell-main\").scrollTop());\r\n                    }\r\n                }\r\n                else{\r\n                    let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                    $(e).show().css({ \"left\": left, \"top\": top + $(\"#luckysheet-cell-main\").scrollTop() });\r\n                }\r\n            });\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let freezen_top = _this.freezenhorizontaldata[0] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let row_index = $(e).data(\"str\");\r\n                let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n\r\n                if(row_index >= freezen_rowindex){\r\n                    if(top < freezen_top){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().css(\"top\", top + $(\"#luckysheet-cell-main\").scrollTop());\r\n                }\r\n            });\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let col_index = $(e).data(\"cindex\");\r\n\r\n                if(col_index >= freezen_colindex){\r\n                    if(col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else{\r\n                    let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                    $(e).show().css(\"left\", left);\r\n                }\r\n            });\r\n        }\r\n        else{\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex).empty();\r\n            createFilterOptions(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select);\r\n        }\r\n    },\r\n    /**\r\n     * \r\n     * @param {string} operate  \"freezenRow\"/ \"freezenColumn\"......\r\n     * @param {Number | String} order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n     * @param {Object} focus \u51BB\u7ED3\u9009\u533A\u65F6\u7684focus\u5355\u5143\u683C\u884C\u5217\u503C\u6784\u6210\u7684\u5BF9\u8C61\uFF1B\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\r\n     */\r\n    saveFrozen: function(operate, order, focus = {}) {\r\n        if (order == null) {\r\n            order = getSheetIndex(Store.currentSheetIndex)\r\n        }\r\n        \r\n        // New configuration attribute of sheet: frozen, which stores more semantic configuration for initialization and transmission to the backend. freezenhorizontaldata is still used as local data\r\n\r\n        const select_save = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        const row_focus = select_save[\"row_focus\"] == null ? select_save[\"row\"][0] : select_save[\"row_focus\"];\r\n        const column_focus = select_save[\"column_focus\"] == null ? select_save[\"column\"][0] : select_save[\"column_focus\"];\r\n\r\n        const range = {\r\n            row_focus: focus.row_focus || row_focus,\r\n            column_focus: focus.column_focus || column_focus\r\n        }\r\n\r\n        const frozen = {\r\n            \"freezenRow\": {\r\n                type: 'row'\r\n            },\r\n            \"freezenColumn\": {\r\n                type: 'column'\r\n            },\r\n            \"freezenRC\": {\r\n                type: 'both'\r\n            },\r\n            \"freezenRowRange\": {\r\n                type: 'rangeRow',\r\n                range: range\r\n            },\r\n            \"freezenColumnRange\": {\r\n                type: 'rangeColumn',\r\n                range: range\r\n            },\r\n            \"freezenRCRange\": {\r\n                type: 'rangeBoth',\r\n                range: range\r\n            },\r\n            \"freezenCancel\": {\r\n                type: 'cancel'\r\n            }\r\n        }\r\n\r\n        // store frozen\r\n        Store.luckysheetfile[order][\"frozen\"] = frozen[operate];\r\n    },\r\n    frozenTofreezen: function() {\r\n        // get frozen type\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        const frozen = file[\"frozen\"];\r\n\r\n        if(frozen == null){\r\n            return;\r\n        }\r\n\r\n        let freezen = null;\r\n\r\n        // transform to freezen\r\n        if(frozen.type === 'row'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n            \r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                }\r\n            }\r\n            \r\n        }\r\n        else if(frozen.type === 'column'){\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n        }\r\n        else if(frozen.type === 'both'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n            \r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                },\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeRow'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = frozen.range[\"row_focus\"];\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n            \r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeColumn'){\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = frozen.range[\"column_focus\"];\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeBoth'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = frozen.range[\"row_focus\"];\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n            \r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = frozen.range[\"column_focus\"];\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                },\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n        }\r\n        else if(frozen.type === 'cancel'){\r\n            freezen = {\r\n                horizontal: null,\r\n                vertical: null\r\n            }\r\n        }\r\n\r\n        file[\"freezen\"] = freezen;\r\n    }\r\n}\r\n\r\nexport default luckysheetFreezen;", "import luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport luckysheetFreezen from './freezen';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport sheetmanage from './sheetmanage';\r\nimport tooltip from '../global/tooltip'\r\nimport { $$, getObjType, camel2split } from \"../utils/util\";\r\nimport { defaultToolbar, toolbarIdMap } from './toolbar';\r\n\r\nlet gridW = 0,\r\n    gridH = 0;\r\n\r\nexport default function luckysheetsizeauto(isRefreshCanvas=true) {\r\n    if (!luckysheetConfigsetting.showinfobar) {\r\n        Store.infobarHeight = 0;\r\n        $(\"#luckysheet_info_detail\").hide();\r\n    }\r\n    else {\r\n        $(\"#luckysheet_info_detail\").show();\r\n        // Store.infobarHeight = 56;\r\n        Store.infobarHeight = document.querySelector('#luckysheet_info_detail').offsetHeight;\r\n    }\r\n\r\n    if (!!Store.toobarObject && !!Store.toobarObject.toobarElements && Store.toobarObject.toobarElements.length === 0) {\r\n        $(\"#\" + Store.container).find(\".luckysheet-wa-editor\").hide();\r\n        Store.toolbarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\".luckysheet-wa-editor\").show();\r\n        // Store.toolbarHeight = 72;\r\n        Store.toolbarHeight = document.querySelector('#' + Store.container +' .luckysheet-wa-editor').offsetHeight;\r\n    }\r\n\r\n    // if (!luckysheetConfigsetting.showsheetbar) {\r\n    //     $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").hide();\r\n    //     Store.sheetBarHeight = 0;\r\n    // }\r\n    // else {\r\n    //     $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").show();\r\n    //     Store.sheetBarHeight = 31;\r\n    // }\r\n\r\n\r\n    customSheetbarConfig();\r\n\r\n    // if (!luckysheetConfigsetting.showstatisticBar) {\r\n    //     $(\"#\" + Store.container).find(\".luckysheet-stat-area\").hide();\r\n    //     Store.statisticBarHeight = 0;\r\n    // }\r\n    // else {\r\n    //     $(\"#\" + Store.container).find(\".luckysheet-stat-area\").show();\r\n    //     Store.statisticBarHeight = 23;\r\n    // }\r\n\r\n    customStatisticBarConfig();\r\n\r\n    // \u516C\u5F0F\u680F\r\n    const formulaEle = document.querySelector(\"#\" + Store.container + ' .luckysheet-wa-calculate');\r\n    if (!luckysheetConfigsetting.sheetFormulaBar) {\r\n        formulaEle.style.display = 'none';\r\n        Store.calculatebarHeight = 0;\r\n    }\r\n    else {\r\n        formulaEle.style.display = 'block';\r\n        Store.calculatebarHeight = formulaEle.offsetHeight;\r\n    }\r\n\r\n    $(\"#\" + Store.container).find(\".luckysheet-grid-container\").css(\"top\", Store.toolbarHeight + Store.infobarHeight + Store.calculatebarHeight);\r\n\r\n    gridW = $(\"#\" + Store.container).width();\r\n\r\n    if(luckysheetConfigsetting.showConfigWindowResize){//\u6570\u636E\u900F\u89C6\u8868  \u56FE\u8868  \u4EA4\u66FF\u989C\u8272 Protection\r\n        if($(\"#luckysheet-modal-dialog-slider-pivot\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-pivot\").outerWidth();\r\n        }\r\n        else if($(\".chartSetting\").is(\":visible\")){\r\n            gridW -= $(\".chartSetting\").outerWidth();\r\n        }\r\n        else if($(\"#luckysheet-modal-dialog-slider-alternateformat\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-alternateformat\").outerWidth();\r\n        }\r\n        if($(\"#luckysheet-modal-dialog-slider-protection\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-protection\").outerWidth();\r\n        }\r\n    }\r\n\r\n    const _locale = locale();\r\n    const locale_toolbar = _locale.toolbar;\r\n    let ismore = false,\r\n        toolbarW = 0,\r\n        morebtn = `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${locale_toolbar.toolMoreTip}\" id=\"luckysheet-icon-morebtn\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\" style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\" style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                        ${locale_toolbar.toolMore}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\" style=\"user-select: none;font-size:12px;\">\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n         </div>`,\r\n         // Add style left:$$('.luckysheet') left, when the worksheet does not fill the full screen\r\n        morediv = '<div id=\"luckysheet-icon-morebtn-div\" class=\"luckysheet-wa-editor\" style=\"position:absolute;top:'+ (Store.infobarHeight + Store.toolbarHeight + $(\"#\" + Store.container).offset().top + $(\"body\").scrollTop()) +'px;right:0px;z-index:1003;padding:5.5px;visibility:hidden;height:auto;white-space:initial;\"></div>';\r\n\r\n    if($(\"#luckysheet-icon-morebtn-div\").length == 0){\r\n        $(\"body\").append(morediv);\r\n    }\r\n\r\n    // $(\"#luckysheet-icon-morebtn-div\").hide();\r\n    $$(\"#luckysheet-icon-morebtn-div\").style.visibility = 'hidden';\r\n    // $(\"#luckysheet-icon-morebtn-div > div\").appendTo($(\"#luckysheet-wa-editor\"));\r\n\r\n    $(\"#luckysheet-icon-morebtn-div > div\").each(function(){\r\n        const $t = $(this)[0];\r\n        const $container =  $(\"#luckysheet-wa-editor\")[0];\r\n\r\n        $container.appendChild(document.createTextNode(\" \"));\r\n\r\n        $container.appendChild($t);\r\n    });\r\n\r\n    $(\"#luckysheet-icon-morebtn\").remove();\r\n\r\n    // \u6240\u6709\u6309\u94AE\u5BBD\u5EA6\u4E0E\u5143\u7D20\u5B9A\u4F4D\r\n    const toobarWidths = Store.toobarObject.toobarWidths;\r\n    const toobarElements = Store.toobarObject.toobarElements;\r\n    let moreButtonIndex = 0;\r\n\r\n    // When you resize the window during initialization, you will find that the dom has not been rendered yet\r\n    if(toobarWidths == undefined){\r\n        return;\r\n    }\r\n    // \u627E\u5230\u5E94\u8BE5\u9690\u85CF\u7684\u8D77\u59CB\u5143\u7D20\u4F4D\u7F6E\r\n    for (let index = toobarWidths.length - 1; index >= 0; index--) {\r\n\r\n        // #luckysheet-icon-morebtn button width plus right is 83px\r\n        if(toobarWidths[index] < gridW - 90){\r\n            moreButtonIndex = index;\r\n            if(moreButtonIndex < toobarWidths.length - 1){\r\n\r\n                ismore = true;\r\n            }\r\n            break;\r\n        }\r\n    }\r\n    // \u4ECE\u8D77\u59CB\u4F4D\u7F6E\u5F00\u59CB\uFF0C\u540E\u9762\u7684\u5143\u7D20\u7EDF\u4E00\u632A\u5230\u4E0B\u65B9\u9690\u85CFDIV\u4E2D\r\n    for (let index = moreButtonIndex; index < toobarElements.length; index++) {\r\n        const element = toobarElements[index];\r\n        if(element instanceof Array){\r\n            for(const ele of element){\r\n                $(\"#luckysheet-icon-morebtn-div\").append($(`${ele}`));\r\n            }\r\n        }else{\r\n            $(\"#luckysheet-icon-morebtn-div\").append($(`${element}`));\r\n        }\r\n\r\n    }\r\n\r\n    if(ismore){\r\n\r\n        $(\"#luckysheet-wa-editor\").append(morebtn);\r\n        $(\"#luckysheet-icon-morebtn\").click(function(){\r\n\r\n            //When resize, change the width of the more button container in real time\r\n            $$('#luckysheet-icon-morebtn-div').style.left = '';//reset\r\n\r\n            const containerLeft = $$('#luckysheet').getBoundingClientRect ? $$('#luckysheet').getBoundingClientRect().left : 0;\r\n            const morebtnLeft = $$('#luckysheet-icon-morebtn-div').getBoundingClientRect().left;//get real left info\r\n\r\n            if(morebtnLeft < containerLeft){\r\n                $$('#luckysheet-icon-morebtn-div').style.left = containerLeft + 'px';\r\n            }\r\n\r\n            let right = $(window).width() - $(\"#luckysheet-icon-morebtn\").offset().left - $(\"#luckysheet-icon-morebtn\").width()+ $(\"body\").scrollLeft();\r\n\r\n\r\n            // $(\"#luckysheet-icon-morebtn-div\").toggle().css(\"right\", right < 0 ? 0 : right);\r\n\r\n            // use native js operation\r\n            $$('#luckysheet-icon-morebtn-div').style.right = right < 0 ? 0 : right + 'px';\r\n\r\n            // change to visibility,morebtnLeft will get the actual value\r\n            if($$('#luckysheet-icon-morebtn-div').style.visibility === 'hidden'){\r\n                $$('#luckysheet-icon-morebtn-div').style.visibility = 'visible';\r\n            }else{\r\n                $$('#luckysheet-icon-morebtn-div').style.visibility = 'hidden';\r\n            }\r\n\r\n            let $txt = $(this).find(\".luckysheet-toolbar-menu-button-caption\");\r\n            if($txt.text().indexOf(locale_toolbar.toolMore) > -1){\r\n\r\n                const toolCloseHTML = `\r\n                <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                    ${locale_toolbar.toolClose}\r\n                </div>\r\n                <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-shangyige\" style=\"user-select: none;font-size:12px;\">\r\n                </div>\r\n                `\r\n                $(this).find(\".luckysheet-toolbar-button-inner-box\").html(toolCloseHTML);\r\n            }\r\n            else{\r\n\r\n                const toolMoreHTML = `\r\n                <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                    ${locale_toolbar.toolMore}\r\n                </div>\r\n                <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige\" style=\"user-select: none;font-size:12px;\">\r\n                </div>\r\n                `\r\n\r\n                $(this).find(\".luckysheet-toolbar-button-inner-box\").html(toolMoreHTML);\r\n            }\r\n\r\n        });\r\n        //$(\"#luckysheet-wa-editor div\").trigger(\"create\");\r\n\r\n        // $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-menu-button\").css(\"margin-right\", -1);\r\n        // $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left\").css(\"margin-right\", -3);\r\n\r\n        // \u201C\u66F4\u591A\u201D\u5BB9\u5668\u4E2D\uFF0C\u8054\u52A8hover\u6548\u679C\r\n        $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left\").off(\"hover\").hover(function(){\r\n            $(this).next(\".luckysheet-toolbar-button-split-right\").addClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n        }, function(){\r\n            $(this).next(\".luckysheet-toolbar-button-split-right\").removeClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n        });\r\n\r\n        $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-right\").off(\"hover\").hover(function(){\r\n            $(this).prev(\".luckysheet-toolbar-button-split-left\").addClass(\"luckysheet-toolbar-button-hover\");\r\n        }, function(){\r\n            $(this).prev(\".luckysheet-toolbar-button-split-left\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n        });\r\n\r\n        // tooltip\r\n        tooltip.createHoverTip(\"#luckysheet-icon-morebtn-div\" ,\".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button\");\r\n    }\r\n\r\n    $(\"#\"+ Store.container + \" .luckysheet-wa-editor .luckysheet-toolbar-button-split-left\").off(\"hover\").hover(function(){\r\n        $(this).next(\".luckysheet-toolbar-button-split-right\").addClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n    }, function(){\r\n        $(this).next(\".luckysheet-toolbar-button-split-right\").removeClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n    });\r\n\r\n    $(\"#\"+ Store.container + \" .luckysheet-wa-editor .luckysheet-toolbar-button-split-right\").off(\"hover\").hover(function(){\r\n        $(this).prev(\".luckysheet-toolbar-button-split-left\").addClass(\"luckysheet-toolbar-button-hover\");\r\n    }, function(){\r\n        $(this).prev(\".luckysheet-toolbar-button-split-left\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n    });\r\n\r\n    // When adding elements to the luckysheet-icon-morebtn-div element of the toolbar, it will affect the height of the entire workbook area, so the height is obtained here\r\n    gridH = $(\"#\" + Store.container).height();\r\n\r\n    $(\"#\" + Store.container).find(\".luckysheet\").height(gridH - 2).width(gridW - 2);\r\n\r\n    changeSheetContainerSize(gridW, gridH)\r\n\r\n    if(isRefreshCanvas){\r\n        luckysheetrefreshgrid($(\"#luckysheet-cell-main\").scrollLeft(), $(\"#luckysheet-cell-main\").scrollTop());\r\n    }\r\n\r\n    sheetmanage.sheetArrowShowAndHide();\r\n    sheetmanage.sheetBarShowAndHide();\r\n}\r\n\r\n\r\nexport function changeSheetContainerSize(gridW, gridH){\r\n    if(gridW==null){\r\n        gridW = $(\"#\" + Store.container).width();\r\n    }\r\n\r\n    if(gridH==null){\r\n        gridH = $(\"#\" + Store.container).height();\r\n    }\r\n    Store.cellmainHeight = gridH - (Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight + Store.sheetBarHeight + Store.statisticBarHeight);\r\n    Store.cellmainWidth = gridW - Store.rowHeaderWidth;\r\n\r\n    $(\"#luckysheet-cols-h-c, #luckysheet-cell-main\").width(Store.cellmainWidth);\r\n    $(\"#luckysheet-cell-main\").height(Store.cellmainHeight);\r\n    $(\"#luckysheet-rows-h\").height(Store.cellmainHeight - Store.cellMainSrollBarSize);\r\n\r\n    $(\"#luckysheet-scrollbar-y\").height(Store.cellmainHeight + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3);\r\n    $(\"#luckysheet-scrollbar-x\").height(Store.cellMainSrollBarSize);\r\n    $(\"#luckysheet-scrollbar-y\").width(Store.cellMainSrollBarSize);\r\n\r\n    $(\"#luckysheet-scrollbar-x\").width(Store.cellmainWidth).css(\"left\", Store.rowHeaderWidth - 2);\r\n\r\n    Store.luckysheetTableContentHW = [\r\n        Store.cellmainWidth + Store.rowHeaderWidth - Store.cellMainSrollBarSize,\r\n        Store.cellmainHeight + Store.columnHeaderHeight - Store.cellMainSrollBarSize\r\n    ];\r\n\r\n    $(\"#luckysheetTableContent, #luckysheetTableContentF\").attr({\r\n        width: Math.ceil(Store.luckysheetTableContentHW[0] * Store.devicePixelRatio),\r\n        height: Math.ceil(Store.luckysheetTableContentHW[1] * Store.devicePixelRatio)\r\n    })\r\n    .css({ width: Store.luckysheetTableContentHW[0], height: Store.luckysheetTableContentHW[1] });\r\n\r\n    $(\"#\" + Store.container).find(\"#luckysheet-grid-window-1\").css(\"bottom\", Store.sheetBarHeight);\r\n    $(\"#\" + Store.container).find(\".luckysheet-grid-window\").css(\"bottom\", Store.statisticBarHeight);\r\n\r\n    let gridwidth = $(\"#luckysheet-grid-window-1\").width();\r\n    $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\")\r\n    .css({ \"width\": gridwidth - 10 })\r\n    .end()\r\n    .find(\".luckysheet-freezebar-horizontal-drop\")\r\n    .css({ \"width\": gridwidth - 10 });\r\n\r\n    let gridheight = $(\"#luckysheet-grid-window-1\").height();\r\n    $(\"#luckysheet-freezebar-vertical\")\r\n    .find(\".luckysheet-freezebar-vertical-handle\")\r\n    .css({ \"height\": gridheight - 10 })\r\n    .end()\r\n    .find(\".luckysheet-freezebar-vertical-drop\")\r\n    .css({ \"height\": gridheight - 10 });\r\n\r\n    luckysheetFreezen.createAssistCanvas();\r\n}\r\n\r\n/**\r\n *\r\n *\r\n * Toolbar judgment rules: First set the display and hide of all tool buttons according to showtoolbar, and then override the judgment of showtoolbar according to showtoolbarConfig rules\r\n *\r\n * The width value of each button in the statistics toolbar is used to calculate which needs to be placed in more buttons\r\n */\r\nexport function menuToolBarWidth() {\r\n    const showtoolbar = luckysheetConfigsetting.showtoolbar;\r\n    const showtoolbarConfig = luckysheetConfigsetting.showtoolbarConfig;\r\n\r\n    const toobarWidths = Store.toobarObject.toobarWidths = [];\r\n    const toobarElements = Store.toobarObject.toobarElements = [];\r\n    const toolbarConfig = Store.toobarObject.toolbarConfig = buildBoolBarConfig();\r\n\r\n    /**\r\n     * \u57FA\u4E8E showtoolbarConfig \u914D\u7F6E \u52A8\u6001\u751F\u6210 toolbarConfig\r\n     * @returns {object}\r\n     * @input showtoolbarConfig = ['undo', 'redo', '|' , 'font' , 'moreFormats', '|']\r\n     * {\r\n     *     undo: {ele: '#luckysheet-icon-undo', index: 0},\r\n     *     redo: {ele: ['#luckysheet-icon-redo', '#luckysheet-separator-redo'], index: 1},\r\n     *     undo: {ele: '#luckysheet-icon-font', index: 2},\r\n     *     moreFormats: {ele: ['#luckysheet-icon-fmt-other', '#luckysheet-separator-more-formats'], index: 3},\r\n     * }\r\n     */\r\n    function buildBoolBarConfig() {\r\n        let obj = {};\r\n        function array2Config(arr) {\r\n            const obj = {};\r\n            let current,next;\r\n            let index = 0;\r\n            for (let i = 0; i<arr.length; i++) {\r\n                current = arr[i];\r\n                next = arr[i + 1];\r\n                if (current !== '|') {\r\n                    obj[current] = {\r\n                        ele: toolbarIdMap[current],\r\n                        index: index++\r\n                    }\r\n                }\r\n                if (next === '|') {\r\n                    if (getObjType(obj[current].ele) === 'array') {\r\n                        obj[current].ele.push(`#toolbar-separator-${camel2split(current)}`);\r\n                    } else {\r\n                        obj[current].ele = [obj[current].ele, `#toolbar-separator-${camel2split(current)}`];\r\n                    }\r\n                }\r\n            }\r\n            return obj;\r\n        }\r\n        // \u6570\u7EC4\u5F62\u5F0F\u76F4\u63A5\u751F\u6210\r\n        if (getObjType(showtoolbarConfig) === 'array') {\r\n            // show \u4E3A false\r\n            if (!showtoolbar) {\r\n                return obj;\r\n            }\r\n            return array2Config(showtoolbarConfig);\r\n        }\r\n        // \u5426\u5219\u4E3A\u5168\u90E8\u4E2D\u4ECE\u8BB0\u5F55\u4E2D\u6311\u9009\u663E\u793A\u6216\u9690\u85CF\r\n        const config = defaultToolbar.reduce(function(total, curr) {\r\n            if (curr !== '|') {\r\n                total[curr] = true;\r\n            }\r\n            return total;\r\n        }, {});\r\n        if (!showtoolbar) {\r\n            for (let s in config) {\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        if (JSON.stringify(showtoolbarConfig) !== '{}') {\r\n            if(showtoolbarConfig.hasOwnProperty('undoRedo')){\r\n                config.undo = config.redo = showtoolbarConfig.undoRedo;\r\n\r\n            }\r\n            Object.assign(config, showtoolbarConfig);\r\n\r\n            let current,next;\r\n            let index = 0;\r\n            for (let i = 0; i<defaultToolbar.length; i++) {\r\n                current = defaultToolbar[i];\r\n                next = defaultToolbar[i + 1];\r\n                if (config[current] === false) {\r\n                    continue;\r\n                }\r\n                if (current !== '|' && config[current]) {\r\n\r\n                    obj[current] = {\r\n                        ele: toolbarIdMap[current],\r\n                        index: index++\r\n                    }\r\n                }\r\n                if (next === '|') {\r\n                    if (getObjType(obj[current].ele) === 'array') {\r\n                        obj[current].ele.push(`#toolbar-separator-${camel2split(current)}`);\r\n                    } else {\r\n                        obj[current].ele = [obj[current].ele, `#toolbar-separator-${camel2split(current)}`];\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            obj = showtoolbar ? array2Config(defaultToolbar) : {};\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    for (let s in toolbarConfig){\r\n        if (Object.prototype.hasOwnProperty.call(toolbarConfig, s)) {\r\n            toobarElements.push($.extend(true,{},toolbarConfig[s]));\r\n        }\r\n    }\r\n\r\n    toobarElements.sort(sortToolbar);\r\n\r\n    function sortToolbar(a,b) {\r\n        if(a.index > b.index){\r\n            return 1;\r\n        }else{\r\n            return -1;\r\n        }\r\n    }\r\n    toobarElements.forEach((curr,index,arr)=>{\r\n        arr[index] = curr.ele;\r\n\r\n        if(index !== toobarElements.length - 1){\r\n            if(curr.ele instanceof Array){\r\n                toobarWidths.push($(curr.ele[0]).offset().left);\r\n            }else{\r\n                toobarWidths.push($(curr.ele).offset().left);\r\n            }\r\n        }else{\r\n            if(curr.ele instanceof Array){\r\n                toobarWidths.push($(curr.ele[0]).offset().left);\r\n                toobarWidths.push($(curr.ele[0]).offset().left + $(curr.ele[0]).outerWidth() + 5);\r\n            }else{\r\n                toobarWidths.push($(curr.ele).offset().left);\r\n                toobarWidths.push($(curr.ele).offset().left + $(curr.ele).outerWidth() + 5);\r\n            }\r\n        }\r\n\r\n    });\r\n\r\n    //If the container does not occupy the full screen, we need to subtract the left margin\r\n    const containerLeft = $('#' + Store.container).offset().left;\r\n    toobarWidths.forEach((item,i)=>{\r\n        toobarWidths[i] -= containerLeft;\r\n    })\r\n\r\n}\r\n\r\n/**\r\n *Custom configuration bottom sheet button\r\n */\r\nfunction customSheetbarConfig() {\r\n\r\n    if(!luckysheetConfigsetting.initShowsheetbarConfig){\r\n\r\n        luckysheetConfigsetting.initShowsheetbarConfig = true;\r\n\r\n        const config = {\r\n            add: true, //Add worksheet\r\n            menu: true, //Worksheet management menu\r\n            sheet: true //Worksheet display\r\n        }\r\n\r\n        if(!luckysheetConfigsetting.showsheetbar){\r\n            for(let s in config){\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        // showsheetbarConfig determines the final result\r\n        if(JSON.stringify(luckysheetConfigsetting.showsheetbarConfig) !== '{}'){\r\n            Object.assign(config,luckysheetConfigsetting.showsheetbarConfig);\r\n        }\r\n\r\n        luckysheetConfigsetting.showsheetbarConfig = config;\r\n\r\n    }\r\n\r\n    const config = luckysheetConfigsetting.showsheetbarConfig;\r\n\r\n    let isHide = 0;\r\n\r\n    for (let s in config) {\r\n        if(!config[s]){\r\n            switch (s) {\r\n                case 'add':\r\n                    $('#luckysheet-sheets-add').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'menu':\r\n                    $('#luckysheet-sheets-m').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'sheet':\r\n                    $('#luckysheet-sheet-container').hide();\r\n                    $('#luckysheet-sheets-leftscroll').hide();\r\n                    $('#luckysheet-sheets-rightscroll').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (isHide === 3) {\r\n        $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").hide();\r\n        Store.sheetBarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").show();\r\n        Store.sheetBarHeight = 31;\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * Customize the bottom count bar\r\n */\r\nfunction customStatisticBarConfig() {\r\n    if(!luckysheetConfigsetting.initStatisticBarConfig){\r\n\r\n        luckysheetConfigsetting.initStatisticBarConfig = true;\r\n\r\n        const config = {\r\n            count: true, // Count bar\r\n            view: true, // print view\r\n            zoom: true // Zoom\r\n        }\r\n\r\n        if(!luckysheetConfigsetting.showstatisticBar){\r\n            for(let s in config){\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        // showstatisticBarConfig determines the final result\r\n        if(JSON.stringify(luckysheetConfigsetting.showstatisticBarConfig) !== '{}'){\r\n            Object.assign(config,luckysheetConfigsetting.showstatisticBarConfig);\r\n        }\r\n\r\n        luckysheetConfigsetting.showstatisticBarConfig = config;\r\n\r\n    }\r\n\r\n    const config = luckysheetConfigsetting.showstatisticBarConfig;\r\n\r\n    let isHide = 0;\r\n\r\n    for (let s in config) {\r\n        if(!config[s]){\r\n            switch (s) {\r\n                case 'count':\r\n                    $('#luckysheet-sta-content').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'view':\r\n                    $('.luckysheet-print-viewList').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'zoom':\r\n                    $('#luckysheet-zoom-content').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (isHide === 3) {\r\n        $(\"#\" + Store.container).find(\".luckysheet-stat-area\").hide();\r\n        Store.statisticBarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\".luckysheet-stat-area\").show();\r\n        Store.statisticBarHeight = 23;\r\n    }\r\n}\r\n", "import Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { modelHTML } from './constant';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetsizeauto from './resize';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport { replaceHtml,transformRangeToAbsolute,openSelfModel } from '../utils/util';\r\nimport { selectionCopyShow } from './select';\r\nimport tooltip from '../global/tooltip';\r\nimport cleargridelement from '../global/cleargridelement';\r\n\r\nlet isInitialProtection = false, isInitialProtectionAddRang = false, rangeItemListCache=[], isAddRangeItemState=true, updateRangeItemIndex = null, validationAuthority=null, updatingSheetFile=null, firstInputSheetProtectionPassword = true;\r\nlet sqrefMapCache = {}, inputRangeProtectionPassword = {}, initialRangePasswordHtml=false;\r\n\r\nconst authorityItemArr = [\r\n    \"selectLockedCells\",\r\n    \"selectunLockedCells\",\r\n    \"formatCells\",\r\n    \"formatColumns\",\r\n    \"formatRows\",\r\n    \"insertColumns\",\r\n    \"insertRows\",\r\n    \"insertHyperlinks\",\r\n    \"deleteColumns\",\r\n    \"deleteRows\",\r\n    \"sort\",\r\n    \"filter\",\r\n    \"usePivotTablereports\",\r\n    \"editObjects\",\r\n    \"editScenarios\"\r\n]\r\n\r\nfunction addRangeItem(item){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    let title = item.name, sqref = item.sqref, password = item.password;\r\n    \r\n    let passwordTxt = \"\";\r\n    if(password!=null && password.length>0){\r\n        passwordTxt = '<i class=\"icon iconfont luckysheet-iconfont-bianji2\" title=\"'+ local_protection.rangeItemHasPassword+'\"></i>';\r\n    }\r\n\r\n    let rangeItemTemplate = `\r\n        <div class=\"luckysheet-protection-rangeItem\" title=\"${local_protection.rangeItemDblclick}\">\r\n            <div class=\"luckysheet-protection-rangeItem-del\" title=\"${locale_button.delete}\">\r\n                <i class=\"icon iconfont luckysheet-iconfont-shanchu\"></i>\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-name\" title=\"${title}\">\r\n                ${title}${passwordTxt}\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-range\" title=\"${sqref}\">\r\n                ${sqref}\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-update\" title=\"${locale_button.update}\">\r\n                <i class=\"icon iconfont luckysheet-iconfont-bianji\"></i>\r\n            </div>\r\n        </div>\r\n    `;\r\n\r\n    $(\"#luckysheet-protection-rangeItem-container\").append(rangeItemTemplate);\r\n}\r\n\r\nfunction initialEvent(file){\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    //confirm protection\r\n    $(\"#luckysheet-slider-protection-ok\").click(function(){\r\n        let password = $(\"#protection-password\").val();\r\n        let sheet = $(\"#protection-swichProtectionState\").is(\":checked\");\r\n        let hint = $(\"#protection-hint\").val();\r\n\r\n        let file = updatingSheetFile, aut = {};\r\n\r\n        if(file!=null && file.config!=null && file.config.authority!=null){\r\n            aut = file.config.authority;\r\n        }        \r\n        \r\n        let authorityData = {\r\n\r\n        }\r\n\r\n        let algorithmName = \"None\";\r\n        if(password!=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\"){\r\n            authorityData.password = password;\r\n            authorityData.algorithmName = \"None\";\r\n            authorityData.saltValue = null;\r\n        }\r\n        else if(aut!=null){\r\n            authorityData.algorithmName = aut.algorithmName;\r\n            authorityData.saltValue = aut.saltValue;\r\n            authorityData.password = aut.password;\r\n        }\r\n        else {\r\n            authorityData.algorithmName = \"None\";\r\n            authorityData.saltValue = null;\r\n            authorityData.password = \"\";\r\n        }\r\n\r\n        authorityData.hintText = hint;\r\n\r\n        authorityData.sheet = sheet==true?1:0;\r\n\r\n        for(let i=0;i<authorityItemArr.length;i++){\r\n            let name = authorityItemArr[i];\r\n            let checkId = \"luckysheet-protection-check-\" + name;\r\n            let authorityValue =  $(\"#\"+checkId).is(':checked');\r\n            \r\n            authorityData[name] = authorityValue==true?1:0;\r\n        }\r\n\r\n        authorityData.allowRangeList = rangeItemListCache;\r\n\r\n        rangeItemListCache = [];\r\n        firstInputSheetProtectionPassword = true;\r\n\r\n        if(file.config==null){\r\n            file.config = {};\r\n        }\r\n\r\n        file.config.authority = authorityData;\r\n\r\n        inputRangeProtectionPassword = {};\r\n\r\n        closeProtectionModal();\r\n\r\n    });\r\n\r\n    //cancel protection\r\n    $(\"#luckysheet-slider-protection-cancel, #luckysheet-modal-dialog-protection-close\").click(function(){\r\n        closeProtectionModal();\r\n    });\r\n\r\n    //Add allow edit range\r\n    $(\"#luckysheet-slider-protection-addRange\").click(function(){\r\n        initialProtectionRangeModal();\r\n        isAddRangeItemState = true;\r\n        $(\"#luckysheet-protection-rangeItem-confirm\").html(locale_button.insert);\r\n\r\n        openSelfModel(\"luckysheet-protection-rangeItem-dialog\");\r\n\r\n        $(\"#protection-allowRangeAdd-title\").val(\"Default\"+rangeItemListCache.length);\r\n        $(\"#protection-allowRangeAdd-range input\").val(\"\");\r\n        $(\"#protection-allowRangeAdd-password\").val(\"\");\r\n        $(\"#protection-allowRangeAdd-hint\").val(\"\");\r\n\r\n    });\r\n\r\n    //update allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemUpdate\").on(\"click.luckysheetProtection.rangeItemUpdate\",\"#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-update\", function(e){\r\n        initialProtectionRangeModal();\r\n\r\n        isAddRangeItemState = false;\r\n        $(\"#luckysheet-protection-rangeItem-confirm\").html(locale_button.update);\r\n\r\n        openSelfModel(\"luckysheet-protection-rangeItem-dialog\");\r\n\r\n        let $rangeItem = $(e.target).closest(\".luckysheet-protection-rangeItem\");\r\n\r\n        let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n        let index = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").index($rangeItem);\r\n\r\n        let item = rangeItemListCache[index];\r\n\r\n        updateRangeItemIndex = index;\r\n\r\n        $(\"#protection-allowRangeAdd-title\").val(item.name);\r\n        $(\"#protection-allowRangeAdd-range input\").val(item.sqref);\r\n        if(item.algorithmName==\"None\"){\r\n            $(\"#protection-allowRangeAdd-password\").val(item.password);\r\n        }\r\n        else{\r\n            $(\"#protection-allowRangeAdd-password\").val(\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\");\r\n        }\r\n        $(\"#protection-allowRangeAdd-hint\").val(item.hintText);\r\n    });\r\n\r\n    //delete allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemDelete\").on(\"click.luckysheetProtection.rangeItemDelete\",\"#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-del\", function(e){\r\n        let $rangeItem = $(e.target).closest(\".luckysheet-protection-rangeItem\");\r\n\r\n        let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n        let index = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").index($rangeItem);\r\n\r\n        let item = rangeItemListCache[index];\r\n\r\n        rangeItemListCache.splice(index, 1);\r\n        $rangeItem.remove();\r\n    });\r\n\r\n    //confirm allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemConfirm\").on(\"click.luckysheetProtection.rangeItemConfirm\",\"#luckysheet-protection-rangeItem-confirm\", function(){\r\n        let name = $(\"#protection-allowRangeAdd-title\").val(),\r\n        rangeText = $(\"#protection-allowRangeAdd-range input\").val(),\r\n        password = $(\"#protection-allowRangeAdd-password\").val(),\r\n        hint = $(\"#protection-allowRangeAdd-hint\").val();\r\n\r\n        if(name.length==0){\r\n            alert(local_protection.rangeItemErrorTitleNull);\r\n            return;\r\n        }\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(rangeText);\r\n\r\n        if(rangeText.length==0){\r\n            alert(local_protection.rangeItemErrorRangeNull);\r\n            return;\r\n        }\r\n\r\n        if(range.length==0){\r\n            alert(local_protection.rangeItemErrorRange);\r\n            return;\r\n        }\r\n\r\n        rangeText = transformRangeToAbsolute(rangeText);\r\n\r\n\r\n        if(isAddRangeItemState){\r\n            let item = {\r\n                name:name,\r\n                password:password,\r\n                hintText:hint,\r\n                algorithmName:\"None\",//MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n                saltValue:null,\r\n                checkRangePasswordUrl:null,\r\n                sqref:rangeText\r\n            }\r\n\r\n            addRangeItem(item);\r\n            rangeItemListCache.push(item);\r\n        }\r\n        else{\r\n            let index = updateRangeItemIndex;\r\n            let item = rangeItemListCache[index];\r\n\r\n            item.name = name;\r\n            item.sqref = rangeText;\r\n            item.hintText = hint;\r\n\r\n            if(password!=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\"){\r\n                item.password = password;\r\n                item.algorithmName = \"None\";\r\n            }\r\n\r\n            let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n            let $rangeitem = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").eq(index);\r\n\r\n            let $name = $rangeitem.find(\".luckysheet-protection-rangeItem-name\");\r\n\r\n            let passwordTxt = \"\";\r\n            if(password!=null && password.length>0){\r\n                passwordTxt = '<i class=\"icon iconfont luckysheet-iconfont-bianji2\" title=\"'+ local_protection.rangeItemHasPassword+'\"></i>';\r\n            }\r\n\r\n            $name.html(name+passwordTxt).attr(\"title\",name);\r\n\r\n            let $range = $rangeitem.find(\".luckysheet-protection-rangeItem-range\");\r\n\r\n            $range.html(rangeText).attr(\"title\",rangeText);\r\n        }\r\n\r\n\r\n\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n    });\r\n\r\n\r\n    //sheet validation check passWord\r\n    $(document).off(\"click.luckysheetProtection.validationConfirm\").on(\"click.luckysheetProtection.validationConfirm\",\"#luckysheet-protection-sheet-validation-confirm\", function(e){\r\n        let $validation = $(\"#luckysheet-protection-sheet-validation\");\r\n        let aut = validationAuthority;\r\n\r\n        if(aut==null){\r\n            restoreProtectionConfig(validationAuthority);\r\n            $validation.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n            luckysheetsizeauto();\r\n            return;\r\n        }\r\n        \r\n        let $input = $validation.find(\"input\");\r\n        let password = $input.val();\r\n\r\n\r\n        if(password==null || password.length==0){\r\n            alert(local_protection.checkPasswordNullalert);\r\n            return;\r\n        }\r\n\r\n        if(aut.algorithmName!=null && aut.algorithmName!=\"None\"){\r\n            if(aut.saltValue!=null && aut.saltValue.length>0){\r\n                var hasher = CryptoApi.getHasher(aut.algorithmName);\r\n                password =CryptoApi.hmac(aut.saltValue, password, hasher);\r\n            }\r\n            else{\r\n                password = CryptoApi.hash(aut.algorithmName, password);\r\n            }\r\n        }\r\n\r\n        if(password==aut.password){\r\n            restoreProtectionConfig(validationAuthority);\r\n            $validation.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n            luckysheetsizeauto();\r\n            firstInputSheetProtectionPassword = false;\r\n        }\r\n        else{\r\n            alert(local_protection.checkPasswordWrongalert);\r\n        }\r\n        \r\n    });\r\n\r\n    $(\"#luckysheet-protection-check-selectLockedCells\").change(function() { \r\n        let $selectLockedCells = $(\"#luckysheet-protection-check-selectLockedCells\"), $selectunLockedCells = $(\"#luckysheet-protection-check-selectunLockedCells\");\r\n\r\n        let selectLockedCellsChecked = $selectLockedCells.is(\":checked\"), selectunLockedCellsChecked = $selectunLockedCells.is(\":checked\");\r\n\r\n        if(selectLockedCellsChecked){\r\n            $selectunLockedCells.prop('checked', true);\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheet-protection-check-selectunLockedCells\").change(function() { \r\n        let $selectLockedCells = $(\"#luckysheet-protection-check-selectLockedCells\"), $selectunLockedCells = $(\"#luckysheet-protection-check-selectunLockedCells\");\r\n\r\n        let selectLockedCellsChecked = $selectLockedCells.is(\":checked\"), selectunLockedCellsChecked = $selectunLockedCells.is(\":checked\");\r\n\r\n        if(!selectunLockedCellsChecked){\r\n            $selectLockedCells.prop('checked', false);\r\n        }\r\n    });\r\n\r\n\r\n    //Cell range select controll\r\n    $(document).off(\"click.luckysheetProtection.dvRange\").on(\"click.luckysheetProtection.dvRange\", \"#protection-allowRangeAdd-range .fa-table\", function(e) {\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n\r\n        let dataSource = \"0\";\r\n        let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n        dataVerificationCtrl.rangeDialog(dataSource, txt);\r\n\r\n        dataVerificationCtrl.selectRange = [];\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(txt);\r\n        if(range.length > 0){\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                dataVerificationCtrl.selectRange.push({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1, \r\n                    \"left_move\": col_pre, \r\n                    \"width_move\": col - col_pre - 1, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [r1, r2], \r\n                    \"column\": [c1, c2], \r\n                    \"row_focus\": r1, \r\n                    \"column_focus\": c1 \r\n                });\r\n            }\r\n        }\r\n        \r\n        selectionCopyShow(dataVerificationCtrl.selectRange);\r\n    }); \r\n    $(document).off(\"click.luckysheetProtection.dvRange2\").on(\"click.luckysheetProtection.dvRange2\", \"#luckysheet-protection-rangeItem-dialog .show-box-item-dropdown .range .fa-table\", function(e) {\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n\r\n        let dataSource = \"1\";\r\n        let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n        dataVerificationCtrl.rangeDialog(dataSource, txt);\r\n\r\n        dataVerificationCtrl.selectRange = [];\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(txt);\r\n        if(range.length > 0){\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    dataVerificationCtrl.selectRange.push({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1, \r\n                    \"left_move\": col_pre, \r\n                    \"width_move\": col - col_pre - 1, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [r1, r2], \r\n                    \"column\": [c1, c2], \r\n                    \"row_focus\": r1, \r\n                    \"column_focus\": c1 \r\n                });\r\n            }\r\n        }\r\n        \r\n        selectionCopyShow(dataVerificationCtrl.selectRange);\r\n    });\r\n    $(document).off(\"click.luckysheetProtection.dvRangeConfirm\").on(\"click.luckysheetProtection.dvRangeConfirm\", \"#luckysheet-dataVerificationRange-dialog-confirm\", function(e) {\r\n        let txt = $(this).parents(\"#luckysheet-dataVerificationRange-dialog\").find(\"input\").val();\r\n\r\n        let $input = $(\"#protection-allowRangeAdd-range input\"), inputValue = $input.val();\r\n        if(inputValue.substr(inputValue.length-1, 1)==\",\"){\r\n            $input.val(inputValue + txt);\r\n        }\r\n        else{\r\n            $input.val(txt);\r\n        }\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n    $(document).off(\"click.luckysheetProtection.dvRangeClose\").on(\"click.dvRangeClose\", \"#luckysheet-dataVerificationRange-dialog-close\", function(e) {\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n    $(document).on(\"click.luckysheetProtection.luckysheetProtection\", \"#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close\", function(e) {\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n}\r\n\r\n//protect range config\r\nfunction initialProtectionRangeModal(file){\r\n    if(isInitialProtectionAddRang){\r\n        return;\r\n    }\r\n    isInitialProtectionAddRang = true;\r\n    let _locale = locale();\r\n    let local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-protection-rangeItem-dialog\", \r\n        \"addclass\": \"luckysheet-protection-rangeItem-dialog\", \r\n        \"title\": local_protection.allowRangeTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-protection-rangeItem-content\">\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitle}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <input class=\"luckysheet-protection-rangeItemiInput\" id=\"protection-allowRangeAdd-title\"  placeHolder=\"${local_protection.allowRangeAddtitleDefault}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddSqrf}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <div id=\"protection-allowRangeAdd-range\" class=\"range\">\r\n                            <input class=\"formulaInputFocus\" spellcheck=\"false\" placeHolder=\"${local_protection.selectCellRangeHolder}\">\r\n                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${local_protection.selectCellRange}\"></i>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitlePassword}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <input class=\"luckysheet-protection-rangeItemiInput\" id=\"protection-allowRangeAdd-password\"  placeHolder=\"${local_protection.enterPassword}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitleHint}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <textarea class=\"luckysheet-protection-rangeItemTextarea\" id=\"protection-allowRangeAdd-hint\"  placeHolder=\"${local_protection.allowRangeAddTitleHintTitle}\"></textarea>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-protection-rangeItem-confirm\" class=\"btn btn-primary\">${locale_button.insert}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n}\r\n\r\n\r\n//Protect sheet initial\r\nfunction initialProtectionRIghtBar(file){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    let authorityItemHtml = \"\";\r\n    for(let i=0;i<authorityItemArr.length;i++){\r\n        let name = authorityItemArr[i];\r\n\r\n        authorityItemHtml += `\r\n            <div class=\"luckysheet-slider-protection-row\" style=\"height:18px;\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                <label for=\"luckysheet-protection-check-${name}\"><input id=\"luckysheet-protection-check-${name}\" name=\"luckysheet-protection-check-${name}\" type=\"checkbox\">${local_protection[name]}</label>\r\n                </div>\r\n            </div>\r\n        `;\r\n    }\r\n\r\n    const protectionModalHtml = `\r\n    <div id=\"luckysheet-modal-dialog-slider-protection\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\" style=\"display:none;\">\r\n        <div class=\"luckysheet-modal-dialog-slider-title\"> <span>${local_protection.protectiontTitle}</span> <span id=\"luckysheet-modal-dialog-protection-close\" title=\"${locale_button.close}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div>\r\n        <div class=\"luckysheet-modal-dialog-slider-content\">\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:10px;height:115px\">\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    <label for=\"protection-swichProtectionState\"><input id=\"protection-swichProtectionState\" name=\"protection-swichProtectionState\" type=\"checkbox\">${local_protection.swichProtectionTip}</label>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:23px;\">\r\n                    <div class=\"luckysheet-slider-protection-column\" style=\"width:98%;\">\r\n                        <input class=\"luckysheet-protection-input\" id=\"protection-password\"  placeHolder=\"${local_protection.enterPassword}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:47px;margin-top:4px;\">\r\n                    <div class=\"luckysheet-slider-protection-column\" style=\"width:98%;\">\r\n                        <textarea class=\"luckysheet-protection-textarea\" id=\"protection-hint\"  placeHolder=\"${local_protection.enterHintTitle}\"></textarea>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:130px;height:290px;border-top:1px solid #c5c5c5\">\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:20px;\">\r\n                    ${local_protection.authorityTitle}\r\n                </div>\r\n                ${authorityItemHtml}\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:440px;bottom:45px;border-top:1px solid #c5c5c5\">\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:25px;\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:0px;line-height: 25px;\">\r\n                        ${local_protection.allowRangeTitle}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\" style=\"left:70%;\">\r\n                        <div class=\"luckysheet-slider-protection-ok luckysheet-slider-protection-addRange\" id=\"luckysheet-slider-protection-addRange\">\r\n                            ${local_protection.allowRangeAdd}\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n\r\n                <div id=\"luckysheet-protection-rangeItem-container\" class=\"luckysheet-slider-protection-row\" style=\"top:25px;bottom:0px;position:absolute\">\r\n                   \r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"bottom:0px;height:45px\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-5x\" style=\"left:0px;\">\r\n                    <div class=\"luckysheet-slider-protection-ok\" id=\"luckysheet-slider-protection-ok\">\r\n                        ${locale_button.confirm}\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-5x\" style=\"left:50%;\">\r\n                    <div class=\"luckysheet-slider-protection-cancel\" id=\"luckysheet-slider-protection-cancel\">\r\n                        ${locale_button.cancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    `;\r\n\r\n    $(\"body\").append(protectionModalHtml);\r\n\r\n\r\n    //Password input initial for sheet Protection\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-protection-sheet-validation\", \r\n        \"addclass\": \"luckysheet-protection-sheet-validation\", \r\n        \"title\": local_protection.validationTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-slider-protection-row\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    ${local_protection.validationTips}\r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-row\" style=\"margin-top:20px\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    <input type=\"password\" class=\"luckysheet-protection-rangeItemiInput\" placeHolder=\"${local_protection.validationInputHint}\">\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-protection-sheet-validation-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n\r\n}\r\n\r\n\r\nfunction restoreProtectionConfig(aut){\r\n    if(aut==null){\r\n        aut = {};\r\n    }\r\n    for(let i=0;i<authorityItemArr.length;i++){\r\n        let name = authorityItemArr[i];\r\n        let checkId = \"luckysheet-protection-check-\" + name;\r\n        let authorityValue = aut[name];\r\n        if(authorityValue==null){\r\n            authorityValue = 0;\r\n        }\r\n\r\n        if(authorityValue==null && name in {selectLockedCells:1, selectunLockedCells:1}){\r\n            authorityValue = 1;\r\n        }\r\n\r\n        $(\"#\"+checkId).prop('checked',authorityValue==1?true:false);\r\n    }\r\n\r\n    if(aut.password!=null && aut.password.length>0){\r\n        if(aut.algorithmName==\"None\" || aut.algorithmName==null){\r\n            $(\"#protection-password\").val(aut.password);\r\n        }\r\n        else{\r\n            $(\"#protection-password\").val(\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\");\r\n        }\r\n    }\r\n    else{\r\n        $(\"#protection-password\").val(\"\");\r\n    }\r\n\r\n    let sheet = aut.sheet;\r\n    if(aut.sheet==null){\r\n        sheet = 0;\r\n    }\r\n    $(\"#protection-swichProtectionState\").prop('checked',sheet==1?true:false);\r\n\r\n    let hintText = aut.hintText;\r\n    if(hintText==null){\r\n        hintText = \"\";\r\n    }\r\n    $(\"#protection-hint\").val(hintText);\r\n\r\n\r\n    rangeItemListCache = [];\r\n    $(\"#luckysheet-protection-rangeItem-container\").empty();\r\n    let allowRangeList = aut.allowRangeList;\r\n    if(allowRangeList!=null && allowRangeList.length>0){\r\n        for(let i=0;i<allowRangeList.length;i++){\r\n            let item = allowRangeList[i];\r\n            addRangeItem(item);\r\n            rangeItemListCache.push(item);\r\n        }\r\n    }\r\n\r\n}\r\n\r\nexport function openProtectionModal(file){\r\n    if(!isInitialProtection){\r\n        initialProtectionRIghtBar(file);\r\n        initialEvent(file);\r\n        isInitialProtection = true;\r\n    }\r\n\r\n    updatingSheetFile = file;\r\n\r\n\r\n    if(file!=null && file.config!=null && file.config.authority!=null){\r\n        let aut = file.config.authority;\r\n        if(firstInputSheetProtectionPassword && aut.sheet==1 && aut.password!=null && aut.password.length>0){\r\n            validationAuthority = aut;\r\n            $(\"#luckysheet-protection-sheet-validation input\").val(\"\");\r\n            openSelfModel(\"luckysheet-protection-sheet-validation\");\r\n            return;\r\n        }\r\n        else{//retore protection config\r\n            restoreProtectionConfig(aut);\r\n        }\r\n    }\r\n    else{//protection initial config\r\n        $(\"#luckysheet-protection-check-selectLockedCells\").prop('checked',true);\r\n        $(\"#luckysheet-protection-check-selectunLockedCells\").prop('checked',true);\r\n    }\r\n\r\n    $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n    luckysheetsizeauto();\r\n\r\n}\r\n\r\nexport function closeProtectionModal(){\r\n    $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n    $(\"#luckysheet-modal-dialog-slider-protection\").hide();\r\n    luckysheetsizeauto();\r\n}\r\n\r\n\r\n\r\n\r\nfunction checkProtectionLockedSqref(r, c, aut, local_protection, isOpenAlert=true, isLock=true){\r\n    let isPass = false;\r\n    let rangeAut = aut.allowRangeList;\r\n    if(rangeAut!=null && rangeAut.length>0){\r\n        let isExists = false;\r\n        for(let i=0;i<rangeAut.length;i++){\r\n            let ra = rangeAut[i];\r\n            let sqref = ra.sqref;\r\n            let range = dataVerificationCtrl.getRangeByTxt(sqref);\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    if(r>=r1 && r<=r2 && c>=c1 && c<=c2){\r\n                        isExists = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(isExists){\r\n\r\n                let password = ra.password;\r\n                if(password!=null && password.length>0  && !(sqref in inputRangeProtectionPassword)){\r\n                    if(isOpenAlert){\r\n                        openRangePasswordModal(ra);\r\n                        $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n                    }\r\n                    return false;\r\n                }\r\n                else{\r\n                    isPass = true;\r\n                }\r\n\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    if (!isPass && !isLock) isPass = true\r\n    if(!isPass && isOpenAlert){\r\n        let ht;\r\n        if(aut.hintText != null && aut.hintText.length>0){\r\n            ht = aut.hintText;\r\n        }\r\n        else{\r\n            ht = local_protection.defaultSheetHintText;\r\n        }\r\n        tooltip.info(\"\", ht);\r\n        $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n    }\r\n    \r\n    return isPass;\r\n}\r\n\r\n\r\nfunction openRangePasswordModal(rangeAut) {\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n    \r\n    if(!initialRangePasswordHtml){\r\n        //Password input initial for range\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-protection-range-validation\", \r\n            \"addclass\": \"luckysheet-protection-sheet-validation\", \r\n            \"title\": local_protection.validationTitle, \r\n            \"content\": `\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div id=\"luckysheet-protection-range-validation-hint\" class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                        \r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"margin-top:20px\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                        <input type=\"password\" class=\"luckysheet-protection-rangeItemiInput\" placeHolder=\"${local_protection.validationInputHint}\">\r\n                    </div>\r\n                </div>\r\n            `, \r\n            \"botton\":  `<button id=\"luckysheet-protection-range-validation-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n    }\r\n\r\n    initialRangePasswordHtml = true;\r\n\r\n\r\n    \r\n    openSelfModel(\"luckysheet-protection-range-validation\");\r\n\r\n    let $hint = $(\"#luckysheet-protection-range-validation-hint\");\r\n    if(rangeAut.hintText != null && rangeAut.hintText.length>0){\r\n        $hint.html(rangeAut.hintText);\r\n    }\r\n    else{\r\n        $hint.html(local_protection.defaultRangeHintText);\r\n    }\r\n    let $rangeV = $(\"#luckysheet-protection-range-validation\");\r\n    let $input = $rangeV.find(\"input\");\r\n    $input.val(\"\");\r\n\r\n    $(\"#luckysheet-protection-range-validation-confirm\").off(\"click\").on(\"click\", function(){\r\n        let password = $input.val();\r\n\r\n        if(password==null || password.length==0){\r\n            alert(local_protection.checkPasswordNullalert);\r\n            return;\r\n        }\r\n\r\n        if(rangeAut.algorithmName!=null && rangeAut.algorithmName!=\"None\"){\r\n            // password = CryptoApi.hash(rangeAut.algorithmName, password);\r\n            if(rangeAut.saltValue!=null && rangeAut.saltValue.length>0){\r\n                var hasher = CryptoApi.getHasher(rangeAut.algorithmName);\r\n                password =CryptoApi.hmac(rangeAut.saltValue, password, hasher);\r\n            }\r\n            else{\r\n                password = CryptoApi.hash(rangeAut.algorithmName, password);\r\n            }\r\n        }\r\n\r\n        if(password==rangeAut.password){\r\n            inputRangeProtectionPassword[rangeAut.sqref] = 1;\r\n            $rangeV.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            alert(local_protection.checkPasswordSucceedalert);\r\n        }\r\n        else{\r\n            alert(local_protection.checkPasswordWrongalert);\r\n        }\r\n\r\n    });\r\n    \r\n}\r\n\r\n//protection state\r\nexport function checkProtectionNotEnable(sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    let ht;\r\n    if(aut.hintText != null && aut.hintText.length>0){\r\n        ht = aut.hintText;\r\n    }\r\n    else{\r\n        ht = local_protection.defaultSheetHintText;\r\n    }\r\n    tooltip.info(\"\", ht);\r\n\r\n    return false;\r\n}\r\n\r\n//cell locked state\r\nexport function checkProtectionLocked(r, c, sheetIndex, isOpenAlert=true, isLock=true){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell && cell.lo === 0){ // lo\u4E3A0\u7684\u65F6\u5019\u624D\u662F\u53EF\u7F16\u8F91\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    return checkProtectionLockedSqref(r, c , aut, local_protection, isOpenAlert, isLock);\r\n}\r\n\r\n//cell hidden state\r\nexport function checkProtectionCellHidden(r, c, sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(!sheetFile || (sheetFile.data && !sheetFile.data[r]) || (sheetFile.data && !sheetFile.data[r][c])){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell==null || cell.hi==null || cell.hi==0){\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n//cell range locked state\r\nexport function checkProtectionLockedRangeList(rangeList, sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(rangeList==null || rangeList.length==0){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    for(let s = 0; s < rangeList.length; s++){\r\n        let r1 = rangeList[s].row[0], r2 = rangeList[s].row[1];\r\n        let c1 = rangeList[s].column[0], c2 = rangeList[s].column[1];\r\n\r\n        for(let r=r1;r<=r2;r++){\r\n            for(let c=c1;c<=c2;c++){\r\n                const cell = sheetFile.data[r][c] || {}\r\n                let isLock = cell.lo === undefined || cell.lo === 1, // \u5355\u5143\u683C\u662F\u5426\u9501\u5B9A\r\n                    isPass = checkProtectionLockedSqref(r, c , aut, local_protection, true, isLock);\r\n                if(!isPass){\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n//selectLockedCells  , selectunLockedCells  and cell state\r\nexport function checkProtectionSelectLockedOrUnLockedCells(r, c, sheetIndex){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell && cell.lo === 0){ // lo\u4E3A0\u7684\u65F6\u5019\u624D\u662F\u53EF\u7F16\u8F91\r\n        if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n            return true;\r\n        }\r\n        else{\r\n            return false;\r\n        }\r\n    }\r\n    else{//locked??\r\n        let isAllEdit = checkProtectionLockedSqref(r, c , aut, local_protection, false);//dont alert password model\r\n        if(isAllEdit){//unlocked\r\n            if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else{//locked\r\n            if(aut.selectLockedCells==1 || aut.selectLockedCells==null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    \r\n}\r\n\r\n\r\n\r\n//selectLockedCells or selectunLockedCells authority, highlight cell \r\nexport function checkProtectionAllSelected(sheetIndex){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    let selectunLockedCells = false;\r\n    if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n        selectunLockedCells = true;\r\n    }\r\n\r\n    let selectLockedCells = false;\r\n    if(aut.selectLockedCells==1 || aut.selectLockedCells==null){\r\n        selectLockedCells = true;\r\n    }\r\n\r\n    if(selectunLockedCells && selectLockedCells){\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n//formatCells authority, bl cl fc fz ff ct  border etc.\r\nexport function checkProtectionFormatCells(sheetIndex){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(aut.formatCells==1 || aut.formatCells==null){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    let ht;\r\n    if(aut.hintText != null && aut.hintText.length>0){\r\n        ht = aut.hintText;\r\n    }\r\n    else{\r\n        ht = local_protection.defaultSheetHintText;\r\n    }\r\n    tooltip.info(\"\", ht);\r\n\r\n    return false;\r\n}\r\n\r\n//formatColumns authority: controll column hidden and width\r\n//formatRows authority: controll row hidden and height\r\n//insertColumns authority\r\n//insertRows authority\r\n//insertHyperlinks authority:Hyperlinks is not incomplete\r\n//deleteColumns authority\r\n//deleteRows authority\r\n//sort authority\r\n//filter authority\r\n//usePivotTablereports authority\r\n//editObjects authority: insert,delete,update for image, chart, comment,shape etc. \r\n//editScenarios authority: Scenarios features is uncompleted\r\n\r\nexport function checkProtectionAuthorityNormal(sheetIndex, type=\"formatColumns\", isAlert=true){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(aut[type]==1 || aut[type]==null){\r\n        return true;\r\n    }\r\n\r\n    if(isAlert){\r\n        const _locale = locale();\r\n        const local_protection = _locale.protection;\r\n        \r\n        let ht;\r\n        if(aut.hintText != null && aut.hintText.length>0){\r\n            ht = aut.hintText;\r\n        }\r\n        else{\r\n            ht = local_protection.defaultSheetHintText;\r\n        }\r\n        tooltip.info(\"\", ht);\r\n    }\r\n\r\n    return false;\r\n}", "import { getObjType } from '../utils/util';\r\nimport { isRealNull, isRealNum, isEditMode } from './validate';\r\nimport { isdatetime, diff } from './datecontroll';\r\nimport tooltip from './tooltip';\r\nimport editor from './editor';\r\nimport { rowlenByRange } from './getRowlen';\r\nimport { jfrefreshgrid } from './refresh';\r\nimport {checkProtectionAuthorityNormal} from '../controllers/protection';\r\nimport Store from '../store';\r\nimport numeral from 'numeral';\r\n\r\n//\u6570\u636E\u6392\u5E8F\u65B9\u6CD5\r\nfunction orderbydata(data, index, isAsc) {\r\n    if (isAsc == null) {\r\n        isAsc = true;\r\n    }\r\n\r\n    let a = function (x, y) {\r\n        let x1 = x[index] , y1 = y[index];\r\n\r\n        if(getObjType(x[index]) == \"object\"){\r\n            x1 = x[index].v;\r\n        }\r\n\r\n        if(getObjType(y[index]) == \"object\"){\r\n            y1 = y[index].v;\r\n        }\r\n\r\n        if(isRealNull(x1)){\r\n            return 1;\r\n        }\r\n\r\n        if(isRealNull(y1)){\r\n            return -1;\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(x1, y1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(x1).value() - numeral(y1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return x1.localeCompare(y1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return 1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    let d = function (x, y) {\r\n        let x1 = x[index] , y1 = y[index];\r\n\r\n        if(getObjType(x[index]) == \"object\"){\r\n            x1 = x[index].v;\r\n        }\r\n\r\n        if(getObjType(y[index]) == \"object\"){\r\n            y1 = y[index].v;\r\n        }\r\n\r\n        if(isRealNull(x1)){\r\n            return 1;\r\n        }\r\n\r\n        if(isRealNull(y1)){\r\n            return -1;\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(y1, x1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(y1).value() - numeral(x1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return y1.localeCompare(x1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return -1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    if (isAsc) {\r\n        return data.sort(a);\r\n    }\r\n    else {\r\n        return data.sort(d);\r\n    }\r\n}\r\n\r\nfunction orderbydata1D(data, isAsc) {\r\n    if (isAsc == null) {\r\n        isAsc = true;\r\n    }\r\n\r\n    let a = function (x, y) {\r\n        let x1 = x, y1 = y;\r\n\r\n        if(getObjType(x) == \"object\"){\r\n            x1 = x.v;\r\n        }\r\n\r\n        if(getObjType(y) == \"object\"){\r\n            y1 = y.v;\r\n        }\r\n\r\n        if(x1 == null){\r\n            x1 = \"\";\r\n        }\r\n\r\n        if(y1 == null){\r\n            y1 = \"\";\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(x1, y1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(x1).value() - numeral(y1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return x1.localeCompare(y1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return 1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    let d = function (x, y) {\r\n        let x1 = x, y1 = y;\r\n\r\n        if(getObjType(x) == \"object\"){\r\n            x1 = x.v;\r\n        }\r\n\r\n        if(getObjType(y) == \"object\"){\r\n            y1 = y.v;\r\n        }\r\n\r\n        if(x1 == null){\r\n            x1 = \"\";\r\n        }\r\n\r\n        if(y1 == null){\r\n            y1 = \"\";\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(y1, x1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(y1).value() - numeral(x1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return y1.localeCompare(x1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return -1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    if (isAsc) {\r\n        return data.sort(a);\r\n    }\r\n    else {\r\n        return data.sort(d);\r\n    }\r\n}\r\n\r\n//\u6392\u5E8F\u9009\u533A\u6570\u636E\r\nfunction sortSelection(isAsc) {\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n        return;\r\n    }\r\n    if(Store.luckysheet_select_save.length > 1){\r\n        if(isEditMode()){\r\n            alert(\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\");\r\n        }\r\n        else{\r\n            tooltip.info(\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\", \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    if(isAsc == null){\r\n        isAsc = true;\r\n    }\r\n\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let r1 = Store.luckysheet_select_save[0].row[0], \r\n        r2 = Store.luckysheet_select_save[0].row[1];\r\n    let c1 = Store.luckysheet_select_save[0].column[0], \r\n        c2 = Store.luckysheet_select_save[0].column[1];\r\n\r\n    let str, edr;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if(d[r] != null && d[r][c1] != null){\r\n            let cell = d[r][c1];\r\n\r\n            if(cell.mc != null || isRealNull(cell.v)){\r\n                continue;\r\n            }\r\n\r\n            if(str == null && /[\\u4e00-\\u9fa5]+/g.test(cell.v)){\r\n                str = r + 1;\r\n                edr = r + 1;\r\n                continue;\r\n            }\r\n            \r\n            if(str == null){\r\n                str = r;    \r\n            }\r\n\r\n            edr = r;\r\n        }\r\n    }\r\n\r\n    if(str == null || str > r2){\r\n        return;\r\n    }\r\n\r\n    let hasMc = false; //\u6392\u5E8F\u9009\u533A\u662F\u5426\u6709\u5408\u5E76\u5355\u5143\u683C\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = c1; c <= c2; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        if(isEditMode()){\r\n            alert(\"\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF01\");\r\n        }\r\n        else{\r\n            tooltip.info(\"\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF01\", \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, 0, isAsc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            d[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [c1, c2] }], allParam);\r\n}\r\n\r\n//\u6392\u5E8F\u4E00\u5217\u6570\u636E\r\nfunction sortColumnSeletion(colIndex, isAsc) {\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n        return;\r\n    }\r\n    if(isAsc == null){\r\n        isAsc = true;\r\n    }\r\n\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let r1 = 0, r2 = d.length - 1;\r\n    let c1 = 0, c2 = d[0].length - 1;\r\n\r\n    let str, edr;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if(d[r][colIndex] != null && d[r][colIndex].mc != null){\r\n            continue;\r\n        }\r\n\r\n        if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v) && /[\\u4e00-\\u9fa5]+/g.test(d[r][colIndex].v) && str == null){\r\n            str = r + 1;\r\n            edr = r + 1;\r\n            continue;\r\n        }\r\n\r\n        if(str == null){\r\n            str = r;    \r\n        }\r\n\r\n        if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v)){\r\n            edr = r;\r\n        }\r\n    }\r\n\r\n    if(str == null || str > r2){\r\n        return;\r\n    }\r\n\r\n    let hasMc = false; //\u6392\u5E8F\u9009\u533A\u662F\u5426\u6709\u5408\u5E76\u5355\u5143\u683C\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = c1; c <= c2; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        if(isEditMode()){\r\n            alert(\"\u5217\u6392\u5E8F\u4F1A\u6269\u5C55\u81F3\u6574\u4E2A\u8868\u683C\u9009\u533A\uFF0C\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u529F\u80FD\u680F\u6392\u5E8F\u529F\u80FD\uFF01\");\r\n        }\r\n        else{\r\n            tooltip.info(\"\u5217\u6392\u5E8F\u4F1A\u6269\u5C55\u81F3\u6574\u4E2A\u8868\u683C\u9009\u533A\uFF0C\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF0C\u65E0\u6CD5\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u529F\u80FD\u680F\u6392\u5E8F\u529F\u80FD\uFF01\", \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, colIndex, isAsc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            d[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [c1, c2] }], allParam);\r\n}\r\n\r\nexport {\r\n    orderbydata,\r\n    orderbydata1D,\r\n    sortSelection,\r\n    sortColumnSeletion,\r\n}", "import { getcellvalue } from './getdata';\r\n\r\nconst luckysheetArray = {\r\n    transpose: function (getdata, useGetcellValue=true) {\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        if (getdata[0].length == 0) {\r\n            return [];\r\n        }\r\n\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    if(useGetcellValue){\r\n                        value = getcellvalue(r, c, getdata);\r\n                    }\r\n                    else{\r\n                        value = getdata[r][c];\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    minusClear: function(p, m){\r\n        if(m.row[0] > p.row[1] || m.row[1] < p.row[0] || m.column[0] > p.column[1] || m.column[1] < p.column[0]){\r\n            return null;\r\n        }\r\n\r\n        if(m.row[0] == p.row[0] && m.row[1] < p.row[1] && m.column[0] > p.column[0] && m.column[1] < p.column[1]){\r\n            return [];\r\n        }\r\n\r\n        let ret = [], range = {row:[], column:[]};\r\n\r\n        let row1 = null, column1 = [p.column[0], p.column[1]];\r\n        if(m.row[1] > p.row[0] && m.row[1] < p.row[1]){\r\n            row1 = [m.row[1] + 1, p.row[1]];\r\n        }\r\n        else if(m.row[0] > p.row[0] && m.row[0] < p.row[1]){\r\n            row1 = [p.row[0], m.row[0] - 1];\r\n        }\r\n\r\n        if(row1 != null){\r\n            ret.push({\"row\": row1, \"column\": column1});\r\n        }\r\n\r\n        let row2 = [p.row[0], p.row[1]], column2 = null;\r\n        if(m.column[1] > p.column[0] && m.column[1] < p.column[1]){\r\n            column2 = [m.column[1] + 1, p.column[1]];\r\n        }\r\n        else if(m.column[0] > p.column[0] && m.column[0] < p.column[1]){\r\n            column2 = [p.column[0], m.column[0] - 1];\r\n        }\r\n\r\n        if(column2 != null){\r\n            ret.push({\"row\": row2, \"column\": column2});\r\n        }\r\n\r\n        return ret;\r\n    }\r\n}\r\n\r\nexport default luckysheetArray;", "import { numFormat } from '../utils/util';\r\n\r\nconst analysis = {\r\n    \"STDEVP\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(Math.sqrt(cov / array1d.length));\r\n    },\r\n    \"STDEV\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(Math.sqrt(cov / (array1d.length - 1)));\r\n    },\r\n    \"VARP\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(cov / array1d.length);\r\n    },\r\n    \"let\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(cov / (array1d.length - 1));\r\n    },\r\n};\r\n\r\nexport default analysis;", "import { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { \r\n    replaceHtml, \r\n    getObjType, \r\n    ABCatNum, \r\n    numFormat,\r\n    numfloatlen,\r\n    showrightclickmenu, \r\n    mouseclickposition \r\n} from '../utils/util';\r\nimport { getdatabyselectionD, getcellvalue, datagridgrowth } from '../global/getdata';\r\nimport { isdatetime, diff, isdatatypemulti, isdatatype } from '../global/datecontroll';\r\nimport { genarate, update } from '../global/format';\r\nimport { isRealNull, isEditMode } from '../global/validate';\r\nimport { orderbydata1D } from '../global/sort';\r\nimport { jfrefreshgrid, jfrefreshgridall } from '../global/refresh';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport luckysheetArray from '../global/array';\r\nimport analysis from '../global/analysis';\r\nimport { selectHightlightShow } from './select';\r\nimport { luckysheet_searcharray } from './sheetSearch';\r\nimport { \r\n    modelHTML, \r\n    filtermenuHTML, \r\n    filtersubmenuHTML, \r\n    pivottableconfigHTML,\r\n    pivottablesumHTML,\r\n    luckysheetPivotTableHTML \r\n} from './constant';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetsizeauto from './resize';\r\nimport server from './server';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport numeral from 'numeral';\r\nimport { luckysheetlodingHTML } from '../controllers/constant';\r\n\r\nconst pivotTable = {\r\n    pivotDatas: null,\r\n    pivotSheetIndex: 0,\r\n    pivotDataSheetIndex: 0,\r\n    celldata: null,\r\n    origindata: null,\r\n    getCellData: function (cursheetindex, datasheetindex, data_select_save) {\r\n        let _this = this;\r\n\r\n        let sheetIndex;\r\n        if (cursheetindex != null) {\r\n            sheetIndex = cursheetindex;\r\n        }\r\n        else {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let realIndex = getSheetIndex(sheetIndex);\r\n\r\n        if (getObjType(Store.luckysheetfile[realIndex].pivotTable) != \"object\"){\r\n            Store.luckysheetfile[realIndex].pivotTable = new Function(\"return \" + Store.luckysheetfile[realIndex].pivotTable )();\r\n        }\r\n\r\n        if (Store.luckysheetfile[realIndex].pivotTable != null) {\r\n            _this.column = Store.luckysheetfile[realIndex].pivotTable.column;\r\n            _this.row = Store.luckysheetfile[realIndex].pivotTable.row;\r\n            _this.values = Store.luckysheetfile[realIndex].pivotTable.values;\r\n            _this.filter = Store.luckysheetfile[realIndex].pivotTable.filter;\r\n            _this.showType = Store.luckysheetfile[realIndex].pivotTable.showType;\r\n\r\n            _this.filterparm = Store.luckysheetfile[realIndex].pivotTable.filterparm;\r\n\r\n            if (Store.luckysheetfile[realIndex].pivotTable.drawPivotTable != null) {\r\n                _this.drawPivotTable = Store.luckysheetfile[realIndex].pivotTable.drawPivotTable;\r\n            }\r\n            else {\r\n                _this.drawPivotTable = true;\r\n            }\r\n\r\n            if (Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary != null) {\r\n                _this.pivotTableBoundary = Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary;\r\n            }\r\n            else {\r\n                _this.pivotTableBoundary = [12, 6];\r\n            }\r\n\r\n            if (data_select_save != null) {\r\n                _this.pivot_select_save = data_select_save;\r\n            }\r\n            else {\r\n                _this.pivot_select_save = Store.luckysheetfile[realIndex].pivotTable.pivot_select_save;\r\n            }\r\n\r\n            if (datasheetindex != null) {\r\n                _this.pivotDataSheetIndex = datasheetindex;\r\n            }\r\n            else {\r\n                _this.pivotDataSheetIndex = Store.luckysheetfile[realIndex].pivotTable.pivotDataSheetIndex;\r\n            }\r\n        }\r\n        else {\r\n            _this.column = null;\r\n            _this.row = null;\r\n            _this.values = null;\r\n            _this.filter = null;\r\n            _this.showType = null;\r\n\r\n            _this.filterparm = null;\r\n\r\n            _this.drawPivotTable = true;\r\n            _this.pivotTableBoundary = [12, 6];\r\n\r\n            if (data_select_save != null) {\r\n                _this.pivot_select_save = data_select_save;\r\n            }\r\n            else {\r\n                _this.pivot_select_save = Store.luckysheet_select_save;\r\n            }\r\n\r\n            if (datasheetindex != null) {\r\n                _this.pivotDataSheetIndex = datasheetindex;\r\n            }\r\n            else {\r\n                _this.pivotDataSheetIndex = sheetIndex;\r\n            }\r\n        }\r\n\r\n        let pivotrealIndex = getSheetIndex(_this.pivotDataSheetIndex);\r\n\r\n        let otherfile = Store.luckysheetfile[pivotrealIndex];\r\n        if(otherfile[\"data\"] == null){\r\n            otherfile[\"data\"] = sheetmanage.buildGridData(otherfile);\r\n        }\r\n        _this.origindata = getdatabyselectionD(otherfile.data, _this.pivot_select_save);\r\n\r\n        let rowhidden = {};\r\n        if (_this.filterparm != null) {\r\n            for (let f in _this.filterparm) {\r\n                // \u76EE\u7684\u662F\u53D6\u51FArowhidden\r\n                for (let h in _this.filterparm[f]) {\r\n                    if (h === 'rowhidden' && _this.filterparm[f][h] != null) {\r\n                        rowhidden = $.extend(true, rowhidden, _this.filterparm[f][h]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        _this.rowhidden = rowhidden;\r\n\r\n        _this.pivotSheetIndex = sheetIndex;\r\n\r\n        let newdata = [];\r\n        for (let i = 0; i < _this.origindata.length; i++) {\r\n            if (_this.rowhidden != null && _this.rowhidden[i] != null) {\r\n                continue;\r\n            }\r\n            newdata.push([].concat(_this.origindata[i]));\r\n        }\r\n        _this.celldata = newdata;\r\n\r\n        _this.pivot_data_type = {};\r\n        for (let c = 0; c < _this.celldata[1].length; c++) {\r\n            let type = isdatatype(_this.celldata[1][c]);\r\n            _this.pivot_data_type[c.toString()] = type;\r\n        }\r\n    },\r\n    pivot_data_type: {},\r\n    pivot_select_save: null,\r\n    column: null,\r\n    row: null,\r\n    values: null,\r\n    filter: null,\r\n    showType: null,\r\n    rowhidden: null,\r\n    selected: null,\r\n    caljs: null,\r\n    initial: true,\r\n    filterparm: null,\r\n    luckysheet_pivotTable_select_state: false,\r\n    jgridCurrentPivotInput: null,\r\n    movestate: false,\r\n    moveitemposition: [],\r\n    movesave: {},\r\n    showvaluecolrow: function () {\r\n        let _this = this;\r\n\r\n        if ($(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").length >= 2) {\r\n            $(\"#luckysheetpivottablevaluecolrowshow\").show();\r\n\r\n            if (_this.showType == \"column\") {\r\n                $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").addClass(\"ui-state-active\");\r\n\r\n                $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").removeClass(\"ui-state-active\");\r\n            }\r\n            else {\r\n                $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", true);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").addClass(\"ui-state-active\");\r\n\r\n                $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", false);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").removeClass(\"ui-state-active\");\r\n            }\r\n        }\r\n        else {\r\n            $(\"#luckysheetpivottablevaluecolrowshow\").hide();\r\n        }\r\n    },\r\n    resetOrderby: function (obj) {\r\n        let orderby = $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").index(obj);\r\n        $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n            if ($(this).data(\"orderby\") == orderby) {\r\n                $(this).data(\"orderby\", \"self\");\r\n            }\r\n        });\r\n    },\r\n    luckysheetsliderlistclearfilter: function ($filter) {\r\n        let _this = this;\r\n\r\n        let $t = $filter.parent();\r\n        let cindex = $t.data(\"index\");\r\n\r\n        let rowhidden = {}, \r\n            selected = {}, \r\n            d = _this.origindata, \r\n            filterdata = {};\r\n\r\n        $t.data(\"rowhidden\", \"\").find(\".luckysheet-slider-list-item-filtered\").hide();\r\n        _this.setDatatojsfile(\"selected\", {}, cindex);\r\n        _this.setDatatojsfile(\"rowhidden\", null, cindex);\r\n\r\n        let newdata = [];\r\n        for (let i = 0; i < d.length; i++) {\r\n            if (rowhidden[i] != null) {\r\n                continue;\r\n            }\r\n            newdata.push([].concat(d[i]));\r\n        }\r\n\r\n        _this.celldata = newdata;\r\n        _this.refreshPivotTable();\r\n        $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n    },\r\n    luckysheetsliderlistitemfilter: function ($filter) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n\r\n        let $t = $filter.parent(), \r\n            toffset = $t.offset(), \r\n            $menu = $(\"#luckysheet-pivotTableFilter-menu\"), \r\n            winH = $(window).height(), \r\n            winW = $(window).width();\r\n\r\n        let cindex = $t.data(\"index\");\r\n\r\n        let rowhidden = $t.data(\"rowhidden\");\r\n        if(rowhidden == null || rowhidden == \"\"){\r\n            rowhidden = {};\r\n        }\r\n        else if(getObjType(rowhidden) == \"string\"){\r\n            rowhidden = JSON.parse(rowhidden);\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n        $(\"#luckysheet-pivotTableFilter-byvalue-input\").val(\"\");\r\n        $(\"#luckysheet-pivotTableFilter-bycondition\").next().hide();\r\n        $(\"#luckysheet-pivotTableFilter-byvalue\").next().show();\r\n\r\n        $menu.data(\"index\", cindex);\r\n\r\n        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").hide().find(\"input\").val();\r\n        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.filiterInputNone);\r\n\r\n        let byconditiontype = $t.data(\"byconditiontype\");\r\n        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"value\", $t.data(\"byconditionvalue\")).data(\"type\", byconditiontype).text($t.data(\"byconditiontext\"));\r\n\r\n        if (byconditiontype == \"2\") {\r\n            let $input = $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2\").show().find(\"input\");\r\n            $input.eq(0).val($t.data(\"byconditionvalue1\"));\r\n            $input.eq(1).val($t.data(\"byconditionvalue2\"));\r\n        }\r\n        else if (byconditiontype == \"1\") {\r\n            $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").eq(0).show().find(\"input\").val($t.data(\"byconditionvalue1\"));\r\n        }\r\n        const loadingObj = luckysheetlodingHTML(\"#luckysheet-pivotTableFilter-byvalue-select\",{text:locale_filter.filiterMoreDataTip});\r\n        $(\"#luckysheet-pivotTableFilter-byvalue-select\").empty().append(loadingObj.el)\r\n        \r\n        let rowhiddenother = {}; //\u5176\u5B83\u7B5B\u9009\u5217\u7684\u9690\u85CF\u884C\r\n        $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").not($t.get(0)).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n\r\n            if (rh == null || rh == \"\") {\r\n                return true;\r\n            }\r\n\r\n            if(getObjType(rh) == \"string\"){\r\n                rh = JSON.parse(rh);\r\n            }\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n\r\n        let data = _this.origindata;\r\n\r\n        setTimeout(function () {\r\n            //\u65E5\u671F\u503C\r\n            let dvmap = {};  \r\n            let dvmap_uncheck = {};\r\n\r\n            //\u9664\u65E5\u671F\u4EE5\u5916\u7684\u503C\r\n            let vmap = {}; \r\n            let vmap_uncheck = {};  \r\n\r\n            for (let r = 1; r < data.length; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(data[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = data[r][cindex];\r\n\r\n                if(cell != null && cell.ct != null && cell.ct.t == \"d\"){ //\u5355\u5143\u683C\u662F\u65E5\u671F\r\n                    let v = update(\"YYYY-MM-DD\", cell.v);\r\n\r\n                    let y = v.split(\"-\")[0];\r\n                    let m = v.split(\"-\")[1];\r\n                    let d = v.split(\"-\")[2];\r\n\r\n                    if(!(y in dvmap)){\r\n                        dvmap[y] = {};\r\n                    }\r\n\r\n                    if(!(m in dvmap[y])){\r\n                        dvmap[y][m] = {};\r\n                    }\r\n\r\n                    if(!(d in dvmap[y][m])){\r\n                        dvmap[y][m][d] = 0;\r\n                    }\r\n                    \r\n                    dvmap[y][m][d]++;\r\n\r\n                    if(r in rowhidden){\r\n                        dvmap_uncheck[y] = 0;\r\n                        dvmap_uncheck[m] = 0;\r\n                        dvmap_uncheck[d] = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    let v, m;\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        v = null;\r\n                        m = null;\r\n                    }\r\n                    else{\r\n                        v = cell.v;\r\n                        m = cell.m;\r\n                    }\r\n\r\n                    if(!(v in vmap)){\r\n                        vmap[v] = {};\r\n                    }\r\n\r\n                    if(!(m in vmap[v])){\r\n                        vmap[v][m] = 0;                            \r\n                    }\r\n\r\n                    vmap[v][m]++;\r\n\r\n                    if(r in rowhidden){\r\n                        vmap_uncheck[v + \"#$$$#\" + m] = 0;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u904D\u5386\u6570\u636E\u52A0\u5230\u9875\u9762\r\n            let item = [];\r\n\r\n            if(JSON.stringify(dvmap).length > 2){\r\n                for(let y in dvmap){\r\n                    let ysum = 0;\r\n                    let monthHtml = '';\r\n\r\n                    for(let m in dvmap[y]){\r\n                        let msum = 0;\r\n                        let dayHtml = '';\r\n\r\n                        for(let d in dvmap[y][m]){\r\n                            let dayL = dvmap[y][m][d];\r\n                            msum += dayL;\r\n\r\n                            //\u6708 \u5C0F\u4E8E 10\r\n                            let mT;\r\n                            if(Number(m) < 10){\r\n                                mT = \"0\" + Number(m);\r\n                            }\r\n                            else{\r\n                                mT = m;    \r\n                            }\r\n\r\n                            //\u65E5 \u5C0F\u4E8E 10\r\n                            let dT;\r\n                            if(Number(d) < 10){\r\n                                dT = \"0\" + Number(d);\r\n                            }\r\n                            else{\r\n                                dT = d;    \r\n                            }\r\n\r\n                            //\u65E5\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                            if((y in dvmap_uncheck) && (m in dvmap_uncheck) && (d in dvmap_uncheck)){\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                            else{\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                        }\r\n\r\n                        ysum += msum;\r\n                        \r\n                        //\u6708 \u5C0F\u4E8E 10\r\n                        let mT2;\r\n                        if(Number(m) < 10){\r\n                            mT2 = \"0\" + Number(m);\r\n                        }\r\n                        else{\r\n                            mT2 = m;    \r\n                        }\r\n\r\n                        //\u6708\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                        if((y in dvmap_uncheck) && (m in dvmap_uncheck)){\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+locale_filter.filiterMonthText+'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                         '</div>';\r\n                        }\r\n                        else{\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+locale_filter.filiterMonthText+'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                         '</div>';\r\n                        }\r\n                    }\r\n\r\n                    //\u5E74\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                    let yearHtml;\r\n                    if(y in dvmap_uncheck){\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+locale_filter.filiterYearText+'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n                    else{\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+locale_filter.filiterYearText+'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n\r\n                    item.unshift(yearHtml);\r\n                }\r\n            }\r\n\r\n            if(JSON.stringify(vmap).length > 2){\r\n                let vmapKeys = Object.keys(vmap);\r\n                vmapKeys = orderbydata1D(vmapKeys, true);\r\n\r\n                for(let i = 0; i < vmapKeys.length; i++){\r\n                    let v = vmapKeys[i];\r\n\r\n                    for(let x in vmap[v]){\r\n                        let text;\r\n                        if((v + \"#$$$#\" + x) == \"null#$$$#null\"){\r\n                            text = locale_filter.valueBlank;\r\n                        }\r\n                        else{\r\n                            text = x;\r\n                        }\r\n\r\n                        //\u662F\u5426\u9009\u4E2D\u72B6\u6001\r\n                        let dataHtml;\r\n                        if((v + \"#$$$#\" + x) in vmap_uncheck){\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"false\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ x +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n                        else{\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"true\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ x +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n\r\n                        item.push(dataHtml);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // \u9002\u914D\u5C0F\u5C4F\u8BBE\u5907\r\n            let containerH = winH - toffset.top - 350\r\n            if (containerH < 0) containerH = 100\r\n            //$(\"#luckysheet-pivotTableFilter-byvalue-select\").html(\"<div class='ListBox luckysheet-mousedown-cancel' style='max-height:\" + containerH + \"px;overflow-y:auto;overflow-x:hidden;'>\" + item.join(\"\") + \"</div>\");\r\n\r\n\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-select\").append(\"<div class='ListBox luckysheet-mousedown-cancel' style='max-height:\" + containerH + \"px;overflow-y:auto;overflow-x:hidden;'>\" + item.join(\"\") + \"</div>\");\r\n            loadingObj.close()\r\n\r\n        }, 1);\r\n\r\n        showrightclickmenu($menu, toffset.left - 250, toffset.top);\r\n    },\r\n    getSumTypeName: function (type) {\r\n        let name = \"\";\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        if (type == \"SUM\") {\r\n            name = locale_pivotTable.valueStatisticsSUM;\r\n        }\r\n        else if (type == \"COUNT\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNT;\r\n        }\r\n        else if (type == \"COUNTA\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNTA;\r\n        }\r\n        else if (type == \"COUNTUNIQUE\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNTUNIQUE;\r\n        }\r\n        else if (type == \"AVERAGE\") {\r\n            name = locale_pivotTable.valueStatisticsAVERAGE;\r\n        }\r\n        else if (type == \"MAX\") {\r\n            name = locale_pivotTable.valueStatisticsMAX;\r\n        }\r\n        else if (type == \"MIN\") {\r\n            name = locale_pivotTable.valueStatisticsMIN;\r\n        }\r\n        else if (type == \"MEDIAN\") {\r\n            name = locale_pivotTable.valueStatisticsMEDIAN;\r\n        }\r\n        else if (type == \"PRODUCT\") {\r\n            name = locale_pivotTable.valueStatisticsPRODUCT;\r\n        }\r\n        else if (type == \"STDEV\") {\r\n            name = locale_pivotTable.valueStatisticsSTDEV;\r\n        }\r\n        else if (type == \"STDEVP\") {\r\n            name = locale_pivotTable.valueStatisticsSTDEVP;\r\n        }\r\n        else if (type == \"let\") {\r\n            name = locale_pivotTable.valueStatisticslet;\r\n        }\r\n        else if (type == \"VARP\") {\r\n            name = locale_pivotTable.valueStatisticsVARP;\r\n        }\r\n\r\n        return name;\r\n    },\r\n    setDatatojsfile: function (attr, value, cindex) {\r\n        let _this = this;\r\n\r\n        let index = getSheetIndex(_this.pivotSheetIndex);\r\n        if (Store.luckysheetfile[index][\"pivotTable\"] == null) {\r\n            Store.luckysheetfile[index][\"pivotTable\"] = {};\r\n        }\r\n\r\n        if (cindex == null) {\r\n            Store.luckysheetfile[index][\"pivotTable\"][attr] = value;\r\n            _this[attr] = value;\r\n        }\r\n        else {\r\n            if (Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"] == null) {\r\n                Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"] = {};\r\n            }\r\n\r\n            if (Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()] == null) {\r\n                Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()] = {};\r\n            }\r\n            Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()][attr] = value;\r\n\r\n            if (_this[\"filterparm\"] == null) {\r\n                _this[\"filterparm\"] = {};\r\n            }\r\n\r\n            if (_this[\"filterparm\"][cindex.toString()] == null) {\r\n                _this[\"filterparm\"][cindex.toString()] = {};\r\n            }\r\n\r\n            _this[\"filterparm\"][cindex.toString()][attr] = value;\r\n        }\r\n    },\r\n    createPivotTable: function (e) {\r\n\r\n        if(isEditMode() || Store.allowEdit===false){\r\n            return;\r\n        }\r\n        let _this = this;\r\n\r\n        let datasheetindex = Store.currentSheetIndex;\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        if(isEditMode()){\r\n            alert(locale_pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            tooltip.info(\"\", locale_pivotTable.errorNotAllowMulti);\r\n            return\r\n        }\r\n\r\n        if (Store.luckysheet_select_save.length == 0 || Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] || Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]) {\r\n            tooltip.info(\"\", locale_pivotTable.errorSelectRange);\r\n            return;\r\n        }\r\n\r\n        let select_save = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n        sheetmanage.addNewSheet(e, true);\r\n\r\n        _this.getCellData(Store.currentSheetIndex, datasheetindex, select_save);\r\n\r\n        _this.setDatatojsfile(\"pivot_select_save\", select_save);\r\n        _this.setDatatojsfile(\"pivotDataSheetIndex\", datasheetindex);\r\n\r\n        _this.initialPivotManage();\r\n    },\r\n    changePivotTable: function (index) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        let pivotDataSheetIndex = Store.luckysheetfile[getSheetIndex(index)].pivotTable.pivotDataSheetIndex;\r\n        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);\r\n\r\n        if(real_pivotDataSheetIndex == null){\r\n            tooltip.info(locale_pivotTable.errorIsDamage, \"\");\r\n            return;\r\n        }\r\n\r\n        _this.getCellData(index);\r\n        _this.initialPivotManage(true);\r\n        _this.refreshPivotTable(); //\u521D\u59CB\u5316\u5728\u4E00\u4E2A\u666E\u901Asheet\u9875\uFF0C\u4ECE\u6B64\u666E\u901Asheet\u9875\u5207\u6362\u5230\u6570\u636E\u900F\u89C6\u8868\u9875\u65F6\uFF0C\u9700\u8981\u5237\u65B0\u4E0B\u6570\u636E\uFF0C\u5426\u5219\u8FD8\u662F\u65E7\u6570\u636E\r\n    },\r\n    refreshPivotTable: function (isRefreshCanvas=true) {\r\n        let _this = this;\r\n\r\n        let redo = {};\r\n        redo[\"pivotTable\"] = pivotTable; \r\n        redo[\"data\"] = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n        _this.storePivotTableParam();\r\n        let ret = _this.dataHandler(_this.column, _this.row, _this.values, _this.showType, _this.celldata);\r\n        _this.setDatatojsfile(\"pivotDatas\", ret);\r\n\r\n        let d = $.extend(true, [], sheetmanage.nulldata);\r\n        let data = d;\r\n\r\n        let addr = 0, addc = 0;\r\n\r\n        if (ret.length == 0) {\r\n            _this.setDatatojsfile(\"drawPivotTable\", true);\r\n            _this.setDatatojsfile(\"pivotTableBoundary\", [12, 6]);\r\n        }\r\n        else {\r\n            _this.setDatatojsfile(\"drawPivotTable\", false);\r\n            _this.setDatatojsfile(\"pivotTableBoundary\", [ret.length, ret[0].length]);\r\n\r\n            let rlen = ret.length, \r\n                clen = ret[0].length;\r\n\r\n            addr = rlen - d.length; \r\n            addc = clen - d[0].length;\r\n\r\n            data = datagridgrowth(d, addr + 20, addc + 10, true);\r\n\r\n            for (let r = 0; r < rlen; r++) {\r\n                let x = [].concat(data[r]);\r\n                for (let c = 0; c < clen; c++) {\r\n                    let value = \"\";\r\n                    if (ret[r] != null && ret[r][c] != null) {\r\n                        value = getcellvalue(r, c, ret);\r\n                    }\r\n                    x[c] = value;\r\n                }\r\n                data[r] = x;\r\n            }\r\n        }\r\n\r\n        redo[\"type\"] = \"pivotTable_change\";\r\n        redo[\"curdata\"] = $.extend(true, [], data);\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n        redo[\"pivotTablecur\"] = _this.getPivotTableData();\r\n\r\n        if(Store.clearjfundo){\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n        \r\n        cleargridelement();\r\n        Store.clearjfundo = false;\r\n        \r\n        if (addr > 0 || addc > 0) {\r\n            jfrefreshgridall(data[0].length, data.length, data, null, Store.luckysheet_select_save, \"datachangeAll\", undefined, undefined,isRefreshCanvas);\r\n        }\r\n        else {\r\n            jfrefreshgrid(data, Store.luckysheet_select_save, {}, null, isRefreshCanvas);\r\n            selectHightlightShow();\r\n        }\r\n\r\n        Store.clearjfundo = true;\r\n    },\r\n    drawPivotTable: true,\r\n    pivotTableBoundary: [12, 6],\r\n    pivotclick: function (row_index, col_index, index) {\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n        if(!file.isPivotTable){\r\n            return;\r\n        }\r\n\r\n        let pivotDataSheetIndex = file.pivotTable.pivotDataSheetIndex;\r\n        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);\r\n\r\n        if(real_pivotDataSheetIndex == null){\r\n            return;\r\n        }\r\n\r\n        let slider = $(\"#luckysheet-modal-dialog-slider-pivot\");        \r\n\r\n        let isRangeClick = this.isPivotRange(row_index, col_index);\r\n        if (isRangeClick && slider.is(\":hidden\")) {\r\n            if(!checkProtectionAuthorityNormal(index, \"usePivotTablereports\",false)){\r\n                // Store.luckysheet_select_status = false;\r\n                return;\r\n            }\r\n            slider.show();\r\n            luckysheetsizeauto();\r\n            $(\"#luckysheet-sta-content\").css(\"padding-right\", 260);\r\n        }\r\n        else if(!isRangeClick && slider.is(\":visible\")) {\r\n            slider.hide();\r\n            luckysheetsizeauto();\r\n            $(\"#luckysheet-sta-content\").css(\"padding-right\", 10);\r\n        }\r\n    },\r\n    isPivotRange: function (row_index, col_index) {\r\n        let _this = this;\r\n\r\n        if (!!Store.luckysheetcurrentisPivotTable) {\r\n            if (row_index < _this.pivotTableBoundary[0] && col_index < _this.pivotTableBoundary[1]) {\r\n                return true;\r\n            }\r\n            else {\r\n                return false;\r\n            }\r\n        }\r\n    },\r\n    storePivotTableParam: function () {\r\n        let _this = this;\r\n        let columnarr = [], rowarr = [], filterarr = [], valuesarr = [];\r\n\r\n        $(\"#luckysheet-modal-dialog-config-filter .luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text();\r\n            filterarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-row .luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text();\r\n            item[\"order\"] = $(this).data(\"order\");\r\n            item[\"orderby\"] = $(this).data(\"orderby\");\r\n            item[\"stastic\"] = $(this).data(\"stastic\");\r\n            rowarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-column .luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text();\r\n            item[\"order\"] = $(this).data(\"order\");\r\n            item[\"orderby\"] = $(this).data(\"orderby\");\r\n            item[\"stastic\"] = $(this).data(\"stastic\");\r\n            columnarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text();\r\n            item[\"sumtype\"] = $(this).data(\"sumtype\");\r\n            item[\"nameindex\"] = $(this).data(\"nameindex\");\r\n            valuesarr.push(item);\r\n        });\r\n\r\n        _this.setDatatojsfile(\"column\", columnarr);\r\n        _this.setDatatojsfile(\"row\", rowarr);\r\n        _this.setDatatojsfile(\"filter\", filterarr);\r\n        _this.setDatatojsfile(\"values\", valuesarr);\r\n        let showtype = $(\"#luckysheetpivottablevaluecolrow:checked, #luckysheetpivottablevaluecolrow1:checked\").val();\r\n        _this.setDatatojsfile(\"showType\", showtype == \"0\" ? \"row\" : \"column\");\r\n\r\n        let pivotTable = _this.getPivotTableData();\r\n        delete pivotTable.pivotDatas;\r\n        server.saveParam(\"all\", _this.pivotSheetIndex, pivotTable, { \"k\": \"pivotTable\" });\r\n    },\r\n    getPivotTableData: function(dataindex){\r\n        if(dataindex == null){\r\n            dataindex = this.pivotSheetIndex;\r\n        }\r\n\r\n        let index = getSheetIndex(dataindex);\r\n        let pivotTable = Store.luckysheetfile[index][\"pivotTable\"];\r\n\r\n        if(getObjType(pivotTable) == \"object\"){\r\n            pivotTable = $.extend(true, {}, Store.luckysheetfile[index][\"pivotTable\"]);\r\n        }\r\n        else{\r\n            pivotTable = new Function(\"return \" + pivotTable )();\r\n        }\r\n\r\n        return pivotTable\r\n    },\r\n    addValuesToTitle: function (titles, values) {\r\n        let rowLen = titles.length * values.length, \r\n            colLen = titles[0].length + 1;\r\n        \r\n        let retdata = [];\r\n        if (titles.length == 0 && values.length > 0) {\r\n            for (let v = 0; v < values.length; v++) {\r\n                retdata.push(values[v].fullname);\r\n            }\r\n\r\n            return retdata;\r\n        }\r\n\r\n        if (values.length == 0 && titles.length > 0) {\r\n            return titles;\r\n        }\r\n\r\n        for (let r = 0; r < rowLen; r++) {\r\n            retdata[r] = new Array(colLen);\r\n\r\n            for (let c = 0; c < colLen - 1; c++) {\r\n                retdata[r][c] = titles[Math.floor(r / values.length)][c];\r\n            }\r\n\r\n            retdata[r][colLen - 1] = values[r % values.length].fullname;\r\n        }\r\n\r\n        return retdata;\r\n    },\r\n    initialPivotManage: function (restore) {\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n        const locale_button = _locale.button;\r\n        const locale_filter = _locale.filter;\r\n\r\n        if (_this.initial) {\r\n            _this.initial = false;\r\n\r\n\r\n\r\n            $(\"body\").append(luckysheetPivotTableHTML());\r\n            $(\"#luckysheet-modal-dialog-slider-close\").click(function () {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                luckysheetsizeauto();\r\n            });\r\n\r\n            $(\"body\").append(replaceHtml(modelHTML, { \"id\": \"luckysheet-data-pivotTable-selection\", \"addclass\": \"luckysheet-data-pivotTable-selection\", \"title\": locale_pivotTable.titleSelectionDataRange, \"content\": '<input id=\"luckysheet-pivotTable-range-selection-input\" class=\"luckysheet-datavisual-range-container\" style=\"font-size: 14px;padding:5px;max-width:none;\" spellcheck=\"false\" aria-label=\"'+locale_pivotTable.titleDataRange+'\" placeholder=\"'+locale_pivotTable.titleDataRange+'\">', \"botton\": '<button id=\"luckysheet-pivotTable-selection-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>' }));\r\n\r\n            $(\"body\").append(replaceHtml(filtermenuHTML(), { \"menuid\": \"pivotTableFilter\" }));\r\n            $(\"body\").append(replaceHtml(filtersubmenuHTML(), { \"menuid\": \"pivotTableFilter\" }));\r\n            $(\"body\").append(pivottableconfigHTML());\r\n            $(\"body\").append(pivottablesumHTML());\r\n\r\n            $(\"#luckysheet-pivotTableFilter-orderby-asc\").remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-desc\").next().remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-desc\").remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-color\").next().remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-color\").remove();\r\n\r\n            $(\"#luckysheetpivottablevaluecolrow, #luckysheetpivottablevaluecolrow1\").checkboxradio({\r\n                icon: false\r\n            }).change(function () {\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            let hidefilersubmenu = null;\r\n            $(\"#luckysheet-pivotTableFilter-menu\").mouseover(function () {\r\n                clearTimeout(hidefilersubmenu);\r\n                hidefilersubmenu = setTimeout(function () {\r\n                    $(\"#luckysheet-pivotTableFilter-submenu\").hide();\r\n                }, 500);\r\n            });\r\n\r\n            //\u70B9\u51FB\u590D\u9009\u6846\r\n            $(document).off(\"click.ptFilterCheckbox1\").on(\"click.ptFilterCheckbox1\", \"#luckysheet-pivotTableFilter-byvalue-select .textBox\",function(){\r\n                if($(this).attr(\"data-check\") == \"true\"){\r\n                    $(this).attr(\"data-check\", \"false\");\r\n                    $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n                else{\r\n                    $(this).attr(\"data-check\", \"true\");\r\n                    $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n            })\r\n            $(document).off(\"click.ptFilterCheckbox2\").on(\"click.ptFilterCheckbox2\", \"#luckysheet-pivotTableFilter-byvalue-select .year\",function(){\r\n                if($(this).attr(\"data-check\") == \"true\"){\r\n                    $(this).attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n                else{\r\n                    $(this).attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n            })\r\n            $(document).off(\"click.ptFilterCheckbox3\").on(\"click.ptFilterCheckbox3\", \"#luckysheet-pivotTableFilter-byvalue-select .month\",function(){\r\n                //\u6708\u4EFD \u5BF9\u5E94\u7684 \u5929\r\n                if($(this).attr(\"data-check\") == \"true\"){\r\n                    $(this).attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n                else{\r\n                    $(this).attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n                //\u6708\u4EFD \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n                let yearDayAllCheck = true;\r\n                let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n                $yearDay.each(function(i,e){\r\n                    if($(e).attr(\"data-check\") == \"true\"){\r\n                        \r\n                    }\r\n                    else{\r\n                        yearDayAllCheck = false;\r\n                    }\r\n                });\r\n                if(yearDayAllCheck){\r\n                    $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n                else{\r\n                    $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n            })\r\n            $(document).off(\"click.ptFilterCheckbox4\").on(\"click.ptFilterCheckbox4\", \"#luckysheet-pivotTableFilter-byvalue-select .day\",function(){\r\n                if($(this).attr(\"data-check\") == \"true\"){\r\n                    $(this).attr(\"data-check\", \"false\");\r\n                    $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n                else{\r\n                    $(this).attr(\"data-check\", \"true\");\r\n                    $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n                //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n                let monthDayAllCheck = true;\r\n                let $monthDay = $(this).parents(\".monthBox\").find(\".day\");\r\n                $monthDay.each(function(i,e){\r\n                    if($(e).attr(\"data-check\") == \"true\"){\r\n                        \r\n                    }\r\n                    else{\r\n                        monthDayAllCheck = false;\r\n                    }\r\n                });\r\n                if(monthDayAllCheck){\r\n                    $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n                else{\r\n                    $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n                //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n                let yearDayAllCheck = true;\r\n                let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n                $yearDay.each(function(i,e){\r\n                    if($(e).attr(\"data-check\") == \"true\"){\r\n                        \r\n                    }\r\n                    else{\r\n                        yearDayAllCheck = false;\r\n                    }\r\n                });\r\n                if(yearDayAllCheck){\r\n                    $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n                    $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n                }\r\n                else{\r\n                    $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n                    $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n                }\r\n            })\r\n\r\n            //\u65E5\u671F \u4E09\u7EA7\u4E0B\u62C9\u663E\u793A\r\n            $(document).off(\"click.ptFilterYearDropdown\").on(\"click.ptFilterYearDropdown\", \"#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right\",function(){\r\n                let $p = $(this).parents(\".luckysheet-mousedown-cancel\");\r\n                if($p.hasClass(\"year\")){\r\n                    $(this).parents(\".yearBox\").find(\".monthList\").slideToggle();\r\n                }\r\n                if($p.hasClass(\"month\")){\r\n                    $(this).parents(\".monthBox\").find(\".dayList\").slideToggle();\r\n                }\r\n            });\r\n\r\n            //\u5168\u9009\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-all\").click(function () {\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").prop(\"checked\", true);\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n            });\r\n\r\n            //\u53CD\u9009\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-contra\").click(function () {\r\n                let $input = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\");\r\n                $input.each(function(i, e){\r\n                    if($(e).is(\":checked\")){\r\n                        $(e).removeAttr(\"checked\");\r\n                        $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n                    }\r\n                    else{\r\n                        $(e).prop(\"checked\", true);\r\n                        $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n                    }\r\n                });\r\n                //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n                let $month = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .monthBox\");\r\n                $month.each(function(index, event){\r\n                    let monthDayAllCheck = true;\r\n                    let $monthDay = $(event).find(\".day input[type='checkbox']\");\r\n                    $monthDay.each(function(i,e){\r\n                        if($(e).is(\":checked\")){\r\n                            \r\n                        }\r\n                        else{\r\n                            monthDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if(monthDayAllCheck){\r\n                        $(event).find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n                        $(event).attr(\"data-check\", \"true\");\r\n                    }\r\n                    else{\r\n                        $(event).find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n                        $(event).attr(\"data-check\", \"false\");\r\n                    }\r\n                });\r\n                //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n                let $year = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .yearBox\");\r\n                $year.each(function(index, event){\r\n                    let yearDayAllCheck = true;\r\n                    let $yearDay = $(event).find(\".day input[type='checkbox']\");\r\n                    $yearDay.each(function(i,e){\r\n                        if($(e).is(\":checked\")){\r\n                            \r\n                        }\r\n                        else{\r\n                            yearDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if(yearDayAllCheck){\r\n                        $(event).find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n                        $(event).attr(\"data-check\", \"true\");\r\n                    }\r\n                    else{\r\n                        $(event).find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n                        $(event).attr(\"data-check\", \"false\");\r\n                    }\r\n                });\r\n            });\r\n\r\n            //\u6E05\u9664\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-clear\").click(function () {\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n            });\r\n\r\n            //\u6309\u7167\u503C\u8FDB\u884C\u7B5B\u9009\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-input\").on('input propertychange', function () {\r\n                let v = $(this).val().toString();\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .luckysheet-mousedown-cancel\").show();\r\n                if(v != \"\"){\r\n                    let $check = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\");\r\n                    $check.each(function(i, e){\r\n                        let $p = $(e).parents(\".luckysheet-mousedown-cancel\");\r\n                        if($p.hasClass(\"day\")){ //\u65E5\u671F\r\n                            let day = $(e).siblings(\"label\").text().toString();\r\n                            let month = $(e).parents(\".monthBox\").find(\".month label\").text().toString();\r\n                            let year = $(e).parents(\".yearBox\").find(\".year label\").text().toString();\r\n                            let itemV = year + \"-\" + month + \"-\" + day;\r\n                            \r\n                            if(itemV.indexOf(v) == -1){\r\n                                $(e).parents(\".day\").hide();\r\n                                //\u5929 \u5BF9\u5E94\u7684 \u6708\u4EFD\r\n                                let $monthDay = $(e).parents(\".dayList\").find(\".day:visible\");\r\n                                if($monthDay.length == 0){\r\n                                    $(e).parents(\".monthBox\").find(\".month\").hide();\r\n                                }\r\n                                //\u5929 \u5BF9\u5E94\u7684 \u5E74\u4EFD\r\n                                let $yearDay = $(e).parents(\".monthList\").find(\".day:visible\");\r\n                                if($yearDay.length == 0){\r\n                                    $(e).parents(\".yearBox\").find(\".year\").hide();\r\n                                }\r\n                            }\r\n                        }\r\n                        if($p.hasClass(\"textBox\")){ //\u5176\u5B83\r\n                            let itemV = $(e).siblings(\"label\").text().toString();\r\n                            \r\n                            if(itemV.indexOf(v) == -1){\r\n                                $(e).parents(\".textBox\").hide();\r\n                            }\r\n                        }\r\n                    });\r\n                }\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTableFilter-bycondition, #luckysheet-pivotTableFilter-byvalue\").click(function () {\r\n                let $t = $(this);\r\n                $t.next().slideToggle(200);\r\n                setTimeout(function () {\r\n                    if ($t.attr(\"id\") == \"luckysheet-pivotTableFilter-bycondition\" && $(\"#luckysheet-pivotTableFilter-bycondition\").next().is(\":visible\")) {\r\n                        if ($(\"#luckysheet-pivotTableFilter-selected span\").text() != locale_filter.filiterInputNone) {\r\n                            $(\"#luckysheet-pivotTableFilter-byvalue\").next().slideUp(200);\r\n                        }\r\n                    }\r\n\r\n                    if ($t.is($(\"#luckysheet-pivotTableFilter-bycondition\"))) {\r\n                        if ($(\"#luckysheet-pivotTableFilter-bycondition\").next().is(\":hidden\") && $(\"#luckysheet-pivotTableFilter-byvalue\").next().is(\":hidden\")) {\r\n                            $(\"#luckysheet-pivotTableFilter-byvalue\").next().slideDown(200);\r\n                        }\r\n                    }\r\n                }, 300);\r\n\r\n            });\r\n\r\n            //\u53D6\u6D88\u6309\u94AE\r\n            $(\"#luckysheet-pivotTableFilter-cancel\").click(function () {\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTableFilter-selected\").click(function () {\r\n                let $t = $(this), toffset = $t.offset(), $menu = $(\"#luckysheet-pivotTableFilter-submenu\");\r\n                $menu.hide();\r\n                let winH = $(window).height(), winW = $(window).width();\r\n                let menuW = $menu.width(), menuH = $menu.height();\r\n                let top = toffset.top, left = toffset.left, mheight = winH - toffset.top - 20;\r\n                if (toffset.left + menuW > winW) {\r\n                    left = toffset.left - menuW;\r\n                }\r\n\r\n                if (toffset.top > winH / 2) {\r\n                    top = winH - toffset.top;\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    mheight = toffset.top - 20;\r\n                }\r\n\r\n                $menu.css({ \"top\": top, \"left\": left, \"height\": mheight }).show();\r\n                clearTimeout(hidefilersubmenu);\r\n            });\r\n\r\n            //\u6309\u6761\u4EF6\u8FC7\u6EE4\r\n            $(\"#luckysheet-pivotTableFilter-submenu\").mouseover(function () {\r\n                clearTimeout(hidefilersubmenu);\r\n            }).find(\".luckysheet-cols-menuitem\").click(function (e) {\r\n                $(\"#luckysheet-pivotTableFilter-selected span\").html($(this).find(\".luckysheet-cols-menuitem-content\").text()).data(\"value\", $(this).data(\"value\"));\r\n                $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").hide();\r\n                if ($(this).data(\"type\") == \"2\") {\r\n                    $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"2\");\r\n                    $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2\").show();\r\n                }\r\n                else if ($(this).data(\"type\") == \"0\") {\r\n                    $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"0\");\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"1\");\r\n                    $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").eq(0).show();\r\n                    //\u82E5\u662F\u65E5\u671F \u6539\u53D8input type\u7C7B\u578B\u4E3Adate\r\n                    if($(this).attr(\"data-value\") == \"dateequal\" || $(this).attr(\"data-value\") == \"datelessthan\" || $(this).attr(\"data-value\") == \"datemorethan\"){\r\n                        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input\").prop(\"type\", \"date\");\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input\").prop(\"type\", \"text\");\r\n                    }\r\n                }\r\n                $(\"#luckysheet-pivotTableFilter-byvalue\").next().slideUp();\r\n                $(\"#luckysheet-pivotTableFilter-submenu\").hide();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\"click\", \" .luckysheet-slider-list-item-filter\", function (e) {\r\n                _this.luckysheetsliderlistitemfilter($(this));\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\"click\", \" .luckysheet-slider-list-item-filtered\", function (e) {\r\n                _this.luckysheetsliderlistclearfilter($(this).next());\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            $(\"#luckysheet-dialog-pivotTable-range-seleted\").click(function () {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                luckysheetsizeauto();\r\n                let $t = $(\"#luckysheet-data-pivotTable-selection\"), \r\n                    myh = $t.outerHeight(), \r\n                    myw = $t.outerWidth();\r\n                let winw = $(window).width(), winh = $(window).height();\r\n                let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n\r\n                $(\"#luckysheet-data-pivotTable-selection\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 4 }).show();\r\n\r\n                _this.jgridCurrentPivotInput = $(\"#luckysheet-dialog-pivotTable-range\").html();\r\n                $(\"#luckysheet-pivotTable-range-selection-input\").val(_this.jgridCurrentPivotInput);\r\n                _this.luckysheet_pivotTable_select_state = true;\r\n            });\r\n\r\n            //\u6E05\u9664\u7B5B\u9009\u6309\u94AE\r\n            $(\"#luckysheet-pivotTableFilter-initial\").click(function () {\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-slider-list-item-filtered\").hide();\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").data(\"rowhidden\", \"\");\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n                $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").hide().find(\"input\").val();\r\n                $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.filiterInputNone);\r\n\r\n                _this.setDatatojsfile(\"filterparm\", null);\r\n                _this.celldata = _this.origindata;\r\n\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\").on(\"click\", \".luckysheet-modal-dialog-slider-config-item-icon\", function (e) {\r\n                let $t = $(e.target), \r\n                    $item = $t.closest(\".luckysheet-modal-dialog-slider-config-item\"), \r\n                    cindex = $item.data(\"index\"), \r\n                    toffset = $item.offset();\r\n                let order = $item.data(\"order\"), \r\n                    orderby = $item.data(\"orderby\"), \r\n                    stastic = $item.data(\"stastic\");\r\n                \r\n                if (order == null) {\r\n                    order = \"default\";\r\n                }\r\n\r\n                let option = '<option value=\"self\">' + $item.find(\".luckysheet-modal-dialog-slider-config-item-txt\").data(\"name\") + '</option>';\r\n\r\n                $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").each(function (i) {\r\n                    option += '<option value=\"' + i + '\">' + $(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text() + '</option>';\r\n                });\r\n                $(\"#luckysheet-pivotTable-config-option-orderby\").empty().html(option);\r\n                \r\n                if (orderby == null) {\r\n                    orderby = \"self\";\r\n                }\r\n\r\n                if (stastic == null) {\r\n                    stastic = \"1\";\r\n                }\r\n\r\n                $(\"#luckysheet-pivotTable-config-option-order\").val(order).data(\"index\", cindex);\r\n                $(\"#luckysheet-pivotTable-config-option-orderby\").val(orderby).data(\"index\", cindex);\r\n                $(\"#luckysheet-pivotTable-config-option-stastic\").val(stastic).data(\"index\", cindex);\r\n\r\n                mouseclickposition($(\"#luckysheet-pivotTable-config-option\"), toffset.left + $item.outerWidth(), toffset.top - 13, \"rightbottom\");\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTable-config-option-order,#luckysheet-pivotTable-config-option-orderby,#luckysheet-pivotTable-config-option-stastic\").change(function () {\r\n                let $t = $(this), cindex = $t.data(\"index\");\r\n                \r\n                $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                    if ($(this).data(\"index\") == cindex) {\r\n                        $(this).data($t.attr(\"id\").replace(\"luckysheet-pivotTable-config-option-\", \"\"), $t.val());\r\n                    }\r\n                });\r\n\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-value\").on(\"click\", \".luckysheet-modal-dialog-slider-config-item-icon\", function (e) {\r\n                let $t = $(e.target), \r\n                    $item = $t.closest(\".luckysheet-modal-dialog-slider-config-item\"), \r\n                    cindex = $item.data(\"index\"), \r\n                    toffset = $item.offset(), \r\n                    sumtype = $item.data(\"sumtype\");\r\n                \r\n                let type = _this.pivot_data_type[cindex.toString()];\r\n                if (sumtype == null) {\r\n                    if (type == \"num\") {\r\n                        sumtype = \"SUM\";\r\n                    }\r\n                    else {\r\n                        sumtype = \"COUNTA\";\r\n                    }\r\n                }\r\n\r\n                let $menu = $(\"#luckysheet-pivotTable-config-option-sumtype\");\r\n                $menu.find(\".luckysheet-submenu-arrow\").hide();\r\n                $menu.find(\".luckysheet-cols-menuitem[sumtype='\" + sumtype + \"'] .luckysheet-submenu-arrow\").css(\"display\", \"inline\");\r\n                $menu.data(\"item\", $item);\r\n\r\n                mouseclickposition($menu, toffset.left + $item.outerWidth(), toffset.top - 13, \"rightbottom\");\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem\").click(function () {\r\n                let $item = $(\"#luckysheet-pivotTable-config-option-sumtype\").data(\"item\");\r\n                let sumtype = $(this).attr(\"sumtype\");\r\n                $item.data(\"sumtype\", $(this).attr(\"sumtype\"));\r\n                let name = _this.getSumTypeName(sumtype) + \":\" + $item.data(\"name\");\r\n                $item.attr(\"title\", name).find(\".luckysheet-modal-dialog-slider-config-item-txt\").html(name);\r\n                $(\"#luckysheet-pivotTable-config-option-sumtype\").hide();\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-filter\").on(\"click\", \".luckysheet-modal-dialog-slider-config-item-icon\", function (e) {\r\n                let $t = $(e.target), \r\n                    cindex = $t.closest(\".luckysheet-modal-dialog-slider-config-item\").data(\"index\");\r\n                _this.luckysheetsliderlistitemfilter($(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(cindex).find(\".luckysheet-slider-list-item-filter\"));\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            //\u786E\u8BA4\u6309\u94AE\r\n            $(\"#luckysheet-pivotTableFilter-confirm\").click(function () {\r\n                let $menu = $(\"#luckysheet-pivotTableFilter-menu\");\r\n                let cindex = $menu.data(\"index\");\r\n\r\n                let rowhiddenother = {}; //\u5176\u5B83\u7B5B\u9009\u5217\u7684\u9690\u85CF\u884C\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").each(function () {\r\n                    let $t = $(this), rh = $t.data(\"rowhidden\");\r\n\r\n                    if($t.data(\"index\") != cindex){\r\n                        if (rh == null || rh == \"\") {\r\n                            return true;\r\n                        }\r\n\r\n                        if(getObjType(rh) == \"string\"){\r\n                            rh = JSON.parse(rh);\r\n                        }\r\n                        \r\n                        for (let r in rh) {\r\n                            rowhiddenother[r] = 0;\r\n                        }\r\n                    }\r\n                });\r\n\r\n                let d = _this.origindata;\r\n\r\n                let filterdata = {};\r\n                let rowhidden = {};\r\n                let caljs = {};\r\n\r\n                if ($(\"#luckysheet-pivotTableFilter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-pivotTableFilter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-pivotTableFilter-selected span\").data(\"value\") != \"null\") {\r\n                    let $t = $(\"#luckysheet-pivotTableFilter-selected span\");\r\n                    let type = $t.data(\"type\"), value = $t.data(\"value\");\r\n\r\n                    caljs[\"value\"] = value;\r\n                    caljs[\"text\"] = $t.text();\r\n\r\n                    if (type == \"0\") {\r\n                        caljs[\"type\"] = \"0\";\r\n                    }\r\n                    else if (type == \"2\") {\r\n                        let $input = $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2 input\");\r\n                        caljs[\"type\"] = \"2\";\r\n                        caljs[\"value1\"] = $input.eq(0).val();\r\n                        caljs[\"value2\"] = $input.eq(1).val();\r\n                    }\r\n                    else {\r\n                        caljs[\"type\"] = \"1\";\r\n                        caljs[\"value1\"] = $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").eq(0).find(\"input\").val();\r\n                    }\r\n\r\n                    for (let r = 1; r < d.length; r++) {\r\n                        if(r in rowhiddenother){\r\n                            continue;\r\n                        }\r\n\r\n                        if(d[r] == null){\r\n                            continue;\r\n                        }\r\n\r\n                        let cell = d[r][cindex];\r\n                        \r\n                        if (value == \"cellnull\") { //\u5355\u5143\u683C\u4E3A\u7A7A\r\n                            if(cell != null && !isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"cellnonull\") { //\u5355\u5143\u683C\u6709\u6570\u636E\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"textinclude\") { //\u6587\u672C\u5305\u542B \r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else{\r\n                                if(cell.m.indexOf(value1) == -1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (value == \"textnotinclude\") { //\u6587\u672C\u4E0D\u5305\u542B\r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n\r\n                            }\r\n                            else{\r\n                                if(cell.m.indexOf(value1) > -1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (value == \"textstart\") { //\u6587\u672C\u5F00\u5934\u4E3A\r\n                            let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else{\r\n                                if(cell.m.substr(0, valuelen) != value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (value == \"textend\") { //\u6587\u672C\u7ED3\u5C3E\u4E3A\r\n                            let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else{\r\n                                if(valuelen > cell.m.length || cell.m.substr(cell.m.length - valuelen, valuelen) != value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (value == \"textequal\") { //\u6587\u672C\u7B49\u4E8E\r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else{\r\n                                if(cell.m != value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (value == \"dateequal\") { //\u65E5\u671F\u7B49\u4E8E\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                                if(parseInt(cell.v) != value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"datelessthan\") { //\u65E5\u671F\u65E9\u4E8E\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                                if(parseInt(cell.v) >= value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"datemorethan\") { //\u65E5\u671F\u665A\u4E8E\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                                if(parseInt(cell.v) <= value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"morethan\") { //\u5927\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v <= value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"moreequalthan\") { //\u5927\u4E8E\u7B49\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v < value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"lessthan\") { //\u5C0F\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v >= value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"lessequalthan\") { //\u5C0F\u4E8E\u7B49\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v > value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"equal\") { //\u7B49\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v != value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"noequal\") { //\u4E0D\u7B49\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v == value1){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"include\") { //\u4ECB\u4E8E\r\n                            let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                            let min, max;\r\n                            if(value1 < value2){\r\n                                min = value1;\r\n                                max = value2;\r\n                            }\r\n                            else{\r\n                                max = value1;\r\n                                min = value2;   \r\n                            }\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v < min || cell.v > max){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                        else if (value == \"noinclude\") { //\u4E0D\u5728\u5176\u4E2D\r\n                            let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                            let min, max;\r\n                            if(value1 < value2){\r\n                                min = value1;\r\n                                max = value2;\r\n                            }\r\n                            else{\r\n                                max = value1;\r\n                                min = value2;   \r\n                            }\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                            else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                                if(cell.v >= min && cell.v <= max){\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                            else{\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").each(function(i, e){\r\n                        if($(e).is(\":visible\") && $(e).is(\":checked\")){\r\n                            return true;\r\n                        }\r\n\r\n                        if($(e).closest(\".day\").length > 0){\r\n                            let day = $(e).siblings(\"label\").text();\r\n                            if(Number(day) < 10){\r\n                                day = \"0\" + day;\r\n                            }\r\n\r\n                            let month = $(e).closest(\".monthBox\").find(\".month label\").text().replace(locale_filter.filiterMonthText, \"\");\r\n                            if(Number(month) < 10){\r\n                                month = \"0\" + month;\r\n                            }\r\n\r\n                            let year = $(e).closest(\".yearBox\").find(\".year label\").text().replace(locale_filter.filiterYearText, \"\");\r\n\r\n                            let itemV = locale_filter.filterDateFormatTip+\"#$$$#\" + year + \"-\" + month + \"-\" + day;\r\n\r\n                            filterdata[itemV] = \"1\";\r\n                        }\r\n\r\n                        if($(e).closest(\".textBox\").length > 0){\r\n                            let itemV = $(e).closest(\".textBox\").data(\"filter\");\r\n\r\n                            filterdata[itemV] = \"1\";\r\n                        }\r\n                    })\r\n\r\n                    for (let r = 1; r < d.length; r++) {\r\n                        if(r in rowhiddenother){\r\n                            continue;\r\n                        }\r\n\r\n                        if(d[r] == null){\r\n                            continue;\r\n                        }\r\n\r\n                        let cell = d[r][cindex];\r\n\r\n                        let value;\r\n                        if(cell == null || isRealNull(cell.v)){\r\n                            value = \"null#$$$#null\";\r\n                        }\r\n                        else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                            let fmt = update(\"YYYY-MM-DD\", cell.v);\r\n                            value = locale_filter.filterDateFormatTip+\"#$$$#\" + fmt;\r\n                        }\r\n                        else{\r\n                            value = cell.v + \"#$$$#\" + cell.m;\r\n                        }\r\n\r\n                        if(value in filterdata){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                let $top = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(cindex);\r\n                if ($(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible:checked\").length < $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible\").length || $(\"#luckysheet-pivotTableFilter-byvalue-input\").val().length > 0 || ($(\"#luckysheet-pivotTableFilter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-pivotTableFilter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-pivotTableFilter-selected span\").data(\"value\") != \"null\")) {\r\n                    $top.data(\"rowhidden\", JSON.stringify(rowhidden)).find(\".luckysheet-slider-list-item-filtered\").show();\r\n                    _this.setDatatojsfile(\"rowhidden\", rowhidden, cindex);\r\n\r\n                    if (caljs != null) {\r\n                        $top.data(\"byconditionvalue\", caljs[\"value\"]).data(\"byconditiontype\", caljs[\"type\"]).data(\"byconditiontext\", caljs[\"text\"]);\r\n                        \r\n                        if (caljs[\"value1\"] != null) {\r\n                            $top.data(\"byconditionvalue1\", caljs[\"value1\"]);\r\n                        }\r\n\r\n                        if (caljs[\"value2\"] != null) {\r\n                            $top.data(\"byconditionvalue2\", caljs[\"value2\"]);\r\n                        }\r\n\r\n                        _this.setDatatojsfile(\"caljs\", caljs, cindex);\r\n                    }\r\n                }\r\n                else {\r\n                    $top.data(\"rowhidden\", \"\").find(\".luckysheet-slider-list-item-filtered\").hide();\r\n                    _this.setDatatojsfile(\"rowhidden\", null, cindex);\r\n                }\r\n\r\n                let newdata = [];\r\n                for (let i = 0; i < d.length; i++) {\r\n                    if(i in rowhidden || i in rowhiddenother){\r\n                        continue;\r\n                    }\r\n\r\n                    newdata.push([].concat(d[i]));\r\n                }\r\n\r\n                _this.celldata = newdata;\r\n                _this.refreshPivotTable();\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n\r\n                cleargridelement();\r\n            });\r\n\r\n            $(\"#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn, #luckysheet-data-pivotTable-selection .luckysheet-modal-dialog-title-close\").click(function () {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n                luckysheetsizeauto();\r\n                $(\"#luckysheet-cell-main .luckysheet-pivotTable-selection-set div\").show();\r\n\r\n                $(\"#luckysheet-data-pivotTable-selection\").hide();\r\n\r\n                sheetmanage.changeSheetExec(_this.pivotSheetIndex);\r\n\r\n                _this.luckysheet_pivotTable_select_state = false;\r\n\r\n                cleargridelement();\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTable-selection-confirm\").click(function () {\r\n                let $input = $(\"#luckysheet-pivotTable-range-selection-input\"), val = $input.val();\r\n\r\n                if ($.trim(val).length == 0 || $.trim(val).toUpperCase() == _this.jgridCurrentPivotInput.toUpperCase()) {\r\n                    $input.val(_this.jgridCurrentPivotInput);\r\n                    $(\"#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn\").click();\r\n                    return;\r\n                }\r\n                else {\r\n                    let val1 = val.split(\"!\");\r\n                    let sheettxt = \"\", rangetxt = \"\", sheetIndex = -1;\r\n\r\n                    if (val1.length > 1) {\r\n                        sheettxt = val1[0];\r\n                        rangetxt = val1[1];\r\n\r\n                        for (let i in Store.luckysheetfile) {\r\n                            if (sheettxt == Store.luckysheetfile[i].name) {\r\n                                sheetIndex = Store.luckysheetfile[i].index;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if (sheetIndex == -1) {\r\n                            sheetIndex = 0;\r\n                        }\r\n                    }\r\n                    else {\r\n                        let index = getSheetIndex(Store.currentSheetIndex);\r\n                        sheettxt = Store.luckysheetfile[index].name;\r\n                        sheetIndex = Store.luckysheetfile[index].index;\r\n                        rangetxt = val1[0];\r\n                    }\r\n\r\n                    if(Store.luckysheetfile[getSheetIndex(sheetIndex)].isPivotTable){\r\n                        if(isEditMode()){\r\n                            alert(locale_pivotTable.errorNotAllowPivotData);\r\n                        }\r\n                        else{\r\n                            tooltip.info(\"\", locale_pivotTable.errorNotAllowPivotData);    \r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    if (rangetxt.indexOf(\":\") == -1) {\r\n                        if(isEditMode()){\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        else{\r\n                            tooltip.info(\"\", locale_pivotTable.errorSelectionRange);    \r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    rangetxt = rangetxt.split(\":\");\r\n                    let row = [], col = [];\r\n                    \r\n                    row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n                    row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n\r\n                    if (row[0] > row[1]) {\r\n                        if(isEditMode()){\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        else{\r\n                            tooltip.info(\"\", locale_pivotTable.errorSelectionRange);    \r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n                    col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n\r\n                    if (col[0] > col[1]) {\r\n                        if(isEditMode()){\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_pivotTable.errorSelectionRange);    \r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n                    sheetmanage.changeSheetExec(_this.pivotSheetIndex);\r\n\r\n                    _this.setDatatojsfile(\"pivot_select_save\", { \"row\": row, \"column\": col });\r\n                    _this.setDatatojsfile(\"pivotDataSheetIndex\", sheetIndex);\r\n\r\n                    _this.getCellData(_this.pivotSheetIndex, sheetIndex, { \"row\": row, \"column\": col });\r\n\r\n                    _this.initialPivotManage();\r\n\r\n                    $(\"#luckysheet-dialog-pivotTable-range\").html(val);\r\n\r\n                    $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n\r\n                    $(\"#luckysheet-data-pivotTable-selection\").hide();\r\n\r\n                    _this.luckysheet_pivotTable_select_state = false;\r\n\r\n                    _this.refreshPivotTable();\r\n\r\n                    luckysheetsizeauto();\r\n\r\n                    cleargridelement();\r\n                }\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-slider-pivot\").on(\"mousedown\", \".luckysheet-slider-list-item-name, .luckysheet-modal-dialog-slider-config-item-txt\", function (e) {\r\n                let $cur = $(e.target);\r\n                _this.movestate = true;\r\n                _this.movesave.obj = $cur.parent();\r\n                _this.movesave.name = $cur.data(\"name\");\r\n                _this.movesave.containerid = $cur.parent().parent().attr(\"id\");\r\n                _this.movesave.index = $cur.data(\"index\");\r\n                \r\n                if ($(\"#luckysheet-modal-dialog-slider-pivot-move\").length == 0) {\r\n                    $(\"body\").append('<div id=\"luckysheet-modal-dialog-slider-pivot-move\">' + _this.movesave.name + '</div>');\r\n                }\r\n\r\n                _this.movesave.width = $(\"#luckysheet-modal-dialog-slider-pivot-move\").outerWidth();\r\n                _this.movesave.height = $(\"#luckysheet-modal-dialog-slider-pivot-move\").outerHeight();\r\n\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").css(\"cursor\", \"default\");\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").mousemove(function (e) {\r\n                if (_this.movestate) {\r\n                    if (_this.moveitemposition.length == 0) {\r\n                        _this.moveitemposition = [0];\r\n                        \r\n                        $(this).find(\".luckysheet-modal-dialog-slider-config-item\").each(function (i) {\r\n                            let $t = $(this), h = $t.outerHeight();\r\n                            _this.moveitemposition.push(_this.moveitemposition[i] + h + 2);\r\n                        });\r\n                        $(this).append('<div id=\"luckysheet-modal-dialog-config-order-help\" style=\"position:absolute;height:3px;width:100%;background:#007ACC;z-index:1;pointer-events: none;user-select:none;\"></div>');\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({ \"background\": \"#FD8585\", \"color\": \"#fff\", \"border\": \"1px solid #FD7070\" });\r\n                    let x = event.pageX, y = event.pageY, $container = $(this);\r\n                    let curtop = y - $container.offset().top + $container.scrollTop();\r\n                    let position = _this.moveitemposition;\r\n                    let row_index = luckysheet_searcharray(position, curtop);\r\n\r\n                    if (row_index == -1) {\r\n                        $(\"#luckysheet-modal-dialog-config-order-help\").css({ \"top\": position[position.length - 1] });\r\n                    }\r\n                    else if ((curtop - position[row_index - 1]) > (position[row_index] - position[row_index - 1]) / 2) {\r\n                        $(\"#luckysheet-modal-dialog-config-order-help\").css({ \"top\": position[row_index] });\r\n                    }\r\n                    else {\r\n                        $(\"#luckysheet-modal-dialog-config-order-help\").css({ \"top\": position[row_index - 1] });\r\n                    }\r\n                }\r\n            }).mouseleave(function () {\r\n                if (_this.movestate) {\r\n                    $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({ \"background\": \"#fff\", \"color\": \"#000\", \"border\": \"1px dotted #000\" });\r\n                    _this.moveitemposition = [];\r\n                    $(\"#luckysheet-modal-dialog-config-order-help\").remove();\r\n                }\r\n            }).mouseup(function (e) {\r\n                if (_this.movestate) {\r\n                    let $t = $(this);\r\n                    let itemHTML;\r\n\r\n                    if (_this.movesave.containerid == $t.attr(\"id\")) {\r\n                        itemHTML = _this.movesave.obj.clone();\r\n                    }\r\n                    else {\r\n                        let name = _this.movesave.name, \r\n                            sumtype = \"\", \r\n                            nameindex = \"\";\r\n                        \r\n                        if ($t.attr(\"id\") == \"luckysheet-modal-dialog-config-value\") {\r\n                            let type = _this.pivot_data_type[_this.movesave.index.toString()];\r\n                            \r\n                            if (type == \"num\") {\r\n                                name = locale_pivotTable.valueStatisticsSUM+\":\" + name;\r\n                                sumtype = \"data-sumtype='SUM'\";\r\n                                nameindex = \"data-nameindex='0'\";\r\n                            }\r\n                            else {\r\n                                name = locale_pivotTable.valueStatisticsCOUNTA+\":\" + name;\r\n                                sumtype = \"data-sumtype='COUNTA'\";\r\n                                nameindex = \"data-nameindex='0'\";\r\n                            }\r\n\r\n                            $(\"#luckysheet-modal-dialog-config-value\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                                if ($(this).find(\".luckysheet-modal-dialog-slider-config-item-txt\").text() == name) {\r\n                                    let ni = parseFloat($(this).data(\"nameindex\")) + 1;\r\n                                    name = name + ni.toString();\r\n                                    $(this).data(\"nameindex\", ni);\r\n                                    return false;\r\n                                }\r\n                            });\r\n                        }\r\n\r\n                        itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' + nameindex + ' ' + sumtype + ' data-index=\"' + _this.movesave.index + '\" data-name=\"' + _this.movesave.name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' + nameindex + ' ' + sumtype + ' data-index=\"' + _this.movesave.index + '\" data-name=\"' + _this.movesave.name + '\">' + name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n                    }\r\n\r\n                    let x = event.pageX, y = event.pageY, $container = $(this);\r\n                    let curtop = y - $container.offset().top + $container.scrollTop();\r\n                    let position = _this.moveitemposition;\r\n                    let row_index = luckysheet_searcharray(position, curtop);\r\n\r\n                    if ((_this.movesave.containerid == \"luckysheet-modal-dialog-pivotTable-list\") || (_this.movesave.containerid == \"luckysheet-modal-dialog-config-value\" && _this.movesave.containerid != $t.attr(\"id\"))) {\r\n                        $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                            if ($(this).data(\"index\") == _this.movesave.index) {\r\n                                $(this).remove();\r\n                            }\r\n                        });\r\n                    }\r\n\r\n                    if (row_index == -1) {\r\n                        if ($t.find(\".luckysheet-modal-dialog-slider-config-item\").length == 0) {\r\n                            $t.append(itemHTML);\r\n                        }\r\n                        else {\r\n                            $t.find(\".luckysheet-modal-dialog-slider-config-item\").last().after(itemHTML);\r\n                        }\r\n\r\n                    }\r\n                    else if ((curtop - position[row_index - 1]) > (position[row_index] - position[row_index - 1]) / 2) {\r\n                        $t.find(\".luckysheet-modal-dialog-slider-config-item\").eq(row_index - 1).after(itemHTML);\r\n                    }\r\n                    else {\r\n                        $t.find(\".luckysheet-modal-dialog-slider-config-item\").eq(row_index - 1).before(itemHTML);\r\n                    }\r\n\r\n                    if (_this.movesave.containerid == \"luckysheet-modal-dialog-pivotTable-list\") {\r\n\r\n                    }\r\n                    else if (_this.movesave.containerid == \"luckysheet-modal-dialog-config-value\" && _this.movesave.containerid != $t.attr(\"id\")) {\r\n\r\n                    }\r\n                    else {\r\n                        _this.movesave.obj.remove();\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-pivotTable-list\").find(\".luckysheet-modal-dialog-slider-list-item\").each(function () {\r\n                        let $seleted = $(this).find(\".luckysheet-slider-list-item-selected\");\r\n                        if ($(this).data(\"index\") == _this.movesave.index && $seleted.find(\"i\").length == 0) {\r\n                            $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                        }\r\n                    });\r\n\r\n                    _this.refreshPivotTable();\r\n\r\n                    $(\"#luckysheet-modal-dialog-slider-pivot-move\").remove();\r\n                    _this.movestate = false;\r\n                    $(\"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").css(\"cursor\", \"default\");\r\n                    _this.moveitemposition = [];\r\n                    $(\"#luckysheet-modal-dialog-config-order-help\").remove();\r\n                    _this.showvaluecolrow();\r\n                    e.stopPropagation();\r\n                }\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\"click\", \".luckysheet-slider-list-item-selected\", function () {\r\n                let $t = $(this), \r\n                    $item = $t.parent(), \r\n                    index = $item.data(\"index\"), \r\n                    name = $item.data(\"name\");\r\n                \r\n                if ($t.find(\"i\").length == 0) {\r\n                    $t.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n\r\n                    let type = _this.pivot_data_type[index.toString()], \r\n                        itemHTML;\r\n\r\n                    if (type == \"num\") {\r\n                        itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-nameindex=\"0\" data-sumtype=\"SUM\" data-index=\"' + index + '\" data-name=\"' + name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-nameindex=\"0\" data-sumtype=\"SUM\" data-index=\"' + index + '\" data-name=\"' + name + '\">\u6C42\u548C:' + name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n                        $(\"#luckysheet-modal-dialog-config-value\").append(itemHTML);\r\n                    }\r\n                    else {\r\n                        itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-index=\"' + index + '\" data-name=\"' + name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-index=\"' + index + '\" data-name=\"' + name + '\">' + name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n                        \r\n                        let $column = $(\"#luckysheet-modal-dialog-config-column\"), \r\n                            $row = $(\"#luckysheet-modal-dialog-config-row\");\r\n                        let columnitem = $column.find(\".luckysheet-modal-dialog-slider-config-item\"), \r\n                            rowitem = $row.find(\".luckysheet-modal-dialog-slider-config-item\");\r\n\r\n                        if (columnitem.length < 2) {\r\n                            $column.append(itemHTML);\r\n                        }\r\n                        else if (rowitem.length < 2) {\r\n                            $row.append(itemHTML);\r\n                        }\r\n                        else {\r\n                            $column.append(itemHTML);\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    $t.find(\"i\").remove();\r\n                    $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                        if ($(this).data(\"index\") == index) {\r\n                            if ($(this).parent().attr(\"id\") == \"luckysheet-modal-dialog-config-value\") {\r\n                                _this.resetOrderby($(this));\r\n                            }\r\n                            $(this).remove();\r\n                        }\r\n                    });\r\n                }\r\n\r\n                _this.refreshPivotTable();\r\n                _this.showvaluecolrow();\r\n            });\r\n\r\n            $(\"#luckysheet-dialog-pivotTable-clearitem\").click(function () {\r\n                $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                    $(this).remove();\r\n                });\r\n\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list\").find(\".luckysheet-modal-dialog-slider-list-item\").each(function () {\r\n                    $(this).find(\".luckysheet-slider-list-item-selected\").find(\"i\").remove();\r\n                });\r\n\r\n                _this.refreshPivotTable();\r\n                _this.showvaluecolrow();\r\n            });\r\n        }\r\n\r\n        if (restore == null) {\r\n            restore = false;\r\n        }\r\n\r\n        if (_this.celldata.length <= 1 && _this.celldata[0].length <= 1) {\r\n            if(isEditMode()){\r\n                alert(locale_pivotTable.errorIncreaseRange);\r\n            }\r\n            else{\r\n                tooltip.info(\"\", locale_pivotTable.errorIncreaseRange);\r\n            }\r\n        }\r\n\r\n        let selecteditem = \"\", \r\n            selecteditemIndex = 1, \r\n            selecteditemtest = {}, \r\n            selecteditemNullIndex = 1;\r\n\r\n        for (let i = 0; i < _this.celldata[0].length; i++) {\r\n            let name;\r\n            if(!!_this.celldata[0][i] && !!_this.celldata[0][i][\"m\"]){\r\n                name = _this.celldata[0][i][\"m\"];\r\n            }\r\n            else{\r\n                name = getcellvalue(0, i, _this.celldata);    \r\n            }\r\n\r\n            if(name != null){\r\n                name = name.toString();\r\n            }\r\n\r\n            if (name == null || $.trim(name.toString()).length == 0) {\r\n                name = locale_pivotTable.titleColumn+\" \" + selecteditemNullIndex;\r\n            }\r\n            selecteditemNullIndex++\r\n\r\n            if (name in selecteditemtest) {\r\n                name = name + selecteditemIndex++;\r\n                if (name in selecteditemtest) {\r\n                    name = name + selecteditemIndex++;\r\n                    if (name in selecteditemtest) {\r\n                        name = name + selecteditemIndex++;\r\n                    }\r\n                }\r\n            }\r\n            selecteditemtest[name] = 1;\r\n\r\n            let dataother = \"\", style = \"\";\r\n\r\n            if (restore && _this.filterparm != null) {\r\n                if (_this.filterparm[i.toString()] != null) {\r\n                    let itemset = _this.filterparm[i.toString()];\r\n                    if (itemset.rowhidden != null) {\r\n                        dataother += \"data-rowhidden='\" + JSON.stringify(itemset.rowhidden) + \"'\";\r\n                    }\r\n\r\n                    if (itemset.selected != null) {\r\n                        dataother += \"data-selected='\" + JSON.stringify(itemset.selected) + \"'\";\r\n                    }\r\n\r\n                    if (itemset.caljs != null) {\r\n                        let caljsset = itemset.caljs;\r\n                        if (caljsset.value != null) {\r\n                            dataother += \"data-byconditionvalue='\" + caljsset.value + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.type != null) {\r\n                            dataother += \"data-byconditiontype='\" + caljsset.type + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.text != null) {\r\n                            dataother += \"data-byconditiontext='\" + caljsset.text + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.value1 != null) {\r\n                            dataother += \"data-byconditionvalue1='\" + caljsset.value1 + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.value2 != null) {\r\n                            dataother += \"data-byconditionvalue2='\" + caljsset.value2 + \"'\";\r\n                        }\r\n\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (dataother.length > 0) {\r\n                style = \"display:block;\";\r\n            }\r\n\r\n            selecteditem += '<div class=\"luckysheet-modal-dialog-slider-list-item\" ' + dataother + ' data-index=\"' + i + '\" data-name=\"' + name + '\"><div title=\"'+locale_pivotTable.titleAddColumn+'\" class=\"luckysheet-slider-list-item-selected\"><div></div></div><div title=\"'+locale_pivotTable.titleMoveColumn+'\" class=\"luckysheet-slider-list-item-name\" ' + dataother + ' data-index=\"' + i + '\" data-name=\"' + name + '\">' + name + '</div><div title=\"'+locale_pivotTable.titleClearColumnFilter+'\" class=\"luckysheet-slider-list-item-filtered\" style=\"' + style + '\"><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div><div title=\"'+locale_pivotTable.titleFilterColumn+'\" class=\"luckysheet-slider-list-item-filter\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n        }\r\n        $(\"#luckysheet-modal-dialog-pivotTable-list\").html(selecteditem);\r\n\r\n        $(\"#luckysheetpivottablevaluecolrowshow\").hide();\r\n        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n\r\n        $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").empty();\r\n        \r\n        if (restore) {\r\n            if (_this.filter != null && _this.filter.length > 0) {\r\n                for (let i = 0; i < _this.filter.length; i++) {\r\n                    let item = _this.filter[i];\r\n\r\n                    let itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-index=\"' + item.index + '\" data-name=\"' + item.name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-index=\"' + item.index + '\" data-name=\"' + item.name + '\">' + item.name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-filter\").append(itemHTML);\r\n\r\n                    let $seleted = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(item.index).find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.row != null && _this.row.length > 0) {\r\n                for (let i = 0; i < _this.row.length; i++) {\r\n                    let item = _this.row[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-order = '\" + item.order + \"'\";\r\n                    }\r\n\r\n                    if (item.orderby != null) {\r\n                        otherset += \"data-orderby = '\" + item.orderby + \"'\";\r\n                    }\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-stastic = '\" + item.stastic + \"'\";\r\n                    }\r\n\r\n                    let itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\">' + item.name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-row\").append(itemHTML);\r\n\r\n                    let $seleted = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(item.index).find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.column != null && _this.column.length > 0) {\r\n                for (let i = 0; i < _this.column.length; i++) {\r\n                    let item = _this.column[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-order = '\" + item.order + \"'\";\r\n                    }\r\n\r\n                    if (item.orderby != null) {\r\n                        otherset += \"data-orderby = '\" + item.orderby + \"'\";\r\n                    }\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-stastic = '\" + item.stastic + \"'\";\r\n                    }\r\n\r\n                    let itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\">' + item.name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-column\").append(itemHTML);\r\n\r\n                    let $seleted = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(item.index).find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.values != null && _this.values.length > 0) {\r\n                for (let i = 0; i < _this.values.length; i++) {\r\n                    let item = _this.values[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.sumtype != null) {\r\n                        otherset += \"data-sumtype = '\" + item.sumtype + \"'\";\r\n                    }\r\n\r\n                    if (item.nameindex != null) {\r\n                        otherset += \"data-nameindex = '\" + item.nameindex + \"'\";\r\n                    }\r\n\r\n                    let itemHTML = '<div title=\"' + name + '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' + otherset + ' data-index=\"' + item.index + '\" data-name=\"' + item.name + '\">' + _this.getSumTypeName(item.sumtype) + \":\" + item.name + '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-value\").append(itemHTML);\r\n\r\n                    let $seleted = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(item.index).find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n\r\n                if (_this.values.length >= 2) {\r\n                    $(\"#luckysheetpivottablevaluecolrowshow\").show();\r\n                    if (_this.showType == \"column\") {\r\n                        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n                        $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").addClass(\"ui-state-active\");\r\n\r\n                        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n                        $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").removeClass(\"ui-state-active\");\r\n                    }\r\n                    else {\r\n                        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", true);\r\n                        $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").addClass(\"ui-state-active\");\r\n\r\n                        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", false);\r\n                        $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").removeClass(\"ui-state-active\");\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-dialog-pivotTable-range\").html(getRangetxt(_this.pivotDataSheetIndex, _this.pivot_select_save));\r\n        $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n        \r\n        luckysheetsizeauto(false);\r\n    },\r\n    getComposeArray: function (data) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n        \r\n        let ret = [];\r\n        for (let i = 0; i < data.length; i++) {\r\n            let name = \"\";\r\n            for (let x = 0; x <= i; x++) {\r\n                if(!!data[x] && !!data[x][\"m\"]){\r\n                    name += data[x][\"m\"];\r\n                }\r\n                else{\r\n                    name += getcellvalue(x, null, data);\r\n                }\r\n            }\r\n            \r\n            ret.push(name);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getnameArray: function (data, field) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        if (field.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let ret = [];\r\n        for (let i = 0; i < field.length; i++) {\r\n            let c_value;\r\n            if(!!data[field[i].index] && !!data[field[i].index][\"m\"]){\r\n                c_value = data[field[i].index][\"m\"];\r\n            }\r\n            else{\r\n                c_value = getcellvalue(field[i].index, null, data);\r\n            }\r\n            \r\n            ret.push(c_value);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getTitleFromGroup: function (group, config, dataposition) {\r\n        let _this = this;\r\n        let orderbygroup = _this.orderbygroup(group, config, dataposition);\r\n\r\n        return _this.generategrouparraymain(orderbygroup, config);\r\n    },\r\n    orderbygroup: function (group, config, dataposition) {\r\n        let _this = this;\r\n\r\n        let stackset = [];\r\n        if (group.length == 0) {\r\n            return [];\r\n        }\r\n        stackset = group;\r\n\r\n        let d = null, \r\n            alllength = stackset.length, \r\n            alllengthInital = stackset.length, \r\n            a = 0;\r\n\r\n        while (alllength != 0) {\r\n            d = stackset[a++];\r\n            alllength--;\r\n\r\n            if (d.children != null && d.children.length > 0) {\r\n                d.children = _this.orderbygroupchildren(d.children, config[d.index].orderby, config[d.index].order, dataposition);\r\n                \r\n                for (let i = 0; i < d.children.length; i++) {\r\n                    stackset.push(d.children[i]);\r\n                    alllength++;\r\n                }\r\n            }\r\n        }\r\n\r\n        return group.splice(0, alllengthInital);\r\n    },\r\n    orderbygroupchildren: function (childrens, orderby, order, dataposition) {\r\n        if (childrens.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let isAsc = false;\r\n        if (order == null || order == \"asc\") {\r\n            isAsc = true;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n\r\n        let a = function (x, y) {\r\n            let f = null, s = null;\r\n\r\n            if (orderby == \"self\" || orderby == null) {\r\n                if(x.name == null){\r\n                    f = locale_filter.valueBlank;\r\n                }\r\n                else{\r\n                    f = x.name.toString();\r\n                }\r\n\r\n                if(y.name == null){\r\n                    s = locale_filter.valueBlank;\r\n                }\r\n                else{\r\n                    s = y.name.toString();\r\n                }\r\n                \r\n                if (isdatetime(f) && isdatetime(s)) {\r\n                    return diff(f, s);\r\n                }\r\n            }\r\n            else {\r\n                f = parseFloat(dataposition[x.orderby].result);\r\n                s = parseFloat(dataposition[y.orderby].result);\r\n            }\r\n\r\n            if (!isNaN(f) && !isNaN(s)) {\r\n                return numeral(f).value() - numeral(s).value();\r\n            }\r\n            else if(isNaN(f) && isNaN(s)){\r\n                return f.localeCompare(s);\r\n            }\r\n            else if (isNaN(f)) {\r\n                return 1;\r\n            }\r\n            else if (isNaN(s)) {\r\n                return -1;\r\n            }\r\n        }\r\n\r\n        let d = function (x, y) {\r\n            let f = null, s = null;\r\n\r\n            if (orderby == \"self\" || orderby == null) {\r\n                if(x.name == null){\r\n                    f = locale_filter.valueBlank;\r\n                }\r\n                else{\r\n                    f = x.name.toString();\r\n                }\r\n\r\n                if(y.name == null){\r\n                    s = locale_filter.valueBlank;\r\n                }\r\n                else{\r\n                    s = y.name.toString();\r\n                }\r\n\r\n                if (isdatetime(f) && isdatetime(s)) {\r\n                    return diff(f, s);\r\n                }\r\n            }\r\n            else {\r\n                f = parseFloat(dataposition[x.orderby].result);\r\n                s = parseFloat(dataposition[y.orderby].result);\r\n            }\r\n\r\n            if (!isNaN(f) && !isNaN(s)) {\r\n                return numeral(s).value() - numeral(f).value();\r\n            }\r\n            else if(isNaN(f) && isNaN(s)){\r\n                return s.localeCompare(f);\r\n            }\r\n            else if (isNaN(f)) {\r\n                return -1;\r\n            }\r\n            else if (isNaN(s)) {\r\n                return 1;\r\n            }\r\n        }\r\n\r\n        if (isAsc) {\r\n            return childrens.sort(a);\r\n        }\r\n        else {\r\n            return childrens.sort(d);\r\n        }\r\n    },\r\n    generategroupaddstatic: function (arr, name) {\r\n        let stasticarr = [];\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n        for (let a = 0; a < arr[0].length; a++) {\r\n            if (a == 0) {\r\n                if (name == locale_pivotTable.valueSum) {\r\n                    stasticarr.push(name);\r\n                }\r\n                else {\r\n                    stasticarr.push({ \"name\": name, \"issum\": true });\r\n                }\r\n\r\n            }\r\n            else {\r\n                stasticarr.push(\"\");\r\n            }\r\n        }\r\n\r\n        return stasticarr;\r\n    },\r\n    generategrouparraymain: function (group, config) {\r\n        let _this = this;\r\n\r\n        //\u751F\u6210\u6570\u7EC4\r\n        let ret = [];\r\n        for (let i = 0; i < group.length; i++) {\r\n            let name = group[i].name;\r\n            let arr = _this.generategrouparray(group[i].children, config, 1);\r\n\r\n            if (config[0].stastic == \"1\" || config[0].stastic == null) {\r\n                arr.push(_this.generategroupaddstatic(arr, name));\r\n            }\r\n\r\n            ret = ret.concat(arr);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    generategrouparray: function (group, config, level) {\r\n        let _this = this;\r\n\r\n        let ret = [];\r\n        for (let i = 0; i < group.length; i++) {\r\n            let name = group[i].name;\r\n            let arr;\r\n\r\n            if (group[i].children == 0 || group[i].children.length == 0) {\r\n                arr = [name];\r\n                ret.push(arr);\r\n            }\r\n            else {\r\n                arr = _this.generategrouparray(group[i].children, config, level + 1);\r\n\r\n                for (let a = 0; a < arr.length; a++) {\r\n                    arr[a].unshift(name);\r\n                }\r\n\r\n                if (config[level].stastic == \"1\" || config[level].stastic == null) {\r\n                    arr.push(_this.generategroupaddstatic(arr, name));\r\n                }\r\n\r\n                ret = ret.concat(arr);\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    addStatisticsData: function (dataposition, valueobj, indicator, d_value) {\r\n        if (dataposition[indicator] == null) {\r\n            dataposition[indicator] = { \r\n                \"data\": [], \r\n                \"count\": 0, \r\n                \"max\": -Infinity, \r\n                \"min\": Infinity, \r\n                \"counta\": 0, \r\n                \"countunique\": 0, \r\n                \"countuniquedata\": {}, \r\n                \"sum\": 0, \r\n                \"digitaldata\": [], \r\n                \"sumtype\": valueobj.sumtype, \r\n                \"index\": valueobj.index, \r\n                \"name\": valueobj.fullname, \r\n                \"acc\": 0 \r\n            };\r\n        }\r\n\r\n        if (isdatatypemulti(d_value)[\"num\"] === true) {\r\n            //fix issue 265\r\n            let num = numFormat(d_value,6);\r\n            dataposition[indicator][\"digitaldata\"].push(num);\r\n            dataposition[indicator][\"count\"] += 1;\r\n            dataposition[indicator][\"sum\"] += num;\r\n\r\n            if (num > dataposition[indicator][\"max\"]) {\r\n                dataposition[indicator][\"max\"] = num;\r\n            }\r\n\r\n            if (num < dataposition[indicator][\"min\"]) {\r\n                dataposition[indicator][\"min\"] = num;\r\n            }\r\n\r\n            let newAcc = numfloatlen(num);\r\n\r\n            if(newAcc > dataposition[indicator][\"acc\"]){\r\n                dataposition[indicator][\"acc\"] = newAcc;\r\n            }\r\n        }\r\n\r\n        if (d_value != \"\") {\r\n            dataposition[indicator][\"data\"].push(d_value);\r\n            dataposition[indicator][\"counta\"] += 1;\r\n            if (!(d_value in dataposition[indicator][\"countuniquedata\"])) {\r\n                dataposition[indicator][\"countuniquedata\"][d_value] = 1;\r\n                dataposition[indicator][\"countunique\"] += 1;\r\n            }\r\n        }\r\n    },\r\n    dataHandler: function (column, row, values, showType, celldata) {\r\n        //column:[{\"index\":1, name:\"\u52171\", \"order\":\"asc\", \"orderby\":\"self/0/1/2\", \"stastic\":\"0/1\"}]\r\n        //row:[{\"index\":1, name:\"\u52173\", \"order\":\"asc\", \"orderby\":\"self/0/1/2\", \"stastic\":\"0/1\"}]\r\n        //values:[{\"index\":1, \"sumtype\":\"SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP\", \"name\":\"\u6C42\u548C:fyc\"}]\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n        const locale_pivotTable = _locale.pivotTable;\r\n        \r\n\r\n        if (showType == null) {\r\n            showType = \"column\";\r\n        }\r\n\r\n        if ((column.length == 0 && row.length == 0 && values.length == 0) || celldata.length == 0) {\r\n            _this.pivotDatas = [];\r\n            return [];\r\n        }\r\n\r\n        //\u751F\u6210\u900F\u89C6\u8868\u503C\u53CA\u5B9A\u4F4D\r\n        let dataposition = {}, \r\n            data = celldata, \r\n            datarowtitle = [], \r\n            datarowtitlegroup = [], \r\n            datarowposition = {}, \r\n            datarowposition_i = 0, \r\n            datacoltitle = [], \r\n            datacoltitlegroup = [], \r\n            datacolposition = {}, \r\n            datacolposition_i = 0;\r\n\r\n        for (let i = 1; i < data.length; i++) {\r\n            let d = data[i];\r\n            let groupbyrowtxt = \"\", \r\n                groupbycoltxt = \"\", \r\n                rowtxt = \"\", \r\n                rowtitle = [], \r\n                rowtitlename = [], \r\n                coltxt = \"\", \r\n                coltitle = [], \r\n                coltitlename = [];\r\n\r\n            //[\"\u56DB\u5DDD\", \"\u6210\u90FD\", \"\u909B\u5D03\"] \u8F6C\u6362\u4E3A [\"\u56DB\u5DDD\", \"\u56DB\u5DDD\u6210\u90FD\", \"\u56DB\u5DDD\u6210\u90FD\u909B\u5D03\"]\r\n            rowtitlename = _this.getnameArray(d, row);\r\n            coltitlename = _this.getnameArray(d, column);\r\n\r\n            rowtitle = _this.getComposeArray(rowtitlename);\r\n            coltitle = _this.getComposeArray(coltitlename);\r\n\r\n            if (rowtitle.length > 0) {\r\n                rowtitle.unshift(locale_pivotTable.valueSum);\r\n            }\r\n\r\n            if (coltitle.length > 0) {\r\n                coltitle.unshift(locale_pivotTable.valueSum);\r\n            }\r\n\r\n            let curentLevelobj_row = datarowposition, \r\n                curentLevelarr_row = datarowtitlegroup;\r\n            \r\n            for (let r = 0; r < rowtitle.length; r++) {\r\n                let item = rowtitle[r], name = r == 0 ? locale_pivotTable.valueSum : rowtitlename[r - 1];//\u4FEE\u6539\r\n\r\n                if (curentLevelobj_row[r.toString()] != null && curentLevelobj_row[r.toString()][item] != null) {//\u4FEE\u6539\r\n                    curentLevelarr_row = curentLevelarr_row[curentLevelobj_row[r.toString()][item]].children;\r\n                }\r\n                else {\r\n                    let orderby = r == 0 ? \"self\" : ((row[r - 1].orderby == \"self\" || row[r - 1].orderby == null) ? item : (showType == \"column\" ? item + values[parseInt(row[r - 1].orderby)].fullname : item + locale_pivotTable.valueSum));\r\n                    \r\n                    if(name == null){\r\n                        name = locale_filter.valueBlank;\r\n                    }\r\n\r\n                    curentLevelarr_row.push({ \"name\": name, \"fullname\": item, \"index\": r, \"orderby\": orderby, \"children\": [] });\r\n\r\n                    if (curentLevelobj_row[r.toString()] == null) {\r\n                        curentLevelobj_row[r.toString()] = {};\r\n                    }\r\n\r\n                    if (curentLevelobj_row[r.toString()][item] == null) {\r\n                        curentLevelobj_row[r.toString()][item] = curentLevelarr_row.length - 1;\r\n                    }\r\n\r\n                    curentLevelarr_row = curentLevelarr_row[curentLevelarr_row.length - 1].children;\r\n                }\r\n            }\r\n\r\n            let curentLevelobj_col = datacolposition, \r\n                curentLevelarr_col = datacoltitlegroup;\r\n\r\n            for (let r = 0; r < coltitle.length; r++) {\r\n                let item = coltitle[r], name = r == 0 ? locale_pivotTable.valueSum : coltitlename[r - 1];\r\n\r\n                if (curentLevelobj_col[r.toString()] != null && curentLevelobj_col[r.toString()][item] != null) {\r\n                    curentLevelarr_col = curentLevelarr_col[curentLevelobj_col[r.toString()][item]].children;\r\n                }\r\n                else {\r\n                    let orderby = r == 0 ? \"self\" : ((column[r - 1].orderby == \"self\" || column[r - 1].orderby == null) ? item : (showType == \"column\" ? locale_pivotTable.valueSum + item : values[parseInt(column[r - 1].orderby)].fullname + item));\r\n                    \r\n                    if(name == null){\r\n                        name = locale_filter.valueBlank;\r\n                    }\r\n\r\n                    curentLevelarr_col.push({ \"name\": name, \"fullname\": item, \"index\": r, \"orderby\": orderby, \"children\": [] });\r\n\r\n                    if (curentLevelobj_col[r.toString()] == null) {\r\n                        curentLevelobj_col[r.toString()] = {};\r\n                    }\r\n\r\n                    if (curentLevelobj_col[r.toString()][item] == null) {\r\n                        curentLevelobj_col[r.toString()][item] = curentLevelarr_col.length - 1;\r\n                    }\r\n\r\n                    curentLevelarr_col = curentLevelarr_col[curentLevelarr_col.length - 1].children;\r\n                }\r\n            }\r\n\r\n            let v_str = \"\";\r\n            for (let v = 0; v < values.length; v++) {\r\n                let d_value = getcellvalue(values[v].index, null, d);\r\n\r\n                let coltitle_c = [].concat(coltitle), rowtitle_c = [].concat(rowtitle);\r\n                if (showType == \"column\") {\r\n                    if (coltitle_c.length > 0) {\r\n                        coltitle_c.push(\"\")\r\n                        coltitle_c = coltitle_c.join(values[v].fullname + \"|||\").split(\"|||\").slice(0, coltitle_c.length - 1);\r\n                    }\r\n                    else {\r\n                        coltitle_c.push(values[v].fullname);\r\n                    }\r\n                }\r\n                else {\r\n                    if (rowtitle_c.length > 0) {\r\n                        rowtitle_c.push(\"\")\r\n                        rowtitle_c = rowtitle_c.join(values[v].fullname + \"|||\").split(\"|||\").slice(0, rowtitle_c.length - 1);\r\n                    }\r\n                    else {\r\n                        rowtitle_c.push(values[v].fullname);\r\n                    }\r\n                }\r\n\r\n                if (coltitle_c.length == 0) {\r\n                    coltitle_c.push(\"\");\r\n                }\r\n\r\n                if (rowtitle_c.length == 0) {\r\n                    rowtitle_c.push(\"\");\r\n                }\r\n\r\n                for (let r = 0; r < rowtitle_c.length; r++) {\r\n                    for (let c = 0; c < coltitle_c.length; c++) {\r\n                        let indicator = rowtitle_c[r] + coltitle_c[c];\r\n                        _this.addStatisticsData(dataposition, values[v], indicator, d_value);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u8BA1\u7B97\u503C\u5217\r\n        //SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP\r\n        for (let indicator in dataposition) {\r\n            let json = dataposition[indicator];\r\n\r\n            if (json.sumtype == \"SUM\") {\r\n                json.result = json.sum;\r\n            }\r\n            else if (json.sumtype == \"COUNT\") {\r\n                json.result = json.count;\r\n            }\r\n            else if (json.sumtype == \"COUNTA\") {\r\n                json.result = json.counta;\r\n            }\r\n            else if (json.sumtype == \"COUNTUNIQUE\") {\r\n                json.result = json.countunique;\r\n            }\r\n            else if (json.sumtype == \"AVERAGE\") {\r\n                json.result = numFormat(json.sum / json.count);\r\n            }\r\n            else if (json.sumtype == \"MAX\") {\r\n                json.result = json.max;\r\n            }\r\n            else if (json.sumtype == \"MIN\") {\r\n                json.result = json.min;\r\n            }\r\n            else if (json.sumtype == \"MEDIAN\") {\r\n                let numArr = json.digitaldata.sort(function(a, b){ return a - b });\r\n                let numLen = numArr.length;\r\n                let numindex = parseInt(numLen / 2);\r\n\r\n                if(numLen % 2 == 0){\r\n                    json.result = (numArr[numindex - 1] + numArr[numindex]) / 2;\r\n                }\r\n                else{\r\n                    json.result = numArr[numindex];\r\n                }\r\n            }\r\n            else if (json.sumtype == \"PRODUCT\") {\r\n                json.result = new Function(\"return \" + json.digitaldata.join(\"*\"))();\r\n            }\r\n            else if (json.sumtype == \"STDEV\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.STDEV(mean, json.digitaldata);\r\n            }\r\n            else if (json.sumtype == \"STDEVP\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.STDEVP(mean, json.digitaldata);\r\n            }\r\n            else if (json.sumtype == \"let\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.let(mean, json.digitaldata);\r\n            }\r\n            else if (json.sumtype == \"VARP\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.VARP(mean, json.digitaldata);\r\n            }\r\n\r\n            let newAcc = numfloatlen(json.result);\r\n            if(newAcc > json.acc){\r\n                json.acc = newAcc;\r\n            }\r\n\r\n            json.result = numFormat(json.result, json.acc);\r\n        }\r\n\r\n        datarowtitle = _this.getTitleFromGroup(datarowtitlegroup, row, dataposition);\r\n        datacoltitle = _this.getTitleFromGroup(datacoltitlegroup, column, dataposition);\r\n\r\n        //\u52A0\u5165\u503C\u5230\u5217/\u884C\u5F62\u6210\u65B0\u7684\u8868\u5934\r\n        if (showType == \"column\") {\r\n            if (datacoltitle.length > 0 && datacoltitle[0].length > 0) {\r\n                datacoltitle = _this.addValuesToTitle(datacoltitle, values);\r\n            }\r\n            else {\r\n                for (let v = 0; v < values.length; v++) {\r\n                    datacoltitle.push([values[v].fullname]);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            if (datarowtitle.length > 0 && datarowtitle[0].length > 0) {\r\n                datarowtitle = _this.addValuesToTitle(datarowtitle, values);\r\n            }\r\n            else {\r\n                for (let v = 0; v < values.length; v++) {\r\n                    datarowtitle.push([values[v].fullname]);\r\n                }\r\n            }\r\n        }\r\n\r\n        let datacoltitle_index = datacoltitle;\r\n        datacoltitle = luckysheetArray.transpose(datacoltitle, false);\r\n\r\n        let valuenslen = values.length == 0 ? 0 : 1;\r\n        let rowLen = (datacoltitle.length == 0 ? valuenslen : datacoltitle.length) + (datarowtitle.length == 0 ? valuenslen : datarowtitle.length), colLen = (datacoltitle.length == 0 ? valuenslen : datacoltitle[0].length) + (datarowtitle.length == 0 ? valuenslen : datarowtitle[0].length);\r\n\r\n        let rowOver = datacoltitle.length, colOver = datarowtitle.length == 0 ? 0 : datarowtitle[0].length;\r\n\r\n        let retdata = [];\r\n        for (let r = 0; r < rowLen; r++) {\r\n            retdata[r] = new Array(colLen);\r\n\r\n            for (let c = 0; c < colLen; c++) {\r\n                let drt = datarowtitle[r - rowOver];\r\n                \r\n                if (r < rowOver && c < colOver) {\r\n                    //\u7A7A\u767D\u5217\u5934\r\n                    retdata[r][c] = \"\";\r\n                }\r\n                else if (r < rowOver && c >= colOver) {\r\n                    //\u5217\u6807\u9898\r\n                    if (datacoltitle[r] != null) {\r\n                        if (getObjType(datacoltitle[r][c - colOver]) == \"object\") {\r\n                            retdata[r][c] = datacoltitle[r][c - colOver].name + locale_pivotTable.valueSum;\r\n                        }\r\n                        else {\r\n                            retdata[r][c] = datacoltitle[r][c - colOver];\r\n                        }\r\n                    }\r\n                    else {\r\n                        retdata[r][c] = \"\";\r\n                    }\r\n                }\r\n                else if (r >= rowOver && c < colOver) {\r\n                    //\u884C\u6807\u9898\r\n                    if (drt != null) {\r\n                        if (getObjType(drt[c]) == \"object\") {\r\n                            retdata[r][c] = drt[c].name + locale_pivotTable.valueSum;\r\n                        }\r\n                        else {\r\n                            retdata[r][c] = drt[c];\r\n                        }\r\n                    }\r\n                    else {\r\n                        retdata[r][c] = \"\";\r\n                    }\r\n                }\r\n                else {\r\n                    //\u5355\u5143\u683C\u5185\u5BB9\r\n                    let prefix = \"\";\r\n                    if (drt != null) {\r\n                        if (!(drt instanceof Array) || drt.length == 1) {\r\n                            if (drt instanceof Array) {\r\n                                prefix = drt[0];\r\n                            }\r\n                            else {\r\n                                prefix = drt;\r\n                            }\r\n                        }\r\n                        else {\r\n                            for (let x = 0; x < drt.length; x++) {\r\n                                if (getObjType(drt[x]) == \"object\") {\r\n                                    prefix += drt[x].name;\r\n                                }\r\n                                else {\r\n                                    prefix += drt[x];\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let suffix = \"\";\r\n                    let dct = datacoltitle_index[c - colOver];\r\n                    if (dct != null) {\r\n                        if (!(dct instanceof Array) || dct.length == 1) {\r\n                            if (dct instanceof Array) {\r\n                                suffix = dct[0];\r\n                            }\r\n                            else {\r\n                                suffix = dct;\r\n                            }\r\n                        }\r\n                        else {\r\n                            for (let x = 0; x < dct.length; x++) {\r\n                                if (getObjType(dct[x]) == \"object\") {\r\n                                    suffix += dct[x].name;\r\n                                }\r\n                                else {\r\n                                    suffix += dct[x];\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let indicator = prefix;\r\n\r\n                    if (prefix != \"\" && suffix != \"\") {\r\n                        indicator = prefix + suffix;\r\n                    }\r\n                    else if (prefix == \"\") {\r\n                        indicator = suffix;\r\n                    }\r\n\r\n                    if (dataposition[indicator] == null) {\r\n                        retdata[r][c] = \"\";\r\n                    }\r\n                    else {\r\n                        retdata[r][c] = dataposition[indicator].result;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (values.length == 1 && column.length > 0 && row.length > 0 ) {\r\n            retdata[0][0] = values[0].fullname;\r\n            retdata.splice(column.length, 1);\r\n        }\r\n        else if(values.length == 1 && column.length > 0){\r\n            // 0: (6) [\"English\", \"foreign language\", \"mathematics\", \"science\", \"Sum\", undefined]\r\n            // 1: (6) [\"CountA:score\", \"CountA:score\", \"CountA:score\", \"CountA:score\", \"CountA:score\", undefined]\r\n            // 2: (6) [3, 3, 3, 3, 12, \"\"]\r\n            //The above format does not meet viewing habits,Process retdata into the correct format\r\n            let titleRow = retdata.splice(column.length, 1);\r\n            let newRetdata = [];\r\n            for(let r=0;r<retdata.length;r++){\r\n                let row = [];\r\n                if(r==retdata.length-1){\r\n                    row.push(titleRow[0][0]);\r\n                }\r\n                else{\r\n                    row.push(\"\");\r\n                }\r\n                for(let c=0;c<retdata[r].length-1;c++){\r\n                    row.push(retdata[r][c]);\r\n                }\r\n                newRetdata.push(row);\r\n            }\r\n            retdata = newRetdata;\r\n        }\r\n\r\n        _this.pivotDatas = retdata;\r\n\r\n        return retdata;\r\n    },\r\n    drillDown: function(row_index, col_index){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"usePivotTablereports\")){\r\n            return;\r\n        }\r\n        let _this = this;\r\n\r\n        let cell = _this.pivotDatas[row_index][col_index];\r\n        let d = $.extend(true, [], sheetmanage.nulldata);\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        let selecteditemNullIndex = 1;\r\n        for(let i = 0; i < _this.celldata[0].length; i++){\r\n            let name;\r\n            if(!!_this.celldata[0][i] && !!_this.celldata[0][i][\"m\"]){\r\n                name = _this.celldata[0][i][\"m\"];\r\n            }\r\n            else{\r\n                name = getcellvalue(0, i, _this.celldata);    \r\n            }\r\n\r\n            if(name != null){\r\n                name = name.toString();\r\n            }\r\n\r\n            if (name == null || $.trim(name.toString()).length == 0) {\r\n                name = locale_pivotTable.titleColumn+\" \" + selecteditemNullIndex;\r\n            }\r\n            selecteditemNullIndex++\r\n\r\n            d[0][i] = name;\r\n        }\r\n        \r\n        let obj = {};\r\n\r\n        //\u884C\r\n        if(_this.row != null && _this.row.length > 0){\r\n            for(let a = 0; a < _this.row.length; a++){\r\n                obj[_this.row[a][\"index\"]] = _this.pivotDatas[row_index][a];\r\n            }\r\n        }\r\n\r\n        //\u5217\r\n        if(_this.column != null && _this.column.length > 0){\r\n            for(let b = 0; b < _this.column.length; b++){\r\n                obj[_this.column[b][\"index\"]] = _this.pivotDatas[b][col_index];\r\n            }\r\n        }\r\n\r\n        let rowArr = [];\r\n        for(let j = 1; j < _this.celldata.length; j++){\r\n            let isEqual = true\r\n\r\n            for(let x in obj){\r\n                let value;\r\n                if(!!_this.celldata[j][x] && !!_this.celldata[j][x][\"m\"]){\r\n                    value = _this.celldata[j][x][\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(j, x, _this.celldata);    \r\n                }\r\n\r\n                if(value != null){\r\n                    value = value.toString();\r\n                }\r\n                else{\r\n                    value = locale_filter.valueBlank;\r\n                }\r\n\r\n                if(value != obj[x]){\r\n                    isEqual = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(isEqual){\r\n                rowArr.push(j);\r\n            }\r\n        }\r\n\r\n        for(let r = 0; r < rowArr.length; r++){\r\n            for(let c = 0; c < _this.celldata[0].length; c++){\r\n                let value;\r\n                if(!!_this.celldata[rowArr[r]][c] && !!_this.celldata[rowArr[r]][c][\"m\"]){\r\n                    value = _this.celldata[rowArr[r]][c][\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(rowArr[r], c, _this.celldata);    \r\n                }\r\n\r\n                if(value != null){\r\n                    value = value.toString();\r\n                }\r\n                else{\r\n                    value = \"\";\r\n                }\r\n\r\n                d[r + 1][c] = value;\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [0, rowArr.length], \"column\": [0, _this.celldata[0].length - 1] }];\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(d, Store.luckysheet_select_save);\r\n        selectHightlightShow();\r\n        Store.clearjfundo = true;\r\n    }\r\n}\r\n\r\nexport default pivotTable;", "import Store from \"../store\";\r\n\r\n//sparkline\u8BBE\u7F6E\r\nlet createClass = function (/* [baseclass, [mixin, ...]], definition */) {\r\n    let Class, args;\r\n    Class = function () {\r\n        this.init.apply(this, arguments);\r\n    };\r\n    if (arguments.length > 1) {\r\n        if (arguments[0]) {\r\n            Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]);\r\n            Class._super = arguments[0].prototype;\r\n        } else {\r\n            Class.prototype = arguments[arguments.length - 1];\r\n        }\r\n        if (arguments.length > 2) {\r\n            args = Array.prototype.slice.call(arguments, 1, -1);\r\n            args.unshift(Class.prototype);\r\n            $.extend.apply($, args);\r\n        }\r\n    } else {\r\n        Class.prototype = arguments[0];\r\n    }\r\n    Class.prototype.cls = Class;\r\n    return Class;\r\n};\r\n\r\n/**\r\n * Wraps a format string for tooltips\r\n * {{x}}\r\n * {{x.2}\r\n * {{x:months}}\r\n */\r\nlet SPFormat = createClass({\r\n    fre: /\\{\\{([\\w.]+?)(:(.+?))?\\}\\}/g,\r\n    precre: /(\\w+)\\.(\\d+)/,\r\n\r\n    init: function (format, fclass) {\r\n        this.format = format;\r\n        this.fclass = fclass;\r\n    },\r\n\r\n    render: function (fieldset, lookups, options) {\r\n        let self = this,\r\n            fields = fieldset,\r\n            match, token, lookupkey, fieldvalue, prec;\r\n        return this.format.replace(this.fre, function () {\r\n            let lookup;\r\n            token = arguments[1];\r\n            lookupkey = arguments[3];\r\n            match = self.precre.exec(token);\r\n            if (match) {\r\n                prec = match[2];\r\n                token = match[1];\r\n            } else {\r\n                prec = false;\r\n            }\r\n            fieldvalue = fields[token];\r\n            if (fieldvalue === undefined) {\r\n                return '';\r\n            }\r\n            if (lookupkey && lookups && lookups[lookupkey]) {\r\n                lookup = lookups[lookupkey];\r\n                if (lookup.get) { // RangeMap\r\n                    return lookups[lookupkey].get(fieldvalue) || fieldvalue;\r\n                } else {\r\n                    return lookups[lookupkey][fieldvalue] || fieldvalue;\r\n                }\r\n            }\r\n            if (isNumber(fieldvalue)) {\r\n                if (options.get('numberFormatter')) {\r\n                    fieldvalue = options.get('numberFormatter')(fieldvalue);\r\n                } else {\r\n                    fieldvalue = formatNumber(fieldvalue, prec,\r\n                        options.get('numberDigitGroupCount'),\r\n                        options.get('numberDigitGroupSep'),\r\n                        options.get('numberDecimalMark'));\r\n                }\r\n            }\r\n            return fieldvalue;\r\n        });\r\n    }\r\n});\r\n\r\n// convience method to avoid needing the new operator\r\n$.spformat = function(format, fclass) {\r\n    return new SPFormat(format, fclass);\r\n};\r\n\r\nlet clipval = function (val, min, max) {\r\n    if (val < min) {\r\n        return min;\r\n    }\r\n    if (val > max) {\r\n        return max;\r\n    }\r\n    return val;\r\n};\r\n\r\nlet quartile = function (values, q) {\r\n    let vl;\r\n    if (q === 2) {\r\n        vl = Math.floor(values.length / 2);\r\n        return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2;\r\n    } else {\r\n        if (values.length % 2 ) { // odd\r\n            vl = (values.length * q + q) / 4;\r\n            return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1];\r\n        } else { //even\r\n            vl = (values.length * q + 2) / 4;\r\n            return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 :  values[vl-1];\r\n\r\n        }\r\n    }\r\n};\r\n\r\nlet normalizeValue = function (val) {\r\n    let nf;\r\n    switch (val) {\r\n        case 'undefined':\r\n            val = undefined;\r\n            break;\r\n        case 'null':\r\n            val = null;\r\n            break;\r\n        case 'true':\r\n            val = true;\r\n            break;\r\n        case 'false':\r\n            val = false;\r\n            break;\r\n        default:\r\n            nf = parseFloat(val);\r\n            if (val == nf) {\r\n                val = nf;\r\n            }\r\n    }\r\n    return val;\r\n};\r\n\r\nlet normalizeValues = function (vals) {\r\n    let i, result = [];\r\n    for (i = vals.length; i--;) {\r\n        result[i] = normalizeValue(vals[i]);\r\n    }\r\n    return result;\r\n};\r\n\r\n\r\nlet all = function (val, arr, ignoreNull) {\r\n    let i;\r\n    for (i = arr.length; i--; ) {\r\n        if (ignoreNull && arr[i] === null) continue;\r\n        if (arr[i] !== val) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n};\r\n\r\n// sums the numeric values in an array, ignoring other values\r\nlet sum = function (vals) {\r\n    let total = 0, i;\r\n    for (i = vals.length; i--;) {\r\n        total += typeof vals[i] === 'number' ? vals[i] : 0;\r\n    }\r\n    return total;\r\n};\r\n\r\nlet remove = function (vals, filter) {\r\n    let i, vl, result = [];\r\n    for (i = 0, vl = vals.length; i < vl; i++) {\r\n        if (vals[i] !== filter) {\r\n            result.push(vals[i]);\r\n        }\r\n    }\r\n    return result;\r\n};\r\n\r\nlet isNumber = function (num) {\r\n    return !isNaN(parseFloat(num)) && isFinite(num);\r\n};\r\n\r\nlet formatNumber = function (num, prec, groupsize, groupsep, decsep) {\r\n    let p, i;\r\n    num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split('');\r\n    p = (p = $.inArray('.', num)) < 0 ? num.length : p;\r\n    if (p < num.length) {\r\n        num[p] = decsep;\r\n    }\r\n    for (i = p - groupsize; i > 0; i -= groupsize) {\r\n        num.splice(i, 0, groupsep);\r\n    }\r\n    return num.join('');\r\n};\r\n\r\n\r\nlet RangeMap = createClass({\r\n    init: function (map) {\r\n        let key, range, rangelist = [];\r\n        for (key in map) {\r\n            if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) {\r\n                range = key.split(':');\r\n                range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]);\r\n                range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]);\r\n                range[2] = map[key];\r\n                rangelist.push(range);\r\n            }\r\n        }\r\n        this.map = map;\r\n        this.rangelist = rangelist || false;\r\n    },\r\n\r\n    get: function (value) {\r\n        let rangelist = this.rangelist,\r\n            i, range, result;\r\n        if ((result = this.map[value]) !== undefined) {\r\n            return result;\r\n        }\r\n        if (rangelist) {\r\n            for (i = rangelist.length; i--;) {\r\n                range = rangelist[i];\r\n                if (range[0] <= value && range[1] >= value) {\r\n                    return range[2];\r\n                }\r\n            }\r\n        }\r\n        return undefined;\r\n    }\r\n});\r\n\r\n// Convenience function\r\n$.range_map = function(map) {\r\n    return new RangeMap(map);\r\n};\r\n\r\nconst luckysheetSparkline = {\r\n    defaultOption:{\r\n        // Settings common to most/all chart types\r\n        common: {\r\n            type: 'line',\r\n            lineColor: '#2ec7c9',\r\n            fillColor: '#CCF3F4',\r\n            defaultPixelsPerValue: 3,\r\n            width: 'auto',\r\n            height: 'auto',\r\n            composite: false,\r\n            tagValuesAttribute: 'values',\r\n            tagOptionsPrefix: 'spark',\r\n            enableTagOptions: false,\r\n            enableHighlight: true,\r\n            highlightLighten: 1.4,\r\n            tooltipSkipNull: true,\r\n            tooltipPrefix: '',\r\n            tooltipSuffix: '',\r\n            disableHiddenCheck: false,\r\n            numberFormatter: false,\r\n            numberDigitGroupCount: 3,\r\n            numberDigitGroupSep: ',',\r\n            numberDecimalMark: '.',\r\n            disableTooltips: true,\r\n            disableInteraction: true,\r\n            offsetX:0,\r\n            offsetY:0\r\n        },\r\n        // Defaults for line charts\r\n        //=LINESPL\r\n        line: {\r\n            spotColor: 0,\r\n            highlightSpotColor: '#5f5',\r\n            highlightLineColor: '#f22',\r\n            spotRadius: 1.5,\r\n            minSpotColor: 0,\r\n            maxSpotColor: 0,\r\n            lineWidth: 1,\r\n            normalRangeMin: undefined,\r\n            normalRangeMax: undefined,\r\n            normalRangeColor: '#ccc',\r\n            drawNormalOnTop: true,\r\n            chartRangeMin: undefined,\r\n            chartRangeMax: undefined,\r\n            chartRangeMinX: undefined,\r\n            chartRangeMaxX: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{y}}{{suffix}}')\r\n        },\r\n        // Defaults for bar charts\r\n        bar: {\r\n            barColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            stackedBarColor: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            zeroColor: undefined,\r\n            nullColor: undefined,\r\n            zeroAxis: true,\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            colorMap: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        column: {\r\n            barColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            stackedBarColor: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            zeroColor: undefined,\r\n            nullColor: undefined,\r\n            zeroAxis: true,\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            colorMap: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        // Defaults for tristate charts\r\n        tristate: {\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            posBarColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            zeroBarColor: '#999',\r\n            colorMap: {},\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value:map}}'),\r\n            // tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } }\r\n        },\r\n        // Defaults for discrete charts\r\n        discrete: {\r\n            lineHeight: 'auto',\r\n            thresholdColor: \"#fc5c5c\",\r\n            thresholdValue: 0,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            // tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        // Defaults for bullet charts\r\n        bullet: {\r\n            targetColor: '#f33',\r\n            targetWidth: 3, // width of the target bar in pixels\r\n            performanceColor: '#33f',\r\n            rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff','#6D87FF','#5876FF','#4465FF','#2F54FF','#1A43FF','#0532FF'],\r\n            base: undefined, // set this to a number to change the base start number\r\n            // tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'),\r\n            // tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} }\r\n        },\r\n        // Defaults for pie charts\r\n        pie: {\r\n            offset: 0,\r\n            sliceColors: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            borderWidth: 0,\r\n            borderColor: '#000',\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value}} ({{percent.1}}%)')\r\n        },\r\n        // Defaults for box plots\r\n        box: {\r\n            raw: false,\r\n            boxLineColor: '#000',\r\n            boxFillColor: '#cdf',\r\n            whiskerColor: '#000',\r\n            outlierLineColor: '#5E5E5E',\r\n            outlierFillColor: '#fff',\r\n            medianColor: '#f00',\r\n            showOutliers: true,\r\n            outlierIQR: 1.5,\r\n            spotRadius: 1.5,\r\n            target: undefined,\r\n            targetColor: '#4a2',\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            // tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'),\r\n            // tooltipFormatFieldlistKey: 'field',\r\n            // tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median',\r\n            //     uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier',\r\n            //     lw: 'Left Whisker', rw: 'Right Whisker'} }\r\n        }\r\n    },\r\n    line:{\r\n        type: 'line',\r\n        init: function (el, values, options, width, height) {\r\n            //line._super.init.call(this, el, values, options, width, height);\r\n            this.vertices = [];\r\n            this.regionMap = [];\r\n            this.xvalues = [];\r\n            this.yvalues = [];\r\n            this.yminmax = [];\r\n            this.hightlightSpotId = null;\r\n            this.lastShapeId = null;\r\n            //this.initTarget();\r\n        },\r\n        getRegion: function (el, x, y) {\r\n            let i,\r\n                regionMap = this.regionMap; // maps regions to value positions\r\n            for (i = regionMap.length; i--;) {\r\n                if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) {\r\n                    return regionMap[i][2];\r\n                }\r\n            }\r\n            return undefined;\r\n        },\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.yvalues[currentRegion] === null,\r\n                x: this.xvalues[currentRegion],\r\n                y: this.yvalues[currentRegion],\r\n                color: this.options.get('lineColor'),\r\n                fillColor: this.options.get('fillColor'),\r\n                offset: currentRegion\r\n            };\r\n        },\r\n        renderHighlight: function () {\r\n            let currentRegion = this.currentRegion,\r\n                target = this.target,\r\n                vertex = this.vertices[currentRegion],\r\n                options = this.options,\r\n                spotRadius = options.get('spotRadius'),\r\n                highlightSpotColor = options.get('highlightSpotColor'),\r\n                highlightLineColor = options.get('highlightLineColor'),\r\n                highlightSpot, highlightLine;\r\n\r\n            if (!vertex) {\r\n                return;\r\n            }\r\n            if (spotRadius && highlightSpotColor) {\r\n                highlightSpot = target.drawCircle(vertex[0], vertex[1],\r\n                    spotRadius, undefined, highlightSpotColor);\r\n                this.highlightSpotId = highlightSpot.id;\r\n                target.insertAfterShape(this.lastShapeId, highlightSpot);\r\n            }\r\n            if (highlightLineColor) {\r\n                highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0],\r\n                    this.canvasTop + this.canvasHeight, highlightLineColor);\r\n                this.highlightLineId = highlightLine.id;\r\n                target.insertAfterShape(this.lastShapeId, highlightLine);\r\n            }\r\n        },\r\n        removeHighlight: function () {\r\n            let target = this.target;\r\n            if (this.highlightSpotId) {\r\n                target.removeShapeId(this.highlightSpotId);\r\n                this.highlightSpotId = null;\r\n            }\r\n            if (this.highlightLineId) {\r\n                target.removeShapeId(this.highlightLineId);\r\n                this.highlightLineId = null;\r\n            }\r\n        },\r\n        scanValues: function () {\r\n            let values = this.values,\r\n                valcount = values.length,\r\n                xvalues = this.xvalues,\r\n                yvalues = this.yvalues,\r\n                yminmax = this.yminmax,\r\n                i, val, isStr, isArray, sp;\r\n            for (i = 0; i < valcount; i++) {\r\n                val = values[i];\r\n                isStr = typeof(values[i]) === 'string';\r\n                isArray = typeof(values[i]) === 'object' && values[i] instanceof Array;\r\n                sp = isStr && values[i].split(':');\r\n                if (isStr && sp.length === 2) { // x:y\r\n                    xvalues.push(Number(sp[0]));\r\n                    yvalues.push(Number(sp[1]));\r\n                    yminmax.push(Number(sp[1]));\r\n                } else if (isArray) {\r\n                    xvalues.push(val[0]);\r\n                    yvalues.push(val[1]);\r\n                    yminmax.push(val[1]);\r\n                } else {\r\n                    xvalues.push(i);\r\n                    if (values[i] === null || values[i] === 'null') {\r\n                        yvalues.push(null);\r\n                    } else {\r\n                        yvalues.push(Number(val));\r\n                        yminmax.push(Number(val));\r\n                    }\r\n                }\r\n            }\r\n            if (this.options.get('xvalues')) {\r\n                xvalues = this.options.get('xvalues');\r\n            }\r\n\r\n            this.maxy = this.maxyorg = Math.max.apply(Math, yminmax);\r\n            this.miny = this.minyorg = Math.min.apply(Math, yminmax);\r\n\r\n            this.maxx = Math.max.apply(Math, xvalues);\r\n            this.minx = Math.min.apply(Math, xvalues);\r\n\r\n            this.xvalues = xvalues;\r\n            this.yvalues = yvalues;\r\n            this.yminmax = yminmax;\r\n\r\n        },\r\n        processRangeOptions: function () {\r\n            let options = this.options,\r\n                normalRangeMin = options.get('normalRangeMin'),\r\n                normalRangeMax = options.get('normalRangeMax');\r\n\r\n            if (normalRangeMin !== undefined) {\r\n                if (normalRangeMin < this.miny) {\r\n                    this.miny = normalRangeMin;\r\n                }\r\n                if (normalRangeMax > this.maxy) {\r\n                    this.maxy = normalRangeMax;\r\n                }\r\n            }\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) {\r\n                this.miny = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) {\r\n                this.maxy = options.get('chartRangeMax');\r\n            }\r\n            if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) {\r\n                this.minx = options.get('chartRangeMinX');\r\n            }\r\n            if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) {\r\n                this.maxx = options.get('chartRangeMaxX');\r\n            }\r\n\r\n        },\r\n        drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) {\r\n            let normalRangeMin = this.options.get('normalRangeMin'),\r\n                normalRangeMax = this.options.get('normalRangeMax'),\r\n                ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))),\r\n                height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey);\r\n            //(x1, y1, x2, y2, lineColor, lineWidth)\r\n            if(height==0 && normalRangeMin==normalRangeMax){\r\n                height=1;\r\n            }\r\n            this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append();\r\n        },\r\n        render: function (el,userValues) {\r\n            this.vertices = [];\r\n            this.regionMap = [];\r\n            this.xvalues = [];\r\n            this.yvalues = [];\r\n            this.yminmax = [];\r\n            this.hightlightSpotId = null;\r\n            this.lastShapeId = null;\r\n\r\n            this.values = userValues;\r\n\r\n            let options = this.options,\r\n                target = this.target,\r\n\r\n                canvasWidth = el.mergedOptions.width,\r\n                canvasHeight = el.mergedOptions.height,\r\n\r\n                vertices = this.vertices,\r\n                spotRadius = options.get('spotRadius'),\r\n                regionMap = this.regionMap,\r\n                rangex, rangey, yvallast,\r\n                canvasTop, canvasLeft,\r\n                vertex, path, paths, x, y, xnext, xpos, xposnext,\r\n                last, next, yvalcount, lineShapes, fillShapes, plen,\r\n                valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i;\r\n\r\n            // if (!line._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n\r\n            this.scanValues();\r\n            this.processRangeOptions();\r\n\r\n            xvalues = this.xvalues;\r\n            yvalues = this.yvalues;\r\n\r\n            if (!this.yminmax.length || this.yvalues.length < 2) {\r\n                // empty or all null valuess\r\n                return;\r\n            }\r\n\r\n            canvasTop = canvasLeft = 0;\r\n\r\n            rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx;\r\n            rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny;\r\n            yvallast = this.yvalues.length - 1;\r\n\r\n            if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) {\r\n                spotRadius = 0;\r\n            }\r\n            if (spotRadius) {\r\n                // adjust the canvas size as required so that spots will fit\r\n                hlSpotsEnabled = options.get('highlightSpotColor') &&  !options.get('disableInteraction');\r\n                if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) {\r\n                    canvasHeight -= Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) {\r\n                    canvasHeight -= Math.ceil(spotRadius);\r\n                    canvasTop += Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled ||\r\n                        ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) {\r\n                    canvasLeft += Math.ceil(spotRadius);\r\n                    canvasWidth -= Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled || options.get('spotColor') ||\r\n                    (options.get('minSpotColor') || options.get('maxSpotColor') &&\r\n                        (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) {\r\n                    canvasWidth -= Math.ceil(spotRadius);\r\n                }\r\n            }\r\n\r\n\r\n            canvasHeight--;\r\n\r\n            if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) {\r\n                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);\r\n            }\r\n\r\n            path = [];\r\n            paths = [path];\r\n            last = next = null;\r\n            yvalcount = yvalues.length;\r\n            for (i = 0; i < yvalcount; i++) {\r\n                x = xvalues[i];\r\n                xnext = xvalues[i + 1];\r\n                y = yvalues[i];\r\n                xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex));\r\n                xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth;\r\n                next = xpos + ((xposnext - xpos) / 2);\r\n                regionMap[i] = [last || 0, next, i];\r\n                last = next;\r\n                if (y === null) {\r\n                    if (i) {\r\n                        if (yvalues[i - 1] !== null) {\r\n                            path = [];\r\n                            paths.push(path);\r\n                        }\r\n                        vertices.push(null);\r\n                    }\r\n                } else {\r\n                    if (y < this.miny) {\r\n                        y = this.miny;\r\n                    }\r\n                    if (y > this.maxy) {\r\n                        y = this.maxy;\r\n                    }\r\n                    if (!path.length) {\r\n                        // previous value was null\r\n                        path.push([xpos, canvasTop + canvasHeight]);\r\n                    }\r\n                    vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))];\r\n                    path.push(vertex);\r\n                    vertices.push(vertex);\r\n                }\r\n            }\r\n\r\n            lineShapes = [];\r\n            fillShapes = [];\r\n            plen = paths.length;\r\n            for (i = 0; i < plen; i++) {\r\n                path = paths[i];\r\n                if (path.length) {\r\n                    if (options.get('fillColor')) {\r\n                        path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]);\r\n                        fillShapes.push(path.slice(0));\r\n                        path.pop();\r\n                    }\r\n                    // if there's only a single point in this path, then we want to display it\r\n                    // as a vertical line which means we keep path[0]  as is\r\n                    if (path.length > 2) {\r\n                        // else we want the first value\r\n                        path[0] = [path[0][0], path[1][1]];\r\n                    }\r\n                    lineShapes.push(path);\r\n                }\r\n            }\r\n\r\n            // draw the fill first, then optionally the normal range, then the line on top of that\r\n            plen = fillShapes.length;\r\n            for (i = 0; i < plen; i++) {\r\n                target.drawShape(fillShapes[i],\r\n                    options.get('fillColor'), options.get('fillColor')).append();\r\n            }\r\n\r\n\r\n\r\n            plen = lineShapes.length;\r\n            for (i = 0; i < plen; i++) {\r\n                target.drawShape(lineShapes[i], options.get('lineColor'), undefined,\r\n                    options.get('lineWidth')).append();\r\n            }\r\n\r\n            if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) {\r\n                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);\r\n            }\r\n            \r\n            if (spotRadius && options.get('valueSpots')) {\r\n                valueSpots = options.get('valueSpots');\r\n                if (valueSpots.get === undefined) {\r\n                    valueSpots = new RangeMap(valueSpots);\r\n                }\r\n                for (i = 0; i < yvalcount; i++) {\r\n                    color = valueSpots.get(yvalues[i]);\r\n                    if (color) {\r\n                        target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)),\r\n                            canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))),\r\n                            spotRadius, undefined,\r\n                            color).append();\r\n                    }\r\n                }\r\n\r\n            }\r\n            if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) {\r\n                target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)),\r\n                    canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))),\r\n                    spotRadius, undefined,\r\n                    options.get('spotColor')).append();\r\n            }\r\n            if (this.maxy !== this.minyorg) {\r\n                if (spotRadius && options.get('minSpotColor')) {\r\n                    x = xvalues[$.inArray(this.minyorg, yvalues)];\r\n                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),\r\n                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))),\r\n                        spotRadius, undefined,\r\n                        options.get('minSpotColor')).append();\r\n                }\r\n                if (spotRadius && options.get('maxSpotColor')) {\r\n                    x = xvalues[$.inArray(this.maxyorg, yvalues)];\r\n                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),\r\n                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))),\r\n                        spotRadius, undefined,\r\n                        options.get('maxSpotColor')).append();\r\n                }\r\n            }\r\n\r\n            // this.lastShapeId = target.getLastShapeId();\r\n            // this.canvasTop = canvasTop;\r\n            // target.render();\r\n\r\n        }\r\n    },\r\n    bar:{\r\n        type: 'bar',\r\n\r\n        init: function (el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.height;\r\n            let height = el.mergedOptions.width;\r\n\r\n            this.canvasWidth = el.mergedOptions.height;\r\n            this.canvasHeight = el.mergedOptions.width;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10),\r\n                chartRangeMin = options.get('chartRangeMin'),\r\n                chartRangeMax = options.get('chartRangeMax'),\r\n                chartRangeClip = options.get('chartRangeClip'),\r\n                stackMin = Infinity,\r\n                stackMax = -Infinity,\r\n                isStackString, groupMin, groupMax, stackRanges,\r\n                numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax,\r\n                stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf;\r\n            //bar._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.values = values;\r\n\r\n            // scan values to determine whether to stack bars\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                val = values[i];\r\n                isStackString = typeof(val) === 'string' && val.indexOf(':') > -1;\r\n                if (isStackString || $.isArray(val)) {\r\n                    stacked = true;\r\n                    if (isStackString) {\r\n                        val = values[i] = normalizeValues(val.split(':'));\r\n                    }\r\n                    val = remove(val, null); // min/max will treat null as zero\r\n                    groupMin = Math.min.apply(Math, val);\r\n                    groupMax = Math.max.apply(Math, val);\r\n                    if (groupMin < stackMin) {\r\n                        stackMin = groupMin;\r\n                    }\r\n                    if (groupMax > stackMax) {\r\n                        stackMax = groupMax;\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.stacked = stacked;\r\n            this.regionShapes = {};\r\n            this.barWidth = Math.floor(width/values.length)-barSpacing;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = this.barWidth + barSpacing;\r\n            //this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n            this.width = width;\r\n            //this.initTarget();\r\n\r\n            if (chartRangeClip) {\r\n                clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin;\r\n                clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax;\r\n            }\r\n\r\n            numValues = [];\r\n            stackRanges = stacked ? [] : numValues;\r\n            let stackTotals = [];\r\n            let stackRangesNeg = [];\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                if (stacked) {\r\n                    vlist = values[i];\r\n                    values[i] = svals = [];\r\n                    stackTotals[i] = 0;\r\n                    stackRanges[i] = stackRangesNeg[i] = 0;\r\n                    for (j = 0, slen = vlist.length; j < slen; j++) {\r\n                        val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j];\r\n                        if (val !== null) {\r\n                            if (val > 0) {\r\n                                stackTotals[i] += val;\r\n                            }\r\n                            if (stackMin < 0 && stackMax > 0) {\r\n                                if (val < 0) {\r\n                                    stackRangesNeg[i] += Math.abs(val);\r\n                                } else {\r\n                                    stackRanges[i] += val;\r\n                                }\r\n                            } else {\r\n                                stackRanges[i] += Math.abs(val);\r\n                                // stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin));\r\n                            }\r\n                            numValues.push(val);\r\n                        }\r\n                    }\r\n                } else {\r\n                    val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i];\r\n                    val = values[i] = normalizeValue(val);\r\n                    if (val !== null) {\r\n                        numValues.push(val);\r\n                    }\r\n                }\r\n            }\r\n            this.max = max = Math.max.apply(Math, numValues);\r\n            this.min = min = Math.min.apply(Math, numValues);\r\n            this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max;\r\n            this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min;\r\n\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) {\r\n                min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) {\r\n                max = options.get('chartRangeMax');\r\n            }\r\n\r\n            this.zeroAxis = zeroAxis = options.get('zeroAxis', true);\r\n            if (min <= 0 && max >= 0 && zeroAxis) {\r\n                xaxisOffset = 0;\r\n            } else if (zeroAxis == false) {\r\n                xaxisOffset = min;\r\n            } else if (min > 0) {\r\n                xaxisOffset = 0;\r\n            } else {\r\n                xaxisOffset = max;\r\n            }\r\n            this.xaxisOffset = xaxisOffset;\r\n\r\n            range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - xaxisOffset;\r\n\r\n            // as we plot zero/min values a single pixel line, we add a pixel to all other\r\n            // values - Reduce the effective canvas size to suit\r\n            this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1;\r\n            this.isNeg = false;\r\n            if (min < xaxisOffset) {\r\n                // yMaxCalc = (stacked && max >= 0) ? stackMax : max;\r\n                // yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight;\r\n                yoffset = Math.floor(this.canvasHeight/2);\r\n                this.isNeg = true;\r\n                if (yoffset !== Math.ceil(yoffset)) {\r\n                    this.canvasHeightEf -= 2;\r\n                    yoffset = Math.ceil(yoffset);\r\n                }\r\n            } else {\r\n                yoffset = 0;\r\n            }\r\n            this.yoffset = yoffset;\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n\r\n            this.range = range;\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let result = Math.floor(x / this.totalBarWidth);\r\n            return (result < 0 || result >= this.values.length) ? undefined : result;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion,\r\n                values = ensureArray(this.values[currentRegion]),\r\n                result = [],\r\n                value, i;\r\n            for (i = values.length; i--;) {\r\n                value = values[i];\r\n                result.push({\r\n                    isNull: value === null,\r\n                    value: value,\r\n                    color: this.calcColor(i, value, currentRegion),\r\n                    offset: currentRegion\r\n                });\r\n            }\r\n            return result;\r\n        },\r\n\r\n        calcColor: function (stacknum, value, valuenum) {\r\n            let colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                options = this.options,\r\n                color, newColor;\r\n            if (this.stacked) {\r\n                color = options.get('stackedBarColor');\r\n            } else {\r\n                color = (value < 0) ? options.get('negBarColor') : options.get('barColor');\r\n            }\r\n            if (value === 0 && options.get('zeroColor') !== undefined) {\r\n                color = options.get('zeroColor');\r\n            }\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            }\r\n            return $.isArray(color) ? color[stacknum % color.length] : color;\r\n        },\r\n\r\n        /**\r\n         * Render bar(s) for a region\r\n         */\r\n        renderRegion: function (valuenum, highlight) {\r\n            let vals = this.values[valuenum],\r\n                options = this.options,\r\n                xaxisOffset = this.xaxisOffset,\r\n                result = [],\r\n                range = this.range,\r\n                stacked = this.stacked,\r\n                target = this.target,\r\n                x = valuenum * this.totalBarWidth,\r\n                canvasHeightEf = this.canvasHeightEf,\r\n                yoffset = this.yoffset,\r\n                y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin;\r\n\r\n            vals = $.isArray(vals) ? vals : [vals];\r\n            valcount = vals.length;\r\n            val = vals[0];\r\n            isNull = all(null, vals);\r\n            allMin = all(xaxisOffset, vals, true);\r\n\r\n            if (isNull) {\r\n                if (options.get('nullColor')) {\r\n                    color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options);\r\n                    y = (yoffset > 0) ? yoffset - 1 : yoffset;\r\n                    return target.drawRect(y, x, 0, this.barWidth - 1, color, color);\r\n                } else {\r\n                    return undefined;\r\n                }\r\n            }\r\n            yoffsetNeg = yoffset;\r\n            if(this.isNeg){\r\n                canvasHeightEf = Math.floor(canvasHeightEf/2);\r\n            }\r\n            for (i = 0; i < valcount; i++) {\r\n                val = vals[i];\r\n\r\n                if (stacked && val === xaxisOffset) {\r\n                    if (!allMin || minPlotted) {\r\n                        continue;\r\n                    }\r\n                    minPlotted = true;\r\n                }\r\n\r\n                if (range > 0) {\r\n                    height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range)));\r\n                } else {\r\n                    height = canvasHeightEf;\r\n                }\r\n\r\n                if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) {\r\n                    y = yoffsetNeg - height;\r\n                    yoffsetNeg += height;\r\n                } else {\r\n                    if(stacked){\r\n                        y = yoffset;\r\n                        yoffset += height;\r\n                    }\r\n                    else{\r\n                        y = yoffset;\r\n                        yoffset -= height;\r\n                    }\r\n                    \r\n                }\r\n                color = this.calcColor(i, val, valuenum);\r\n                if (highlight) {\r\n                    color = this.calcHighlightColor(color, options);\r\n                }\r\n                result.push(target.drawRect(y, x,  height - 1, this.barWidth - 1,color, color));\r\n            }\r\n            if (result.length === 1) {\r\n                return result[0];\r\n            }\r\n            return result;\r\n        }\r\n    },\r\n    column:{\r\n        type: 'column',\r\n\r\n        init: function (el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10),\r\n                chartRangeMin = options.get('chartRangeMin'),\r\n                chartRangeMax = options.get('chartRangeMax'),\r\n                chartRangeClip = options.get('chartRangeClip'),\r\n                stackMin = Infinity,\r\n                stackMax = -Infinity,\r\n                isStackString, groupMin, groupMax, stackRanges,\r\n                numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax,\r\n                stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf;\r\n            //bar._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.values = values;\r\n\r\n            // scan values to determine whether to stack bars\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                val = values[i];\r\n                isStackString = typeof(val) === 'string' && val.indexOf(':') > -1;\r\n                if (isStackString || $.isArray(val)) {\r\n                    stacked = true;\r\n                    if (isStackString) {\r\n                        val = values[i] = normalizeValues(val.split(':'));\r\n                    }\r\n                    val = remove(val, null); // min/max will treat null as zero\r\n                    groupMin = Math.min.apply(Math, val);\r\n                    groupMax = Math.max.apply(Math, val);\r\n                    if (groupMin < stackMin) {\r\n                        stackMin = groupMin;\r\n                    }\r\n                    if (groupMax > stackMax) {\r\n                        stackMax = groupMax;\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.stacked = stacked;\r\n            this.regionShapes = {};\r\n            this.barWidth = Math.floor(width/values.length)-barSpacing;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = this.barWidth + barSpacing;\r\n            //this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n            this.width = width;\r\n            //this.initTarget();\r\n\r\n            if (chartRangeClip) {\r\n                clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin;\r\n                clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax;\r\n            }\r\n\r\n            numValues = [];\r\n            stackRanges = stacked ? [] : numValues;\r\n            let stackTotals = [];\r\n            let stackRangesNeg = [];\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                if (stacked) {\r\n                    vlist = values[i];\r\n                    values[i] = svals = [];\r\n                    stackTotals[i] = 0;\r\n                    stackRanges[i] = stackRangesNeg[i] = 0;\r\n                    for (j = 0, slen = vlist.length; j < slen; j++) {\r\n                        val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j];\r\n                        if (val !== null) {\r\n                            if (val > 0) {\r\n                                stackTotals[i] += val;\r\n                            }\r\n                            if (stackMin < 0 && stackMax > 0) {\r\n                                if (val < 0) {\r\n                                    stackRangesNeg[i] += Math.abs(val);\r\n                                } else {\r\n                                    stackRanges[i] += val;\r\n                                }\r\n                            } else {\r\n                                stackRanges[i] += Math.abs(val);\r\n                                // stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin));\r\n                            }\r\n                            numValues.push(val);\r\n                        }\r\n                    }\r\n                } else {\r\n                    val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i];\r\n                    val = values[i] = normalizeValue(val);\r\n                    if (val !== null) {\r\n                        numValues.push(val);\r\n                    }\r\n                }\r\n            }\r\n            this.max = max = Math.max.apply(Math, numValues);\r\n            this.min = min = Math.min.apply(Math, numValues);\r\n            this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max;\r\n            this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min;\r\n\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) {\r\n                min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) {\r\n                max = options.get('chartRangeMax');\r\n            }\r\n\r\n            this.zeroAxis = zeroAxis = options.get('zeroAxis', true);\r\n            if (min <= 0 && max >= 0 && zeroAxis) {\r\n                xaxisOffset = 0;\r\n            } else if (zeroAxis == false) {\r\n                xaxisOffset = min;\r\n            } else if (min > 0) {\r\n                xaxisOffset = 0;\r\n            } else {\r\n                xaxisOffset = max;\r\n            }\r\n            this.xaxisOffset = xaxisOffset;\r\n\r\n            range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - xaxisOffset;\r\n\r\n            // as we plot zero/min values a single pixel line, we add a pixel to all other\r\n            // values - Reduce the effective canvas size to suit\r\n            this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1;\r\n            this.isNeg = false;\r\n            if (min < xaxisOffset) {\r\n                // yMaxCalc = (stacked && max >= 0) ? stackMax : max;\r\n                // yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight;\r\n                yoffset = Math.floor(this.canvasHeight/2);\r\n                this.isNeg = true;\r\n                if (yoffset !== Math.ceil(yoffset)) {\r\n                    this.canvasHeightEf -= 2;\r\n                    yoffset = Math.ceil(yoffset);\r\n                }\r\n            } else {\r\n                yoffset = this.canvasHeight;\r\n            }\r\n            this.yoffset = yoffset;\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n\r\n            this.range = range;\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let result = Math.floor(x / this.totalBarWidth);\r\n            return (result < 0 || result >= this.values.length) ? undefined : result;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion,\r\n                values = ensureArray(this.values[currentRegion]),\r\n                result = [],\r\n                value, i;\r\n            for (i = values.length; i--;) {\r\n                value = values[i];\r\n                result.push({\r\n                    isNull: value === null,\r\n                    value: value,\r\n                    color: this.calcColor(i, value, currentRegion),\r\n                    offset: currentRegion\r\n                });\r\n            }\r\n            return result;\r\n        },\r\n\r\n        calcColor: function (stacknum, value, valuenum) {\r\n            let colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                options = this.options,\r\n                color, newColor;\r\n            if (this.stacked) {\r\n                color = options.get('stackedBarColor');\r\n            } else {\r\n                color = (value < 0) ? options.get('negBarColor') : options.get('barColor');\r\n            }\r\n            if (value === 0 && options.get('zeroColor') !== undefined) {\r\n                color = options.get('zeroColor');\r\n            }\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            }\r\n            return $.isArray(color) ? color[stacknum % color.length] : color;\r\n        },\r\n\r\n        /**\r\n         * Render bar(s) for a region\r\n         */\r\n        renderRegion: function (valuenum, highlight) {\r\n            let vals = this.values[valuenum],\r\n                options = this.options,\r\n                xaxisOffset = this.xaxisOffset,\r\n                result = [],\r\n                range = this.range,\r\n                stacked = this.stacked,\r\n                target = this.target,\r\n                x = valuenum * this.totalBarWidth,\r\n                canvasHeightEf = this.canvasHeightEf,\r\n                yoffset = this.yoffset,\r\n                y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin;\r\n\r\n            vals = $.isArray(vals) ? vals : [vals];\r\n            valcount = vals.length;\r\n            val = vals[0];\r\n            isNull = all(null, vals);\r\n            allMin = all(xaxisOffset, vals, true);\r\n\r\n            if (isNull) {\r\n                if (options.get('nullColor')) {\r\n                    color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options);\r\n                    y = (yoffset > 0) ? yoffset - 1 : yoffset;\r\n                    return target.drawRect(x, y, this.barWidth - 1, 0, color, color);\r\n                } else {\r\n                    return undefined;\r\n                }\r\n            }\r\n            yoffsetNeg = yoffset;\r\n            if(this.isNeg){\r\n                canvasHeightEf = Math.floor(canvasHeightEf/2);\r\n            }\r\n            for (i = 0; i < valcount; i++) {\r\n                val = vals[i];\r\n\r\n                if (stacked && val === xaxisOffset) {\r\n                    if (!allMin || minPlotted) {\r\n                        continue;\r\n                    }\r\n                    minPlotted = true;\r\n                }\r\n\r\n                if (range > 0) {\r\n                    height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range)));\r\n                } else {\r\n                    height = canvasHeightEf;\r\n                }\r\n\r\n                if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) {\r\n                    y = yoffsetNeg;\r\n                    yoffsetNeg += height;\r\n                } else {\r\n                    y = yoffset - height;\r\n                    yoffset -= height;\r\n                }\r\n                color = this.calcColor(i, val, valuenum);\r\n                if (highlight) {\r\n                    color = this.calcHighlightColor(color, options);\r\n                }\r\n                result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color));\r\n            }\r\n            if (result.length === 1) {\r\n                return result[0];\r\n            }\r\n            return result;\r\n        }\r\n    },\r\n    tristate:{\r\n        type: 'tristate',\r\n        init: function(el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10);\r\n            //tristate._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.regionShapes = {};\r\n            this.barWidth = barWidth;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = barWidth + barSpacing;\r\n            this.values = $.map(values, Number);\r\n            this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n            //this.initTarget();\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            return Math.floor(x / this.totalBarWidth);\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                color: this.calcColor(this.values[currentRegion], currentRegion),\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        calcColor: function (value, valuenum) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                color, newColor;\r\n\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            } else if (values[valuenum] < 0) {\r\n                color = options.get('negBarColor');\r\n            } else if (values[valuenum] > 0) {\r\n                color = options.get('posBarColor');\r\n            } else {\r\n                color = options.get('zeroBarColor');\r\n            }\r\n            return color;\r\n        },\r\n\r\n        renderRegion: function (valuenum, highlight) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                target = this.target,\r\n                canvasHeight, height, halfHeight,\r\n                x, y, color;\r\n\r\n            canvasHeight = this.canvasHeight;\r\n            halfHeight = Math.round(canvasHeight / 2);\r\n\r\n            x = valuenum * this.totalBarWidth;\r\n            if (values[valuenum] < 0) {\r\n                y = halfHeight;\r\n                height = halfHeight - 1;\r\n            } else if (values[valuenum] > 0) {\r\n                y = 0;\r\n                height = halfHeight - 1;\r\n            } else {\r\n                y = halfHeight - 1;\r\n                height = 2;\r\n            }\r\n            color = this.calcColor(values[valuenum], valuenum);\r\n            if (color === null) {\r\n                return;\r\n            }\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, options);\r\n            }\r\n            return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color);\r\n        }\r\n    },\r\n    discrete:{\r\n        type: 'discrete',\r\n\r\n        init: function(el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            this.regionShapes = {};\r\n            this.values = values = $.map(values, Number);\r\n            this.min = Math.min.apply(Math, values);\r\n            this.max = Math.max.apply(Math, values);\r\n            this.range = this.max - this.min;\r\n            this.width = width;\r\n            this.interval = Math.floor(width / values.length);\r\n            this.itemWidth = width / values.length;\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) {\r\n                this.min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) {\r\n                this.max = options.get('chartRangeMax');\r\n            }\r\n            //this.initTarget();\r\n            if (this.target) {\r\n                this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight');\r\n            }\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            return Math.floor(x / this.itemWidth);\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        renderRegion: function (valuenum, highlight) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                min = this.min,\r\n                max = this.max,\r\n                range = this.range,\r\n                interval = this.interval,\r\n                target = this.target,\r\n                canvasHeight = this.canvasHeight,\r\n                lineHeight = this.lineHeight,\r\n                pheight = canvasHeight - lineHeight,\r\n                ytop, val, color, x;\r\n\r\n            val = clipval(values[valuenum], min, max);\r\n            x = valuenum * interval;\r\n            ytop = Math.round(pheight - pheight * ((val - min) / range));\r\n            color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, options);\r\n            }\r\n            //return target.drawLine(x, ytop, x, ytop + lineHeight, color);\r\n\r\n            return this.target.drawRect(x, ytop, interval<=2?1:interval-2, lineHeight, color, color);\r\n        }\r\n    },\r\n    bullet:{\r\n        type: 'bullet',\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let min, max, vals;\r\n            //bullet._super.init.call(this, el, values, options, width, height);\r\n\r\n            // values: target, performance, range1, range2, range3\r\n            this.values = values = normalizeValues(values);\r\n            // target or performance could be null\r\n            vals = values.slice();\r\n            vals[0] = vals[0] === null ? vals[2] : vals[0];\r\n            vals[1] = values[1] === null ? vals[2] : vals[1];\r\n            min = Math.min.apply(Math, values);\r\n            max = Math.max.apply(Math, values);\r\n            if (options.get('base') === undefined) {\r\n                min = min < 0 ? min : 0;\r\n            } else {\r\n                min = options.get('base');\r\n            }\r\n            this.min = min;\r\n            this.max = max;\r\n            this.range = max - min;\r\n            this.shapes = {};\r\n            this.valueShapes = {};\r\n            this.regiondata = {};\r\n            this.width = width;\r\n            //this.target = this.$el.simpledraw(width, height, options.get('composite'));\r\n            if (!values.length) {\r\n                this.disabled = true;\r\n            }\r\n            //this.initTarget();\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let shapeid = this.target.getShapeAt(el, x, y);\r\n            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                fieldkey: currentRegion.substr(0, 1),\r\n                value: this.values[currentRegion.substr(1)],\r\n                region: currentRegion\r\n            };\r\n        },\r\n\r\n        changeHighlight: function (highlight) {\r\n            let currentRegion = this.currentRegion,\r\n                shapeid = this.valueShapes[currentRegion],\r\n                shape;\r\n            delete this.shapes[shapeid];\r\n            switch (currentRegion.substr(0, 1)) {\r\n                case 'r':\r\n                    shape = this.renderRange(currentRegion.substr(1), highlight);\r\n                    break;\r\n                case 'p':\r\n                    shape = this.renderPerformance(highlight);\r\n                    break;\r\n                case 't':\r\n                    shape = this.renderTarget(highlight);\r\n                    break;\r\n            }\r\n            this.valueShapes[currentRegion] = shape.id;\r\n            this.shapes[shape.id] = currentRegion;\r\n            this.target.replaceWithShape(shapeid, shape);\r\n        },\r\n\r\n        renderRange: function (rn, highlight) {\r\n            let rangeval = this.values[rn],\r\n                rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)),\r\n                color = this.options.get('rangeColors')[rn - 2];\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color);\r\n        },\r\n\r\n        renderPerformance: function (highlight) {\r\n            let perfval = this.values[1],\r\n                perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)),\r\n                color = this.options.get('performanceColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1,\r\n                Math.round(this.canvasHeight * 0.4) - 1, color, color);\r\n        },\r\n\r\n        renderTarget: function (highlight) {\r\n            let targetval = this.values[0],\r\n                x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)),\r\n                targettop = Math.round(this.canvasHeight * 0.10),\r\n                targetheight = this.canvasHeight - (targettop * 2),\r\n                color = this.options.get('targetColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color);\r\n        },\r\n\r\n        render: function (el,userValues) {\r\n            this.init(el,userValues);\r\n            let vlen = this.values.length,\r\n                target = this.target,\r\n                i, shape;\r\n            // if (!bullet._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n            for (i = 2; i < vlen; i++) {\r\n                shape = this.renderRange(i).append();\r\n                this.shapes[shape.id] = 'r' + i;\r\n                this.valueShapes['r' + i] = shape.id;\r\n            }\r\n            if (this.values[1] !== null) {\r\n                shape = this.renderPerformance().append();\r\n                this.shapes[shape.id] = 'p1';\r\n                this.valueShapes.p1 = shape.id;\r\n            }\r\n            if (this.values[0] !== null) {\r\n                shape = this.renderTarget().append();\r\n                this.shapes[shape.id] = 't0';\r\n                this.valueShapes.t0 = shape.id;\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    pie:{\r\n        type: 'pie',\r\n\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let total = 0, i;\r\n\r\n            //pie._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.shapes = {}; // map shape ids to value offsets\r\n            this.valueShapes = {}; // maps value offsets to shape ids\r\n            this.values = values = $.map(values, Number);\r\n\r\n            if (options.get('width') === 'auto') {\r\n                this.width = this.height;\r\n            }\r\n\r\n            if (values.length > 0) {\r\n                for (i = values.length; i--;) {\r\n                    total += values[i];\r\n                }\r\n            }\r\n            this.total = total;\r\n            //this.initTarget();\r\n            this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2);\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let shapeid = this.target.getShapeAt(el, x, y);\r\n            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                percent: this.values[currentRegion] / this.total * 100,\r\n                color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length],\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        changeHighlight: function (highlight) {\r\n            let currentRegion = this.currentRegion,\r\n                    newslice = this.renderSlice(currentRegion, highlight),\r\n                    shapeid = this.valueShapes[currentRegion];\r\n            delete this.shapes[shapeid];\r\n            this.target.replaceWithShape(shapeid, newslice);\r\n            this.valueShapes[currentRegion] = newslice.id;\r\n            this.shapes[newslice.id] = currentRegion;\r\n        },\r\n\r\n        renderSlice: function (valuenum, highlight) {\r\n            let target = this.target,\r\n                options = this.options,\r\n                radius = this.radius,\r\n                borderWidth = options.get('borderWidth'),\r\n                offset = options.get('offset'),\r\n                circle = 2 * Math.PI,\r\n                values = this.values,\r\n                total = this.total,\r\n                next = offset ? (2*Math.PI)*(offset/360) : 0,\r\n                start, end, i, vlen, color;\r\n\r\n            vlen = values.length;\r\n            for (i = 0; i < vlen; i++) {\r\n                start = next;\r\n                end = next;\r\n                if (total > 0) {  // avoid divide by zero\r\n                    end = next + (circle * (values[i] / total));\r\n                }\r\n                if (valuenum === i) {\r\n                    color = options.get('sliceColors')[i % options.get('sliceColors').length];\r\n                    if (highlight) {\r\n                        color = this.calcHighlightColor(color, options);\r\n                    }\r\n\r\n                    return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color);\r\n                }\r\n                next = end;\r\n            }\r\n        },\r\n\r\n        render: function (el,userValues) {\r\n            this.init(el,userValues);\r\n            let target = this.target,\r\n                values = this.values,\r\n                options = this.options,\r\n                radius = this.radius,\r\n                borderWidth = options.get('borderWidth'),\r\n                shape, i;\r\n\r\n            // if (!pie._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n            if (borderWidth) {\r\n                target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)),\r\n                    options.get('borderColor'), undefined, borderWidth).append();\r\n            }\r\n            for (i = values.length; i--;) {\r\n                if (values[i]) { // don't render zero values\r\n                    shape = this.renderSlice(i).append();\r\n                    this.valueShapes[i] = shape.id; // store just the shapeid\r\n                    this.shapes[shape.id] = i;\r\n                }\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    box:{\r\n        type: 'box',\r\n\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            //box._super.init.call(this, el, values, options, width, height);\r\n            this.values = $.map(values, Number);\r\n            this.width = options.get('width') === 'auto' ? '4.0em' : width;\r\n            //this.initTarget();\r\n            if (!this.values.length) {\r\n                this.disabled = 1;\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Simulate a single region\r\n         */\r\n        getRegion: function () {\r\n            return 1;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let result = [\r\n                { field: 'lq', value: this.quartiles[0] },\r\n                { field: 'med', value: this.quartiles[1] },\r\n                { field: 'uq', value: this.quartiles[2] }\r\n            ];\r\n            if (this.loutlier !== undefined) {\r\n                result.push({ field: 'lo', value: this.loutlier});\r\n            }\r\n            if (this.routlier !== undefined) {\r\n                result.push({ field: 'ro', value: this.routlier});\r\n            }\r\n            if (this.lwhisker !== undefined) {\r\n                result.push({ field: 'lw', value: this.lwhisker});\r\n            }\r\n            if (this.rwhisker !== undefined) {\r\n                result.push({ field: 'rw', value: this.rwhisker});\r\n            }\r\n            return result;\r\n        },\r\n\r\n        render:  function (el,userValues) {\r\n            this.init(el,userValues);\r\n\r\n            let target = this.target,\r\n                values = this.values,\r\n                vlen = values.length,\r\n                options = this.options,\r\n                canvasWidth = this.canvasWidth,\r\n                canvasHeight = this.canvasHeight,\r\n                minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'),\r\n                maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'),\r\n                canvasLeft = 0,\r\n                lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i,\r\n                size, unitSize;\r\n\r\n            // if (!box._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n\r\n            if (options.get('raw')) {\r\n                if (options.get('showOutliers') && values.length > 5) {\r\n                    loutlier = values[0];\r\n                    lwhisker = values[1];\r\n                    q1 = values[2];\r\n                    q2 = values[3];\r\n                    q3 = values[4];\r\n                    rwhisker = values[5];\r\n                    routlier = values[6];\r\n                } else {\r\n                    lwhisker = values[0];\r\n                    q1 = values[1];\r\n                    q2 = values[2];\r\n                    q3 = values[3];\r\n                    rwhisker = values[4];\r\n                }\r\n            } else {\r\n                values.sort(function (a, b) { return a - b; });\r\n                q1 = quartile(values, 1);\r\n                q2 = quartile(values, 2);\r\n                q3 = quartile(values, 3);\r\n                iqr = q3 - q1;\r\n                if (options.get('showOutliers')) {\r\n                    lwhisker = rwhisker = undefined;\r\n                    for (i = 0; i < vlen; i++) {\r\n                        if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) {\r\n                            lwhisker = values[i];\r\n                        }\r\n                        if (values[i] < q3 + (iqr * options.get('outlierIQR'))) {\r\n                            rwhisker = values[i];\r\n                        }\r\n                    }\r\n                    loutlier = values[0];\r\n                    routlier = values[vlen - 1];\r\n                } else {\r\n                    lwhisker = values[0];\r\n                    rwhisker = values[vlen - 1];\r\n                }\r\n            }\r\n            this.quartiles = [q1, q2, q3];\r\n            this.lwhisker = lwhisker;\r\n            this.rwhisker = rwhisker;\r\n            this.loutlier = loutlier;\r\n            this.routlier = routlier;\r\n\r\n            unitSize = canvasWidth / (maxValue - minValue + 1);\r\n            if (options.get('showOutliers')) {\r\n                canvasLeft = Math.ceil(options.get('spotRadius'));\r\n                canvasWidth -= 2 * Math.ceil(options.get('spotRadius'));\r\n                unitSize = canvasWidth / (maxValue - minValue + 1);\r\n                if (loutlier < lwhisker) {\r\n                    target.drawCircle((loutlier - minValue) * unitSize + canvasLeft,\r\n                        canvasHeight / 2,\r\n                        options.get('spotRadius'),\r\n                        options.get('outlierLineColor'),\r\n                        options.get('outlierFillColor')).append();\r\n                }\r\n                if (routlier > rwhisker) {\r\n                    target.drawCircle((routlier - minValue) * unitSize + canvasLeft,\r\n                        canvasHeight / 2,\r\n                        options.get('spotRadius'),\r\n                        options.get('outlierLineColor'),\r\n                        options.get('outlierFillColor')).append();\r\n                }\r\n            }\r\n\r\n            // box\r\n            target.drawRect(\r\n                Math.round((q1 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.1),\r\n                Math.round((q3 - q1) * unitSize),\r\n                Math.round(canvasHeight * 0.8),\r\n                options.get('boxLineColor'),\r\n                options.get('boxFillColor')).append();\r\n            // left whisker\r\n            target.drawLine(\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                Math.round((q1 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                options.get('lineColor')).append();\r\n            target.drawLine(\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 4),\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight - canvasHeight / 4),\r\n                options.get('whiskerColor')).append();\r\n            // right whisker\r\n            target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                Math.round((q3 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                options.get('lineColor')).append();\r\n            target.drawLine(\r\n                Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 4),\r\n                Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight - canvasHeight / 4),\r\n                options.get('whiskerColor')).append();\r\n            // median line\r\n            target.drawLine(\r\n                Math.round((q2 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.1),\r\n                Math.round((q2 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.9),\r\n                options.get('medianColor')).append();\r\n            if (options.get('target')) {\r\n                size = Math.ceil(options.get('spotRadius'));\r\n                target.drawLine(\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),\r\n                    Math.round((canvasHeight / 2) - size),\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),\r\n                    Math.round((canvasHeight / 2) + size),\r\n                    options.get('targetColor')).append();\r\n                target.drawLine(\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size),\r\n                    Math.round(canvasHeight / 2),\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size),\r\n                    Math.round(canvasHeight / 2),\r\n                    options.get('targetColor')).append();\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    shapeCount:0,\r\n    shapes:{},\r\n    shapeseq:[],\r\n    lastShapeId:null,\r\n    mergedOptions:null,\r\n    init:function(userValues, userOptions){\r\n        let extendedOptions, defaults, base;\r\n        userOptions = userOptions || {};\r\n        let _this = this;\r\n        defaults = this.defaultOption;\r\n        base = defaults.common;\r\n        extendedOptions = defaults[userOptions.type || base.type];\r\n\r\n        _this.shapeCount = 0;\r\n        _this.shapes = {};\r\n        _this.shapeseq = [];\r\n        _this.lastShapeId = null;\r\n\r\n        _this.mergedOptions = $.extend({}, base, extendedOptions, userOptions);\r\n        _this.mergedOptions.width = _this.mergedOptions.width;\r\n        _this.mergedOptions.height = _this.mergedOptions.height;\r\n        _this[_this.mergedOptions.type].render(_this, userValues);\r\n\r\n        return { shapes:_this.shapes, shapeseq:_this.shapeseq, offsetX:_this.mergedOptions.offsetX, offsetY:_this.mergedOptions.offsetY, pixelWidth:_this.mergedOptions.width, pixelHeight:_this.mergedOptions.height};\r\n\r\n    },\r\n    _getContext: function (lineColor, fillColor, lineWidth) {\r\n        let context;\r\n        if(this.ctx != null){\r\n            context = this.ctx;\r\n        }\r\n        else{\r\n            context = $(\"#\" + this._canvasID ).get(0).getContext('2d');\r\n        }\r\n\r\n        if (lineColor !== undefined) {\r\n            context.strokeStyle = lineColor;\r\n        }\r\n        context.lineWidth = lineWidth === undefined ? 1 : lineWidth;\r\n        if (fillColor !== undefined) {\r\n            context.fillStyle = fillColor;\r\n        }\r\n        return context;\r\n    },\r\n\r\n    reset: function () {\r\n        let context = this._getContext();\r\n        context.clearRect(0, 0, this.pixelWidth, this.pixelHeight);\r\n        this.shapes = {};\r\n        this.shapeseq = [];\r\n        this.currentTargetShapeId = undefined;\r\n    },\r\n\r\n    _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) {\r\n        let context = this._getContext(lineColor, fillColor, lineWidth),\r\n            i, plen;\r\n        context.beginPath();\r\n        context.moveTo(path[0][0] + 0.5 + this.offsetX, path[0][1] + 0.5 + this.offsetY);\r\n        \r\n        for (i = 1, plen = path.length; i < plen; i++) {\r\n            context.lineTo(path[i][0] + 0.5 + this.offsetX, path[i][1] + 0.5 + this.offsetY); // the 0.5 offset gives us crisp pixel-width lines\r\n        }\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor !== undefined) {\r\n            context.fill();\r\n        }\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX + this.offsetX, this.targetY + this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n    },\r\n\r\n    _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) {\r\n        let context = this._getContext(lineColor, fillColor, lineWidth);\r\n        context.beginPath();\r\n        x+=this.offsetX;\r\n        y+=this.offsetY;\r\n        context.arc(x, y, radius, 0, 2 * Math.PI, false);\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX+this.offsetX, this.targetY+this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor !== undefined) {\r\n            context.fill();\r\n        }\r\n    },\r\n\r\n    _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) {\r\n        let context = this._getContext(lineColor, fillColor);\r\n        x+=this.offsetX;\r\n        y+=this.offsetY;\r\n        context.beginPath();\r\n        context.moveTo(x, y);\r\n        context.arc(x, y, radius, startAngle, endAngle, false);\r\n        context.lineTo(x, y);\r\n        context.closePath();\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor) {\r\n            context.fill();\r\n        }\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX+this.offsetX, this.targetY+this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n    },\r\n\r\n    _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) {\r\n        // x+=this.offsetX;\r\n        // y+=this.offsetY;\r\n        return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor);\r\n    },\r\n\r\n    appendShape: function (shape) {\r\n        this.shapes[shape.id] = shape;\r\n        this.shapeseq.push(shape.id);\r\n        this.lastShapeId = shape.id;\r\n        return shape.id;\r\n    },\r\n\r\n    replaceWithShape: function (shapeid, shape) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        this.shapes[shape.id] = shape;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] == shapeid) {\r\n                shapeseq[i] = shape.id;\r\n            }\r\n        }\r\n        delete this.shapes[shapeid];\r\n    },\r\n\r\n    replaceWithShapes: function (shapeids, shapes) {\r\n        let shapeseq = this.shapeseq,\r\n            shapemap = {},\r\n            sid, i, first;\r\n\r\n        for (i = shapeids.length; i--;) {\r\n            shapemap[shapeids[i]] = true;\r\n        }\r\n        for (i = shapeseq.length; i--;) {\r\n            sid = shapeseq[i];\r\n            if (shapemap[sid]) {\r\n                shapeseq.splice(i, 1);\r\n                delete this.shapes[sid];\r\n                first = i;\r\n            }\r\n        }\r\n        for (i = shapes.length; i--;) {\r\n            shapeseq.splice(first, 0, shapes[i].id);\r\n            this.shapes[shapes[i].id] = shapes[i];\r\n        }\r\n\r\n    },\r\n\r\n    insertAfterShape: function (shapeid, shape) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] === shapeid) {\r\n                shapeseq.splice(i + 1, 0, shape.id);\r\n                this.shapes[shape.id] = shape;\r\n                return;\r\n            }\r\n        }\r\n    },\r\n\r\n    removeShapeId: function (shapeid) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] === shapeid) {\r\n                shapeseq.splice(i, 1);\r\n                break;\r\n            }\r\n        }\r\n        delete this.shapes[shapeid];\r\n    },\r\n\r\n    getShapeAt: function (el, x, y) {\r\n        this.targetX = x;\r\n        this.targetY = y;\r\n        this.render();\r\n        return this.currentTargetShapeId;\r\n    },\r\n    _canvasID:\"luckysheetTableContent\",\r\n    render: function (shapeseq, shapes, offsetX, offsetY, pixelWidth, pixelHeight,canvasid,ctx) {\r\n        if(canvasid==null){\r\n            canvasid = \"luckysheetTableContent\";\r\n        }\r\n        this._canvasID = canvasid;\r\n\r\n        if(ctx != null){\r\n            this.ctx = ctx;\r\n        }\r\n\r\n        let shapeCount = shapeseq.length,\r\n            context = this._getContext(),\r\n            shapeid, shape, i;\r\n        this.offsetX = offsetX;\r\n        this.offsetY = offsetY;\r\n        this.pixelWidth = pixelWidth;\r\n        this.pixelHeight = pixelHeight;\r\n        //context.clearRect(this.offsetX, this.offsetY, this.pixelWidth, this.pixelHeight);\r\n\r\n        // qkSparkSetting.currentSparkVlaue = {\r\n        //     shapeseq : shapeseq,\r\n        //     shapes:shapes,\r\n        //     shapeCount:shapeCount,\r\n        //     el:this\r\n        // }\r\n\r\n        for (i = 0; i < shapeCount; i++) {\r\n            shapeid = shapeseq[i];\r\n            shape = shapes[shapeid];\r\n            this['_draw' + shape.type].apply(this, shape.args);\r\n        }\r\n        // if (!this.interact) {\r\n        //     // not interactive so no need to keep the shapes array\r\n        //     this.shapes = {};\r\n        //     this.shapeseq = [];\r\n        // }\r\n    },\r\n    drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) {\r\n        return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth);\r\n    },\r\n\r\n    drawShape: function (path, lineColor, fillColor, lineWidth) {\r\n        return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]);\r\n    },\r\n\r\n    drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) {\r\n        return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]);\r\n    },\r\n\r\n    drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) {\r\n        return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]);\r\n    },\r\n\r\n    drawRect: function (x, y, width, height, lineColor, fillColor) {\r\n        return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]);\r\n    },\r\n    _genShape: function (shapetype, shapeargs) {\r\n        let id = this.shapeCount++;\r\n        shapeargs.unshift(id);\r\n        // return new VShape(this, id, shapetype, shapeargs);\r\n        // this.target = target;\r\n        // this.id = id;\r\n        // this.type = type;\r\n        // this.args = args;\r\n        let shape = { id:id, type:shapetype, args:shapeargs };\r\n        this.shapes[id] = shape;\r\n        this.shapeseq.push(id);\r\n        this.lastShapeId = id;\r\n        return {\r\n            append:function(){\r\n                return shape;\r\n            },\r\n            get:function(){\r\n                return id;\r\n            }\r\n        };\r\n    }\r\n\r\n}\r\n\r\nlet barHighlightMixin = {\r\n    changeHighlight: function (highlight) {\r\n        let currentRegion = this.currentRegion,\r\n            target = this.target,\r\n            shapeids = this.regionShapes[currentRegion],\r\n            newShapes;\r\n        // will be null if the region value was null\r\n        if (shapeids) {\r\n            newShapes = this.renderRegion(currentRegion, highlight);\r\n            if ($.isArray(newShapes) || $.isArray(shapeids)) {\r\n                target.replaceWithShapes(shapeids, newShapes);\r\n                this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) {\r\n                    return newShape.id;\r\n                });\r\n            } else {\r\n                target.replaceWithShape(shapeids, newShapes);\r\n                this.regionShapes[currentRegion] = newShapes.id;\r\n            }\r\n        }\r\n    },\r\n    render: function (el,userValues) {\r\n        this.init(el, userValues);\r\n        let values = this.values,\r\n            target = this.target,\r\n            regionShapes = this.regionShapes,\r\n            shapes, ids, i, j;\r\n\r\n        // if (!this.cls._super.render.call(this)) {\r\n        //     return;\r\n        // }\r\n        for (i = values.length; i--;) {\r\n            shapes = this.renderRegion(i);\r\n            if (shapes) {\r\n                if ($.isArray(shapes)) {\r\n                    ids = [];\r\n                    for (j = shapes.length; j--;) {\r\n                        shapes[j].append();\r\n                        ids.push(shapes[j].id);\r\n                    }\r\n                    regionShapes[i] = ids;\r\n                } else {\r\n                    shapes.append();\r\n                    regionShapes[i] = shapes.id; // store just the shapeid\r\n                }\r\n            } else {\r\n                // null value\r\n                regionShapes[i] = null;\r\n            }\r\n        }\r\n        //target.render();\r\n    }\r\n};\r\n\r\nlet _luckysheetSparkLineOptions = {\r\n    get:function(type){\r\n        return luckysheetSparkline.mergedOptions[type];\r\n    }\r\n}\r\n\r\nlet _luckysheetSparkLineTarget = {\r\n    drawLine:function(x1, y1, x2, y2, lineColor, lineWidth){\r\n        return luckysheetSparkline.drawLine(x1, y1, x2, y2, lineColor, lineWidth);\r\n    },\r\n\r\n    drawShape:function(path, lineColor, fillColor, lineWidth){\r\n        return luckysheetSparkline.drawShape(path, lineColor, fillColor, lineWidth);\r\n    },\r\n\r\n    drawCircle:function(x, y, radius, lineColor, fillColor, lineWidth){\r\n        return luckysheetSparkline.drawCircle(x, y, radius, lineColor, fillColor, lineWidth);\r\n    },\r\n\r\n    drawPieSlice:function(x, y, radius, startAngle, endAngle, lineColor, fillColor){\r\n        return luckysheetSparkline.drawPieSlice(x, y, radius, startAngle, endAngle, lineColor, fillColor);\r\n    },\r\n\r\n    drawRect:function(x, y, width, height, lineColor, fillColor){\r\n        return luckysheetSparkline.drawRect(x, y, width, height, lineColor, fillColor);\r\n    }\r\n}\r\n\r\nfor(let item in luckysheetSparkline){\r\n    if(item in {\"line\":null, \"bar\":null, \"column\":null, \"tristate\":null, \"discrete\":null, \"bullet\":null, \"pie\":null, \"box\":null}){\r\n        luckysheetSparkline[item].options = _luckysheetSparkLineOptions;\r\n        luckysheetSparkline[item].target = _luckysheetSparkLineTarget;\r\n    }\r\n\r\n    if(item in {\"bar\":null, \"column\":null, \"tristate\":null, \"discrete\":null}){\r\n        luckysheetSparkline[item].changeHighlight = barHighlightMixin.changeHighlight;\r\n        luckysheetSparkline[item].render = barHighlightMixin.render;\r\n    }\r\n}\r\n\r\nexport default luckysheetSparkline;\r\n", "import pivotTable from '../controllers/pivotTable';\r\nimport conditionformat from '../controllers/conditionformat';\r\nimport alternateformat from '../controllers/alternateformat';\r\nimport luckysheetSparkline from '../controllers/sparkline';\r\nimport menuButton from '../controllers/menuButton';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport { luckysheetdefaultstyle, luckysheet_CFiconsImg,luckysheetdefaultFont } from '../controllers/constant';\r\nimport { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport { dynamicArrayCompute } from './dynamicArray';\r\nimport browser from './browser';\r\nimport { isRealNull, isRealNum } from './validate';\r\nimport { getMeasureText,getCellTextInfo } from './getRowlen';\r\nimport { getRealCellValue } from './getdata';\r\nimport { getBorderInfoComputeRange } from './border';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { getObjType, chatatABC, luckysheetfontformat } from '../utils/util';\r\nimport { isInlineStringCell } from '../controllers/inlineString';\r\nimport method from './method';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\n\r\nfunction luckysheetDrawgridRowTitle(scrollHeight, drawHeight, offsetTop) {\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (drawHeight == null) {\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    }\r\n\r\n    if (offsetTop == null) {\r\n        offsetTop = Store.columnHeaderHeight;\r\n    }\r\n    \r\n    let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n\r\n    luckysheetTableContent.clearRect(\r\n        0,\r\n        offsetTop ,\r\n        (Store.rowHeaderWidth - 1) ,\r\n        drawHeight\r\n    );\r\n\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //\u57FA\u51C6\u7EBF \u5782\u76F4\u5C45\u4E2D\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    let dataset_row_st, dataset_row_ed;\r\n    dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);\r\n    dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);\r\n\r\n    if (dataset_row_st == -1) {\r\n        dataset_row_st = 0;\r\n    }\r\n    if (dataset_row_ed == -1) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n    \r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(0, offsetTop-1, Store.rowHeaderWidth -1, drawHeight-2);\r\n    luckysheetTableContent.clip();\r\n\r\n    let end_r, start_r;\r\n    let bodrder05 = 0.5;//Default 0.5\r\n    let preEndR;\r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        }\r\n        else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n        end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n        //\u82E5\u8D85\u51FA\u7ED8\u5236\u533A\u57DF\u7EC8\u6B62\r\n        // if(end_r > scrollHeight + drawHeight){\r\n        //     break;\r\n        // }\r\n        let firstOffset = (dataset_row_st==r)?-2:0;\r\n        let lastOffset = (dataset_row_ed==r)?-2:0;\r\n        //\u5217\u6807\u9898\u5355\u5143\u683C\u6E32\u67D3\u524D\u89E6\u53D1\uFF0Creturn false \u5219\u4E0D\u6E32\u67D3\u8BE5\u5355\u5143\u683C\r\n        if(!method.createHookFunction(\"rowTitleCellRenderBefore\", r+1, {\r\n            r:r,\r\n            top:(start_r + offsetTop + firstOffset),\r\n            width:Store.rowHeaderWidth -1,\r\n            height:(end_r - start_r + 1+lastOffset-firstOffset)\r\n        }, luckysheetTableContent)){ continue; }\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n\r\n        }\r\n        else {\r\n            luckysheetTableContent.fillStyle = \"#ffffff\";\r\n            luckysheetTableContent.fillRect(\r\n                0,\r\n                (start_r + offsetTop + firstOffset) , \r\n                Store.rowHeaderWidth -1,\r\n                (end_r - start_r + 1+lastOffset-firstOffset) \r\n            )\r\n            luckysheetTableContent.fillStyle = \"#000000\";\r\n\r\n            //\u884C\u6807\u9898\u680F\u5E8F\u5217\u53F7\r\n            luckysheetTableContent.save();//save scale before draw text\r\n            luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);\r\n            let textMetrics = getMeasureText(r+1, luckysheetTableContent); \r\n            //luckysheetTableContent.measureText(r + 1);\r\n\r\n            let horizonAlignPos = (Store.rowHeaderWidth  - textMetrics.width) / 2;\r\n            let verticalAlignPos = (start_r + (end_r - start_r) / 2 + offsetTop) ;\r\n\r\n            luckysheetTableContent.fillText(r + 1, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);\r\n            luckysheetTableContent.restore();//restore scale after draw text\r\n        }\r\n\r\n        //vertical\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n            (Store.rowHeaderWidth - 2 + bodrder05) ,\r\n             (start_r + offsetTop - 2)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (Store.rowHeaderWidth - 2 + bodrder05) ,\r\n             (end_r + offsetTop - 2)\r\n        );\r\n        luckysheetTableContent.lineWidth = 1;\r\n\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n\r\n        //\u884C\u6807\u9898\u680F\u6A2A\u7EBF,horizen\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] == null && Store.config[\"rowhidden\"][r+1] != null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                -1,\r\n                (end_r + offsetTop - 4 + bodrder05) \r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (Store.rowHeaderWidth - 1) ,\r\n                (end_r + offsetTop - 4 + bodrder05) \r\n            );\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n        else if(Store.config[\"rowhidden\"]==null || Store.config[\"rowhidden\"][r] == null){\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                -1,\r\n                (end_r + offsetTop - 2 + bodrder05) \r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (Store.rowHeaderWidth - 1) ,\r\n                (end_r + offsetTop - 2 + bodrder05) \r\n            );\r\n\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n\r\n        }\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r-1] != null && preEndR!=null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                -1,\r\n                (preEndR + offsetTop + bodrder05) \r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (Store.rowHeaderWidth - 1) ,\r\n                (preEndR + offsetTop + bodrder05) \r\n            );\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        preEndR = end_r;\r\n\r\n        //\u5217\u6807\u9898\u5355\u5143\u683C\u6E32\u67D3\u524D\u89E6\u53D1\uFF0Creturn false \u5219\u4E0D\u6E32\u67D3\u8BE5\u5355\u5143\u683C\r\n        method.createHookFunction(\"rowTitleCellRenderAfter\", r+1, {\r\n            r:r,\r\n            top:(start_r + offsetTop + firstOffset),\r\n            width:Store.rowHeaderWidth -1,\r\n            height:(end_r - start_r + 1+lastOffset-firstOffset)\r\n        }, luckysheetTableContent)\r\n\r\n    }\r\n\r\n    //\u884C\u6807\u9898\u680F\u7AD6\u7EBF\r\n    // luckysheetTableContent.beginPath();\r\n    // luckysheetTableContent.moveTo(\r\n    //     (Store.rowHeaderWidth - 2 + 0.5) ,\r\n    //     (offsetTop - 1) \r\n    // );\r\n    // luckysheetTableContent.lineTo(\r\n    //     (Store.rowHeaderWidth - 2 + 0.5) ,\r\n    //     (Store.rh_height + offsetTop) \r\n    // );\r\n    // luckysheetTableContent.lineWidth = 1;\r\n    // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    // luckysheetTableContent.closePath();\r\n    // luckysheetTableContent.stroke();\r\n\r\n\r\n    //\u6E05\u9664canvas\u5DE6\u4E0A\u89D2\u533A\u57DF \u9632\u6B62\u5217\u6807\u9898\u680F\u5E8F\u5217\u53F7\u6EA2\u51FA\u663E\u793A\r\n    // luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth , Store.columnHeaderHeight );\r\n\r\n    // Must be restored twice, otherwise it will be enlarged under window.devicePixelRatio = 1.5\r\n    luckysheetTableContent.restore();\r\n    luckysheetTableContent.restore();\r\n    \r\n}\r\n\r\nfunction luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft) {\r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n\r\n    if (drawWidth == null) {\r\n        drawWidth = Store.luckysheetTableContentHW[0];\r\n    }\r\n\r\n    if (offsetLeft == null) {\r\n        offsetLeft = Store.rowHeaderWidth;\r\n    }\r\n    \r\n    let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n    luckysheetTableContent.clearRect(\r\n        offsetLeft ,\r\n        0,\r\n        drawWidth ,\r\n        (Store.columnHeaderHeight - 1) \r\n    );\r\n\r\n\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //\u57FA\u51C6\u7EBF \u5782\u76F4\u5C45\u4E2D\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    let dataset_col_st, dataset_col_ed;\r\n    dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);\r\n    dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);\r\n\r\n    if (dataset_col_st == -1) {\r\n        dataset_col_st = 0;\r\n    }\r\n    if (dataset_col_ed == -1) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n    \r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(offsetLeft-1, 0, drawWidth, Store.columnHeaderHeight -1);\r\n    luckysheetTableContent.clip();\r\n\r\n    // console.log(offsetLeft, 0, drawWidth, Store.columnHeaderHeight -1);\r\n\r\n    let end_c, start_c;\r\n    let bodrder05 = 0.5;//Default 0.5\r\n    let preEndC;\r\n    for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n        if (c == 0) {\r\n            start_c = -scrollWidth;\r\n        }\r\n        else {\r\n            start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n        }\r\n        end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n\r\n        //\u82E5\u8D85\u51FA\u7ED8\u5236\u533A\u57DF\u7EC8\u6B62\r\n        // if(end_c > scrollWidth + drawWidth+1){\r\n        //     break;\r\n        // }\r\n        let abc = chatatABC(c);\r\n        //\u5217\u6807\u9898\u5355\u5143\u683C\u6E32\u67D3\u524D\u89E6\u53D1\uFF0Creturn false \u5219\u4E0D\u6E32\u67D3\u8BE5\u5355\u5143\u683C\r\n        if(!method.createHookFunction(\"columnTitleCellRenderBefore\", abc, {\r\n            c:c,\r\n            left:(start_c + offsetLeft - 1),\r\n            width:(end_c - start_c),\r\n            height:Store.columnHeaderHeight -1\r\n        }, luckysheetTableContent)){ continue; }\r\n        \r\n        if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n\r\n        }\r\n        else {\r\n            luckysheetTableContent.fillStyle = \"#ffffff\";\r\n            luckysheetTableContent.fillRect(\r\n                (start_c + offsetLeft - 1) , \r\n                0, \r\n                (end_c - start_c) ,\r\n                Store.columnHeaderHeight -1\r\n            )\r\n            luckysheetTableContent.fillStyle = \"#000000\";\r\n\r\n            //\u5217\u6807\u9898\u680F\u5E8F\u5217\u53F7\r\n            luckysheetTableContent.save();//save scale before draw text\r\n            luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);\r\n            \r\n            let textMetrics = getMeasureText(abc, luckysheetTableContent);\r\n            //luckysheetTableContent.measureText(abc);\r\n\r\n            let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft)  - textMetrics.width / 2);\r\n            let verticalAlignPos = Math.round(Store.columnHeaderHeight / 2 );\r\n            \r\n            luckysheetTableContent.fillText(abc, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);\r\n            luckysheetTableContent.restore();//restore scale after draw text\r\n        }\r\n\r\n        //\u5217\u6807\u9898\u680F\u7AD6\u7EBF vertical\r\n        if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] == null && Store.config[\"colhidden\"][c+1] != null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                (end_c + offsetLeft - 4 + bodrder05) ,\r\n                0\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (end_c + offsetLeft - 4 + bodrder05) ,\r\n                (Store.columnHeaderHeight - 2) \r\n            );\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n        else if(Store.config[\"colhidden\"]==null || Store.config[\"colhidden\"][c] == null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                (end_c + offsetLeft - 2 + bodrder05) ,\r\n                0\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (end_c + offsetLeft - 2 + bodrder05) ,\r\n                (Store.columnHeaderHeight - 2) \r\n            );\r\n\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c-1] != null && preEndC!=null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                (preEndC + offsetLeft + bodrder05) ,\r\n                0\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                (preEndC + offsetLeft + bodrder05) ,\r\n                (Store.columnHeaderHeight - 2) \r\n            );\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n\r\n        //horizen\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n             (start_c + offsetLeft - 1), \r\n            (Store.columnHeaderHeight - 2 + bodrder05) \r\n        );\r\n        luckysheetTableContent.lineTo(\r\n             (end_c + offsetLeft - 1), \r\n            (Store.columnHeaderHeight - 2 + bodrder05) \r\n        );\r\n        // luckysheetTableContent.lineWidth = 1;\r\n\r\n        // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;        \r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n\r\n        preEndC = end_c;\r\n\r\n        method.createHookFunction(\"columnTitleCellRenderAfter\", abc, {\r\n            c:c,\r\n            left:(start_c + offsetLeft - 1),\r\n            width:(end_c - start_c),\r\n            height:Store.columnHeaderHeight -1\r\n        }, luckysheetTableContent)\r\n    }\r\n\r\n    //\u5217\u6807\u9898\u680F\u6A2A\u7EBF\r\n    // luckysheetTableContent.beginPath();\r\n    // luckysheetTableContent.moveTo(\r\n    //     (offsetLeft - 1) ,\r\n    //     (Store.columnHeaderHeight - 2 + 0.5) \r\n    // );\r\n    // luckysheetTableContent.lineTo(\r\n    //     (Store.ch_width + offsetLeft - 2) ,\r\n    //     (Store.columnHeaderHeight - 2 + 0.5) \r\n    // );\r\n    // luckysheetTableContent.lineWidth = 1;\r\n    // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    // luckysheetTableContent.closePath();\r\n    // luckysheetTableContent.stroke();\r\n\r\n    //\u6E05\u9664canvas\u5DE6\u4E0A\u89D2\u533A\u57DF \u9632\u6B62\u5217\u6807\u9898\u680F\u5E8F\u5217\u53F7\u6EA2\u51FA\u663E\u793A\r\n    // luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth , Store.columnHeaderHeight );\r\n\r\n    // Must be restored twice, otherwise it will be enlarged under window.devicePixelRatio = 1.5\r\n    luckysheetTableContent.restore();\r\n    luckysheetTableContent.restore();\r\n\r\n}\r\n\r\nfunction luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop, columnOffsetCell, rowOffsetCell, mycanvas) {\r\n\r\n    if(Store.flowdata == null){\r\n        return;\r\n    }\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n    // console.trace();\r\n    clearTimeout(Store.measureTextCacheTimeOut);\r\n    \r\n    //\u53C2\u6570\u672A\u5B9A\u4E49\u5904\u7406\r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (drawWidth == null) {\r\n        drawWidth = Store.luckysheetTableContentHW[0];\r\n    }\r\n    if (drawHeight == null) {\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    }\r\n\r\n    if (offsetLeft == null) {\r\n        offsetLeft = Store.rowHeaderWidth;\r\n    }\r\n    if (offsetTop == null) {\r\n        offsetTop = Store.columnHeaderHeight;\r\n    }\r\n\r\n    if (columnOffsetCell == null) {\r\n        columnOffsetCell = 0;\r\n    }\r\n    if (rowOffsetCell == null) {\r\n        rowOffsetCell = 0;\r\n    }\r\n\r\n    //\u8868\u683Ccanvas\r\n    let luckysheetTableContent = null;\r\n    if(mycanvas == null){\r\n        luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    }\r\n    else {\r\n        if(getObjType(mycanvas) == \"object\"){\r\n            try{\r\n                luckysheetTableContent = mycanvas.get(0).getContext(\"2d\");\r\n            }\r\n            catch(err){\r\n                luckysheetTableContent = mycanvas;\r\n            }\r\n        }\r\n        else{\r\n            luckysheetTableContent = $(\"#\" + mycanvas).get(0).getContext(\"2d\");\r\n        }\r\n    }\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n    \r\n    luckysheetTableContent.clearRect(\r\n        0, \r\n        0, \r\n        Store.luckysheetTableContentHW[0],\r\n        Store.luckysheetTableContentHW[1]\r\n    );\r\n\r\n    //\u8868\u683C\u6E32\u67D3\u533A\u57DF \u8D77\u6B62\u884C\u5217\u4E0B\u6807\r\n    let dataset_row_st, \r\n        dataset_row_ed, \r\n        dataset_col_st, \r\n        dataset_col_ed;\r\n\r\n    dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);\r\n    dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);\r\n\r\n    if (dataset_row_st == -1) {\r\n        dataset_row_st = 0;\r\n    }\r\n\r\n    dataset_row_st += rowOffsetCell;\r\n\r\n    if (dataset_row_ed == -1) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n\r\n    dataset_row_ed += rowOffsetCell;\r\n\r\n    if (dataset_row_ed >= Store.visibledatarow.length) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n\r\n    dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);\r\n    dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);\r\n    \r\n    if (dataset_col_st == -1) {\r\n        dataset_col_st = 0;\r\n    }\r\n\r\n    dataset_col_st += columnOffsetCell;\r\n\r\n    if (dataset_col_ed == -1) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n\r\n    dataset_col_ed += columnOffsetCell;\r\n\r\n    if (dataset_col_ed >= Store.visibledatacolumn.length) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n\r\n    //\u8868\u683C\u6E32\u67D3\u533A\u57DF \u8D77\u6B62\u884C\u5217\u5750\u6807\r\n    let fill_row_st, \r\n        fill_row_ed, \r\n        fill_col_st, \r\n        fill_col_ed;\r\n\r\n    if(dataset_row_st == 0){\r\n        fill_row_st = 0;\r\n    }\r\n    else{\r\n        fill_row_st = Store.visibledatarow[dataset_row_st - 1];\r\n    }\r\n\r\n    fill_row_ed = Store.visibledatarow[dataset_row_ed];\r\n\r\n    if(dataset_col_st == 0){\r\n        fill_col_st = 0;\r\n    }\r\n    else{\r\n        fill_col_st = Store.visibledatacolumn[dataset_col_st - 1];\r\n    }\r\n\r\n    fill_col_ed = Store.visibledatacolumn[dataset_col_ed];\r\n\r\n    //\u8868\u683Ccanvas \u521D\u59CB\u5316\u5904\u7406\r\n    luckysheetTableContent.fillStyle = \"#ffffff\";\r\n    luckysheetTableContent.fillRect(\r\n        (offsetLeft - 1) , \r\n        (offsetTop - 1) , \r\n        (fill_col_ed - scrollWidth) , \r\n        (fill_row_ed - scrollHeight)\r\n    );\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    // luckysheetTableContent.textBaseline = \"top\";\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    //\u8868\u683C\u6E32\u67D3\u533A\u57DF \u975E\u7A7A\u5355\u5143\u683C\u884C\u5217 \u8D77\u6B62\u5750\u6807\r\n    let cellupdate = [];\r\n    let mergeCache = {};\r\n    let borderOffset = {};\r\n\r\n    let bodrder05 = 0.5;//Default 0.5\r\n\r\n    // \u94A9\u5B50\u51FD\u6570\r\n    method.createHookFunction(\"cellAllRenderBefore\",Store.flowdata,sheetFile,luckysheetTableContent);\r\n    \r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        let start_r;\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        }\r\n        else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        let end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n        \r\n        for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n            let start_c;\r\n            if (c == 0) {\r\n                start_c = -scrollWidth;\r\n            }\r\n            else {\r\n                start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n            }\r\n\r\n            let end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n            \r\n            if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                continue\r\n            }\r\n            \r\n            let firstcolumnlen = Store.defaultcollen;\r\n            if (Store.config[\"columnlen\"] != null && Store.config[\"columnlen\"][c] != null) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][c];\r\n            }\r\n\r\n\r\n\r\n            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {\r\n                let value = Store.flowdata[r][c];\r\n\r\n                if(getObjType(value) == \"object\" && (\"mc\" in value)){\r\n                    borderOffset[r + \"_\" + c] = { \r\n                        \"start_r\": start_r,\r\n                        \"start_c\": start_c, \r\n                        \"end_r\": end_r, \r\n                        \"end_c\": end_c \r\n                    };\r\n\r\n                    if(\"rs\" in value[\"mc\"]){\r\n                        let key = \"r\"+ r + \"c\" + c;\r\n                        mergeCache[key] = cellupdate.length;\r\n                    }\r\n                    else{\r\n                        let key = \"r\"+ value[\"mc\"].r + \"c\" + value[\"mc\"].c;\r\n                        let margeMain = cellupdate[mergeCache[key]];\r\n\r\n                        if(margeMain == null){\r\n                            mergeCache[key] = cellupdate.length;\r\n                            cellupdate.push({\r\n                                \"r\": r, \r\n                                \"c\": c, \r\n                                \"start_c\": start_c, \r\n                                \"start_r\": start_r, \r\n                                \"end_r\": end_r, \r\n                                \"end_c\": end_c, \r\n                                \"firstcolumnlen\": firstcolumnlen, \r\n                            });\r\n                        }\r\n                        else{\r\n                            if(margeMain.c == c){\r\n                                margeMain.end_r += (end_r - start_r - 1);\r\n                            }\r\n                            \r\n                            if(margeMain.r == r){\r\n                                margeMain.end_c += (end_c - start_c);\r\n                                margeMain.firstcolumnlen += firstcolumnlen;\r\n                            }\r\n                        }\r\n\r\n                        continue;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                //\u7A7A\u5355\u5143\u683C\u6E32\u67D3\u524D\r\n                // if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n                //     r:r,\r\n                //     c:c,\r\n                //     \"start_r\": cellsize[1],\r\n                //     \"start_c\":cellsize[0], \r\n                //     \"end_r\": cellsize[3], \r\n                //     \"end_c\": cellsize[2] \r\n                // }, sheetFile,luckysheetTableContent)){ continue; }\r\n            }\r\n\r\n\r\n            cellupdate.push({\r\n                \"r\": r, \r\n                \"c\": c, \r\n                \"start_r\": start_r, \r\n                \"start_c\": start_c, \r\n                \"end_r\": end_r, \r\n                \"end_c\": end_c, \r\n                \"firstcolumnlen\": firstcolumnlen, \r\n            });\r\n            borderOffset[r + \"_\" + c] = { \r\n                \"start_r\": start_r, \r\n                \"start_c\": start_c, \r\n                \"end_r\": end_r, \r\n                \"end_c\": end_c \r\n            };\r\n        }\r\n    }\r\n\r\n    //\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\u8BA1\u7B97\r\n    let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"]);\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\u8BA1\u7B97\r\n    let af_compute = alternateformat.getComputeMap();\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u8BA1\u7B97\r\n    let cf_compute = conditionformat.getComputeMap();\r\n\r\n    //\u8868\u683C\u6E32\u67D3\u533A\u57DF \u6EA2\u51FA\u5355\u5143\u683C\u914D\u7F6E\u4FDD\u5B58\r\n    let cellOverflowMap = getCellOverflowMap(luckysheetTableContent, dataset_col_st, dataset_col_ed,dataset_row_st,dataset_row_ed);\r\n\r\n    let mcArr = [];\r\n\r\n    for(let cud = 0; cud < cellupdate.length; cud++){\r\n        let item = cellupdate[cud];\r\n        let r = item.r, \r\n            c = item.c, \r\n            start_r = item.start_r, \r\n            start_c = item.start_c, \r\n            end_r = item.end_r, \r\n            end_c = item.end_c;\r\n        let firstcolumnlen = item.firstcolumnlen;\r\n\r\n        if(Store.flowdata[r] == null){\r\n            continue;\r\n        }\r\n\r\n        // //\u6709\u503C\u5355\u5143\u683C\u6E32\u67D3\u524D\r\n        // if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n        //     r:r,\r\n        //     c:c,\r\n        //     \"start_r\": cellsize[1],\r\n        //     \"start_c\":cellsize[0], \r\n        //     \"end_r\": cellsize[3], \r\n        //     \"end_c\": cellsize[2]  \r\n        // }, sheetFile,luckysheetTableContent)){ continue; }\r\n        \r\n        if(Store.flowdata[r][c] == null){ //\u7A7A\u5355\u5143\u683C\r\n            nullCellRender(r, c, start_r, start_c, end_r, end_c,luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05);\r\n        }\r\n        else{\r\n            let cell = Store.flowdata[r][c];\r\n            let value = null;\r\n\r\n            if((typeof cell == \"object\") && \"mc\" in cell){\r\n                mcArr.push(cellupdate[cud]);\r\n                // continue;\r\n            }\r\n            else{\r\n                value = getRealCellValue(r,c);\r\n            }  \r\n\r\n            if(value == null || value.toString().length == 0){\r\n                nullCellRender(r, c, start_r, start_c, end_r, end_c,luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05);\r\n                \r\n                //sparklines\u6E32\u67D3\r\n                let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n                let cellsize = [\r\n                     (start_c + offsetLeft + borderfix[0]), \r\n                     (start_r + offsetTop + borderfix[1]), \r\n                     (end_c - start_c - 3 + borderfix[2]), \r\n                     (end_r - start_r - 3 - 1 + borderfix[3])\r\n                ];\r\n                sparklinesRender(r, c, cellsize[0], cellsize[1], \"luckysheetTableContent\", luckysheetTableContent);\r\n            }\r\n            else{\r\n                if((r + \"_\" + c) in dynamicArray_compute){//\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\r\n                    value = dynamicArray_compute[r + \"_\" + c].v;\r\n                }\r\n                \r\n                cellRender(r, c, start_r, start_c, end_r, end_c, value,luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05);\r\n            }\r\n        }\r\n\r\n        // method.createHookFunction(\"cellRenderAfter\", Store.flowdata[r][c], {\r\n        //     r:r,\r\n        //     c:c,\r\n        //     \"start_r\": start_r,\r\n        //     \"start_c\": start_c, \r\n        //     \"end_r\": end_r, \r\n        //     \"end_c\": end_c \r\n        // }, sheetFile,luckysheetTableContent)\r\n    }\r\n\r\n    //\u5408\u5E76\u5355\u5143\u683C\u518D\u5904\u7406\r\n    for(let m = 0; m < mcArr.length; m++){\r\n        let item = mcArr[m];\r\n        let r = item.r, \r\n            c = item.c, \r\n            start_r = item.start_r, \r\n            start_c = item.start_c, \r\n            end_r = item.end_r-1, \r\n            end_c = item.end_c-1;\r\n        let firstcolumnlen = item.firstcolumnlen;\r\n\r\n        let cell = Store.flowdata[r][c];\r\n        let value = null;\r\n\r\n        let margeMaindata = cell[\"mc\"];\r\n\r\n        value = getRealCellValue(margeMaindata.r,margeMaindata.c);\r\n\r\n        r = margeMaindata.r;\r\n        c = margeMaindata.c;\r\n\r\n        let mainCell = Store.flowdata[r][c];\r\n\r\n        if (c == 0) {\r\n            start_c = -scrollWidth;\r\n        }\r\n        else {\r\n            start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n        }\r\n\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        }\r\n        else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        end_r = Store.visibledatarow[r+mainCell[\"mc\"].rs-1] - scrollHeight;\r\n        end_c = Store.visibledatacolumn[c+mainCell[\"mc\"].cs-1] - scrollWidth;\r\n\r\n        if(value == null || value.toString().length == 0){\r\n            nullCellRender(r, c, start_r, start_c, end_r, end_c,luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05, true);\r\n            \r\n            //sparklines\u6E32\u67D3\r\n            let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n            let cellsize = [\r\n                 (start_c + offsetLeft + borderfix[0]), \r\n                 (start_r + offsetTop + borderfix[1]), \r\n                 (end_c - start_c - 3 + borderfix[2]), \r\n                 (end_r - start_r - 3 - 1  + borderfix[3])\r\n            ];\r\n            sparklinesRender(r, c, cellsize[0], cellsize[1], \"luckysheetTableContent\", luckysheetTableContent);\r\n        }\r\n        else{\r\n            if((r + \"_\" + c) in dynamicArray_compute){//\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\r\n                value = dynamicArray_compute[r + \"_\" + c].v;\r\n            }\r\n            cellRender(r, c, start_r, start_c, end_r, end_c, value, luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05, true);\r\n        }\r\n    }\r\n\r\n    //\u6570\u636E\u900F\u89C6\u8868\u8FB9\u6846\u6E32\u67D3\r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        let start_r;\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        }\r\n        else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        let end_r = Store.visibledatarow[r] - scrollHeight;\r\n        \r\n        for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n            let start_c;\r\n            if (c == 0) {\r\n                start_c = -scrollWidth;\r\n            }\r\n            else {\r\n                start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n            }\r\n\r\n            let end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n\r\n\r\n            //\u6570\u636E\u900F\u89C6\u8868\r\n            if (!!Store.luckysheetcurrentisPivotTable && pivotTable.drawPivotTable) {\r\n                if ((c == 0 || c == 5) && r <= 11) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                         (end_c - 2 + bodrder05 + offsetLeft), \r\n                         (start_r + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                         (end_c - 2 + bodrder05 + offsetLeft), \r\n                         (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n\r\n                if ((r == 2 || r == 11) && c <= 5) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                         (start_c - 1 + offsetLeft), \r\n                         (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                         (end_c - 2 + bodrder05 + offsetLeft), \r\n                         (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n\r\n                if (r == 6 && c == 3) {\r\n                    luckysheetTableContent.save();\r\n                    luckysheetTableContent.font=\"bold 30px Arial\";\r\n                    luckysheetTableContent.fillStyle = \"#626675\";\r\n                    luckysheetTableContent.textAlign=\"center\";  \r\n                    luckysheetTableContent.fillText(\r\n                        locale().pivotTable.title, \r\n                         (start_c + (end_c - start_c) / 2 + 4 + offsetLeft), \r\n                        (start_r + (end_r - start_r) / 2 - 1 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.restore();\r\n                }\r\n            }\r\n            else if (!!Store.luckysheetcurrentisPivotTable) {\r\n                if (c < pivotTable.pivotTableBoundary[1] && r < pivotTable.pivotTableBoundary[0]) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                        (end_c - 2 + bodrder05 + offsetLeft), \r\n                        (start_r + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        (end_c - 2 + bodrder05 + offsetLeft), \r\n                        (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                        (start_c - 1 + offsetLeft), \r\n                        (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        (end_c - 2 + offsetLeft), \r\n                        (end_r - 2 + bodrder05 + offsetTop)\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u8FB9\u6846\u5355\u72EC\u6E32\u67D3\r\n    if(Store.config[\"borderInfo\"] != null && Store.config[\"borderInfo\"].length > 0){\r\n        //\u8FB9\u6846\u6E32\u67D3\r\n        let borderLeftRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){\r\n            let linetype = style;\r\n\r\n            let m_st =  (start_c - 2 + bodrder05 + offsetLeft);\r\n            let m_ed =  (start_r + offsetTop-1);\r\n            let line_st =  (start_c - 2 + bodrder05 + offsetLeft);\r\n            let line_ed =  (end_r - 2 + bodrder05 + offsetTop);\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"v\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n            \r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        }\r\n\r\n        let borderRightRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){\r\n            let linetype = style;\r\n\r\n            let m_st =  (end_c - 2 + bodrder05 + offsetLeft);\r\n            let m_ed =  (start_r + offsetTop-1);\r\n            let line_st =  (end_c - 2 + bodrder05 + offsetLeft);\r\n            let line_ed =  (end_r - 2 + bodrder05 + offsetTop);\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"v\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n            \r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        }\r\n\r\n        let borderBottomRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){\r\n            let linetype = style;\r\n\r\n            let m_st =  (start_c - 2 + bodrder05 + offsetLeft);\r\n            let m_ed =  (end_r - 2 + bodrder05 + offsetTop);\r\n            let line_st =  (end_c - 2 + bodrder05 + offsetLeft);\r\n            let line_ed =  (end_r - 2 + bodrder05 + offsetTop);\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"h\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n            \r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        }\r\n\r\n        let borderTopRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){\r\n            let linetype = style;\r\n\r\n            let m_st =  (start_c - 2 + bodrder05 + offsetLeft);\r\n            let m_ed =  (start_r - 1 + bodrder05 + offsetTop);\r\n            let line_st =  (end_c - 2 + bodrder05 + offsetLeft);\r\n            let line_ed =  (start_r - 1 + bodrder05 + offsetTop);\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"h\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n            \r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        }\r\n\r\n        let borderInfoCompute = getBorderInfoComputeRange(dataset_row_st,dataset_row_ed,dataset_col_st,dataset_col_ed);\r\n        \r\n        for(let x in borderInfoCompute){\r\n            //let bd_r = x.split(\"_\")[0], bd_c = x.split(\"_\")[1];\r\n\r\n            let bd_r = x.substr(0, x.indexOf('_'));\r\n            let bd_c = x.substr(x.indexOf('_') + 1);\r\n\r\n            // if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){\r\n            //     continue;\r\n            // }\r\n\r\n            if(borderOffset[bd_r + \"_\" + bd_c]){\r\n                let start_r = borderOffset[bd_r + \"_\" + bd_c].start_r;\r\n                let start_c = borderOffset[bd_r + \"_\" + bd_c].start_c;\r\n                let end_r = borderOffset[bd_r + \"_\" + bd_c].end_r;\r\n                let end_c = borderOffset[bd_r + \"_\" + bd_c].end_c;\r\n\r\n                let cellOverflow_colInObj = cellOverflow_colIn(cellOverflowMap, bd_r, bd_c, dataset_col_st, dataset_col_ed);\r\n\r\n                let borderLeft = borderInfoCompute[x].l;\r\n                if(borderLeft != null && (!cellOverflow_colInObj.colIn || cellOverflow_colInObj.stc == bd_c)){\r\n                    borderLeftRender(borderLeft.style, borderLeft.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);\r\n                }\r\n\r\n                let borderRight = borderInfoCompute[x].r;\r\n                if(borderRight != null && (!cellOverflow_colInObj.colIn || cellOverflow_colInObj.colLast)){\r\n                    borderRightRender(borderRight.style, borderRight.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);\r\n                }\r\n\r\n                let borderTop = borderInfoCompute[x].t;\r\n                if(borderTop != null){\r\n                    borderTopRender(borderTop.style, borderTop.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);\r\n                }\r\n\r\n                let borderBottom = borderInfoCompute[x].b;\r\n                if(borderBottom != null){\r\n                    borderBottomRender(borderBottom.style, borderBottom.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u6E32\u67D3\u8868\u683C\u65F6\u6709\u5C3E\u5217\u65F6\uFF0C\u6E05\u9664\u53F3\u8FB9\u7070\u8272\u533A\u57DF\uFF0C\u9632\u6B62\u8868\u683C\u6709\u503C\u6EA2\u51FA\r\n    if(dataset_col_ed == Store.visibledatacolumn.length - 1){\r\n        luckysheetTableContent.clearRect(\r\n            (fill_col_ed - scrollWidth + offsetLeft) - 1 , \r\n            (offsetTop) - 1 , \r\n            (Store.ch_width - Store.visibledatacolumn[dataset_col_ed]) , \r\n            (fill_row_ed - scrollHeight)\r\n        );\r\n    }\r\n\r\n    luckysheetTableContent.restore();\r\n\r\n    Store.measureTextCacheTimeOut = setTimeout(() => {\r\n        Store.measureTextCache = {};\r\n        Store.measureTextCellInfoCache = {};\r\n        Store.cellOverflowMapCache = {};\r\n    }, 100);\r\n\r\n}\r\n\r\n\r\n//sparklines\u6E32\u67D3\r\nlet sparklinesRender = function(r, c, offsetX, offsetY, canvasid, ctx){\r\n    if(Store.flowdata[r] == null || Store.flowdata[r][c] == null){\r\n        return;\r\n    }\r\n\r\n    let sparklines = Store.flowdata[r][c].spl;\r\n    if(sparklines != null){\r\n        if(typeof sparklines == \"string\"){\r\n            sparklines = new Function(\"return \" + sparklines)();\r\n        }\r\n\r\n        if(getObjType(sparklines) == \"object\"){\r\n            let temp1 = sparklines;\r\n            let x = temp1.offsetX;\r\n            let y = temp1.offsetY;\r\n            x = x == null ? 0 : x;\r\n            y = y == null ? 0 : y;\r\n            luckysheetSparkline.render(\r\n                temp1.shapeseq, \r\n                temp1.shapes, \r\n                offsetX + x, \r\n                offsetY + y, \r\n                temp1.pixelWidth, \r\n                temp1.pixelHeight, \r\n                canvasid, \r\n                ctx\r\n            );\r\n        }\r\n        else if(getObjType(sparklines) == \"array\" && getObjType(sparklines[0]) == \"object\"){\r\n            for(let i = 0; i < sparklines.length; i++){\r\n                let temp1 = sparklines[i];\r\n                let x = temp1.offsetX;\r\n                let y = temp1.offsetY;\r\n                x = x == null ? 0 : x;\r\n                y = y == null ? 0 : y;\r\n                luckysheetSparkline.render(\r\n                    temp1.shapeseq, \r\n                    temp1.shapes, \r\n                    offsetX + x, \r\n                    offsetY + y, \r\n                    temp1.pixelWidth, \r\n                    temp1.pixelHeight, \r\n                    canvasid, \r\n                    ctx\r\n                );\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n//\u7A7A\u767D\u5355\u5143\u683C\u6E32\u67D3 \r\nlet nullCellRender = function(r, c, start_r, start_c, end_r, end_c,luckysheetTableContent,af_compute,cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05,isMerge){\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute); //\u4EA4\u66FF\u989C\u8272\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute); //\u6761\u4EF6\u683C\u5F0F\r\n\r\n    let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n\r\n    //\u80CC\u666F\u8272\r\n    let fillStyle = menuButton.checkstatus(Store.flowdata, r, c , \"bg\");\r\n\r\n    if(checksAF != null && checksAF[1] != null){//\u4EA4\u66FF\u989C\u8272 \r\n        fillStyle = checksAF[1];\r\n    }\r\n\r\n    if(checksCF != null && checksCF[\"cellColor\"] != null){//\u6761\u4EF6\u683C\u5F0F \r\n        fillStyle = checksCF[\"cellColor\"];\r\n    }\r\n\r\n    if(Store.flowdata[r][c] != null && Store.flowdata[r][c].tc != null){//\u6807\u9898\u8272\r\n        fillStyle = Store.flowdata[r][c].tc;\r\n    }\r\n\r\n    if(fillStyle==null){\r\n        luckysheetTableContent.fillStyle = \"#FFFFFF\";\r\n    }\r\n    else{\r\n        luckysheetTableContent.fillStyle = fillStyle;\r\n    }\r\n    \r\n\r\n    let cellsize = [\r\n         (start_c + offsetLeft + borderfix[0]), \r\n         (start_r + offsetTop  + borderfix[1]), \r\n         (end_c - start_c + borderfix[2]-(!!isMerge?1:0)), \r\n         (end_r - start_r + borderfix[3])\r\n    ];\r\n\r\n    //\u5355\u5143\u683C\u6E32\u67D3\u524D\uFF0C\u8003\u8651\u5230\u5408\u5E76\u5355\u5143\u683C\u4F1A\u518D\u6B21\u6E32\u67D3\u4E00\u904D\uFF0C\u7EDF\u4E00\u653E\u5230\u8FD9\u91CC\r\n    if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n        r:r,\r\n        c:c,\r\n        \"start_r\": cellsize[1],\r\n        \"start_c\":cellsize[0], \r\n        \"end_r\": cellsize[3] + cellsize[1], \r\n        \"end_c\": cellsize[2] + cellsize[0]\r\n    }, sheetmanage.getSheetByIndex(),luckysheetTableContent)){ return; }\r\n\r\n    luckysheetTableContent.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);\r\n\r\n    if((r + \"_\" + c) in dynamicArray_compute){\r\n        let value = dynamicArray_compute[r + \"_\" + c].v;\r\n\r\n        luckysheetTableContent.fillStyle = \"#000000\";\r\n        //\u6587\u672C\u5BBD\u5EA6\u548C\u9AD8\u5EA6\r\n        let fontset = luckysheetdefaultFont();\r\n        luckysheetTableContent.font = fontset;\r\n\r\n        //\u6C34\u5E73\u5BF9\u9F50 (\u9ED8\u8BA4\u4E3A1\uFF0C\u5DE6\u5BF9\u9F50)\r\n        let horizonAlignPos = (start_c + 4 + offsetLeft) ;\r\n\r\n        //\u5782\u76F4\u5BF9\u9F50 (\u9ED8\u8BA4\u4E3A2\uFF0C\u4E0B\u5BF9\u9F50)\r\n        let verticalFixed = browser.luckysheetrefreshfixed();\r\n        let verticalAlignPos = (end_r + offsetTop - 2) ; \r\n        luckysheetTableContent.textBaseline = 'bottom';\r\n        \r\n        luckysheetTableContent.fillText(value == null ? \"\" : value, horizonAlignPos, verticalAlignPos);\r\n    }\r\n\r\n    //\u82E5\u5355\u5143\u683C\u6709\u6279\u6CE8\r\n    if(Store.flowdata[r][c] != null && Store.flowdata[r][c].ps != null){\r\n        let ps_w = 8*Store.zoomRatio, ps_h = 8*Store.zoomRatio; \r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo( (end_c + offsetLeft - 1- ps_w),  (start_r + offsetTop));\r\n        luckysheetTableContent.lineTo( (end_c + offsetLeft - 1),  (start_r + offsetTop));\r\n        luckysheetTableContent.lineTo( (end_c + offsetLeft - 1),  (start_r + offsetTop + ps_h));\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //\u6B64\u5355\u5143\u683C \u4E0E  \u6EA2\u51FA\u5355\u5143\u683C\u5173\u7CFB\r\n    let cellOverflow_colInObj = cellOverflow_colIn(cellOverflowMap, r, c, dataset_col_st, dataset_col_ed);\r\n\r\n    //\u6B64\u5355\u5143\u683C \u4E3A \u6EA2\u51FA\u5355\u5143\u683C\u6E32\u67D3\u8303\u56F4\u6700\u540E\u4E00\u5217\uFF0C\u7ED8\u5236\u6EA2\u51FA\u5355\u5143\u683C\u5185\u5BB9\r\n    if(cellOverflow_colInObj.colLast){\r\n        cellOverflowRender(\r\n            cellOverflow_colInObj.rowIndex,\r\n            cellOverflow_colInObj.colIndex,\r\n            cellOverflow_colInObj.stc,\r\n            cellOverflow_colInObj.edc,\r\n            luckysheetTableContent,\r\n            scrollHeight,\r\n            scrollWidth,\r\n            offsetLeft,offsetTop,af_compute, cf_compute\r\n        );\r\n    }\r\n\r\n    //\u5373\u6EA2\u51FA\u5355\u5143\u683C\u8DE8\u6B64\u5355\u5143\u683C\uFF0C\u6B64\u5355\u5143\u683C\u4E0D\u7ED8\u5236\u53F3\u8FB9\u6846\r\n    if(!cellOverflow_colInObj.colIn || cellOverflow_colInObj.colLast){\r\n        //\u53F3\u8FB9\u6846\r\n        if(!Store.luckysheetcurrentisPivotTable && !fillStyle && Store.showGridLines){\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                 (end_c + offsetLeft - 2 + bodrder05), \r\n                 (start_r + offsetTop)\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                 (end_c + offsetLeft - 2 + bodrder05), \r\n                 (end_r + offsetTop)\r\n            );\r\n            luckysheetTableContent.lineWidth = 1;\r\n\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n    }\r\n\r\n    //\u4E0B\u8FB9\u6846\r\n    if(!Store.luckysheetcurrentisPivotTable && !fillStyle && Store.showGridLines){\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n             (start_c + offsetLeft - 1), \r\n             (end_r + offsetTop - 2 + bodrder05)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n             (end_c + offsetLeft - 1), \r\n             (end_r + offsetTop - 2 + bodrder05)\r\n        );\r\n        luckysheetTableContent.lineWidth = 1;\r\n\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;        \r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    // \u5355\u5143\u683C\u6E32\u67D3\u540E\r\n    method.createHookFunction(\"cellRenderAfter\", Store.flowdata[r][c], {\r\n        r:r,\r\n        c:c,\r\n        \"start_r\": cellsize[1],\r\n        \"start_c\":cellsize[0], \r\n        \"end_r\": cellsize[3] + cellsize[1], \r\n        \"end_c\": cellsize[2] + cellsize[0]\r\n    }, sheetmanage.getSheetByIndex(),luckysheetTableContent)\r\n}\r\n\r\n\r\nlet cellRender = function(r, c, start_r, start_c, end_r, end_c, value, luckysheetTableContent,af_compute, cf_compute,offsetLeft,offsetTop,dynamicArray_compute,cellOverflowMap, dataset_col_st, dataset_col_ed,scrollHeight,scrollWidth,bodrder05,isMerge){\r\n    let cell = Store.flowdata[r][c];\r\n    let cellWidth = end_c - start_c - 2;\r\n    let cellHeight = end_r - start_r - 2;\r\n    let space_width = 2, space_height = 2; //\u5BBD\u9AD8\u65B9\u5411 \u95F4\u9699\r\n\r\n    //\u6C34\u5E73\u5BF9\u9F50\r\n    let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c, \"ht\");\r\n    //\u5782\u76F4\u5BF9\u9F50\r\n    let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c, \"vt\");\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute); \r\n    //\u6761\u4EF6\u683C\u5F0F\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute); \r\n\r\n    //\u5355\u5143\u683C \u80CC\u666F\u989C\u8272\r\n    let fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"bg\");\r\n    if(checksAF != null && checksAF[1] != null){ //\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272 \u80CC\u666F\u989C\u8272\r\n        fillStyle = checksAF[1];\r\n    }\r\n    if(checksCF != null && checksCF[\"cellColor\"] != null){ //\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F \u80CC\u666F\u989C\u8272\r\n        fillStyle = checksCF[\"cellColor\"];\r\n    }\r\n    // luckysheetTableContent.textBaseline = 'top';\r\n    if(fillStyle==null){\r\n        luckysheetTableContent.fillStyle = \"#FFFFFF\";\r\n    }\r\n    else{\r\n        luckysheetTableContent.fillStyle = fillStyle;\r\n    }\r\n\r\n    let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n    // console.log(value, fillStyle,borderfix);\r\n    let cellsize = [\r\n        (start_c + offsetLeft + borderfix[0]), \r\n        (start_r + offsetTop  + borderfix[1]), \r\n        (end_c - start_c + borderfix[2]-(!!isMerge?1:0)), \r\n        (end_r - start_r + borderfix[3])\r\n    ];\r\n\r\n    //\u5355\u5143\u683C\u6E32\u67D3\u524D\uFF0C\u8003\u8651\u5230\u5408\u5E76\u5355\u5143\u683C\u4F1A\u518D\u6B21\u6E32\u67D3\u4E00\u904D\uFF0C\u7EDF\u4E00\u653E\u5230\u8FD9\u91CC\r\n    if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n        r:r,\r\n        c:c,\r\n        \"start_r\": cellsize[1],\r\n        \"start_c\":cellsize[0], \r\n        \"end_r\": cellsize[3] + cellsize[1], \r\n        \"end_c\": cellsize[2] + cellsize[0]\r\n    }, sheetmanage.getSheetByIndex(),luckysheetTableContent)){ return; }\r\n\r\n\r\n    luckysheetTableContent.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);\r\n\r\n    let dataVerification = dataVerificationCtrl.dataVerification;\r\n\r\n    if(dataVerification != null && dataVerification[r + '_' + c] != null && !dataVerificationCtrl.validateCellData(value, dataVerification[r + '_' + c])){\r\n        //\u5355\u5143\u683C\u5DE6\u4E0A\u89D2\u7EA2\u8272\u5C0F\u4E09\u89D2\u6807\u793A\r\n        let dv_w = 5 * Store.zoomRatio, dv_h = 5 * Store.zoomRatio; //\u7EA2\u8272\u5C0F\u4E09\u89D2\u5BBD\u9AD8\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n            (start_c + offsetLeft), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (start_c + offsetLeft + dv_w), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (start_c + offsetLeft), \r\n            (start_r + offsetTop + dv_h)\r\n        );\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //\u82E5\u5355\u5143\u683C\u6709\u6279\u6CE8\uFF08\u5355\u5143\u683C\u53F3\u4E0A\u89D2\u7EA2\u8272\u5C0F\u4E09\u89D2\u6807\u793A\uFF09\r\n    if(cell.ps != null){\r\n        let ps_w = 8*Store.zoomRatio, ps_h = 8*Store.zoomRatio; //\u7EA2\u8272\u5C0F\u4E09\u89D2\u5BBD\u9AD8\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n            (end_c + offsetLeft - ps_w), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (end_c + offsetLeft), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (end_c + offsetLeft), \r\n            (start_r + offsetTop + ps_h)\r\n        );\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //\u82E5\u5355\u5143\u683C\u5F3A\u5236\u4E3A\u5B57\u7B26\u4E32\uFF0C\u5219\u663E\u793A\u7EFF\u8272\u5C0F\u4E09\u89D2\r\n    if(cell.qp==1 && isRealNum(cell.v)){\r\n        let ps_w = 6*Store.zoomRatio, ps_h = 6*Store.zoomRatio; //\u7EA2\u8272\u5C0F\u4E09\u89D2\u5BBD\u9AD8\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n            (start_c + offsetLeft + ps_w-1), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (start_c + offsetLeft-1), \r\n            (start_r + offsetTop)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n            (start_c + offsetLeft-1), \r\n            (start_r + offsetTop + ps_h)\r\n        );\r\n        luckysheetTableContent.fillStyle = \"#487f1e\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //\u6EA2\u51FA\u5355\u5143\u683C\r\n    let cellOverflow_bd_r_render = true; //\u6EA2\u51FA\u5355\u5143\u683C\u53F3\u8FB9\u6846\u662F\u5426\u9700\u8981\u7ED8\u5236\r\n    let cellOverflow_colInObj = cellOverflow_colIn(cellOverflowMap, r, c, dataset_col_st, dataset_col_ed);\r\n\r\n    if(cell.tb == '1' && cellOverflow_colInObj.colIn){\r\n        //\u6B64\u5355\u5143\u683C \u4E3A \u6EA2\u51FA\u5355\u5143\u683C\u6E32\u67D3\u8303\u56F4\u6700\u540E\u4E00\u5217\uFF0C\u7ED8\u5236\u6EA2\u51FA\u5355\u5143\u683C\u5185\u5BB9\r\n        if(cellOverflow_colInObj.colLast){\r\n            cellOverflowRender(\r\n                cellOverflow_colInObj.rowIndex,\r\n                cellOverflow_colInObj.colIndex,\r\n                cellOverflow_colInObj.stc,\r\n                cellOverflow_colInObj.edc,\r\n                luckysheetTableContent,\r\n                scrollHeight,\r\n                scrollWidth,offsetLeft,offsetTop,af_compute, cf_compute\r\n            );\r\n        }\r\n        else{\r\n            cellOverflow_bd_r_render = false;\r\n        }\r\n    }\r\n    //\u6570\u636E\u9A8C\u8BC1 \u590D\u9009\u6846\r\n    else if(dataVerification != null && dataVerification[r + '_' + c] != null && dataVerification[r + '_' + c].type == 'checkbox'){\r\n        let pos_x = start_c + offsetLeft;\r\n        let pos_y = start_r + offsetTop + 1;\r\n\r\n        luckysheetTableContent.save();\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.rect(pos_x, pos_y, cellWidth, cellHeight);\r\n        luckysheetTableContent.clip();\r\n        luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);\r\n        \r\n        let measureText = getMeasureText(value, luckysheetTableContent);\r\n        let textMetrics = measureText.width + 14;\r\n        let oneLineTextHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n        let horizonAlignPos = (pos_x + space_width) ; //\u9ED8\u8BA4\u4E3A1\uFF0C\u5DE6\u5BF9\u9F50\r\n        if(horizonAlign == \"0\"){ //\u5C45\u4E2D\u5BF9\u9F50\r\n            horizonAlignPos = (pos_x + cellWidth / 2)  - (textMetrics / 2);\r\n        }\r\n        else if(horizonAlign == \"2\"){ //\u53F3\u5BF9\u9F50\r\n            horizonAlignPos = (pos_x + cellWidth - space_width)  - textMetrics;\r\n        }\r\n        \r\n        let verticalCellHeight = cellHeight > oneLineTextHeight ? cellHeight : oneLineTextHeight;\r\n\r\n        let verticalAlignPos_text = (pos_y + verticalCellHeight - space_height) ; //\u6587\u672C\u5782\u76F4\u65B9\u5411\u57FA\u51C6\u7EBF\r\n        luckysheetTableContent.textBaseline = \"bottom\";\r\n        let verticalAlignPos_checkbox = verticalAlignPos_text - 13 * Store.zoomRatio;\r\n\r\n        if(verticalAlign == \"0\"){ //\u5C45\u4E2D\u5BF9\u9F50 \r\n            verticalAlignPos_text = (pos_y + verticalCellHeight / 2);\r\n            luckysheetTableContent.textBaseline = \"middle\";\r\n            verticalAlignPos_checkbox = verticalAlignPos_text - 6 * Store.zoomRatio;\r\n        }\r\n        else if(verticalAlign == \"1\"){ //\u4E0A\u5BF9\u9F50\r\n            verticalAlignPos_text = (pos_y + space_height);\r\n            luckysheetTableContent.textBaseline = \"top\";\r\n            verticalAlignPos_checkbox = verticalAlignPos_text + 1 * Store.zoomRatio;\r\n        }\r\n\r\n        horizonAlignPos = horizonAlignPos / Store.zoomRatio;\r\n        verticalAlignPos_text = verticalAlignPos_text / Store.zoomRatio;\r\n        verticalAlignPos_checkbox = verticalAlignPos_checkbox / Store.zoomRatio;\r\n\r\n        //\u590D\u9009\u6846\r\n        luckysheetTableContent.lineWidth = 1;\r\n        luckysheetTableContent.strokeStyle = \"#000\";\r\n        luckysheetTableContent.strokeRect(horizonAlignPos, verticalAlignPos_checkbox, 10, 10);\r\n\r\n        if(dataVerification[r + '_' + c].checked){\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.lineTo(\r\n                horizonAlignPos + 1, \r\n                verticalAlignPos_checkbox + 6\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                horizonAlignPos + 4, \r\n                verticalAlignPos_checkbox + 9\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                horizonAlignPos + 9, \r\n                verticalAlignPos_checkbox + 2\r\n            );\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n\r\n        //\u6587\u672C\r\n        luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , \"fc\");\r\n        luckysheetTableContent.fillText(value == null ? \"\" : value, horizonAlignPos + 14, verticalAlignPos_text);\r\n        \r\n        luckysheetTableContent.restore();\r\n    }\r\n    else{\r\n        //\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\u6570\u636E\u6761\r\n        if(checksCF != null && checksCF[\"dataBar\"] != null && checksCF[\"dataBar\"][\"valueLen\"] && checksCF[\"dataBar\"][\"valueLen\"].toString() !== 'NaN'){\r\n            let x =  (start_c + offsetLeft + space_width);\r\n            let y =  (start_r + offsetTop + space_height);\r\n            let w =  (cellWidth - space_width * 2);\r\n            let h =  (cellHeight - space_height * 2);\r\n\r\n            let valueType = checksCF[\"dataBar\"][\"valueType\"];\r\n            let valueLen = checksCF[\"dataBar\"][\"valueLen\"];\r\n            let format = checksCF[\"dataBar\"][\"format\"];\r\n\r\n            if(valueType == 'minus'){\r\n                //\u8D1F\u6570\r\n                let minusLen = checksCF[\"dataBar\"][\"minusLen\"];\r\n                \r\n                if(format.length > 1){\r\n                    //\u6E10\u53D8\r\n                    let my_gradient = luckysheetTableContent.createLinearGradient(\r\n                        x + w * minusLen * (1 - valueLen), \r\n                        y, \r\n                        x + w * minusLen, \r\n                        y\r\n                    );\r\n                    my_gradient.addColorStop(0, \"#ffffff\");\r\n                    my_gradient.addColorStop(1, \"#ff0000\");\r\n\r\n                    luckysheetTableContent.fillStyle = my_gradient;\r\n                }\r\n                else{\r\n                    //\u5355\u8272\r\n                    luckysheetTableContent.fillStyle = \"#ff0000\";\r\n                }\r\n                \r\n                luckysheetTableContent.fillRect(\r\n                    x + w * minusLen * (1 - valueLen), \r\n                    y, \r\n                    w * minusLen * valueLen, \r\n                    h\r\n                );\r\n\r\n                luckysheetTableContent.beginPath();\r\n                luckysheetTableContent.moveTo(\r\n                    x + w * minusLen * (1 - valueLen), \r\n                    y\r\n                );\r\n                luckysheetTableContent.lineTo(\r\n                    x + w * minusLen * (1 - valueLen), \r\n                    y + h\r\n                );\r\n                luckysheetTableContent.lineTo(\r\n                    x + w * minusLen, \r\n                    y + h\r\n                );\r\n                luckysheetTableContent.lineTo(\r\n                    x + w * minusLen, \r\n                    y\r\n                );\r\n                luckysheetTableContent.lineTo(\r\n                    x + w * minusLen * (1 - valueLen), \r\n                    y\r\n                );\r\n                luckysheetTableContent.lineWidth = 1;\r\n                luckysheetTableContent.strokeStyle = \"#ff0000\";\r\n                luckysheetTableContent.stroke();\r\n                luckysheetTableContent.closePath();\r\n            }\r\n            else if(valueType == 'plus'){\r\n                //\u6B63\u6570\r\n                let plusLen = checksCF[\"dataBar\"][\"plusLen\"];\r\n\r\n                if(plusLen == 1){\r\n                    if(format.length > 1){\r\n                        //\u6E10\u53D8\r\n                        let my_gradient = luckysheetTableContent.createLinearGradient(\r\n                            x, \r\n                            y, \r\n                            x + w * valueLen, \r\n                            y\r\n                        );\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n    \r\n                        luckysheetTableContent.fillStyle = my_gradient;\r\n                    }\r\n                    else{\r\n                        //\u5355\u8272\r\n                        luckysheetTableContent.fillStyle = format[0];\r\n                    }\r\n                    \r\n                    luckysheetTableContent.fillRect(\r\n                        x, \r\n                        y, \r\n                        w * valueLen, \r\n                        h\r\n                    );\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                        x, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x, \r\n                        y + h\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * valueLen, \r\n                        y + h\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * valueLen, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = format[0];\r\n                    luckysheetTableContent.stroke();\r\n                    luckysheetTableContent.closePath();\r\n                }\r\n                else{\r\n                    let minusLen = checksCF[\"dataBar\"][\"minusLen\"];\r\n\r\n                    if(format.length > 1){\r\n                        //\u6E10\u53D8\r\n                        let my_gradient = luckysheetTableContent.createLinearGradient(\r\n                            x + w * minusLen, \r\n                            y, \r\n                            x + w * minusLen + w * plusLen * valueLen, \r\n                            y\r\n                        );\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n    \r\n                        luckysheetTableContent.fillStyle = my_gradient;\r\n                    }\r\n                    else{\r\n                        //\u5355\u8272\r\n                        luckysheetTableContent.fillStyle = format[0];\r\n                    }\r\n                    \r\n                    luckysheetTableContent.fillRect(\r\n                        x + w * minusLen, \r\n                        y, \r\n                        w * plusLen * valueLen, \r\n                        h\r\n                    );\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(\r\n                        x + w * minusLen, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * minusLen, \r\n                        y + h\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * minusLen + w * plusLen * valueLen, \r\n                        y + h\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * minusLen + w * plusLen * valueLen, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineTo(\r\n                        x + w * minusLen, \r\n                        y\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = format[0];\r\n                    luckysheetTableContent.stroke();\r\n                    luckysheetTableContent.closePath();\r\n                }\r\n            }\r\n        }\r\n\r\n        let pos_x = start_c + offsetLeft;\r\n        let pos_y = start_r + offsetTop + 1;\r\n\r\n        luckysheetTableContent.save();\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.rect(pos_x , pos_y, cellWidth , cellHeight );\r\n        luckysheetTableContent.clip();\r\n        luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);\r\n\r\n\r\n        let textInfo = getCellTextInfo(cell , luckysheetTableContent, {\r\n            cellWidth:cellWidth,\r\n            cellHeight:cellHeight,\r\n            space_width:space_width,\r\n            space_height:space_height,\r\n            r:r,\r\n            c:c\r\n        });\r\n\r\n        //\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F\u56FE\u6807\u96C6\r\n        if(checksCF != null && checksCF[\"icons\"] != null && textInfo.type==\"plain\"){\r\n            let l = checksCF[\"icons\"][\"left\"];\r\n            let t = checksCF[\"icons\"][\"top\"];\r\n            \r\n            let value = textInfo.values[0]\r\n            let horizonAlignPos = pos_x +  value.left;\r\n            let verticalAlignPos = pos_y + value.top- textInfo.textHeightAll;\r\n\r\n            if(verticalAlign == \"0\"){ //\u5C45\u4E2D\u5BF9\u9F50 \r\n                verticalAlignPos = pos_y + cellHeight/2 - textInfo.textHeightAll/2;\r\n            }\r\n            else if(verticalAlign == \"1\"){ //\u4E0A\u5BF9\u9F50\r\n                verticalAlignPos = pos_y;\r\n            }\r\n            else if(verticalAlign == \"2\"){ //\u4E0B\u5BF9\u9F50\r\n                verticalAlignPos =verticalAlignPos - textInfo.desc;\r\n            }\r\n\r\n            verticalAlignPos = verticalAlignPos/Store.zoomRatio;\r\n            horizonAlignPos = horizonAlignPos/Store.zoomRatio;\r\n\r\n            luckysheetTableContent.drawImage(\r\n                luckysheet_CFiconsImg, \r\n                l * 42, \r\n                t * 32, \r\n                32, \r\n                32, \r\n                pos_x/Store.zoomRatio , \r\n                verticalAlignPos,  \r\n                textInfo.textHeightAll/Store.zoomRatio, \r\n                textInfo.textHeightAll/Store.zoomRatio\r\n            );\r\n            \r\n            if(horizonAlign != \"0\" && horizonAlign != \"2\"){ //\u5DE6\u5BF9\u9F50\u65F6 \u6587\u672C\u6E32\u67D3\u7A7A\u51FA\u4E00\u4E2A\u56FE\u6807\u7684\u8DDD\u79BB\r\n                horizonAlignPos = horizonAlignPos + textInfo.textHeightAll/Store.zoomRatio;\r\n            }\r\n        }\r\n\r\n        //\u5355\u5143\u683C \u6587\u672C\u989C\u8272\r\n        luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , \"fc\");\r\n        \r\n        //\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272 \u6587\u672C\u989C\u8272\r\n        if(checksAF != null && checksAF[0] != null){ \r\n            luckysheetTableContent.fillStyle = checksAF[0];\r\n        }\r\n        //\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F \u6587\u672C\u989C\u8272\r\n        if(checksCF != null && checksCF[\"textColor\"] != null){ \r\n            luckysheetTableContent.fillStyle = checksCF[\"textColor\"];\r\n        }\r\n\r\n        //\u82E5\u5355\u5143\u683C\u683C\u5F0F\u4E3A\u81EA\u5B9A\u4E49\u6570\u5B57\u683C\u5F0F\uFF08[red]\uFF09 \u6587\u672C\u989C\u8272\u4E3A\u7EA2\u8272\r\n        if(cell.ct && cell.ct.fa && cell.ct.fa.indexOf('[Red]') > -1 && cell.ct.t == 'n' && cell.v < 0){\r\n            luckysheetTableContent.fillStyle = '#ff0000';\r\n        }\r\n\r\n        cellTextRender(\r\n            textInfo,\r\n            luckysheetTableContent,\r\n            {\r\n                pos_x:pos_x,\r\n                pos_y:pos_y,\r\n            }\r\n        );\r\n\r\n\r\n        luckysheetTableContent.restore();\r\n    }\r\n\r\n    if(cellOverflow_bd_r_render){\r\n        //\u53F3\u8FB9\u6846\r\n        if(!Store.luckysheetcurrentisPivotTable && !fillStyle && Store.showGridLines){\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(\r\n                 (end_c + offsetLeft - 2 + bodrder05), \r\n                 (start_r + offsetTop)\r\n            );\r\n            luckysheetTableContent.lineTo(\r\n                 (end_c + offsetLeft - 2 + bodrder05), \r\n                 (end_r + offsetTop)\r\n            );\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n    }\r\n\r\n    //\u4E0B\u8FB9\u6846\r\n    if(!Store.luckysheetcurrentisPivotTable && !fillStyle && Store.showGridLines){\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(\r\n             (start_c + offsetLeft - 1), \r\n             (end_r + offsetTop - 2 + bodrder05)\r\n        );\r\n        luckysheetTableContent.lineTo(\r\n             (end_c + offsetLeft - 1), \r\n             (end_r + offsetTop - 2 + bodrder05)\r\n        );\r\n        luckysheetTableContent.lineWidth = 1;\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    // \u5355\u5143\u683C\u6E32\u67D3\u540E\r\n    method.createHookFunction(\"cellRenderAfter\", Store.flowdata[r][c], {\r\n        r:r,\r\n        c:c,\r\n        \"start_r\": cellsize[1],\r\n        \"start_c\":cellsize[0], \r\n        \"end_r\": cellsize[3] + cellsize[1], \r\n        \"end_c\": cellsize[2] + cellsize[0]\r\n    }, sheetmanage.getSheetByIndex(),luckysheetTableContent)\r\n}\r\n\r\n//\u6EA2\u51FA\u5355\u5143\u683C\u6E32\u67D3\r\nlet cellOverflowRender = function(r, c, stc, edc,luckysheetTableContent,scrollHeight,scrollWidth,offsetLeft,offsetTop,af_compute, cf_compute){\r\n    //\u6EA2\u51FA\u5355\u5143\u683C \u8D77\u6B62\u884C\u5217\u5750\u6807\r\n    let start_r;\r\n    if (r == 0) {\r\n        start_r = -scrollHeight - 1;\r\n    }\r\n    else {\r\n        start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n    }\r\n\r\n    let end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n    let start_c;\r\n    if (stc == 0) {\r\n        start_c = -scrollWidth;\r\n    }\r\n    else {\r\n        start_c = Store.visibledatacolumn[stc - 1] - scrollWidth;\r\n    }\r\n\r\n    let end_c = Store.visibledatacolumn[edc] - scrollWidth;\r\n\r\n    //\r\n    let cell = Store.flowdata[r][c];\r\n    let cellWidth = end_c - start_c - 2;\r\n    let cellHeight = end_r - start_r - 2;\r\n    let space_width = 2, space_height = 2; //\u5BBD\u9AD8\u65B9\u5411 \u95F4\u9699\r\n\r\n    let pos_x = start_c + offsetLeft;\r\n    let pos_y = start_r + offsetTop + 1;\r\n\r\n    let fontset = luckysheetfontformat(cell);\r\n    luckysheetTableContent.font = fontset;\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(pos_x , pos_y, cellWidth , cellHeight );\r\n    luckysheetTableContent.clip();\r\n    luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);\r\n    \r\n\r\n    let textInfo = getCellTextInfo(cell , luckysheetTableContent, {\r\n        cellWidth:cellWidth,\r\n        cellHeight:cellHeight,\r\n        space_width:space_width,\r\n        space_height:space_height,\r\n        r:r,\r\n        c:c\r\n    });\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute); \r\n    //\u6761\u4EF6\u683C\u5F0F\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute); \r\n\r\n    //\u5355\u5143\u683C \u6587\u672C\u989C\u8272\r\n    luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , \"fc\");\r\n        \r\n    //\u82E5\u5355\u5143\u683C\u6709\u4EA4\u66FF\u989C\u8272 \u6587\u672C\u989C\u8272\r\n    if(checksAF != null && checksAF[0] != null){ \r\n        luckysheetTableContent.fillStyle = checksAF[0];\r\n    }\r\n    //\u82E5\u5355\u5143\u683C\u6709\u6761\u4EF6\u683C\u5F0F \u6587\u672C\u989C\u8272\r\n    if(checksCF != null && checksCF[\"textColor\"] != null){ \r\n        luckysheetTableContent.fillStyle = checksCF[\"textColor\"];\r\n    }\r\n\r\n    cellTextRender(\r\n        textInfo,\r\n        luckysheetTableContent,\r\n        {\r\n            pos_x:pos_x,\r\n            pos_y:pos_y,\r\n        }\r\n    );\r\n\r\n    luckysheetTableContent.restore();\r\n\r\n}\r\n\r\n//\u83B7\u53D6\u8868\u683C\u6E32\u67D3\u8303\u56F4 \u6EA2\u51FA\u5355\u5143\u683C \r\nfunction getCellOverflowMap(canvas, col_st, col_ed, row_st, row_end){\r\n    let map = {};\r\n\r\n    let data = Store.flowdata;\r\n\r\n    for(let r = row_st; r <= row_end; r++){\r\n        if(data[r]==null){\r\n            continue;\r\n        }\r\n\r\n        if(Store.cellOverflowMapCache[r]!=null){\r\n            map[r] = Store.cellOverflowMapCache[r];\r\n            continue;\r\n        }\r\n\r\n        let hasCellOver = false;\r\n\r\n        for(let c = 0; c < data[r].length; c++){\r\n            let cell = data[r][c];\r\n\r\n            // if(Store.cellOverflowMapCache[r + '_' + c]!=null){\r\n            //     map[r + '_' + c] = Store.cellOverflowMapCache[r + '_' + c];\r\n            //     continue;\r\n            // }\r\n\r\n            if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                continue\r\n            }\r\n\r\n            if(cell != null && (!isRealNull(cell.v) || isInlineStringCell(cell) ) && cell.mc == null && cell.tb == '1'){\r\n\r\n                //\u6C34\u5E73\u5BF9\u9F50\r\n                let horizonAlign = menuButton.checkstatus(data, r, c, \"ht\");\r\n\r\n                \r\n                let textMetricsObj = getCellTextInfo(cell, canvas,{\r\n                    r:r,\r\n                    c:c,\r\n                });\r\n                let textMetrics = 0;\r\n                if(textMetricsObj!=null){\r\n                    textMetrics = textMetricsObj.textWidthAll;\r\n                }\r\n\r\n                //canvas.measureText(value).width;\r\n\r\n                let start_c = c - 1 < 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n                let end_c = Store.visibledatacolumn[c];\r\n\r\n                let stc, edc;\r\n\r\n                if((end_c - start_c) < textMetrics){\r\n                    if(horizonAlign == '0'){//\u5C45\u4E2D\u5BF9\u9F50\r\n                        let trace_forward = cellOverflow_trace(r, c, c - 1, 'forward', horizonAlign, textMetrics);\r\n                        let trace_backward = cellOverflow_trace(r, c, c + 1, 'backward', horizonAlign, textMetrics);\r\n                    \r\n                        if(trace_forward.success){\r\n                            stc = trace_forward.c;\r\n                        }\r\n                        else{\r\n                            stc = trace_forward.c + 1;\r\n                        }\r\n\r\n                        if(trace_backward.success){\r\n                            edc = trace_backward.c;\r\n                        }\r\n                        else{\r\n                            edc = trace_backward.c - 1;\r\n                        }\r\n                    }\r\n                    else if(horizonAlign == '1'){//\u5DE6\u5BF9\u9F50\r\n                        let trace = cellOverflow_trace(r, c, c + 1, 'backward', horizonAlign, textMetrics);\r\n                        stc = c;\r\n\r\n                        if(trace.success){\r\n                            edc = trace.c;\r\n                        }\r\n                        else{\r\n                            edc = trace.c - 1;\r\n                        }\r\n                    }\r\n                    else if(horizonAlign == '2'){//\u53F3\u5BF9\u9F50\r\n                        let trace = cellOverflow_trace(r, c, c - 1, 'forward', horizonAlign, textMetrics);\r\n                        edc = c;\r\n\r\n                        if(trace.success){\r\n                            stc = trace.c;\r\n                        }\r\n                        else{\r\n                            stc = trace.c + 1;\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    stc = c;\r\n                    edc = c;\r\n                }\r\n\r\n                // if(((stc >= col_st && stc <= col_ed) || (edc >= col_st && edc <= col_ed)) && stc < edc){\r\n                if(((stc <= col_ed) || (edc >= col_st)) && stc < edc){\r\n                    let item = {\r\n                        r: r,\r\n                        stc: stc,\r\n                        edc: edc \r\n                    }\r\n\r\n                    if(map[r]==null){\r\n                        map[r] = {};\r\n                    }\r\n\r\n                    map[r][c] = item;\r\n\r\n                    // Store.cellOverflowMapCache[r + '_' + c] = item;\r\n\r\n                    hasCellOver = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        if(hasCellOver){\r\n            Store.cellOverflowMapCache[r] = map[r];\r\n        }\r\n\r\n    }\r\n\r\n    return map;\r\n}\r\n\r\nfunction cellOverflow_trace(r, curC, traceC, traceDir, horizonAlign, textMetrics){\r\n    let data = Store.flowdata; \r\n\r\n    //\u8FFD\u6EAF\u5355\u5143\u683C\u5217\u8D85\u51FA\u6570\u7EC4\u8303\u56F4 \u5219\u8FFD\u6EAF\u7EC8\u6B62\r\n    if(traceDir == 'forward' && traceC < 0){\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC\r\n        }; \r\n    }\r\n    \r\n    if(traceDir == 'backward' && traceC > data[r].length - 1){\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC\r\n        };\r\n    }\r\n\r\n    //\u8FFD\u6EAF\u5355\u5143\u683C\u662F \u975E\u7A7A\u5355\u5143\u683C\u6216\u5408\u5E76\u5355\u5143\u683C \u5219\u8FFD\u6EAF\u7EC8\u6B62\r\n    let cell = data[r][traceC];\r\n    if(cell != null && (!isRealNull(cell.v) || cell.mc != null)){\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC\r\n        };\r\n    }\r\n\r\n    let start_curC = curC - 1 < 0 ? 0 : Store.visibledatacolumn[curC - 1];\r\n    let end_curC = Store.visibledatacolumn[curC];\r\n\r\n    let w = textMetrics - (end_curC - start_curC);\r\n\r\n    if(horizonAlign == '0'){//\u5C45\u4E2D\u5BF9\u9F50\r\n        start_curC -= w / 2;\r\n        end_curC += w / 2;\r\n    }\r\n    else if(horizonAlign == '1'){//\u5DE6\u5BF9\u9F50\r\n        end_curC += w;\r\n    }\r\n    else if(horizonAlign == '2'){//\u53F3\u5BF9\u9F50\r\n        start_curC -= w;\r\n    }\r\n\r\n    let start_traceC = traceC - 1 < 0 ? 0 : Store.visibledatacolumn[traceC - 1];\r\n    let end_traceC = Store.visibledatacolumn[traceC];\r\n\r\n    if(traceDir == 'forward'){\r\n        if(start_curC < start_traceC){\r\n            return cellOverflow_trace(r, curC, traceC - 1, traceDir, horizonAlign, textMetrics);\r\n        }\r\n        else if(start_curC < end_traceC){\r\n            return {\r\n                success: true,\r\n                r: r,\r\n                c: traceC\r\n            }\r\n        }\r\n        else{\r\n            return {\r\n                success: false,\r\n                r: r,\r\n                c: traceC\r\n            }\r\n        }\r\n    }\r\n    \r\n    if(traceDir == 'backward'){\r\n        if(end_curC > end_traceC){\r\n            return cellOverflow_trace(r, curC, traceC + 1, traceDir, horizonAlign, textMetrics);\r\n        }\r\n        else if(end_curC > start_traceC){\r\n            return {\r\n                success: true,\r\n                r: r,\r\n                c: traceC\r\n            }\r\n        }\r\n        else{\r\n            return {\r\n                success: false,\r\n                r: r,\r\n                c: traceC\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfunction cellOverflow_colIn(map, r, c, col_st, col_ed){\r\n    let colIn = false, //\u6B64\u5355\u5143\u683C \u662F\u5426\u5728 \u67D0\u4E2A\u6EA2\u51FA\u5355\u5143\u683C\u7684\u6E32\u67D3\u8303\u56F4\r\n        colLast = false, //\u6B64\u5355\u5143\u683C \u662F\u5426\u662F \u67D0\u4E2A\u6EA2\u51FA\u5355\u5143\u683C\u7684\u6E32\u67D3\u8303\u56F4\u7684\u6700\u540E\u4E00\u5217\r\n        rowIndex, //\u6EA2\u51FA\u5355\u5143\u683C \u884C\u4E0B\u6807 \r\n        colIndex, //\u6EA2\u51FA\u5355\u5143\u683C \u5217\u4E0B\u6807\r\n        stc,\r\n        edc;\r\n\r\n    for(let rkey in map){\r\n        for(let ckey in map[rkey]){\r\n            rowIndex = rkey;\r\n            colIndex = ckey;\r\n            // rowIndex = key.substr(0, key.indexOf('_'));\r\n            // colIndex = key.substr(key.indexOf('_') + 1);\r\n            let mapItem = map[rkey][ckey];\r\n            stc = mapItem.stc;\r\n            edc = mapItem.edc;\r\n\r\n            if(rowIndex == r){\r\n                if(c >= stc && c <= edc){\r\n                    colIn = true;\r\n\r\n                    if(c == edc || c == col_ed){\r\n                        colLast = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if(colLast){\r\n            break;\r\n        }\r\n    }\r\n\r\n    return {\r\n        colIn: colIn,\r\n        colLast: colLast,\r\n        rowIndex: rowIndex,\r\n        colIndex: colIndex,\r\n        stc: stc,\r\n        edc: edc\r\n    }\r\n}\r\n\r\nfunction cellTextRender(textInfo, ctx, option){\r\n    if(textInfo==null){\r\n        return\r\n    }\r\n    let values = textInfo.values;\r\n    let pos_x = option.pos_x, pos_y = option.pos_y;\r\n    if(values==null){\r\n        return;\r\n    }\r\n    // console.log(textInfo, pos_x, pos_y, values[0].width, values[0].left, ctx);\r\n\r\n    // for(let i=0;i<values.length;i++){\r\n    //     let word = values[i];\r\n    //     ctx.font = word.style;\r\n    //     ctx.fillText(word.content, (pos_x + word.left)/Store.zoomRatio, (pos_y+word.top)/Store.zoomRatio);\r\n    // }\r\n\r\n    // ctx.fillStyle = \"rgba(255,255,0,0.2)\";\r\n    // ctx.fillRect((pos_x + values[0].left)/Store.zoomRatio, (pos_y+values[0].top-values[0].asc)/Store.zoomRatio, textInfo.textWidthAll, textInfo.textHeightAll)\r\n\r\n    if(textInfo.rotate!=0 && textInfo.type!=\"verticalWrap\"){\r\n        ctx.save();\r\n        ctx.translate((pos_x+textInfo.textLeftAll)/Store.zoomRatio, (pos_y+textInfo.textTopAll)/Store.zoomRatio);\r\n        ctx.rotate(-textInfo.rotate * Math.PI / 180);\r\n        ctx.translate(-(textInfo.textLeftAll+pos_x)/Store.zoomRatio, -(pos_y+textInfo.textTopAll)/Store.zoomRatio);\r\n    }\r\n\r\n    // ctx.fillStyle = \"rgb(0,0,0)\";\r\n    for(let i=0;i<values.length;i++){\r\n        let word = values[i];\r\n        if(word.inline===true && word.style!=null){\r\n            ctx.font = word.style.fontset;\r\n            ctx.fillStyle = word.style.fc;\r\n        }\r\n        else{\r\n            ctx.font = word.style;\r\n        }\r\n        \r\n        // \u6682\u65F6\u672A\u6392\u67E5\u5230word.content\u7B2C\u4E00\u6B21\u4F1A\u662Fobject\uFF0C\u5148\u505A\u4E0B\u5224\u65AD\u6765\u6E32\u67D3\uFF0C\u540E\u7EED\u627E\u5230\u95EE\u9898\u518D\u590D\u539F\r\n        let txt = typeof word.content === 'object' ? word.content.m : word.content\r\n        ctx.fillText(txt, (pos_x + word.left)/Store.zoomRatio, (pos_y+word.top)/Store.zoomRatio);\r\n        \r\n        \r\n        if(word.cancelLine!=null){\r\n            let c = word.cancelLine;\r\n            ctx.beginPath();\r\n            ctx.moveTo(\r\n                Math.floor((pos_x +c.startX)/Store.zoomRatio)+0.5 ,\r\n                Math.floor((pos_y+c.startY)/Store.zoomRatio)+0.5 ,\r\n            );\r\n            ctx.lineTo(\r\n                Math.floor((pos_x +c.endX)/Store.zoomRatio)+0.5 ,\r\n                Math.floor((pos_y+c.endY)/Store.zoomRatio)+0.5 ,\r\n            );\r\n            ctx.lineWidth = Math.floor(c.fs/9);\r\n            ctx.strokeStyle = ctx.fillStyle;\r\n            ctx.stroke();\r\n            ctx.closePath();\r\n        }\r\n\r\n        if(word.underLine!=null){\r\n            let underLines = word.underLine;\r\n            for(let a=0;a<underLines.length;a++){\r\n                let item = underLines[a];\r\n                ctx.beginPath();\r\n                ctx.moveTo(\r\n                    Math.floor((pos_x +item.startX)/Store.zoomRatio)+0.5 ,\r\n                    Math.floor((pos_y+item.startY)/Store.zoomRatio)\r\n                );\r\n                ctx.lineTo(\r\n                    Math.floor((pos_x +item.endX)/Store.zoomRatio)+0.5,\r\n                    Math.floor((pos_y+ item.endY)/Store.zoomRatio)+0.5\r\n                );\r\n                ctx.lineWidth = Math.floor(item.fs/9);\r\n                ctx.strokeStyle = ctx.fillStyle;\r\n                ctx.stroke();\r\n                ctx.closePath();\r\n            }\r\n        }\r\n    }\r\n    // ctx.fillStyle = \"rgba(0,0,0,0.2)\";\r\n    // ctx.fillRect((pos_x + values[0].left)/Store.zoomRatio, (pos_y+values[0].top-values[0].asc)/Store.zoomRatio, textInfo.textWidthAll, textInfo.textHeightAll)\r\n    // ctx.fillStyle = \"rgba(255,0,0,1)\";\r\n    // ctx.fillRect(pos_x+textInfo.textLeftAll-2, pos_y+textInfo.textTopAll-2, 4,4);\r\n    if(textInfo.rotate!=0 && textInfo.type!=\"verticalWrap\"){\r\n        ctx.restore();\r\n    }\r\n}\r\n\r\n\r\nexport {\r\n    luckysheetDrawgridRowTitle,\r\n    luckysheetDrawgridColumnTitle,\r\n    luckysheetDrawMain,\r\n}", "import { replaceHtml } from '../utils/util';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport server from './server';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nconst hyperlinkCtrl = {\r\n    item: {\r\n        linkType: 'external', //\u94FE\u63A5\u7C7B\u578B external\u5916\u90E8\u94FE\u63A5\uFF0Cinternal\u5185\u90E8\u94FE\u63A5\r\n        linkAddress: '',  //\u94FE\u63A5\u5730\u5740 \u7F51\u9875\u5730\u5740\u6216\u5DE5\u4F5C\u8868\u5355\u5143\u683C\u5F15\u7528\r\n        linkTooltip: '',  //\u63D0\u793A\r\n    },\r\n    hyperlink: null,\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const hyperlinkText = _locale.insertLink;\r\n        const toolbarText = _locale.toolbar;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-insertLink-dialog\").remove();\r\n\r\n        let sheetListOption = '';\r\n        Store.luckysheetfile.forEach(item => {\r\n            sheetListOption += `<option value=\"${item.name}\">${item.name}</option>`;\r\n        })\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkText\">${hyperlinkText.linkText}\uFF1A</label>\r\n                                <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkText\"/>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkType\">${hyperlinkText.linkType}\uFF1A</label>\r\n                                <select id=\"luckysheet-insertLink-dialog-linkType\">\r\n                                    <option value=\"external\">${hyperlinkText.external}</option>\r\n                                    <option value=\"internal\">${hyperlinkText.internal}</option>\r\n                                </select>\r\n                            </div>\r\n                            <div class=\"show-box show-box-external\">\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkAddress\">${hyperlinkText.linkAddress}\uFF1A</label>\r\n                                    <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkAddress\" placeholder=\"${hyperlinkText.placeholder1}\" />\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"show-box show-box-internal\">\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkSheet\">${hyperlinkText.linkSheet}\uFF1A</label>\r\n                                    <select id=\"luckysheet-insertLink-dialog-linkSheet\">\r\n                                        ${sheetListOption}\r\n                                    </select>\r\n                                </div>\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkCell\">${hyperlinkText.linkCell}\uFF1A</label>\r\n                                    <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkCell\" value=\"A1\" placeholder=\"${hyperlinkText.placeholder2}\" />\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkTooltip\">${hyperlinkText.linkTooltip}\uFF1A</label>\r\n                                <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkTooltip\" placeholder=\"${hyperlinkText.placeholder3}\" />\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-insertLink-dialog\", \r\n            \"addclass\": \"luckysheet-insertLink-dialog\", \r\n            \"title\": toolbarText.insertLink, \r\n            \"content\": content, \r\n            \"botton\":  `<button id=\"luckysheet-insertLink-dialog-confirm\" class=\"btn btn-primary\">${buttonText.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${buttonText.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-insertLink-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 350).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), \r\n            winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), \r\n            scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-insertLink-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n\r\n        _this.dataAllocation();\r\n    },\r\n    init: function (){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const hyperlinkText = _locale.insertLink;\r\n\r\n        //\u94FE\u63A5\u7C7B\u578B\r\n        $(document).off(\"change.linkType\").on(\"change.linkType\", \"#luckysheet-insertLink-dialog-linkType\", function(e){\r\n            let value = this.value;\r\n\r\n            $(\"#luckysheet-insertLink-dialog .show-box\").hide();\r\n            $(\"#luckysheet-insertLink-dialog .show-box-\" + value).show();\r\n        })\r\n\r\n        //\u786E\u8BA4\u6309\u94AE\r\n        $(document).off(\"click.confirm\").on(\"click.confirm\", \"#luckysheet-insertLink-dialog-confirm\", function(e){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let rowIndex = last.row_focus || last.row[0];\r\n            let colIndex = last.column_focus || last.column[0];\r\n\r\n            //\u6587\u672C\r\n            let linkText = $(\"#luckysheet-insertLink-dialog-linkText\").val();\r\n\r\n            let linkType = $(\"#luckysheet-insertLink-dialog-linkType\").val();\r\n            let linkAddress = $(\"#luckysheet-insertLink-dialog-linkAddress\").val();\r\n            let linkSheet = $(\"#luckysheet-insertLink-dialog-linkSheet\").val();\r\n            let linkCell = $(\"#luckysheet-insertLink-dialog-linkCell\").val();\r\n            let linkTooltip = $(\"#luckysheet-insertLink-dialog-linkTooltip\").val();\r\n\r\n            if(linkType == 'external'){\r\n                if(!/^http[s]?:\\/\\//.test(linkAddress)){\r\n                    linkAddress = 'https://' + linkAddress;\r\n                }\r\n\r\n                if(!/^http[s]?:\\/\\/([\\w\\-\\.]+)+[\\w-]*([\\w\\-\\.\\/\\?%&=]+)?$/ig.test(linkAddress)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', hyperlinkText.tooltipInfo1);\r\n                    return;\r\n                }\r\n            }\r\n            else{\r\n                if(!formula.iscelldata(linkCell)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', hyperlinkText.tooltipInfo2);\r\n                    return;\r\n                }\r\n\r\n                linkAddress = linkSheet + \"!\" + linkCell;\r\n            }\r\n\r\n            if(linkText == null || linkText.replace(/\\s/g, '') == ''){\r\n                linkText = linkAddress;\r\n            }\r\n\r\n            let item = {\r\n                linkType: linkType,\r\n                linkAddress: linkAddress,\r\n                linkTooltip: linkTooltip,\r\n            }\r\n\r\n            let historyHyperlink = $.extend(true, {}, _this.hyperlink);\r\n            let currentHyperlink = $.extend(true, {}, _this.hyperlink);\r\n\r\n            currentHyperlink[rowIndex + \"_\" + colIndex] = item;\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let cell = d[rowIndex][colIndex];\r\n\r\n            if(cell == null){\r\n                cell = {};\r\n            }\r\n\r\n            cell.fc = 'rgb(0, 0, 255)';\r\n            cell.un = 1;\r\n            cell.v = cell.m = linkText;\r\n\r\n            d[rowIndex][colIndex] = cell;\r\n\r\n            _this.ref(\r\n                historyHyperlink, \r\n                currentHyperlink, \r\n                Store.currentSheetIndex, \r\n                d, \r\n                [{ row: [rowIndex, rowIndex], column: [colIndex, colIndex] }]\r\n            );\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-insertLink-dialog\").hide();\r\n        })\r\n    },\r\n    dataAllocation: function(){\r\n        let _this = this;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus || last.row[0];\r\n        let colIndex = last.column_focus || last.column[0];\r\n\r\n        let hyperlink = _this.hyperlink || {};\r\n        let item = hyperlink[rowIndex + \"_\" + colIndex] || {};\r\n\r\n        //\u6587\u672C\r\n        let text = getcellvalue(rowIndex, colIndex, null, 'm');\r\n        $(\"#luckysheet-insertLink-dialog-linkText\").val(text);\r\n\r\n        //\u94FE\u63A5\u7C7B\u578B\r\n        let linkType = item.linkType || 'external';\r\n        $(\"#luckysheet-insertLink-dialog-linkType\").val(linkType);\r\n\r\n        $(\"#luckysheet-insertLink-dialog .show-box\").hide();\r\n        $(\"#luckysheet-insertLink-dialog .show-box-\" + linkType).show();\r\n\r\n        //\u94FE\u63A5\u5730\u5740\r\n        let linkAddress = item.linkAddress || '';\r\n\r\n        if(linkType == 'external'){\r\n            $(\"#luckysheet-insertLink-dialog-linkAddress\").val(linkAddress);\r\n        }\r\n        else{\r\n            if(formula.iscelldata(linkAddress)){\r\n                let sheettxt = linkAddress.split(\"!\")[0];\r\n                let rangetxt = linkAddress.split(\"!\")[1];\r\n\r\n                $(\"#luckysheet-insertLink-dialog-linkSheet\").val(sheettxt);\r\n                $(\"#luckysheet-insertLink-dialog-linkCell\").val(rangetxt);\r\n            }\r\n        }\r\n\r\n        //\u63D0\u793A\r\n        let linkTooltip = item.linkTooltip || '';\r\n        $(\"#luckysheet-insertLink-dialog-linkTooltip\").val(linkTooltip);\r\n    },\r\n    cellFocus: function(r, c){\r\n        let _this = this;\r\n\r\n        if(_this.hyperlink == null || _this.hyperlink[r + '_' + c] == null){\r\n            return;\r\n        }\r\n\r\n        let item = _this.hyperlink[r + '_' + c];\r\n\r\n        if(item.linkType == 'external'){\r\n            window.open(item.linkAddress);\r\n        }\r\n        else{\r\n            let cellrange = formula.getcellrange(item.linkAddress);\r\n            let sheetIndex = cellrange.sheetIndex;\r\n            let range = [{\r\n                row: cellrange.row,\r\n                column: cellrange.column\r\n            }];\r\n\r\n            if(sheetIndex != Store.currentSheetIndex){\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n                $(\"#luckysheet-sheets-item\" + sheetIndex).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n                sheetmanage.changeSheet(sheetIndex);\r\n            }\r\n\r\n            Store.luckysheet_select_save = range;\r\n            selectHightlightShow(true);\r\n\r\n            let row_pre = cellrange.row[0] - 1 == -1 ? 0 : Store.visibledatarow[cellrange.row[0] - 1];\r\n            let col_pre = cellrange.column[0] - 1 == -1 ? 0 : Store.visibledatacolumn[cellrange.column[0] - 1];\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n        }\r\n    },\r\n    overshow: function(event){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-hyperlink-overshow\").remove();\r\n\r\n        if($(event.target).closest(\"#luckysheet-cell-main\").length == 0){\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            return;\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            return;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if(!!margeset){\r\n            row_index = margeset.row[2];\r\n            col_index = margeset.column[2];\r\n        }\r\n\r\n        if(_this.hyperlink == null || _this.hyperlink[row_index + \"_\" + col_index] == null){\r\n            return;\r\n        }\r\n\r\n        let item = _this.hyperlink[row_index + \"_\" + col_index];\r\n        let linkTooltip = item.linkTooltip;\r\n\r\n        if(linkTooltip == null || linkTooltip.replace(/\\s/g, '') == ''){\r\n            linkTooltip = item.linkAddress;\r\n        }\r\n\r\n        let row = Store.visibledatarow[row_index], \r\n            row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n        let col = Store.visibledatacolumn[col_index], \r\n            col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let html = `<div id=\"luckysheet-hyperlink-overshow\" style=\"background:#fff;padding:5px 10px;border:1px solid #000;box-shadow:2px 2px #999;position:absolute;left:${col_pre}px;top:${row + 5}px;z-index:100;\">\r\n                        <div>${linkTooltip}</div>\r\n                        <div>\u5355\u51FB\u9F20\u6807\u53EF\u4EE5\u8FFD\u8E2A</div>\r\n                    </div>`;\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main\"));\r\n    },\r\n    ref: function(historyHyperlink, currentHyperlink, sheetIndex, d, range){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateHyperlink\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyHyperlink\"] = historyHyperlink;\r\n            redo[\"currentHyperlink\"] = currentHyperlink;\r\n            redo[\"data\"] = Store.flowdata; \r\n            redo[\"curData\"] = d;\r\n            redo[\"range\"] = range; \r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        _this.hyperlink = currentHyperlink;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].hyperlink = currentHyperlink;\r\n\r\n        Store.flowdata = d;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata;\r\n\r\n        //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentHyperlink, { \"k\": \"hyperlink\" });\r\n            server.historyParam(Store.flowdata, sheetIndex, range);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default hyperlinkCtrl;", "import rhchInit from './rhchInit';\r\nimport formula from './formula';\r\nimport editor from './editor';\r\nimport { setcellvalue } from './setdata';\r\nimport { getcellFormula } from './getdata';\r\nimport { computeRowlenArr } from './getRowlen';\r\nimport { \r\n    luckysheetDrawMain, \r\n    luckysheetDrawgridRowTitle, \r\n    luckysheetDrawgridColumnTitle \r\n} from './draw';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport server from '../controllers/server';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport luckysheetPostil from '../controllers/postil';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport hyperlinkCtrl from '../controllers/hyperlinkCtrl';\r\nimport { selectHightlightShow, selectionCopyShow, collaborativeEditBox } from '../controllers/select';\r\nimport { createFilterOptions } from '../controllers/filter';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nlet refreshCanvasTimeOut = null;\r\n\r\nfunction runExecFunction(range, index, data){\r\n    formula.execFunctionExist = [];\r\n    for(let s = 0; s < range.length; s++){\r\n        for(let r = range[s].row[0]; r <= range[s].row[1]; r++){\r\n            for(let c = range[s].column[0]; c <= range[s].column[1]; c++){\r\n                formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": index });\r\n            }\r\n        }\r\n    }\r\n    formula.execFunctionExist.reverse();\r\n    formula.execFunctionGroup(null, null, null, null, data);\r\n    formula.execFunctionGlobalData = null;\r\n}\r\n\r\nfunction jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefreshCanvas = true) {\r\n    if(data == null){\r\n        data = Store.flowdata;\r\n    }\r\n\r\n    if(range == null){\r\n        range = Store.luckysheet_select_save;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    clearTimeout(refreshCanvasTimeOut);\r\n\r\n    //\u5173\u8054\u53C2\u6570\r\n    if(allParam == null){\r\n        allParam = {};\r\n    }\r\n\r\n    let cfg = allParam[\"cfg\"];  //config\r\n    let RowlChange = allParam[\"RowlChange\"];  //\u884C\u9AD8\u6539\u53D8\r\n    let cdformat = allParam[\"cdformat\"];  //\u6761\u4EF6\u683C\u5F0F\r\n    let dataVerification = allParam[\"dataVerification\"];  //\u6570\u636E\u9A8C\u8BC1\r\n    let dynamicArray = allParam[\"dynamicArray\"];  //\u52A8\u6001\u6570\u7EC4\r\n\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        let curConfig;\r\n        if(cfg == null){\r\n            curConfig = $.extend(true, {}, Store.config);\r\n        }\r\n        else{\r\n            curConfig = $.extend(true, {}, cfg);\r\n        }\r\n\r\n        let curCdformat;\r\n        if(cdformat == null){\r\n            curCdformat = $.extend(true, [], file[\"luckysheet_conditionformat_save\"]);\r\n        }\r\n        else{\r\n            curCdformat = cdformat;\r\n        }\r\n\r\n        let curDataVerification;\r\n        if(dataVerification == null){\r\n            curDataVerification = $.extend(true, {}, file[\"dataVerification\"])\r\n        }\r\n        else{\r\n            curDataVerification = dataVerification;\r\n        }\r\n\r\n        let curDynamicArray;\r\n        if(dynamicArray == null){\r\n            curDynamicArray = $.extend(true, [], file[\"dynamicArray\"]);\r\n        }\r\n        else{\r\n            curDynamicArray = dynamicArray;\r\n        }\r\n        \r\n        Store.jfredo.push({ \r\n            \"type\": \"datachange\", \r\n            \"data\": Store.flowdata, \r\n            \"curdata\": data,\r\n            \"sheetIndex\": Store.currentSheetIndex, \r\n            \"config\": $.extend(true, {}, Store.config), \r\n            \"curConfig\": curConfig,\r\n            \"cdformat\":  $.extend(true, [], file[\"luckysheet_conditionformat_save\"]),\r\n            \"curCdformat\": curCdformat,\r\n            \"RowlChange\": RowlChange,\r\n            \"dataVerification\": $.extend(true, [], file[\"dataVerification\"]),\r\n            \"curDataVerification\": curDataVerification,\r\n            \"dynamicArray\": $.extend(true, [], file[\"dynamicArray\"]),\r\n            \"curDynamicArray\": curDynamicArray,\r\n            \"range\": range,\r\n            \"dataRange\": [...file.luckysheet_select_save]// \u4FDD\u7559\u64CD\u4F5C\u65F6\u7684\u9009\u533A\r\n        });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n    file.data = Store.flowdata;\r\n\r\n    // \u5FC5\u987B\u8981\u5904\u7406\uFF0C\u53EF\u80FD\u4E4B\u524D\u7684config\u4E3A\u7A7A\uFF0C\u5219\u4E5F\u9700\u8981\u6E05\u7A7A\r\n    if(cfg != null){\r\n        Store.config = cfg;\r\n        file.config = Store.config;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n        if(RowlChange != null){\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n    }\r\n\r\n    //condition format, null or empty array are not processed\r\n    if(cdformat != null && cdformat.length !== 0){\r\n        file[\"luckysheet_conditionformat_save\"] = cdformat;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cdformat, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    //data Verification, null or empty object are not processed\r\n    if(dataVerification != null && Object.keys(dataVerification).length !== 0){\r\n        dataVerificationCtrl.dataVerification = dataVerification;\r\n        file[\"dataVerification\"] = dataVerification;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, dataVerification, { \"k\": \"dataVerification\" });\r\n    }\r\n\r\n    //\u52A8\u6001\u6570\u7EC4\r\n    if(dynamicArray != null){\r\n        file[\"dynamicArray\"] = dynamicArray;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, dynamicArray, { \"k\": \"dynamicArray\" });\r\n    }\r\n\r\n    //\u66F4\u65B0\u6570\u636E\u7684\u8303\u56F4\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0];\r\n        let c1 = range[s].column[0];\r\n\r\n        if(Store.flowdata[r1][c1] != null && Store.flowdata[r1][c1].spl != null){\r\n            window.luckysheetCurrentRow = r1;\r\n            window.luckysheetCurrentColumn = c1;\r\n            window.luckysheetCurrentFunction = Store.flowdata[r1][c1].f;\r\n\r\n            let fp = $.trim(formula.functionParserExe(Store.flowdata[r1][c1].f));\r\n            let sparklines = new Function(\"return \" +fp)();\r\n            Store.flowdata[r1][c1].spl = sparklines;\r\n        }\r\n\r\n        if(server.allowUpdate){ //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n            server.historyParam(Store.flowdata, Store.currentSheetIndex, range[s]);\r\n        }\r\n        // \u5237\u65B0\u56FE\u8868\r\n        if(typeof(Store.chartparam.jfrefreshchartall)==\"function\"){\r\n            Store.chartparam.jfrefreshchartall(Store.flowdata,range[s].row[0],range[s].row[1],range[s].column[0],range[s].column[1]);\r\n        }\r\n    }\r\n    //\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\u8054\u52A8\r\n    if (isRunExecFunction) {\r\n        runExecFunction(range, Store.currentSheetIndex, data);\r\n    }\r\n    //\u5237\u65B0\u8868\u683C\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    /* \u9009\u533A\u540C\u6B65 */\r\n    selectHightlightShow();\r\n    window.luckysheet_getcelldata_cache = null;\r\n}\r\n\r\nfunction jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlValue, cdformat, isRefreshCanvas=true) {\r\n    let redo = {}, isRunExecFunction=false;\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    if (ctrlType == \"cellRowChange\") {\r\n        redo[\"type\"] = \"cellRowChange\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        let setfield = cfg[\"rowlen\"];\r\n\r\n        if(setfield == null){\r\n            setfield = {};\r\n        }\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, setfield, { \"k\": \"rowlen\" });\r\n    }\r\n    else if (ctrlType == \"resizeC\") {\r\n        redo[\"type\"] = \"resize\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        let setfield = cfg[\"columnlen\"];\r\n\r\n        if(setfield == null){\r\n            setfield = {};\r\n        }\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, setfield, { \"k\": \"columnlen\" });\r\n    }\r\n    else if (ctrlType.indexOf(\"extend\")>-1) {\r\n        redo[\"type\"] = \"extend\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        server.saveParam(\"arc\", Store.currentSheetIndex, {\"index\": ctrlValue.index, \"len\": ctrlValue.len, \"direction\": ctrlValue.direction, \"mc\": cfg.merge }, { \"rc\": ctrlValue.type });\r\n    }\r\n    else if (ctrlType.indexOf(\"dele\")>-1) {\r\n        redo[\"type\"] = \"dele\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        server.saveParam(\"drc\", Store.currentSheetIndex, {\"index\": ctrlValue.index, \"len\":ctrlValue.len, \"mc\": cfg.merge, \"borderInfo\": cfg.borderInfo }, { \"rc\": ctrlValue.type});\r\n    }\r\n    else {\r\n        redo[\"type\"] = \"datachangeAll\";\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        isRunExecFunction = true;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            server.historyParam(data, Store.currentSheetIndex, range[s]);    \r\n        }\r\n    }\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        redo[\"data\"] = Store.flowdata;\r\n        redo[\"curdata\"] = data;\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n        redo[\"cdformat\"] = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n        redo[\"curCdformat\"] = cdformat;\r\n\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(data);//worker\u5B58\u6570\u636E\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n\r\n    //config\r\n    if (cfg != null) {\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n    }\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\r\n    if(cdformat != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = cdformat;\r\n    \r\n        server.saveParam(\"all\", Store.currentSheetIndex, cdformat, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    //\u9009\u533A\r\n    Store.luckysheet_select_save = $.extend(true, [], range);\r\n    if(Store.luckysheet_select_save.length > 0){\r\n        //\u6709\u9009\u533A\u65F6\uFF0C\u5237\u65B0\u4E00\u4E0B\u9009\u533A\r\n        selectHightlightShow();\r\n    }\r\n\r\n\r\n    if(isRunExecFunction){\r\n        //\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\u8054\u52A8\r\n        runExecFunction(range, Store.currentSheetIndex, data);\r\n    }\r\n\r\n    //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n    jfrefreshgrid_rhcw(rowheight, colwidth);\r\n\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n    \r\n\r\n    sheetmanage.storeSheetParamALL();\r\n    \r\n    window.luckysheet_getcelldata_cache = null;\r\n}\r\n\r\nfunction jfrefreshrange(data, range, cdformat) {\r\n    clearTimeout(refreshCanvasTimeOut);\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({ \r\n            \"type\": \"rangechange\", \r\n            \"data\": Store.flowdata, \r\n            \"curdata\": data,\r\n            \"range\": range, \r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"cdformat\":  $.extend(true, [],  Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]),\r\n            \"curCdformat\": cdformat \r\n        });\r\n    }\r\n\r\n    //flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\r\n    if(cdformat != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = cdformat;\r\n    }\r\n\r\n    //\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\u8054\u52A8\r\n    runExecFunction(range, Store.currentSheetIndex, data);\r\n\r\n    //\u5237\u65B0\u8868\u683C\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n\r\n    //\u53D1\u9001\u7ED9\u540E\u53F0\r\n    for(let s = 0; s < range.length; s++){\r\n        server.historyParam(Store.flowdata, Store.currentSheetIndex, range[s]);\r\n    }\r\n}\r\n\r\n//\u5220\u9664\u3001\u589E\u52A0\u884C\u5217 \u5237\u65B0\u8868\u683C\r\nfunction jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, af, freezen, dataVerification, hyperlink){\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n    collaborativeEditBox();\r\n    //merge\u6539\u53D8\u5BF9\u5E94\u7684\u5355\u5143\u683C\u503C\u6539\u53D8\r\n    let mcData = [];\r\n    for(let m in cfg[\"merge\"]){\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        for(let r = mc.r; r <= mc.r + mc.rs - 1; r++){\r\n            for(let c = mc.c; c <= mc.c + mc.cs - 1; c++){\r\n                if(data[r][c] == null){\r\n                    data[r][c] = {};\r\n                }\r\n\r\n                if(r == mc.r && c == mc.c){\r\n                    data[r][c].mc = mc;\r\n                }\r\n                else{\r\n                    data[r][c].mc = { \"r\": mc.r, \"c\": mc.c };\r\n                }\r\n\r\n                mcData.push({ \"r\": r, \"c\": c });                       \r\n            }\r\n        }\r\n    }\r\n\r\n    //\u516C\u5F0F\u94FE\u4E2D\u516C\u5F0F\u8303\u56F4\u6539\u53D8\u5BF9\u5E94\u5355\u5143\u683C\u503C\u7684\u6539\u53D8\r\n    let funcData = [];\r\n    // if(calc.length > 0){\r\n    //     // \u53D6\u6D88execFunctionGroupData\uFF0C\u6539\u7528execFunctionGlobalData\r\n    //     // formula.execFunctionGroupData = data;\r\n\r\n    //     for(let i = 0; i < calc.length; i++){\r\n    //         let clc = calc[i];\r\n    //         let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            \r\n    //         let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n    //         clc.func = clc_result;\r\n\r\n    //         if(data[clc_r][clc_c].f == clc_funcStr){\r\n    //             setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n    //             // funcData\u5B58\u50A8\u5F53\u524D\u7ED3\u679C\u6CA1\u6709\u7528\u5904\uFF0C\u6BCF\u6B21\u8FD8\u662F\u9700\u8981\u4ECEcalc\u516C\u5F0F\u94FE\u5B9E\u65F6\u4ECE\u5F53\u524D\u6570\u636E\u4E2D\u8BA1\u7B97\u6BD4\u8F83\u9760\u8C31\r\n    //             // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": ctrlType,\r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"data\": Store.flowdata,\r\n            \"curData\": data,\r\n            \"config\": $.extend(true, {}, Store.config),\r\n            \"curConfig\": cfg,\r\n            \"ctrlValue\": ctrlValue,\r\n            \"mcData\": mcData,\r\n            \"calc\": $.extend(true, [], file.calcChain),\r\n            \"curCalc\": calc,\r\n            \"funcData\": funcData,\r\n            \"filterObj\": { \"filter_select\": $.extend(true, {}, file.filter_select), \"filter\": $.extend(true, {}, file.filter) },\r\n            \"curFilterObj\": filterObj,\r\n            \"cf\": $.extend(true, [], file.luckysheet_conditionformat_save),\r\n            \"curCf\": cf,\r\n            \"af\": $.extend(true, [], file.luckysheet_alternateformat_save),\r\n            \"curAf\": af,\r\n            \"freezen\": { \"freezenhorizontaldata\": luckysheetFreezen.freezenhorizontaldata, \"freezenverticaldata\": luckysheetFreezen.freezenverticaldata },\r\n            \"curFreezen\": freezen,\r\n            \"dataVerification\": $.extend(true, {}, file.dataVerification),\r\n            \"curDataVerification\": dataVerification,\r\n            \"hyperlink\": $.extend(true, {}, file.hyperlink),\r\n            \"curHyperlink\": hyperlink,\r\n            \"range\": file.luckysheet_select_save,\r\n            \"dataRange\": [...file.luckysheet_select_save]// \u4FDD\u7559\u64CD\u4F5C\u65F6\u7684\u9009\u533A\r\n        });\r\n    }\r\n\r\n    let index = ctrlValue.index,\r\n        len = ctrlValue.len,\r\n        rc = ctrlValue.rc;\r\n\r\n    if(ctrlType == \"addRC\"){\r\n        let direction = ctrlValue.direction,\r\n            restore = ctrlValue.restore;\r\n\r\n        let addData = [];\r\n        if(restore){\r\n            if(rc == \"r\"){\r\n                let st_r;\r\n                if(direction == \"lefttop\"){\r\n                    st_r = index;\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    st_r = index + 1;\r\n                }\r\n                let ed_r = st_r + len - 1;\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    let row = [];\r\n                    for(let c = 0; c < data[0].length; c++){\r\n                        let cell = data[r][c];\r\n                        row.push(cell);\r\n                    }\r\n                    addData.push(row);\r\n                }\r\n            }\r\n            else if(rc == \"c\"){\r\n                let st_c;\r\n                if(direction == \"lefttop\"){\r\n                    st_c = index;\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    st_c = index + 1;\r\n                }\r\n                let ed_c = st_c + len - 1;\r\n\r\n                for(let r = 0; r < data.length; r++){\r\n                    let row = [];\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        let cell = data[r][c];\r\n                        row.push(cell);\r\n                    }\r\n                    addData.push(row);\r\n                }\r\n            }\r\n        }\r\n\r\n        server.saveParam(\"arc\", Store.currentSheetIndex, {\"index\": index, \"len\": len, \"direction\": direction, \"data\": addData }, { \"rc\": rc });\r\n    }\r\n    else if(ctrlType == \"delRC\"){\r\n        server.saveParam(\"drc\", Store.currentSheetIndex, {\"index\": index, \"len\": len }, { \"rc\": rc });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n    file.data = data;\r\n\r\n    //config\r\n    Store.config = cfg;\r\n    file.config = Store.config;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n    //mcData\r\n    for(let i = 0; i < mcData.length; i++){\r\n        let mcData_r = mcData[i].r,\r\n            mcData_c = mcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[mcData_r][mcData_c], { \"r\": mcData_r, \"c\": mcData_c });\r\n    }\r\n\r\n    //\u516C\u5F0F\u94FE\u4E2D\u516C\u5F0F\u8303\u56F4\u6539\u53D8\u5BF9\u5E94\u5355\u5143\u683C\u503C\u7684\u6539\u53D8\r\n    if(calc.length > 0){\r\n        // \u53D6\u6D88execFunctionGroupData\uFF0C\u6539\u7528execFunctionGlobalData\r\n        // formula.execFunctionGroupData = data;\r\n\r\n        for(let i = 0; i < calc.length; i++){\r\n            let clc = calc[i];\r\n            let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            \r\n            let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n            clc.func = clc_result;\r\n\r\n            if(data[clc_r][clc_c].f == clc_funcStr){\r\n                setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n                // funcData\u5B58\u50A8\u5F53\u524D\u7ED3\u679C\u6CA1\u6709\u7528\u5904\uFF0C\u6BCF\u6B21\u8FD8\u662F\u9700\u8981\u4ECEcalc\u516C\u5F0F\u94FE\u5B9E\u65F6\u4ECE\u5F53\u524D\u6570\u636E\u4E2D\u8BA1\u7B97\u6BD4\u8F83\u9760\u8C31\r\n                // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n            }\r\n        }\r\n    }\r\n\r\n    //calc\u51FD\u6570\u94FE\r\n    file.calcChain = calc;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, calc, { \"k\": \"calcChain\" });\r\n    for(let i = 0; i < funcData.length; i++){\r\n        let funcData_r = funcData[i].r,\r\n            funcData_c = funcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[funcData_r][funcData_c], { \"r\": funcData_r, \"c\": funcData_c });\r\n    }\r\n\r\n    //\u7B5B\u9009\u914D\u7F6E\r\n    if(filterObj != null){\r\n        file.filter_select = filterObj.filter_select;\r\n        file.filter = filterObj.filter;\r\n    }\r\n    else{\r\n        file.filter_select = null;\r\n        file.filter = null;\r\n    }\r\n    createFilterOptions(file.filter_select, file.filter);\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter_select, { \"k\": \"filter_select\" });\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u914D\u7F6E\r\n    file.luckysheet_conditionformat_save = cf;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_conditionformat_save, { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //\u4EA4\u66FF\u989C\u8272\u914D\u7F6E\r\n    file.luckysheet_alternateformat_save = af;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_alternateformat_save, { \"k\": \"luckysheet_alternateformat_save\" });\r\n\r\n    //\u51BB\u7ED3\u914D\u7F6E\r\n    if(freezen != null){\r\n        luckysheetFreezen.freezenhorizontaldata = freezen.freezenhorizontaldata;\r\n        luckysheetFreezen.freezenverticaldata = freezen.freezenverticaldata;\r\n    }\r\n    else{\r\n        luckysheetFreezen.freezenhorizontaldata = null;\r\n        luckysheetFreezen.freezenverticaldata = null;\r\n    }\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\r\n    dataVerificationCtrl.dataVerification = dataVerification;\r\n    file.dataVerification = dataVerification;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.dataVerification, { \"k\": \"dataVerification\" });\r\n\r\n    //\u8D85\u94FE\u63A5\r\n    hyperlinkCtrl.hyperlink = hyperlink;\r\n    file.hyperlink = hyperlink;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.hyperlink, { \"k\": \"hyperlink\" });\r\n\r\n    //\u884C\u9AD8\u3001\u5217\u5BBD\u5237\u65B0\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n}\r\n\r\n//\u5220\u9664\u5355\u5143\u683C \u5237\u65B0\u8868\u683C\r\nfunction jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification, hyperlink){\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    collaborativeEditBox();\r\n    //merge\u6539\u53D8\u5BF9\u5E94\u7684\u5355\u5143\u683C\u503C\u6539\u53D8\r\n    let mcData = [];\r\n    if(JSON.stringify(cfg[\"merge\"]) == \"{}\"){\r\n        for(let r = 0; r < data.length; r++){\r\n            for(let c = 0; c < data[0].length; c++){\r\n                let cell = data[r][c];\r\n    \r\n                if(cell != null && cell.mc != null){\r\n                    delete cell.mc;\r\n                    mcData.push({ \"r\": r, \"c\": c });\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        for(let m in cfg[\"merge\"]){\r\n            let mc = cfg[\"merge\"][m];\r\n    \r\n            for(let r = mc.r; r <= mc.r + mc.rs - 1; r++){\r\n                for(let c = mc.c; c <= mc.c + mc.cs - 1; c++){\r\n                    if(data[r][c] == null){\r\n                        data[r][c] = {};\r\n                    }\r\n    \r\n                    // if(r == mc.r && c == mc.c){\r\n                    //     data[r][c].mc = mc;\r\n                    // }\r\n                    // else{\r\n                    //     data[r][c].mc = { \"r\": mc.r, \"c\": mc.c };\r\n                    // }\r\n    \r\n                    // mcData.push({ \"r\": r, \"c\": c });        \r\n                    \r\n\r\n                    if(r == mc.r && c == mc.c){\r\n                        if(JSON.stringify(data[r][c].mc) !=JSON.stringify(mc)){\r\n                            data[r][c].mc = mc;\r\n                            mcData.push({ \"r\": r, \"c\": c });   \r\n                        }\r\n                    }\r\n                    else{\r\n                        let tempMc = { \"r\": mc.r, \"c\": mc.c };\r\n                        if(JSON.stringify(data[r][c].mc) != JSON.stringify(tempMc)){\r\n                            data[r][c].mc = tempMc;\r\n                            mcData.push({ \"r\": r, \"c\": c });   \r\n                        }\r\n                    }   \r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u516C\u5F0F\u94FE\u4E2D\u516C\u5F0F\u8303\u56F4\u6539\u53D8\u5BF9\u5E94\u5355\u5143\u683C\u503C\u7684\u6539\u53D8\r\n    let funcData = [];\r\n    // if(calc.length > 0){\r\n    //     // formula.execFunctionGroupData = data;\r\n\r\n    //     for(let i = 0; i < calc.length; i++){\r\n    //         let clc = calc[i];\r\n    //         let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n    //         let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n    //         clc.func = clc_result;\r\n\r\n    //         if(data[clc_r][clc_c].f == clc_funcStr){\r\n    //             setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n    //             funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": \"deleteCell\",\r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"ctrl\": ctrl,\r\n            \"data\": Store.flowdata,\r\n            \"curData\": data,\r\n            \"config\": $.extend(true, {}, Store.config),\r\n            \"curConfig\": cfg,\r\n            \"mcData\": mcData,\r\n            \"calc\": $.extend(true, [], file.calcChain),\r\n            \"curCalc\": calc,\r\n            \"funcData\": funcData,\r\n            \"filterObj\": { \"filter_select\": $.extend(true, {}, file.filter_select), \"filter\": $.extend(true, {}, file.filter) },\r\n            \"curFilterObj\": filterObj,\r\n            \"cf\": $.extend(true, [], file.luckysheet_conditionformat_save),\r\n            \"curCf\": cf,\r\n            \"dataVerification\": $.extend(true, {}, file.dataVerification),\r\n            \"curDataVerification\": dataVerification,\r\n            \"hyperlink\": $.extend(true, {}, file.hyperlink),\r\n            \"curHyperlink\": hyperlink,\r\n            \"range\": file.luckysheet_select_save,\r\n            \"dataRange\": [...file.luckysheet_select_save] // \u4FDD\u7559\u64CD\u4F5C\u65F6\u7684\u9009\u533A\r\n        });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n    file.data = data;\r\n\r\n    //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n    if(server.allowUpdate){\r\n        let type = ctrl.type,\r\n            str = ctrl.str,\r\n            edr = ctrl.edr,\r\n            stc = ctrl.stc,\r\n            edc = ctrl.edc;\r\n\r\n        let range;\r\n        if(type == 'moveUp'){\r\n            range = {\r\n                \"row\": [str, data.length - 1],\r\n                \"column\": [stc, edc]\r\n            }\r\n        }\r\n        else if(type == 'moveLeft'){\r\n            range = {\r\n                \"row\": [str, edr],\r\n                \"column\": [stc, data[0].length - 1]\r\n            };\r\n        }\r\n\r\n        server.historyParam(Store.flowdata, Store.currentSheetIndex, range);\r\n    }\r\n\r\n    //config\r\n    Store.config = cfg;\r\n    file.config = Store.config;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n    //mcData\r\n    for(let i = 0; i < mcData.length; i++){\r\n        let mcData_r = mcData[i].r,\r\n            mcData_c = mcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[mcData_r][mcData_c], { \"r\": mcData_r, \"c\": mcData_c });\r\n    }\r\n\r\n    //\u516C\u5F0F\u94FE\u4E2D\u516C\u5F0F\u8303\u56F4\u6539\u53D8\u5BF9\u5E94\u5355\u5143\u683C\u503C\u7684\u6539\u53D8\r\n    if(calc.length > 0){\r\n        // formula.execFunctionGroupData = data;\r\n\r\n        for(let i = 0; i < calc.length; i++){\r\n            let clc = calc[i];\r\n            let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n            clc.func = clc_result;\r\n\r\n            if(data[clc_r][clc_c].f == clc_funcStr){\r\n                setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n                // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n            }\r\n        }\r\n    }\r\n\r\n    //calc\u51FD\u6570\u94FE\r\n    file.calcChain = calc;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, calc, { \"k\": \"calcChain\" });\r\n    for(let i = 0; i < funcData.length; i++){\r\n        let funcData_r = funcData[i].r,\r\n            funcData_c = funcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[funcData_r][funcData_c], { \"r\": funcData_r, \"c\": funcData_c });\r\n    }\r\n\r\n    //\u7B5B\u9009\u914D\u7F6E\r\n    if(filterObj != null){\r\n        file.filter_select = filterObj.filter_select;\r\n        file.filter = filterObj.filter;\r\n    }\r\n    else{\r\n        file.filter_select = null;\r\n        file.filter = null;\r\n    }\r\n    createFilterOptions(file.filter_select, file.filter);\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter_select, { \"k\": \"filter_select\" });\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\u914D\u7F6E\r\n    file.luckysheet_conditionformat_save = cf;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_conditionformat_save, { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\r\n    dataVerificationCtrl.dataVerification = dataVerification;\r\n    file.dataVerification = dataVerification;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.dataVerification, { \"k\": \"dataVerification\" });\r\n\r\n    //\u8D85\u94FE\u63A5\r\n    hyperlinkCtrl.hyperlink = hyperlink;\r\n    file.hyperlink = hyperlink;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.hyperlink, { \"k\": \"hyperlink\" });\r\n\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n}\r\n\r\n//\u590D\u5236\u526A\u5207 \u5237\u65B0\u8868\u683C\r\nfunction jfrefreshgrid_pastcut(source, target, RowlChange){\r\n    //\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\u8054\u52A8\r\n    let execF_rc = {};\r\n    formula.execFunctionExist = [];\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    for(let r = source[\"range\"].row[0]; r <= source[\"range\"].row[1]; r++){\r\n        for(let c = source[\"range\"].column[0]; c <= source[\"range\"].column[1]; c++){\r\n            if((r + \"_\" + c + \"_\" + source[\"sheetIndex\"]) in execF_rc){\r\n                continue;\r\n            }\r\n\r\n            execF_rc[r + \"_\" + c + \"_\" + source[\"sheetIndex\"]] = 0;\r\n            formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": source[\"sheetIndex\"] });\r\n        }\r\n    }\r\n\r\n    for(let r = target[\"range\"].row[0]; r <= target[\"range\"].row[1]; r++){\r\n        for(let c = target[\"range\"].column[0]; c <= target[\"range\"].column[1]; c++){\r\n            if((r + \"_\" + c + \"_\" + target[\"sheetIndex\"]) in execF_rc){\r\n                continue;\r\n            }\r\n\r\n            execF_rc[r + \"_\" + c + \"_\" + target[\"sheetIndex\"]] = 0;\r\n            formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": target[\"sheetIndex\"] });\r\n        }\r\n    }\r\n\r\n\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": \"pasteCut\",\r\n            \"source\": source,\r\n            \"target\": target,\r\n            \"RowlChange\": RowlChange\r\n        })\r\n    }\r\n\r\n    //config\r\n    let rowHeight;\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        Store.config = source[\"curConfig\"];\r\n        rowHeight = source[\"curData\"].length;\r\n        Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"config\"] = target[\"curConfig\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.config = target[\"curConfig\"];\r\n        rowHeight = target[\"curData\"].length;\r\n        Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"config\"] = source[\"curConfig\"];\r\n    }\r\n\r\n    if(RowlChange){\r\n        Store.visibledatarow = [];\r\n        Store.rh_height = 0;\r\n        \r\n        for (let i = 0; i < rowHeight; i++) {\r\n            let rowlen = Store.defaultrowlen;\r\n            \r\n            if (Store.config[\"rowlen\"] != null && Store.config[\"rowlen\"][i] != null) {\r\n                rowlen = Store.config[\"rowlen\"][i];\r\n            }\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][i] != null) {\r\n                rowlen = Store.config[\"rowhidden\"][i];\r\n                Store.visibledatarow.push(Store.rh_height);\r\n                continue;\r\n            }\r\n            else {\r\n                Store.rh_height += rowlen + 1;\r\n            }\r\n\r\n            Store.visibledatarow.push(Store.rh_height);//\u884C\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n        }\r\n        Store.rh_height += 80;\r\n        // sheetmanage.showSheet();\r\n\r\n        if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n            let rowlenArr = computeRowlenArr(target[\"curData\"].length, target[\"curConfig\"]);\r\n            Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"visibledatarow\"] = rowlenArr;\r\n        }\r\n        else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n            let rowlenArr = computeRowlenArr(source[\"curData\"].length, source[\"curConfig\"]);\r\n            Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"visibledatarow\"] = rowlenArr;\r\n        }\r\n    }\r\n\r\n    //Store.flowdata\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        Store.flowdata = source[\"curData\"];\r\n        Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"data\"] = target[\"curData\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.flowdata = target[\"curData\"];\r\n        Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"data\"] = source[\"curData\"];\r\n    }\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n    \r\n    //luckysheet_select_save\r\n    if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.luckysheet_select_save = [{\"row\": target[\"range\"].row, \"column\": target[\"range\"].column}];\r\n    }\r\n    else{\r\n        Store.luckysheet_select_save = [{\"row\": source[\"range\"].row, \"column\": source[\"range\"].column}];\r\n    }\r\n    if(Store.luckysheet_select_save.length > 0){\r\n        //\u6709\u9009\u533A\u65F6\uFF0C\u5237\u65B0\u4E00\u4E0B\u9009\u533A\r\n        selectHightlightShow();\r\n    }\r\n\r\n    //\u6761\u4EF6\u683C\u5F0F\r\n    Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])].luckysheet_conditionformat_save = source[\"curCdformat\"];\r\n    Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])].luckysheet_conditionformat_save = target[\"curCdformat\"];\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        dataVerificationCtrl.dataVerification = source[\"curDataVerification\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        dataVerificationCtrl.dataVerification = target[\"curDataVerification\"]\r\n    }\r\n    Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])].dataVerification = source[\"curDataVerification\"];\r\n    Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])].dataVerification = target[\"curDataVerification\"];\r\n    \r\n    \r\n    formula.execFunctionExist.reverse();\r\n    formula.execFunctionGroup(null, null, null, null, target[\"curData\"]);\r\n    formula.execFunctionGlobalData = null;\r\n\r\n    let index = getSheetIndex(Store.currentSheetIndex);\r\n    let file = Store.luckysheetfile[index];\r\n    file.scrollTop  = $(\"#luckysheet-cell-main\").scrollTop();\r\n    file.scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft()\r\n    \r\n    sheetmanage.showSheet();\r\n\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n\r\n    sheetmanage.storeSheetParamALL();\r\n\r\n    //saveparam\r\n    //\u6765\u6E90\u8868\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curConfig\"], { \"k\": \"config\" });\r\n    //\u76EE\u7684\u8868\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curConfig\"], { \"k\": \"config\" });\r\n    \r\n    //\u6765\u6E90\u8868\r\n    server.historyParam(source[\"curData\"], source[\"sheetIndex\"], {\"row\": source[\"range\"][\"row\"], \"column\": source[\"range\"][\"column\"]});\r\n    //\u76EE\u7684\u8868\r\n    server.historyParam(target[\"curData\"], target[\"sheetIndex\"], {\"row\": target[\"range\"][\"row\"], \"column\": target[\"range\"][\"column\"]});\r\n\r\n    //\u6765\u6E90\u8868\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curCdformat\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n    //\u76EE\u7684\u8868\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curCdformat\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //\u6765\u6E90\u8868\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curDataVerification\"], { \"k\": \"dataVerification\" });\r\n    //\u76EE\u7684\u8868\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curDataVerification\"], { \"k\": \"dataVerification\" });\r\n}\r\n\r\n//\u884C\u9AD8\u3001\u5217\u5BBD\u6539\u53D8 \u5237\u65B0\u8868\u683C\r\nfunction jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){\r\n    rhchInit(rowheight, colwidth);\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    sheetmanage.storeSheetParam();\r\n\r\n    //\u884C\u9AD8\u5217\u5BBD\u6539\u53D8\u65F6 \u91CD\u65B0\u8BA1\u7B97sparklines\r\n    let calcChain = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].calcChain;\r\n    \r\n    if(calcChain != null && calcChain.length > 0){\r\n        if(Store.config[\"rowlen\"] == null){\r\n            Store.config[\"rowlen\"] = {};\r\n        }\r\n\r\n        if(Store.config[\"columnlen\"] == null){\r\n            Store.config[\"columnlen\"] = {};\r\n        }            \r\n\r\n        for(let i = 0; i < calcChain.length; i++){\r\n            let r = calcChain[i].r, c = calcChain[i].c, index = calcChain[i].index;\r\n\r\n            if(index == Store.currentSheetIndex && Store.flowdata[r][c] != null && Store.flowdata[r][c].spl != null && ((r in Store.config[\"rowlen\"]) || (c in Store.config[\"columnlen\"]))){\r\n                window.luckysheetCurrentRow = r;\r\n                window.luckysheetCurrentColumn = c;\r\n                window.luckysheetCurrentFunction = Store.flowdata[r][c].f;\r\n\r\n                let fp = $.trim(formula.functionParserExe(Store.flowdata[r][c].f));\r\n                let sparklines = new Function(\"return \" + fp)();\r\n                Store.flowdata[r][c].spl = sparklines;\r\n\r\n                server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[r][c], { \"r\": r, \"c\": c });\r\n            }\r\n        }\r\n\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n    }\r\n    \r\n    //\u6279\u6CE8\u6846\u540C\u6B65\r\n    luckysheetPostil.positionSync();\r\n    //\u9009\u533A\u540C\u6B65\r\n    selectHightlightShow();\r\n    // \u534F\u540C\u63D0\u793A\u6846\u540C\u6B65\r\n    collaborativeEditBox();\r\n    //\u6539\u53D8\u5355\u5143\u683C\u884C\u9AD8\uFF0C\u590D\u5236\u865A\u7EBF\u6846\u540C\u6B65\r\n    if($(\".luckysheet-selection-copy\").is(\":visible\")){\r\n        selectionCopyShow();\r\n    }\r\n\r\n    //\u6539\u53D8\u5355\u5143\u683C\u884C\u9AD8\uFF0C\u9009\u533A\u4E0B\u62C9icon\u9690\u85CF\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n    }\r\n\r\n    //\u6709\u51BB\u7ED3\u72B6\u6001\u65F6\uFF0C\u540C\u6B65\u884C\u9AD8\u3001\u5217\u5BBD\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && luckysheetFreezen.freezenverticaldata != null){\r\n        let row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n        let col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        let scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st], \r\n            row_st + 1, \r\n            scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), \r\n            top\r\n        ];\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st], \r\n            col_st + 1, \r\n            scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), \r\n            left\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, freezenverticaldata, left);\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else if(luckysheetFreezen.freezenhorizontaldata != null){\r\n        let row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n        let scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st], \r\n            row_st + 1, \r\n            scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), \r\n            top\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else if(luckysheetFreezen.freezenverticaldata != null){\r\n        let col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n        let scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st], \r\n            col_st + 1, \r\n            scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), \r\n            left\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else{\r\n        //\u6709\u7B5B\u9009\u6807\u5FD7\u65F6\uFF0C\u540C\u6B65\u7B5B\u9009\u6309\u94AE\u548C\u7B5B\u9009\u8303\u56F4\u4F4D\u7F6E\r\n        if($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").length > 0){\r\n            $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function(i, e){\r\n                let str = $(e).data(\"str\"), cindex = $(e).data(\"cindex\");\r\n\r\n                let left = Store.visibledatacolumn[cindex] - 20;\r\n                let top = str - 1 == -1 ? 0 : Store.visibledatarow[str - 1];\r\n\r\n                $(e).css({ \"left\": left, \"top\": top });\r\n            });\r\n        }\r\n    }\r\n\r\n    if($(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).length > 0){\r\n        let luckysheet_filter_save = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select;\r\n\r\n        let r1 = luckysheet_filter_save.row[0], \r\n            r2 = luckysheet_filter_save.row[1];\r\n        let c1 = luckysheet_filter_save.column[0], \r\n            c2 = luckysheet_filter_save.column[1];\r\n\r\n        let row = Store.visibledatarow[r2], \r\n            row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        let col = Store.visibledatacolumn[c2], \r\n            col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        $(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1\r\n        });\r\n    }\r\n\r\n    sheetmanage.showSheet();\r\n\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n   \r\n}\r\n\r\n//Refresh the canvas display data according to scrollHeight and scrollWidth\r\nfunction luckysheetrefreshgrid(scrollWidth, scrollHeight) {\r\n    formula.groupValuesRefresh();\r\n    \r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null || luckysheetFreezen.freezenhorizontaldata != null) {\r\n        let freezen_horizon_px, freezen_horizon_ed, freezen_horizon_scrollTop;\r\n        let freezen_vertical_px, freezen_vertical_ed, freezen_vertical_scrollTop;\r\n        let drawWidth = Store.luckysheetTableContentHW[0], drawHeight = Store.luckysheetTableContentHW[1];\r\n        \r\n        if (luckysheetFreezen.freezenverticaldata != null && luckysheetFreezen.freezenhorizontaldata != null) {\r\n            freezen_horizon_px = luckysheetFreezen.freezenhorizontaldata[0];\r\n            freezen_horizon_ed = luckysheetFreezen.freezenhorizontaldata[1];\r\n            freezen_horizon_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n            freezen_vertical_px = luckysheetFreezen.freezenverticaldata[0];\r\n            freezen_vertical_ed = luckysheetFreezen.freezenverticaldata[1];\r\n            freezen_vertical_scrollTop = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n            //\u5DE6\u4E0Acanvas freezen_3\r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                freezen_horizon_scrollTop, \r\n                freezen_vertical_px, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_3\"\r\n            );\r\n\r\n            //\u4E0A\u53F3canvas freezen_4\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                freezen_horizon_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_4\"\r\n            );\r\n\r\n            //\u5DE6\u4E0Bcanvas freezen_7\r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                freezen_vertical_px, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_7\"\r\n            );\r\n\r\n            //\u53F3\u4E0Bcanvas luckysheetTableContent\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n\r\n            //\u6807\u9898\r\n            luckysheetDrawgridColumnTitle(freezen_vertical_scrollTop, freezen_vertical_px, Store.rowHeaderWidth);\r\n            luckysheetDrawgridColumnTitle(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth\r\n            );\r\n            \r\n            luckysheetDrawgridRowTitle(freezen_horizon_scrollTop, freezen_horizon_px, Store.columnHeaderHeight);\r\n            luckysheetDrawgridRowTitle(\r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n           \r\n        }\r\n        else if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            freezen_horizon_px = luckysheetFreezen.freezenhorizontaldata[0];\r\n            freezen_horizon_ed = luckysheetFreezen.freezenhorizontaldata[1];\r\n            freezen_horizon_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n            luckysheetDrawMain(\r\n                scrollWidth, \r\n                freezen_horizon_scrollTop, \r\n                drawWidth, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_h\"\r\n            );\r\n            luckysheetDrawMain(\r\n                scrollWidth, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawWidth, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                null, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n        \r\n            luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, null);\r\n            \r\n            luckysheetDrawgridRowTitle(freezen_horizon_scrollTop, freezen_horizon_px, Store.columnHeaderHeight);\r\n            luckysheetDrawgridRowTitle(\r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n            \r\n        }\r\n        else if (luckysheetFreezen.freezenverticaldata != null) {\r\n            freezen_vertical_px = luckysheetFreezen.freezenverticaldata[0];\r\n            freezen_vertical_ed = luckysheetFreezen.freezenverticaldata[1];\r\n            freezen_vertical_scrollTop = luckysheetFreezen.freezenverticaldata[2];\r\n            \r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                scrollHeight, \r\n                freezen_vertical_px, \r\n                drawHeight, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_v\"\r\n            );\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                scrollHeight, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                drawHeight, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth, \r\n                null\r\n            );\r\n            \r\n            luckysheetDrawgridRowTitle(scrollHeight, drawHeight, null);\r\n            \r\n            luckysheetDrawgridColumnTitle(freezen_vertical_scrollTop, freezen_vertical_px, Store.rowHeaderWidth);\r\n            luckysheetDrawgridColumnTitle(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth\r\n            );\r\n            \r\n        }\r\n    }\r\n    else {\r\n        if($(\"#luckysheetTableContent\").length == 0){\r\n            return;\r\n        }\r\n        let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n        luckysheetDrawMain(scrollWidth, scrollHeight);\r\n    \r\n        // luckysheetTableContent.clearRect(0, 0, 46, 20);\r\n        \r\n        luckysheetDrawgridColumnTitle(scrollWidth);\r\n        luckysheetDrawgridRowTitle(scrollHeight);\r\n\r\n        //\u6E05\u9664canvas\u5DE6\u4E0A\u89D2\u533A\u57DF \u9632\u6B62\u5217\u6807\u9898\u680F\u5E8F\u5217\u53F7\u6EA2\u51FA\u663E\u793A\r\n        \r\n        luckysheetTableContent.clearRect(0, 0, (Store.rowHeaderWidth* Store.devicePixelRatio-1) , (Store.columnHeaderHeight* Store.devicePixelRatio-1) );\r\n    }\r\n}\r\n\r\nexport {\r\n    jfrefreshgrid,\r\n    jfrefreshgridall,\r\n    jfrefreshrange,\r\n    jfrefreshgrid_adRC,\r\n    jfrefreshgrid_deleteCell,\r\n    jfrefreshgrid_pastcut,\r\n    jfrefreshgrid_rhcw,\r\n    luckysheetrefreshgrid,\r\n}", "// \u81EA\u5B9A\u4E49\u56FE\u7247\u7684\u66F4\u65B0\u65B9\u6CD5\u4F8B\u5982: customImageUpdate(\"POST\", \"http://127.0.0.1:8000/luckysheetimageprocess/\", d)\r\nfunction customImageUpdate(method, url, obj) {\r\n    return new Promise((resolve, reject) => {\r\n        const xhr = new XMLHttpRequest() || new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n        xhr.open(method, url);\r\n        xhr.send(JSON.stringify(obj)); // \u53D1\u9001 POST/GET \u6570\u636E\r\n        xhr.onreadystatechange = function () {\r\n            if (xhr.readyState == 4) {\r\n                if (xhr.status == 200) {\r\n                    resolve(xhr.responseText);\r\n                } else {\r\n                    reject(\"error\");\r\n                }\r\n            }\r\n        };\r\n    });\r\n}\r\n\r\nexport {\r\n    customImageUpdate\r\n}", "import pako from 'pako'\r\nimport { showloading, hideloading } from '../global/loading';\r\nimport { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh';\r\nimport editor from '../global/editor'\r\nimport { sheetHTML, luckyColor } from './constant';\r\nimport sheetmanage from './sheetmanage';\r\nimport menuButton from './menuButton';\r\nimport { createFilterOptions } from './filter';\r\nimport luckysheetFreezen from './freezen';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport { getObjType, replaceHtml, getByteLen } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\nimport { collaborativeEditBox } from './select'\r\nimport locale from '../locale/locale';\r\nimport dayjs from \"dayjs\";\r\nimport json from '../global/json';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport {customImageUpdate} from './imageUpdateCtrl';\r\nimport method from '../global/method';\r\n\r\nconst server = {\r\n    gridKey: null,\r\n    loadUrl: null,\r\n    updateUrl: null,\r\n    updateImageUrl: null,\r\n    title: null,\r\n\t\tloadSheetUrl: null,\r\n\t\tretryTimer:null,\r\n    allowUpdate: false, //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\r\n    historyParam: function(data, sheetIndex, range) {\r\n    \tlet _this = this;\r\n\r\n\t    let r1 = range.row[0], r2 = range.row[1];\r\n\t    let c1 = range.column[0], c2 = range.column[1];\r\n\r\n\t    if(r1 == r2 && c1 == c2){ //\u5355\u4E2A\u5355\u5143\u683C\u66F4\u65B0\r\n\t        let v = data[r1][c1];\r\n\t        _this.saveParam(\"v\", sheetIndex, v, { \"r\": r1, \"c\": c1 });\r\n\t    }\r\n\t    else{ //\u8303\u56F4\u5355\u5143\u683C\u66F4\u65B0\r\n\t        let rowlen = r2 - r1 + 1;\r\n\t        let collen = c2 - c1 + 1;\r\n\r\n\t        let timeR = Math.floor(1000 / collen);\r\n\t        let n = Math.ceil(rowlen / timeR); //\u5206\u6279\u6B21\u66F4\u65B0\uFF0C\u4E00\u6B21\u6700\u591A1000\u4E2A\u5355\u5143\u683C\r\n\r\n\t        for(let i = 0; i < n; i++){\r\n\t            let str = r1 + timeR * i;\r\n\r\n\t\t\t\tlet edr;\r\n\t            if(i == n - 1){\r\n\t                edr = r2;\r\n\t            }\r\n\t            else{\r\n\t                edr = r1 + timeR * (i + 1) - 1;\r\n\t            }\r\n\r\n\t            let v = [];\r\n\r\n\t            for(let r = str; r <= edr; r++){\r\n\t                let v_row = [];\r\n\r\n\t                for(let c = c1; c <= c2; c++){\r\n\t\t\t\t\t\tif(data[r]==null){\r\n\t\t\t\t\t\t\tv_row.push(null);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse{\r\n\t\t\t\t\t\t\tv_row.push(data[r][c]);\r\n\t\t\t\t\t\t}\r\n\t                }\r\n\r\n\t                v.push(v_row);\r\n\t            }\r\n\r\n\t            _this.saveParam(\"rv\", sheetIndex, v, { \"range\": { \"row\": [str, edr], \"column\": [c1, c2] } });\r\n\r\n\t            if(i == n - 1){\r\n\t                _this.saveParam(\"rv_end\", sheetIndex, null);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t},\r\n    saveParam: function (type, index, value, params) {\r\n    \tlet _this = this;\r\n\r\n\t    if(!_this.allowUpdate){\r\n\t        return;\r\n\t    }\r\n\r\n\t    if(value == undefined){\r\n\t        value = null;\r\n\t    }\r\n\r\n\t    let d = {};\r\n\t    d.t = type;\r\n\t    d.i = index;\r\n\t    d.v = value;\r\n\r\n\t\t//\u5207\u6362sheet\u9875\u4E0D\u53D1\u540E\u53F0\uFF0CTODO\uFF1A\u6539\u4E3A\u53D1\u540E\u53F0+\u540E\u53F0\u4E0D\u5E7F\u64AD\r\n\t\tif(type === 'shs'){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t    if (type == \"rv\") { //\u5355\u5143\u683C\u6279\u91CF\u66F4\u65B0\r\n\t        d.range = params.range;\r\n\t    }\r\n\t    else if (type == \"v\" || type == \"fu\" || type == \"fm\") {\r\n\t        d.r = params.r;\r\n\t        d.c = params.c;\r\n\t    }\r\n\t    else if (type == \"fc\") {\r\n\t        d.op = params.op;\r\n\t        d.pos = params.pos;\r\n\t    }\r\n\t    else if (type == \"drc\" || type == \"arc\" || type == \"h\" || type == \"wh\") {\r\n\t        d.rc = params.rc;\r\n\t    }\r\n\t    else if (type == \"c\") {\r\n\t        d.cid = params.cid;\r\n\t        d.op = params.op;\r\n\t    }\r\n\t    else if (type == \"f\") {\r\n\t        d.op = params.op;\r\n\t        d.pos = params.pos;\r\n\t    }\r\n\t    else if (type == \"s\") {\r\n\r\n\t    }\r\n\t    else if (type == \"sh\") {\r\n\t        d.op = params.op;\r\n\t        if(params.cur != null){\r\n\t            d.cur = params.cur;\r\n\t        }\r\n\t    }\r\n\t    else if (type == \"cg\") {\r\n\t        d.k = params.k;\r\n\t    }\r\n\t    else if (type == \"all\") {\r\n\t        d.k = params.k;\r\n\t        // d.s = params.s;\r\n\t    }\r\n\r\n\t    // TODO \u914D\u7F6E\u81EA\u5B9A\u4E49\u65B9\u5F0F\u540C\u6B65\u56FE\u7247\r\n        const customImageUpdateMethodConfig = luckysheetConfigsetting.imageUpdateMethodConfig\r\n\t\tif (JSON.stringify(customImageUpdateMethodConfig) !== \"{}\") {\r\n            if (\"images\" != d.k) {\r\n                let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), {to: \"string\"});\r\n\r\n                if (_this.websocket != null) {\r\n                    _this.websocket.send(msg);\r\n                }\r\n            } else {\r\n                customImageUpdate(customImageUpdateMethodConfig.method, customImageUpdateMethodConfig.url, d)\r\n                    .then((data) => {\r\n                        console.log(data);\r\n                    })\r\n                    .catch((err) => {\r\n                        console.log(err);\r\n                    });\r\n\r\n            }\r\n        } else {\r\n            let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), {to: \"string\"});\r\n            if (_this.websocket != null) {\r\n                _this.websocket.send(msg);\r\n            }\r\n        }\r\n\r\n\t},\r\n    websocket: null,\r\n    wxErrorCount: 0,\r\n    openWebSocket: function(){\r\n        let _this = this;\r\n\r\n        if('WebSocket' in window){\r\n\t\t\tlet wxUrl = _this.updateUrl + \"?t=111&g=\" + encodeURIComponent(_this.gridKey);\r\n\t\t\tif(_this.updateUrl.indexOf('?') > -1){\r\n\t\t\t\twxUrl = _this.updateUrl + \"&t=111&g=\" + encodeURIComponent(_this.gridKey);\r\n\t\t\t}\r\n\r\n\t        _this.websocket = new WebSocket(wxUrl);\r\n\r\n\t        //\u8FDE\u63A5\u5EFA\u7ACB\u65F6\u89E6\u53D1\r\n\t        _this.websocket.onopen = function() {\r\n\t        \tconsole.info(locale().websocket.success);\r\n\t        \thideloading();\r\n\t\t\t\t_this.wxErrorCount = 0;\r\n\r\n\t            //\u9632\u6B62websocket\u957F\u65F6\u95F4\u4E0D\u53D1\u9001\u6D88\u606F\u5BFC\u81F4\u65AD\u8FDE\r\n\t\t\t\t_this.retryTimer = setInterval(function(){\r\n\t                _this.websocket.send(\"rub\");\r\n\t            }, 60000);\r\n\t        }\r\n\r\n\t        //\u5BA2\u6237\u7AEF\u63A5\u6536\u670D\u52A1\u7AEF\u6570\u636E\u65F6\u89E6\u53D1\r\n\t        _this.websocket.onmessage = function(result){\r\n\t\t\t\tStore.result = result\r\n\t\t\t\tlet data = new Function(\"return \" + result.data)();\r\n        method.createHookFunction('cooperativeMessage', data)\r\n\t\t\t\tconsole.info(data);\r\n\t\t\t\tlet type = data.type;\r\n\t\t\t\tlet {message,id} = data;\r\n\t\t\t\t// \u7528\u6237\u9000\u51FA\u65F6\uFF0C\u5173\u95ED\u534F\u540C\u7F16\u8F91\u65F6\u5176\u63D0\u793A\u6846\r\n\t\t\t\tif(message === '\u7528\u6237\u9000\u51FA') {\r\n\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + id).hide();\r\n\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize = Store.cooperativeEdit.changeCollaborationSize.filter(value => {\r\n\t\t\t\t\t\treturn value.id != id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tStore.cooperativeEdit.checkoutData = Store.cooperativeEdit.checkoutData.filter(value => {\r\n\t\t\t\t\t\treturn value.id != id\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t            if(type == 1){ //send \u6210\u529F\u6216\u5931\u8D25\r\n                const oldIndex = data.data.v.index;\r\n                const sheetToUpdate = Store.luckysheetfile.filter((sheet)=> sheet.index === oldIndex)[0];\r\n                if (sheetToUpdate !== null) {\r\n                  setTimeout(() => {\r\n                    const index = data.data.i;\r\n                    sheetToUpdate.index = index;\r\n                    Store.currentSheetIndex = index;\r\n\r\n                    $(`#luckysheet-sheets-item${oldIndex}`).attr('data-index', index);\r\n                    $(`#luckysheet-sheets-item${oldIndex}`).prop('id', `luckysheet-sheets-item${index}`);\r\n                    $(`#luckysheet-datavisual-selection-set-${oldIndex}`).prop('id', `luckysheet-datavisual-selection-set-${index}`);\r\n                  }, 1);\r\n                }\r\n\t            }\r\n\t            else if(type == 2){ //\u66F4\u65B0\u6570\u636E\r\n\t                let item = JSON.parse(data.data);\r\n\t\t\t\t\t_this.wsUpdateMsg(item);\r\n\t\t\t\t\tlet chang_data = JSON.parse(data.data)\r\n\t\t\t\t\tif(chang_data.k == 'columnlen') {\r\n\t\t\t\t\t\tcollaborativeEditBox(chang_data.v,null)\r\n\t\t\t\t\t} else if(chang_data.k == 'rowlen') {\r\n\t\t\t\t\t\tcollaborativeEditBox(null,chang_data.v)\r\n\t\t\t\t\t}\r\n\t            }\r\n\t            else if(type == 3){ //\u591A\u4EBA\u64CD\u4F5C\u4E0D\u540C\u9009\u533A(\"t\": \"mv\")\uFF08\u7528\u4E0D\u540C\u989C\u8272\u663E\u793A\u5176\u4ED6\u4EBA\u6240\u64CD\u4F5C\u7684\u9009\u533A\uFF09\r\n\t                let id = data.id;\r\n\t                let username = data.username;\r\n\t                let item = JSON.parse(data.data);\r\n\t                let type = item.t,\r\n\t                    index = item.i,\r\n\t                    value = item.v;\r\n\t\t\t\t\tif(Store.cooperativeEdit.changeCollaborationSize.length === 0) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet flag = Store.cooperativeEdit.changeCollaborationSize.some(value1 => {\r\n\t\t\t\t\t\treturn value1.id == id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif(flag) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.forEach(val => {\r\n\t\t\t\t\t\t\tif(val.id == id) {\r\n\t\t\t\t\t\t\t\tval.v = item.v[0]\r\n\t\t\t\t\t\t\t\tval.i = index\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})\r\n\t\t\t\t\t}\r\n\t                if(getObjType(value) != \"array\" && getObjType(value) !== \"object\"){\r\n\t                    value = JSON.parse(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet r = 0\r\n\t\t\t\t\tlet c = 0\r\n\t\t\t\t\tif(index == Store.currentSheetIndex){//\u53D1\u9001\u6D88\u606F\u8005\u5728\u5F53\u524D\u9875\u9762\r\n\r\n\t\t\t\t\t\tif(getObjType(value) === \"object\" && value.op === 'enterEdit'){\r\n\t\t\t\t\t\t\tr = value.range[value.range.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value.range[value.range.length - 1].column[0];\r\n\t\t\t\t\t\t\t_this.multipleRangeShow(id, username, r, c, value.op);\r\n\r\n\t\t\t\t\t\t}else {\r\n\r\n\t\t\t\t\t\t\tr = value[value.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value[value.length - 1].column[0];\r\n\r\n\t\t\t\t\t\t\t_this.multipleRangeShow(id, username, r, c);\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(getObjType(value) === \"object\" && value.op === 'enterEdit'){\r\n\t\t\t\t\t\t\tr = value.range[value.range.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value.range[value.range.length - 1].column[0];\r\n\t\t\t\t\t\t}else {\r\n\t\t\t\t\t\t\tr = value[value.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value[value.length - 1].column[0];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(Store.cooperativeEdit.checkoutData.length === 0) {\r\n\t\t\t\t\t\tif(value.op) {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,index})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet checkoutFlag = Store.cooperativeEdit.checkoutData.some(item => {\r\n\t\t\t\t\t\treturn item.id == id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif(checkoutFlag) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.forEach(item => {\r\n\t\t\t\t\t\t\tif(item.id == id) {\r\n\t\t\t\t\t\t\t\titem.username = username\r\n\t\t\t\t\t\t\t\titem.r = r\r\n\t\t\t\t\t\t\t\titem.c = c\r\n\t\t\t\t\t\t\t\titem.index = index\r\n\t\t\t\t\t\t\t\tif (value.op === 'enterEdit') {\r\n\t\t\t\t\t\t\t\t\titem.op = value.op\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(value.op === 'enterEdit') {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,index})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//\u5176\u4ED6\u5BA2\u6237\u7AEF\u5207\u6362\u9875\u9762\u65F6\r\n\t\t\t\t\tStore.cooperativeEdit.checkoutData.forEach(item => {\r\n\t\t\t\t\t\tif(item.index != Store.currentSheetIndex) {\r\n\t\t\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + item.id).hide();\r\n\t\t\t\t\t\t\titem.op == ''\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif($(\"#luckysheet-multipleRange-show-\" + id)[0]) {\r\n\t\t\t\t\t\tlet change_bottom = $(\"#luckysheet-multipleRange-show-\" + id)[0].offsetHeight - 1\r\n\t\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \">.username\").css({\"bottom\":change_bottom + 'px'})\r\n\t\t\t\t\t}\r\n\t            }\r\n\t            else if(type == 4){ //\u6279\u91CF\u6307\u4EE4\u66F4\u65B0\r\n\t\t\t\t\t// let items = JSON.parse(data.data);\r\n\r\n\t\t\t\t\t// After editing by multiple people, data.data may appear as an empty string\r\n\t\t\t\t\tlet items = data.data === \"\" ?  data.data : JSON.parse(data.data);\r\n\r\n\t                for(let i = 0; i < items.length; i++){\r\n\t                    _this.wsUpdateMsg(item[i]);\r\n\t                }\r\n\t            } else if (type == 5) {\r\n                showloading(data.data);\r\n              } else if (type == 6) {\r\n                hideloading();\r\n              }\r\n\t        }\r\n\r\n\t        //\u901A\u4FE1\u53D1\u751F\u9519\u8BEF\u65F6\u89E6\u53D1\r\n\t        _this.websocket.onerror = function(){\r\n\t            _this.wxErrorCount++;\r\n\r\n\t            if(_this.wxErrorCount > 3){\r\n\t                showloading(locale().websocket.refresh);\r\n\t            }\r\n\t            else{\r\n\t                showloading(locale().websocket.wait);\r\n\t                _this.openWebSocket();\r\n\t            }\r\n\t        }\r\n\r\n\t        //\u8FDE\u63A5\u5173\u95ED\u65F6\u89E6\u53D1\r\n\t        _this.websocket.onclose = function(e){\r\n\t\t\t\tconsole.info(locale().websocket.close);\r\n\t\t\t\tif(e.code === 1000){\r\n\t\t\t\t\tclearInterval(_this.retryTimer)\r\n\t\t\t\t\t_this.retryTimer = null\r\n\t\t\t\t}else{\r\n\t\t\t\t\talert(locale().websocket.contact);\r\n\t\t\t\t}\r\n\t        }\r\n\t    }\r\n\t    else{\r\n\t        alert(locale().websocket.support);\r\n\t    }\r\n    },\r\n    wsUpdateMsg: function(item) {\r\n\t    let type = item.t,\r\n\t        index = item.i,\r\n\t        value = item.v;\r\n\r\n\t    let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n\t    if([\"v\",\"rv\",\"cg\",\"all\",\"fc\",\"drc\",\"arc\",\"f\",\"fsc\",\"fsr\",\"sh\",\"c\"].includes(type) && file == null){\r\n\t        return;\r\n\t    }\r\n\r\n\t    if(type == \"v\"){ //\u5355\u4E2A\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let r = item.r, c = item.c;\r\n\t        file.data[r][c] = value;\r\n\r\n\t        if(index == Store.currentSheetIndex){//\u66F4\u65B0\u6570\u636E\u4E3A\u5F53\u524D\u8868\u683C\u6570\u636E\r\n\t\t\t\tStore.flowdata = file.data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n\t            //\u5982\u679C\u66F4\u65B0\u7684\u5355\u5143\u683C\u6709\u6279\u6CE8\r\n\t            if(value != null && value.ps != null){\r\n\t                luckysheetPostil.buildPs(r, c, value.ps);\r\n\t            }\r\n\t            else{\r\n\t                luckysheetPostil.buildPs(r, c, null);\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t\telse if(type == \"rv\"){ //\u8303\u56F4\u5355\u5143\u683C\u6570\u636E\u66F4\u65B0\r\n\t\t\tif(Object.keys(item.range).length > 0) {\r\n\t\t\t\tStore.cooperativeEdit.merge_range = item.range\r\n\t\t\t\tStore.cooperativeEdit.merge_range.v = item.v\r\n\t\t\t\tcollaborativeEditBox();\r\n\t\t\t}\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let r1 = item.range.row[0], r2 = item.range.row[1];\r\n\t        let c1 = item.range.column[0], c2 = item.range.column[1];\r\n\r\n\t        for(let r = r1; r <= r2; r++){\r\n\t            for(let c = c1; c <= c2; c++){\r\n\t                file.data[r][c] = value[r - r1][c - c1];\r\n\t            }\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){//\u66F4\u65B0\u6570\u636E\u4E3A\u5F53\u524D\u8868\u683C\u6570\u636E\r\n\t\t\t\tStore.flowdata = file.data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n\t            //\u5982\u679C\u66F4\u65B0\u7684\u5355\u5143\u683C\u6709\u6279\u6CE8\r\n\t            for(let r = r1; r <= r2; r++){\r\n\t                for(let c = c1; c <= c2; c++){\r\n\t                    if(value[r - r1][c - c1] != null && value[r - r1][c - c1].ps != null){\r\n\t                        luckysheetPostil.buildPs(r, c, value[r - r1][c - c1].ps);\r\n\t                    }\r\n\t                    else{\r\n\t                        luckysheetPostil.buildPs(r, c, null);\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t\t\t}\r\n\t    }\r\n\t    else if(type == \"cg\"){ //config\u66F4\u65B0\uFF08rowhidden\uFF0Crowlen\uFF0Ccolumnlen\uFF0Cmerge\uFF0CborderInfo\uFF09\r\n\t        let k = item.k;\r\n\r\n\t        if(k == \"borderInfo\"){\r\n\t\t\t\tfile[\"config\"][\"borderInfo\"] = value;\r\n\t        }\r\n\t        else{\r\n\t            if(!(k in file[\"config\"])){\r\n\t                file[\"config\"][k] = {};\r\n\t            }\r\n\r\n\t            // for(let key in value){\r\n\t            //     file[\"config\"][k][key] = value[key];\r\n\t\t\t\t// }\r\n\r\n\t\t\t\t// \u26A0\uFE0F \u4E0A\u9762\u7684\u5904\u7406\u65B9\u5F0F\u4F1A\u5BFC\u81F4\u90E8\u5206\u914D\u7F6E\u9879\u88AB\u9057\u6F0F\uFF0C\u4EE5\u81F4\u534F\u540C\u7F16\u8F91\u7684\u65F6\u5019\u591A\u89C6\u56FE\u51FA\u73B0\u4E0D\u4E00\u81F4\u7684\u60C5\u51B5\uFF0C\u8C03\u6574\u5904\u7406\u7684\u7B56\u7565\u4E3A\u76F4\u63A5\u66FF\u6362\u914D\u7F6E\u9879\uFF1A\r\n\t\t\t\t// \u53EF\u80FD\u7684\u914D\u7F6E\u9879\u4E3A\uFF1A\r\n\t\t\t\t// columnlen: {0: 65, 1: 186, 2: 52}\r\n\t\t\t\t// customHeight: {0: 1, 5: 1, 6: 1}\r\n\t\t\t\t// customWidth: {0: 1, 1: 1, 2: 1}\r\n\t\t\t\t// merge: {2_1: {\u2026}, 4_2: {\u2026}, 6_2: {\u2026}}\r\n\t\t\t\t// rowlen: {0: 19, 5: 93, 6: 117}\r\n\t\t\t\tif(value && (typeof value == \"object\")){\r\n\t\t\t\t\tfile[\"config\"][k] = value;\r\n\t\t\t\t}\r\n\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){//\u66F4\u65B0\u6570\u636E\u4E3A\u5F53\u524D\u8868\u683C\u6570\u636E\r\n\t            Store.config = file[\"config\"];\r\n\r\n\t            if(k == \"rowlen\" || k == \"columnlen\" || k == \"rowhidden\"){\r\n\t                jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"all\"){ //\u901A\u7528\u4FDD\u5B58\u66F4\u65B0\r\n\t        let k = item.k;\r\n\t        file[k] = value;\r\n\r\n\t        if(k == \"name\"){ //\u5DE5\u4F5C\u8868\u540D\r\n\t            $(\"#luckysheet-sheet-container-c #luckysheet-sheets-item\" + index).find(\"span.luckysheet-sheets-item-name\").html(value);\r\n\t        }\r\n\t        else if(k == \"color\"){ //\u5DE5\u4F5C\u8868\u989C\u8272\r\n\t            let currentSheetItem = $(\"#luckysheet-sheet-container-c #luckysheet-sheets-item\" + index);\r\n\t            currentSheetItem.find(\".luckysheet-sheets-item-color\").remove();\r\n\r\n\t            if(value != null || value != \"\"){\r\n\t                currentSheetItem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value + ';\"></div>');\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"pivotTable\"){ //PivotTable\r\n\t            // luckysheet.pivotTable.changePivotTable(index);\r\n\t        }\r\n\t\t\telse if(k == \"frozen\"){ //freezen row and column\r\n\r\n\t\t\t\t// tranform frozen\r\n\t\t\t\tluckysheetFreezen.frozenTofreezen();\r\n\r\n\t            if(index == Store.currentSheetIndex){\r\n\t\t\t\t\tconst _locale = locale();\r\n\t\t\t\t\tconst locale_freezen = _locale.freezen;\r\n\t                if(file[\"freezen\"].horizontal == null){\r\n\t                    $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"fa fa-list-alt\"></i> '+locale_freezen.freezenRow);\r\n\t                    luckysheetFreezen.freezenhorizontaldata = null;\r\n\t                    $(\"#luckysheet-freezebar-horizontal\").hide();\r\n\t                }\r\n\t                else{\r\n\t                    luckysheetFreezen.createFreezenHorizontal(file[\"freezen\"].horizontal.freezenhorizontaldata, file[\"freezen\"].horizontal.top);\r\n\t                }\r\n\r\n\t                if(file[\"freezen\"].vertical == null){\r\n\t                    $(\"#luckysheet-freezen-btn-vertical\").html('<i class=\"fa fa-indent\"></i> '+locale_freezen.freezenColumn);\r\n\t                    luckysheetFreezen.freezenverticaldata = null;\r\n\t                    $(\"#luckysheet-freezebar-vertical\").hide();\r\n\t                }\r\n\t                else{\r\n\t                    luckysheetFreezen.createFreezenVertical(file[\"freezen\"].vertical.freezenverticaldata, file[\"freezen\"].vertical.left);\r\n\t                }\r\n\r\n\t                luckysheetFreezen.createAssistCanvas();\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"filter_select\"){ //\u7B5B\u9009\u8303\u56F4\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                createFilterOptions(value);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"filter\"){ //\u7B5B\u9009\u4FDD\u5B58\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                createFilterOptions(file.filter_select, value);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"luckysheet_conditionformat_save\"){ //\u6761\u4EF6\u683C\u5F0F\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"luckysheet_alternateformat_save\"){ //\u4EA4\u66FF\u989C\u8272\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"config\"){ //config\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                Store.config = value;\r\n\t                jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"dynamicArray\"){ //\u52A8\u6001\u6570\u7EC4\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t\t\t}\r\n\t\t\telse if(k == \"images\"){ //\u56FE\u7247\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\timageCtrl.images = value;\r\n\t\t\t\t\timageCtrl.allImagesShow();\r\n\t\t\t\t\timageCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(k == \"dataVerification\"){ //\u6570\u636E\u9A8C\u8BC1\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\tdataVerificationCtrl.dataVerification = value;\r\n        \t\t\tdataVerificationCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(k == \"hyperlink\"){ //\u94FE\u63A5\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\thyperlinkCtrl.hyperlink = value;\r\n        \t\t\thyperlinkCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t    }\r\n\t    else if(type == \"fc\"){ //\u51FD\u6570\u94FEcalc\r\n\t        let op = item.op, pos = item.pos;\r\n\r\n\t        if(getObjType(value) != \"object\"){\r\n\t\t\t\tvalue = new Function(\"return \" + value)();\r\n\t        }\r\n\r\n\t        let r = value.r, c = value.c;\r\n\r\n\t        let calcChain = file[\"calcChain\"] == null ? [] : file[\"calcChain\"];\r\n\r\n\t        if(op == \"add\"){\r\n\t            calcChain.push(value);\r\n\t        }\r\n\t        else if(op == \"del\"){\r\n\t            for(let a = 0; a < calcChain.length; a++){\r\n\t                if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){\r\n\t                    calcChain.splice(a, 1);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        // else if(op == \"update\"){\r\n\t        //     for(let a = 0; a < calcChain.length; a++){\r\n\t        //         if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){\r\n\t        //             calcChain[a].func = func;\r\n\t        //         }\r\n\t        //     }\r\n\t        // }\r\n\r\n\t        setTimeout(function () {\r\n\t            luckysheetrefreshgrid();\r\n\t        }, 1);\r\n\t    }\r\n\t    else if(type == \"drc\"){ //\u5220\u9664\u884C\u5217\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let rc = item.rc,\r\n\t        \tst_i = value.index,\r\n\t        \tlen = value.len,\r\n\t        \tmc = value.mc,\r\n\t        \tborderInfo = value.borderInfo;\r\n\t        let data = file.data;\r\n\r\n\t        if(rc == \"r\"){\r\n\t            file[\"row\"] -= len;\r\n\r\n\t            data.splice(st_i, len);\r\n\r\n\t            //\u7A7A\u767D\u884C\u6A21\u677F\r\n\t            let row = [];\r\n\t            for (let c = 0; c < data[0].length; c++) {\r\n\t                row.push(null);\r\n\t            }\r\n\r\n\t            //\u5220\u9664\u591A\u5C11\u884C\uFF0C\u589E\u52A0\u591A\u5C11\u884C\u7A7A\u767D\u884C\r\n\t            for (let r = 0; r < len; r++) {\r\n\t                data.push(row);\r\n\t            }\r\n\t        }\r\n\t        else{\r\n\t            file[\"column\"] -= len;\r\n\r\n\t            //\u7A7A\u767D\u5217\u6A21\u677F\r\n\t            let addcol = [];\r\n\t            for (let r = 0; r < len; r++) {\r\n\t                addcol.push(null);\r\n\t            }\r\n\r\n\t            for(let i = 0; i < data.length; i++){\r\n\t                data[i].splice(st_i, len);\r\n\r\n\t                data[i] = data[i].concat(addcol);\r\n\t            }\r\n\t        }\r\n\r\n\t        for(let x in mc){\r\n\t            let r = mc[x].r, c = mc[x].c;\r\n\t            data[r][c].mc = mc[x];\r\n\t        }\r\n\r\n\t        file[\"config\"].merge = mc;\r\n\t        file[\"config\"].borderInfo = borderInfo;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t\t\t\tStore.flowdata = data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n\t            Store.config[\"merge\"] = mc;\r\n\t            Store.config[\"borderInfo\"] = borderInfo;\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"arc\"){ //\u589E\u52A0\u884C\u5217\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let rc = item.rc,\r\n\t        \tst_i = value.index,\r\n\t        \tlen = value.len,\r\n\t\t\t\taddData = value.data,\r\n\t\t\t\tdirection = value.direction,\r\n\t        \tmc = value.mc,\r\n\t        \tborderInfo = value.borderInfo;\r\n\t        let data = $.extend(true, [], file.data);\r\n\r\n\t        if(rc == \"r\"){\r\n\t\t\t\tfile[\"row\"] += len;\r\n\r\n\t\t\t\t//\u7A7A\u884C\u6A21\u677F\r\n\t\t\t\tlet row = [];\r\n\t\t\t\tfor(let c = 0; c < data[0].length; c++){\r\n\t\t\t\t\trow.push(null);\r\n\t\t\t\t}\r\n\r\n\t            let arr = [];\r\n\t            for(let i = 0; i < len; i++){\r\n\t\t\t\t\tif(addData[i] == null){\r\n\t\t\t\t\t\tarr.push(JSON.stringify(row));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse{\r\n\t\t\t\t\t\tarr.push(JSON.stringify(addData[i]));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(direction == \"lefttop\"){\r\n\t\t\t\t\tif(st_i == 0){\r\n\t\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.unshift(' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse{\r\n\t\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.splice(' + st_i + ', 0, ' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.splice(' + (st_i + 1) + ', 0, ' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t}\r\n\t        }\r\n\t        else{\r\n\t\t\t\tfile[\"column\"] += len;\r\n\r\n\t            for(let i = 0; i < data.length; i++){\r\n\t\t\t\t\t/* \u5728\u6BCF\u4E00\u884C\u7684\u6307\u5B9A\u4F4D\u7F6E\u90FD\u63D2\u5165\u4E00\u5217 */\r\n\t\t\t\t\tfor (let j = 0; j < len; j++) {\r\n\t\t\t\t\t\tif(direction == \"lefttop\"){\r\n\t\t\t\t\t\t\tdata[i].splice(st_i, 0, addData[j]);\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tdata[i].splice(st_i + 1, 0, addData[j]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t            }\r\n\t        }\r\n\r\n\t        for(let x in mc){\r\n\t            let r = mc[x].r, c = mc[x].c;\r\n\t            data[r][c].mc = mc[x];\r\n\t        }\r\n\r\n\t\t\tfile.data = data;\r\n\t        file[\"config\"].merge = mc;\r\n\t        file[\"config\"].borderInfo = borderInfo;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t\t\t\tStore.flowdata = data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n\t            Store.config[\"merge\"] = mc;\r\n\t            Store.config[\"borderInfo\"] = borderInfo;\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"f\"){ //\u7B5B\u9009\r\n\t        let op = item.op, pos = item.pos;\r\n\r\n\t        let filter = file.filter;\r\n\r\n\t        if(filter == null){\r\n\t            filter = {};\r\n\t        }\r\n\r\n\t        if(op == \"upOrAdd\"){\r\n\t            filter[pos] =  value;\r\n\t        }\r\n\t        else if(op == \"del\"){\r\n\t            delete filter[pos];\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            createFilterOptions(file.filter_select, filter);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"fsc\"){ //\u6E05\u9664\u7B5B\u9009\r\n\t        file.filter = null;\r\n\t        file.filter_select = null;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n\t            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"fsr\"){ //\u6062\u590D\u7B5B\u9009\r\n\t        file.filter = value.filter;\r\n\t        file.filter_select = value.filter_select;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            createFilterOptions(file.filter_select, file.filter);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"sha\"){ //\u65B0\u5EFAsheet\r\n\t        Store.luckysheetfile.push(value);\r\n\r\n\t        let colorset = '';\r\n\t        if(value.color != null){\r\n\t            colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value.color + ';\"></div>';\r\n\t        }\r\n\r\n\t        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": value.index, \"active\": \"\", \"name\": value.name, \"style\": \"\", \"colorset\": colorset }));\r\n\t        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + value.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\t    }\r\n\t    else if(type == \"shc\"){ //\u590D\u5236sheet\r\n\t        let copyindex = value.copyindex, name = value.name;\r\n\r\n\t        let copyarrindex = getSheetIndex(copyindex);\r\n\t        let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]);\r\n\r\n\t        copyjson.index = index;\r\n\t        copyjson.name = name;\r\n\r\n\t        Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson);\r\n\r\n\t        let copyobject = $(\"#luckysheet-sheets-item\" + copyindex);\r\n\t        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": copyjson.index, \"active\": \"\", \"name\": copyjson.name, \"style\": \"\", \"colorset\": \"\" }));\r\n\t        $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(copyobject);\r\n\t        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + copyjson.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\t    }\r\n\t    else if(type == \"shd\"){ //\u5220\u9664sheet\r\n\t        for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n\t            if(Store.luckysheetfile[i].index == value.deleIndex){\r\n\r\n\t\t\t\t\t// \u5982\u679C\u5220\u9664\u7684\u662F\u5F53\u524Dsheet\uFF0C\u5219\u5207\u6362\u5230\u524D\u4E00\u4E2Asheet\u9875\r\n\t\t\t\t\tif(Store.currentSheetIndex === value.deleIndex){\r\n\t\t\t\t\t\tconst index = value.deleIndex;\r\n\r\n\t\t\t\t\t\tStore.luckysheetfile[sheetmanage.getSheetIndex(index)].hide = 1;\r\n\r\n\t\t\t\t\t\tlet luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + index);\r\n\t\t\t\t\t\tluckysheetcurrentSheetitem.hide();\r\n\r\n\t\t\t\t\t\t$(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n\r\n\t\t\t\t\t\tlet indicator = luckysheetcurrentSheetitem.nextAll(\":visible\");\r\n\t\t\t\t\t\tif (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n\t\t\t\t\t\t\tindicator = indicator.eq(0).data(\"index\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tindicator = luckysheetcurrentSheetitem.prevAll(\":visible\").eq(0).data(\"index\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$(\"#luckysheet-sheets-item\" + indicator).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n\t\t\t\t\t\tsheetmanage.changeSheetExec(indicator);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tserver.sheetDeleSave.push(Store.luckysheetfile[i]);\r\n\r\n\t\t\t\t\tStore.luckysheetfile.splice(i, 1);\r\n\r\n\t                break;\r\n\t            }\r\n\t        }\r\n\r\n\t        $(\"#luckysheet-sheets-item\" + value.deleIndex).remove();\r\n\t\t\t$(\"#luckysheet-datavisual-selection-set-\" + value.deleIndex).remove();\r\n\r\n\t    }\r\n\t    else if(type == \"shr\"){ //sheet\u4F4D\u7F6E\r\n\t        for(let x in value){\r\n\t            Store.luckysheetfile[getSheetIndex(x)].order = value[x];\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"shre\"){ //\u5220\u9664sheet\u6062\u590D\u64CD\u4F5C\r\n\t        for(let i = 0; i < server.sheetDeleSave.length; i++){\r\n\t            if(server.sheetDeleSave[i].index == value.reIndex){\r\n\t                let datav = server.sheetDeleSave[i];\r\n\r\n\t                Store.luckysheetfile.push(datav);\r\n\r\n\t                let colorset = '';\r\n\t                if(value.color != null){\r\n\t                    colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + datav.color + ';\"></div>';\r\n\t                }\r\n\r\n\t                $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": datav.index, \"active\": \"\", \"name\": datav.name, \"style\": \"\", \"colorset\": colorset }));\r\n\t                $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + datav.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\t                break;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"sh\"){ //\u9690\u85CFsheet\r\n\t        let op = item.op, cur = item.cur;\r\n\r\n\t        if(op == \"hide\"){\r\n\t            file.hide = 1;\r\n\t            $(\"#luckysheet-sheets-item\" + index).hide();\r\n\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                $(\"#luckysheet-sheets-item\" + cur).addClass(\"luckysheet-sheets-item-active\");\r\n\t                sheetmanage.changeSheetExec(cur);\r\n\t            }\r\n\t        }\r\n\t        else if(op == \"show\"){\r\n\t            file.hide = 0;\r\n\t            $(\"#luckysheet-sheets-item\" + index).show();\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"c\"){ //\u56FE\u8868\u64CD\u4F5C TODO\r\n\t        let op = item.op, cid = item.cid;\r\n\r\n\t        if(op == \"add\"){ //\u63D2\u5165\r\n\t            file.chart.push(value);\r\n\r\n\t            luckysheet.insertChartTosheet(value.sheetIndex, value.dataSheetIndex, value.option, value.chartType, value.selfOption, value.defaultOption, value.row, value.column, value.chart_selection_color, value.chart_id, value.chart_selection_id, value.chartStyle, value.rangeConfigCheck, value.rangeRowCheck, value.rangeColCheck, value.chartMarkConfig, value.chartTitleConfig, value.winWidth, value.winHeight, value.scrollLeft1, value.scrollTop1, value.chartTheme, value.myWidth, value.myHeight, value.myLeft, value.myTop, value.myindexrank1, true);\r\n\t        }\r\n\t        else if(op == \"xy\" || op == \"wh\" || op == \"update\"){ //\u79FB\u52A8 \u7F29\u653E \u66F4\u65B0\r\n\t            for(let i = 0; i < file.chart.length; i++){\r\n\t                let chartjson = file.chart[i];\r\n\r\n\t                if(chartjson.chart_id == cid){\r\n\t                    for(let item in chartjson){\r\n\t                        for(let vitem in value){\r\n\t                            if(item == vitem){\r\n\t                                chartjson[item] = value[vitem];\r\n\t                            }\r\n\t                        }\r\n\t                    }\r\n\r\n\t                    sheetmanage.saveChart(chartjson);\r\n\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        else if(op == \"del\"){ //\u5220\u9664\r\n\t            for(let i = 0; i < file.chart.length; i++){\r\n\t                let chartjson = file.chart[i];\r\n\r\n\t                if(chartjson.chart_id == cid){\r\n\t                    file.chart.splice(i, 1);\r\n\r\n\t                    $(\"#\" + cid).remove();\r\n\t                    sheetmanage.delChart($(\"#\" + cid).attr(\"chart_id\"), $(\"#\" + cid).attr(\"sheetIndex\"));\r\n\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"na\"){ //\u8868\u683C\u540D\u79F0\r\n\t        $(\"#luckysheet_info_detail_input\").val(value).css(\"width\", getByteLen(value) * 10);\r\n\t    }\r\n\t},\r\n    multipleIndex: 0,\r\n    multipleRangeShow: function(id, name, r, c, value) {\r\n    \tlet _this = this;\r\n\r\n\t    let row = Store.visibledatarow[r],\r\n\t        row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1],\r\n\t        col = Store.visibledatacolumn[c],\r\n\t        col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n\t    let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n\t    if(!!margeset){\r\n\t        row = margeset.row[1];\r\n\t        row_pre = margeset.row[0];\r\n\r\n\t        col = margeset.column[1];\r\n\t        col_pre = margeset.column[0];\r\n\t\t}\r\n\r\n\t\t// \u8D85\u51FA16\u4E2A\u5B57\u7B26\u5C31\u663E\u793A...\r\n\t\tif(getByteLen(name) > 16){\r\n\t\t\tname = getByteLen(name,16) + \"...\";\r\n\t\t}\r\n\r\n\t\t// \u5982\u679C\u6B63\u5728\u7F16\u8F91\uFF0C\u5C31\u663E\u793A\u201C\u6B63\u5728\u8F93\u5165\u201D\r\n\t\tif(value === 'enterEdit'){\r\n\t\t\tname += \" \" + locale().edit.typing;\r\n\t\t}\r\n\r\n\t    if($(\"#luckysheet-multipleRange-show-\" + id).length > 0){\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id).css({ \"position\": \"absolute\", \"left\": col_pre - 1, \"width\": col - col_pre - 1, \"top\": row_pre - 1, \"height\": row - row_pre - 1 });\r\n\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \" .username\").text(name);\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \" .username\").show();\r\n\r\n\t\t\tif(Store.cooperativeEdit.usernameTimeout['user' + id] != null){\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id])\r\n\t\t\t}\r\n\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = setTimeout(()=>{\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id]);\r\n\t\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = null;\r\n\t\t\t},10 * 1000)\r\n\r\n\r\n\r\n\t    }\r\n\t    else{\r\n\t        // let itemHtml = '<div id=\"luckysheet-multipleRange-show-'+ id +'\" data-color=\"'+ luckyColor[_this.multipleIndex] +'\" title=\"'+ name +'\" style=\"position: absolute;left: '+ (col_pre - 1) +'px;width: '+ (col - col_pre - 1) +'px;top: '+ (row_pre - 1) +'px;height: '+ (row - row_pre - 1) +'px;border: 1px solid '+ luckyColor[_this.multipleIndex] +';z-index: 15;\">'+\r\n\t        //                 '<div style=\"width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: '+ luckyColor[_this.multipleIndex] +'\"></div>'+\r\n\t\t\t//                '</div>';\r\n\r\n\t\t\tlet itemHtml = `<div\r\n\t\t\t\t\t\t\t\tid=\"luckysheet-multipleRange-show-${id}\"\r\n\t\t\t\t\t\t\t\tclass=\"luckysheet-multipleRange-show\"\r\n\t\t\t\t\t\t\t\tdata-color=\"${luckyColor[_this.multipleIndex]}\"\r\n\t\t\t\t\t\t\t\ttitle=\"${name}\"\r\n\t\t\t\t\t\t\t\tstyle=\"position: absolute;left: ${col_pre - 1}px;width: ${col - col_pre - 1}px;top: ${row_pre - 1}px;height: ${row - row_pre - 1}px;border: 1px solid ${luckyColor[_this.multipleIndex]};z-index: 15;\">\r\n\r\n\t\t\t\t\t\t\t\t<div class=\"username\" style=\"height: 19px;line-height:19px;width: max-content;position: absolute;bottom: ${row - row_pre - 1}px;right: 0;background-color: ${luckyColor[_this.multipleIndex]};color:#ffffff;padding:0 10px;\">\r\n\t\t\t\t\t\t\t\t${name}\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div style=\"width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: ${luckyColor[_this.multipleIndex]}\">\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t// \u6B63\u5728\u8F93\u5165\r\n\r\n\t        $(itemHtml).appendTo($(\"#luckysheet-cell-main #luckysheet-multipleRange-show\"));\r\n\r\n\t\t\t_this.multipleIndex++;\r\n\r\n\t\t\t// \u8BBE\u5B9A\u5141\u8BB8\u7528\u6237\u540D\u6D88\u5931\u7684\u5B9A\u65F6\u5668\uFF0C10\u79D2\u540E\u7528\u6237\u540D\u53EF\u9690\u85CF\r\n\t\t\t// 10\u79D2\u4E4B\u7C7B\uFF0C\u7528\u6237\u64CD\u4F5C\u754C\u9762\u4E0D\u4F1A\u9690\u85CF\u7528\u6237\u540D\uFF1B10\u79D2\u4E4B\u540E\u5982\u679C\u7528\u6237\u64CD\u4F5C\u4E86\u754C\u9762\uFF0C\u5219\u9690\u85CF\u7528\u6237\u540D\uFF0C\u6CA1\u64CD\u4F5C\u5C31\u4E0D\u9690\u85CF\r\n\t\t\tif(Store.cooperativeEdit.usernameTimeout['user' + id] != null){\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id])\r\n\t\t\t}\r\n\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = setTimeout(()=>{\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id]);\r\n\t\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = null;\r\n\t\t\t},10 * 1000)\r\n\t    }\r\n\t},\r\n    sheetDeleSave: [], //\u5171\u4EAB\u7F16\u8F91\u6A21\u5F0F\u4E0B \u5220\u9664\u7684sheet\u4FDD\u5B58\u4E0B\u6765\uFF0C\u65B9\u4FBF\u6062\u590D\u65F6\u53D6\u503C\r\n    submitInterval: 1000,\r\n    imagesubmitInterval: 5000,\r\n    submitdatalimit: 50,\r\n    submitcompresslimit: 1000,\r\n    checksubmit: function(data){\r\n        let _this = this;\r\n        //clearTimeout(_this.requestTimeOut);\r\n\r\n        _this.submitTimeout();\r\n\r\n        clearTimeout(_this.imageRequestTimeout);\r\n        _this.imageRequestTimeout = setTimeout(function(){\r\n            _this.imageRequest();\r\n        }, _this.imagesubmitInterval);\r\n    },\r\n    submitTimeout: function(){\r\n        let _this = this;\r\n        clearTimeout(_this.requestTimeOut);\r\n\r\n        //console.log(_this.requestlast, dayjs(), (_this.requestlast!=null && _this.requestlast.add(10, 'seconds').isBefore(dayjs()) ) );\r\n        if(!_this.requestLock && (_this.requestlast!=null && _this.requestlast.clone().add(1, 'seconds').isBefore(dayjs()) ) ){\r\n            _this.request();\r\n        }\r\n\r\n        // if(!_this.imageRequestLock && (_this.imageRequestLast==null || _this.imageRequestLast.clone().add(30, 'seconds').isBefore(dayjs()) ) ){\r\n\r\n        // }\r\n\r\n        _this.requestTimeOut = setTimeout(function(){\r\n            _this.submitTimeout();\r\n        }, _this.submitInterval);\r\n    },\r\n    requestLock: false,\r\n    requestlast: null,\r\n    firstchange: true,\r\n    requestTimeOut: null,\r\n    request: function () {\r\n        let _this = this;\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n\r\n        _this.cachelocaldata(function(cahce_key, params){\r\n            if(params.length==0){\r\n                return;\r\n            }\r\n\r\n            params = encodeURIComponent(JSON.stringify(params));\r\n            let compressBeginLen = params.length;\r\n            let iscommpress = false;\r\n            // if (compressBeginLen > _this.submitcompresslimit) {\r\n            //     params = pako.gzip(params, { to: \"string\" });\r\n            //     iscommpress = true;\r\n            // }\r\n            _this.requestLock = true;\r\n            //console.log(params);\r\n            // console.log(\"request\");\r\n            if(_this.updateUrl != \"\"){\r\n                $.post(_this.updateUrl, { compress: iscommpress, gridKey: _this.gridKey, data: params }, function (data) {\r\n\t\t\t\t\tlet re = new Function(\"return \" + data)();\r\n                    if(re.status){\r\n                        $(\"#luckysheet_info_detail_update\").html(\"\u6700\u8FD1\u5B58\u6863\u65F6\u95F4:\"+ dayjs().format(\"M-D H:m:s\"));\r\n                        $(\"#luckysheet_info_detail_save\").html(\"\u540C\u6B65\u6210\u529F\");\r\n                        _this.clearcachelocaldata();\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet_info_detail_save\").html(\"<span style='color:#ff2121'>\u540C\u6B65\u5931\u8D25</span>\");\r\n                        _this.restorecachelocaldata();\r\n                    }\r\n                    _this.requestlast = dayjs();\r\n                    _this.requestLock = false;\r\n                });\r\n             }\r\n        });\r\n    },\r\n    imageRequestLast: null,\r\n    imageRequestLock: false,\r\n    imageRequestTimeout: null,\r\n    imageRequest: function(){\r\n        let _this = this;\r\n\r\n        html2canvas($(\"#\" + container).find(\".luckysheet-grid-window\").get(0), {\r\n          onrendered: function(canvas) {\r\n            //let imgcut = $(\"#luckysheet-cell-main\").find(\".luckysheet-grid-window\");\r\n            //document.body.appendChild(canvas);\r\n            let old = $(canvas).appendTo(\"body\");\r\n            old.hide();\r\n            let newwidth = old.width();\r\n            let newheight = old.height();\r\n            let imageData = old.get(0).getContext(\"2d\").getImageData(0, 0, newwidth, newheight);\r\n\r\n            let cutW = newwidth, cutH = newheight;\r\n            if(cutW*0.54 > cutH){\r\n                cutW = cutH / 0.54;\r\n            }\r\n            else{\r\n                cutH = cutW * 0.54;\r\n            }\r\n            let newCanvas = $(\"<canvas>\").attr(\"width\", cutW).attr(\"height\", cutH)[0];\r\n\r\n            newCanvas.getContext(\"2d\").putImageData(imageData, 0, 0);\r\n\r\n            old.attr(\"width\", 350);\r\n            old.attr(\"height\", 189);\r\n            old.get(0).getContext(\"2d\").drawImage(newCanvas, 0, 0, 350, 189);\r\n            let base64 = old.get(0).toDataURL('image/jpeg', 0.9);\r\n\r\n            //console.log(base64);\r\n            //console.log(\"\u538B\u7F29\uFF1A\", pako.gzip(base64, { to: \"string\" }));\r\n            //console.log(\"imageRequest\");\r\n            let curindex = luckysheet.sheetmanage.getCurSheetnoset();\r\n            _this.imageRequestLock =true;\r\n            // let data1 = pako.gzip(encodeURIComponent(JSON.stringify({\"t\":\"thumb\", \"img\": base64, \"curindex\":curindex })), { to: \"string\" });\r\n            let data1 = encodeURIComponent(JSON.stringify({\"t\":\"thumb\", \"img\": base64, \"curindex\":curindex }));\r\n            old.remove();\r\n            //console.log(\"\u7F29\u7565\u56FE\", _this.imageRequestLast,base64);\r\n            if(_this.updateImageUrl != \"\"){\r\n                // $.post(_this.updateImageUrl, { compress: true, gridKey: _this.gridKey, data:data1  }, function (data) {\r\n                $.post(_this.updateImageUrl, { compress: false, gridKey: _this.gridKey, data:data1  }, function (data) {\r\n\t\t\t\t\tlet re = new Function(\"return \" + data)();\r\n                    if(re.status){\r\n                        imageRequestLast = dayjs();\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet_info_detail_save\").html(\"<span style='color:#ff2121'>\u7F51\u7EDC\u4E0D\u7A33\u5B9A</span>\");\r\n                    }\r\n                    _this.imageRequestLock =true;\r\n                });\r\n            }\r\n\r\n          }\r\n        });\r\n    },\r\n    localdata: [],\r\n    matchOpt: function(v, d){\r\n        for(let vitem in v){\r\n            if(vitem == \"t\" && v[\"t\"] in {\"drc\":1, \"arc\":1,\"sha\":1,\"shc\":1,\"shd\":1 } ){\r\n                return false;\r\n            }\r\n\r\n            if(vitem==\"v\"){\r\n                continue;\r\n            }\r\n\r\n            if(!(vitem in d)){\r\n                return false;\r\n            }\r\n\r\n            if(d[vitem] != v[vitem]){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    },\r\n    deleteRepeatOpt: function(data, value){\r\n        //let d = $.extend(true, [], data); //\u539F\u6765\r\n        let d = data;\r\n        let _this = this;\r\n\r\n        if(value instanceof Array){\r\n            for(let i = 0; i < value.length; i++){\r\n                let vitem = value[i];\r\n\r\n                for(let a = 0; a < d.length; a++){\r\n                    let ditem = data[i]; //let ditem = data[a];?\r\n\r\n                    if(_this.matchOpt(vitem, ditem)){\r\n                        delete d[a];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let a = 0; a < d.length; a++){\r\n                let ditem = d[a];\r\n\r\n                if(_this.matchOpt(value, ditem)){\r\n                    delete d[a];\r\n                }\r\n            }\r\n        }\r\n\r\n        let ret = [];\r\n        for(let i = 0; i < d.length; i++){\r\n            if(d[i] != null){\r\n                ret.push(d[i]);\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    setlocaldata: function (value, func) {\r\n        let key = this.gridKey;\r\n        //store.push(key, data);\r\n        let _this = this;\r\n        _this.getlocaldata(function(data){\r\n            if(data==null){\r\n                data = [];\r\n            }\r\n\r\n            //\u6B64\u5904\u4E0D\u53BB\u91CD\uFF0C\u5728request\u540C\u6B65\u540E\u53F0\u65F6\u7EDF\u4E00\u5FAA\u73AF\u4E00\u6B21\u53BB\u91CD\r\n            //let data = _this.deleteRepeatOpt(data, value);\r\n\r\n            if(value instanceof Array){\r\n                data = data.concat(value);\r\n            }\r\n            else{\r\n                data.push(value);\r\n            }\r\n\r\n            _this.localdata = data;\r\n            func(_this.localdata);\r\n\r\n            //console.log(value);\r\n            // localforage.setItem(key, data).then(function () {\r\n            //     console.log(data);\r\n            //     func(data);\r\n            // }).catch(function (err) {\r\n\r\n            // });\r\n        });\r\n    },\r\n    getlocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        //return store.get(key);\r\n        func(this.localdata);\r\n        // localforage.getItem(key).then(function(readValue) {\r\n        //     func(readValue);\r\n        // });\r\n    },\r\n    clearlocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        //store.remove(key);\r\n        this.localdata = [];\r\n        func();\r\n        // localforage.removeItem(key, function(err,value) {\r\n        //     func();\r\n        // });\r\n    },\r\n    cachelocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        let _this = this;\r\n        let cahce_key = key + \"__qkcache\";\r\n        //store.remove(key);\r\n        //console.log(key, cahce_key);\r\n\r\n\r\n        //\u5904\u7406localdata\u53BB\u91CD\r\n        let updatedata = _this.localdata;\r\n        let uLen = updatedata.length;\r\n        if(uLen > 1){\r\n            let prevData = [];\r\n            prevData[0] = updatedata[0];\r\n            for(let i = 1; i < uLen; i++){\r\n                let value = updatedata[i];\r\n                let flag = true;\r\n                for(let a=0;a<prevData.length;a++){\r\n                    let ditem = prevData[a];\r\n                    if(_this.matchOpt(value, ditem)){\r\n                        prevData.splice(a,1,value);\r\n                        flag = false; //\u5982\u679C\u5DF2\u5339\u914D\u91CD\u590D\uFF0C\u5219\u540E\u7EED\u65E0\u9700\u518D\u52A0\r\n                        break;\r\n                    }\r\n                }\r\n                if(flag){\r\n                    prevData = prevData.concat(value);\r\n                }\r\n\r\n            }\r\n            updatedata = prevData;\r\n\r\n        }\r\n        if(updatedata==null || updatedata.length==0){\r\n            return;\r\n        }\r\n        //console.log(key, cahce_key,updatedata);\r\n        _this.clearlocaldata(function(){\r\n            localforage.setItem(cahce_key, updatedata).then(function () {\r\n                func(cahce_key, updatedata);\r\n            });\r\n        });\r\n\r\n        // localforage.getItem(key).then(function(readValue) {\r\n        //     let updatedata = readValue;\r\n        //     if(readValue==null || readValue.length==0){\r\n        //         return;\r\n        //     }\r\n        //     //console.log(key, cahce_key,updatedata);\r\n        //     _this.clearlocaldata(function(){\r\n        //         localforage.setItem(cahce_key, updatedata).then(function () {\r\n        //             func(cahce_key, updatedata);\r\n        //         });\r\n        //     });\r\n        // });\r\n    },\r\n    clearcachelocaldata: function(func){\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n        //store.remove(key);\r\n        localforage.removeItem(cahce_key, function(err,value) {\r\n            if(func && typeof(func)==\"function\"){\r\n                func();\r\n            }\r\n\r\n        });\r\n    },\r\n    restorecachelocaldata: function(func){\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n        let _this = this;\r\n        localforage.getItem(cahce_key).then(function(readValue) {\r\n            let updatedata = readValue;\r\n            _this.getlocaldata(function(data){\r\n                if(data==null){\r\n                    data = [];\r\n                }\r\n                let newdata = updatedata.concat(data);\r\n                //data.unshift(updatedata);\r\n\r\n                _this.localdata = newdata;\r\n                if(func instanceof Function){\r\n                    func(_this.localdata);\r\n                }\r\n\r\n                // localforage.setItem(key, newdata).then(function () {\r\n                //     func(newdata);\r\n                // }).catch(function (err) {\r\n\r\n                // });\r\n            });\r\n        });\r\n\t},\r\n\tkeepHighLightBox: function() {\r\n        Store.cooperativeEdit.checkoutData.forEach(value => {\r\n            if(value.index == Store.currentSheetIndex) {\r\n                if(value.op === 'enterEdit') {\r\n                    server.multipleRangeShow(value.id, value.username, value.r, value.c, value.op);\r\n                } else {\r\n                    server.multipleRangeShow(value.id, value.username, value.r, value.c);\r\n                }\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default server;\r\n", "import { modelHTML, luckysheetchartpointconfigHTML, luckysheetToolHTML } from '../controllers/constant';\r\nimport browser from './browser';\r\nimport { replaceHtml } from '../utils/util';\r\nimport locale from '../locale/locale';\r\nimport server from '../controllers/server';\r\n\r\nconst tooltip = {\r\n    info: function (title, content) {\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-info\").remove();\r\n\r\n        let _locale = locale();\r\n        let locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-info\", \r\n            \"addclass\": \"\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;'+locale_button.close+'&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-info\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-info\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    confirm: function (title, content, func1, func2, name1, name2) {\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-confirm\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n        \r\n        if(name1 == null){\r\n            name1 = locale_button.confirm;\r\n        }\r\n        if(name2 == null){\r\n            name2 = locale_button.cancel;\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-confirm\", \r\n            \"addclass\": \"\", \r\n            \"style\": \"z-index:100003\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button class=\"btn btn-primary luckysheet-model-conform-btn\">&nbsp;&nbsp;'+ name1 +'&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-cancel-btn\">&nbsp;&nbsp;'+ name2 +'&nbsp;&nbsp;</button>' \r\n        }));\r\n        let $t = $(\"#luckysheet-confirm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-confirm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        $t.find(\".luckysheet-model-conform-btn\").click(function () {\r\n            if (typeof func1 == 'function') {\r\n                func1();\r\n            }\r\n            server.keepHighLightBox();\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();  \r\n        });\r\n        $t.find(\".luckysheet-model-cancel-btn\").click(function () {\r\n            if (typeof func2 == 'function') {\r\n                func2();\r\n            }\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n    },\r\n    screenshot: function (title, content, imgurl) {\r\n\r\n        const _locale = locale();\r\n        const locale_screenshot = _locale.screenshot;\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-confirm\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-confirm\", \r\n            \"addclass\": \"\", \r\n            \"style\": \"z-index:100003\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<a style=\"text-decoration:none;color:#fff;\" class=\"download btn btn-primary luckysheet-model-conform-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadBtn +'&nbsp;&nbsp;</a>&nbsp;&nbsp;<button class=\"btn btn-primary luckysheet-model-copy-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadCopy +'&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-cancel-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadClose +'&nbsp;&nbsp;</button>' \r\n        }));\r\n        let $t = $(\"#luckysheet-confirm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-confirm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        $t.find(\".luckysheet-model-conform-btn\").click(function () {\r\n            if(browser.isIE() == \"1\"){\r\n                alert(locale_screenshot.browserNotTip);\r\n            }\r\n            else{\r\n                if (!!window.ActiveXObject || \"ActiveXObject\" in window){\r\n                    if ($(\"#IframeReportImg\").length === 0){\r\n                        $('<iframe style=\"display:none;\" id=\"IframeReportImg\" name=\"IframeReportImg\" onload=\"downloadImg();\" width=\"0\" height=\"0\" src=\"about:blank\"></iframe>').appendTo(\"body\");\r\n                    }\r\n                    if ($('#IframeReportImg').attr(\"src\") != imgurl) {\r\n                        $('#IframeReportImg').attr(\"src\",imgurl);\r\n                    } else {\r\n                        if ($('#IframeReportImg').src != \"about:blank\") {\r\n                            window.frames[\"IframeReportImg\"].document.execCommand(\"SaveAs\");\r\n                        }\r\n                    }\r\n                }  \r\n            }\r\n        });\r\n        $t.find(\".luckysheet-model-cancel-btn\").click(function () {\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n\r\n        $('#luckysheet-confirm .luckysheet-model-copy-btn').click(function(){\r\n            let dt = new clipboard.DT();\r\n            dt.setData(\"text/html\", \"<img src='\"+ imgurl +\"'>\");\r\n            if(browser.isIE() == \"1\"){\r\n                alert(locale_screenshot.rightclickTip);\r\n            }\r\n            else{\r\n                clipboard.write(dt);\r\n                alert(locale_screenshot.successTip);  \r\n            }\r\n        });\r\n    },\r\n    chartPointConfig: function (id, savefunc1, closefunc2) {\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": id, \r\n            \"addclass\": \"luckysheet-chart-point-config-c\", \r\n            \"title\": \"\u6570\u636E\u70B9\u6279\u91CF\u8BBE\u7F6E\", \r\n            \"content\": luckysheetchartpointconfigHTML, \r\n            \"botton\": '<button class=\"btn btn-danger luckysheet-model-save-btn\">&nbsp;&nbsp;\u4FDD\u5B58\u8BBE\u7F6E&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;\u53D6\u6D88&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003;height:80%;width:80%;top:10%;left:10%;\" \r\n        }));\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        $(\"#\" + id).find(\".luckysheet-chart-point-config\").css(\"height\", winh - 160);\r\n        $(\"#\" + id).css({ \r\n            \"height\": winh - 90, \r\n            \"width\": winw - 100, \r\n            \"left\": 7, \r\n            \"top\": 14 \r\n        }).show().find(\".luckysheet-model-save-btn\").click(function () {\r\n            if (typeof savefunc1 == 'function') {\r\n                savefunc1();\r\n            }\r\n\r\n            $(\"#\" + id).hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n\r\n        $(\"#\" + id).find(\".luckysheet-model-save-btn\").click(function () {\r\n            if (typeof closefunc2 == 'function') {\r\n                closefunc2();\r\n            }\r\n\r\n            $(\"#\" + id).hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n    },\r\n    sheetConfig: function () {\r\n\r\n    },\r\n    hoverTipshowState: false,\r\n    hoverTipshowTimeOut: null,\r\n    createHoverTip: function (obj, to) {\r\n        let _this = this;\r\n\r\n        $(obj).on(\"mouseover\", to, function (e) {\r\n            if (_this.hoverTipshowState) {\r\n                return;\r\n            }\r\n\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            _this.hoverTipshowTimeOut = setTimeout(function(){\r\n                let $t = $(e.currentTarget), \r\n                    toffset = $t.offset(), \r\n                    $toolup = $(\"#luckysheet-tooltip-up\");\r\n                \r\n                let tips = $t.data(\"tips\");\r\n                if (tips == null || tips.length == 0) {\r\n                    tips = $t.prev().data(\"tips\");\r\n\r\n                    if (tips == null || tips.length == 0) {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                if ($toolup.length == 0) {\r\n                    $(\"body\").append(luckysheetToolHTML);\r\n                    $toolup = $(\"#luckysheet-tooltip-up\");\r\n                }\r\n\r\n                $toolup.removeClass(\"jfk-tooltip-hide\").find(\"div.jfk-tooltip-contentId\").html(tips);\r\n                let toolwidth = $toolup.outerWidth();\r\n                $toolup.find(\"div.jfk-tooltip-arrow\").css(\"left\", (toolwidth) / 2);\r\n\r\n                let toolleft = toffset.left + ($t.outerWidth() - toolwidth) / 2;\r\n                if(toolleft < 2){\r\n                    toolleft = 2;\r\n                    $toolup.find(\"div.jfk-tooltip-arrow\").css(\"left\", $t.outerWidth() / 2);\r\n                }\r\n\r\n                $toolup.css({ \"top\": toffset.top + $t.outerHeight() + 1, \"left\": toolleft });\r\n            }, 300);\r\n\r\n        }).on(\"mouseout\", to, function (e) {\r\n            _this.hoverTipshowState = false;\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            $(\"#luckysheet-tooltip-up\").addClass(\"jfk-tooltip-hide\");\r\n        }).on(\"click\", to, function (e) {\r\n            _this.hoverTipshowState = true;\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            $(\"#luckysheet-tooltip-up\").addClass(\"jfk-tooltip-hide\");\r\n        });\r\n    },\r\n    popover: function(content, position, close, style, btntxt, exitsFuc){\r\n        let _locale = locale();\r\n        let locale_button = _locale.button;\r\n        let locale_paint = _locale.paint;\r\n\r\n        if(btntxt == null){\r\n            btntxt = locale_button.close;\r\n        }\r\n\r\n        let htmldiv = '<div id=\"luckysheetpopover\" class=\"luckysheetpopover\"><div class=\"luckysheetpopover-content\">'+locale_paint.start+'</div><div class=\"luckysheetpopover-btn\">'+ btntxt +'</div></div>';\r\n        $(\"#luckysheetpopover\").remove();\r\n        $(\"body\").append(htmldiv);\r\n        $(\"#luckysheetpopover .luckysheetpopover-content\").html(content);\r\n\r\n        let w = $(\"#luckysheetpopover\").outerWidth(),\r\n            h = $(\"#luckysheetpopover\").outerHeight();\r\n        let pcss = {};\r\n\r\n        if(position == 'topLeft'){\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'topCenter'){\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'topRight'){\r\n            pcss.top = \"20px\";\r\n            pcss.right = \"20px\";\r\n        }\r\n        else if(position == 'midLeft'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'center'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'midRight'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.right = \"20px\";\r\n        }\r\n        else if(position == 'bottomLeft'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'bottomCenter'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'bottomRight'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.right = \"20px\";\r\n        }\r\n        else{\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n\r\n        if(style == \"white\"){\r\n            pcss.background = \"rgba(255, 255, 255, 0.65)\";\r\n            pcss.color = \"#000\";\r\n            $(\"#luckysheetpopover .luckysheetpopover-btn\").css({\"border\": \"1px solid #000\"});\r\n        }\r\n\r\n        setTimeout(function(){\r\n            $(\"#luckysheetpopover .luckysheetpopover-content\").css({\"margin-left\": -$(\"#luckysheetpopover .luckysheetpopover-btn\").outerWidth()/2});\r\n        }, 1);\r\n        $(\"#luckysheetpopover\").css(pcss).fadeIn();\r\n        $(\"#luckysheetpopover .luckysheetpopover-btn\").click(function(){\r\n            if(typeof(exitsFuc) == \"function\"){\r\n                exitsFuc();\r\n            }\r\n        });\r\n\r\n        if(close != null && typeof(close) == \"number\"){\r\n            setTimeout(function(){\r\n                $(\"#luckysheetpopover\").fadeOut().remove();\r\n                if(typeof(exitsFuc) == \"function\"){\r\n                    exitsFuc();\r\n                }\r\n            }, close);\r\n        }\r\n    }\r\n}\r\n\r\nexport default tooltip;", "import { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { replaceHtml, getObjType, chatatABC } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNull, isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { genarate } from '../global/format';\r\nimport { modelHTML, luckysheet_CFiconsImg } from './constant';\r\nimport server from './server';\r\nimport { selectionCopyShow } from './select';\r\nimport sheetmanage from './sheetmanage';\r\nimport locale from '../locale/locale';\r\nimport {checkProtectionFormatCells} from './protection';\r\nimport Store from '../store';\r\nimport dayjs from 'dayjs'\r\n\r\n//\u6761\u4EF6\u683C\u5F0F\r\nconst conditionformat = {\r\n    fileClone: [],\r\n    editorRule: null, //{\"sheetIndex\": sheetIndex,\"itemIndex\": itemIndex,\"data\": luckysheetfile[sheetIndex].luckysheet_conditionformat_save[itemIndex]}\r\n    ruleTypeHtml: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        return `<div class=\"ruleTypeBox\">\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem1}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem2}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem3}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem4}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem5}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem6}</span>\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    textCellColorHtml: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        return `<div id=\"textCellColor\">\r\n                    <div class=\"colorbox\">\r\n                        <input id=\"checkTextColor\" type=\"checkbox\" checked=\"checked\">\r\n                        <label for=\"checkTextColor\">${conditionformat_Text.textColor}\uFF1A</label>\r\n                        <input id=\"textcolorshow\" data-tips=\"${conditionformat_Text.textColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#9c0006\" style=\"display: none;\">\r\n                    </div>\r\n                    <div class=\"colorbox\">\r\n                        <input id=\"checkCellColor\" type=\"checkbox\" checked=\"checked\">\r\n                        <label for=\"checkCellColor\">${conditionformat_Text.cellColor}\uFF1A</label>\r\n                        <input id=\"cellcolorshow\" data-tips=\"${conditionformat_Text.cellColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#ffc7ce\" style=\"display: none;\">\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    selectRange: [],\r\n    selectStatus: false,\r\n    dataBarList: [\r\n        { \"format\": [\"#638ec6\", \"#ffffff\"] },  //\u84DD-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n        { \"format\": [\"#63c384\", \"#ffffff\"] },  //\u7EFF-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n        { \"format\": [\"#ff555a\", \"#ffffff\"] },  //\u7EA2-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n        { \"format\": [\"#ffb628\", \"#ffffff\"] },  //\u6A59-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n        { \"format\": [\"#008aef\", \"#ffffff\"] },  //\u6D45\u84DD-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n        { \"format\": [\"#d6007b\", \"#ffffff\"] },  //\u7D2B-\u767D\u6E10\u53D8 \u6570\u636E\u6761\r\n\r\n        { \"format\": [\"#638ec6\"] },  //\u84DD\u8272 \u6570\u636E\u6761\r\n        { \"format\": [\"#63c384\"] },  //\u7EFF\u8272 \u6570\u636E\u6761\r\n        { \"format\": [\"#ff555a\"] },  //\u7EA2\u8272 \u6570\u636E\u6761\r\n        { \"format\": [\"#ffb628\"] },  //\u6A59\u8272 \u6570\u636E\u6761\r\n        { \"format\": [\"#008aef\"] },  //\u6D45\u84DD\u8272 \u6570\u636E\u6761\r\n        { \"format\": [\"#d6007b\"] }   //\u7D2B\u8272 \u6570\u636E\u6761\r\n    ],\r\n    colorGradationList: [\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"] },  //\u7EFF-\u9EC4-\u7EA2\u8272\u9636\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"] },  //\u7EA2-\u9EC4-\u7EFF\u8272\u9636\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //\u7EFF-\u767D-\u7EA2\u8272\u9636\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"] },  //\u7EA2-\u767D-\u7EFF\u8272\u9636\r\n\r\n        { \"format\": [\"rgb(90, 138, 198)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //\u84DD-\u767D-\u7EA2\u8272\u9636\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(90, 138, 198)\"] },  //\u7EA2-\u767D-\u84DD\u8272\u9636\r\n\r\n        { \"format\": [\"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //\u767D-\u7EA2\u8272\u9636\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\"] },  //\u7EA2-\u767D\u8272\u9636\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\"] },  //\u7EFF-\u767D\u8272\u9636\r\n        { \"format\": [\"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"] },  //\u767D-\u7EFF\u8272\u9636\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\"] },  //\u7EFF-\u9EC4\u8272\u9636\r\n        { \"format\": [\"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"] }   //\u9EC4-\u7EFF\u8272\u9636\r\n    ],\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        // \u7BA1\u7406\u89C4\u5219\r\n        $(document).off(\"change.CFchooseSheet\").on(\"change.CFchooseSheet\", \"#luckysheet-administerRule-dialog .chooseSheet\", function(){\r\n            let index = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            _this.getConditionRuleList(index);\r\n        });\r\n        $(document).off(\"click.CFadministerRuleItem\").on(\"click.CFadministerRuleItem\", \"#luckysheet-administerRule-dialog .ruleList .listBox .item\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        $(document).off(\"click.CFadministerRuleConfirm\").on(\"click.CFadministerRuleConfirm\", \"#luckysheet-administerRule-dialog-confirm\", function(){\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n            let fileH = $.extend(true, [], Store.luckysheetfile);\r\n            let historyRules = _this.getHistoryRules(fileH);\r\n\r\n            //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n            let fileClone = $.extend(true, [], _this.fileClone);\r\n            for(let c = 0; c < fileClone.length; c++){\r\n                let sheetIndex = fileClone[c][\"index\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"];\r\n            }\r\n\r\n            let fileC = $.extend(true, [], Store.luckysheetfile);\r\n            let currentRules = _this.getCurrentRules(fileC);\r\n\r\n            //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            //\u9690\u85CF\u4E00\u4E9Bdom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").hide();\r\n\r\n            //\u53D1\u9001\u7ED9\u540E\u53F0\r\n            if(server.allowUpdate){\r\n                let files = $.extend(true, [], Store.luckysheetfile);\r\n                for(let i = 0; i < files.length; i++){\r\n                    server.saveParam(\"all\", files[i][\"index\"], files[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n        });\r\n\r\n        $(document).off(\"click.CFadministerRuleClose\").on(\"click.CFadministerRuleClose\", \"#luckysheet-administerRule-dialog-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").hide();\r\n            _this.fileClone = [];\r\n        });\r\n        $(document).off(\"click.CFadministerRuleFa\").on(\"click.CFadministerRuleFa\", \"#luckysheet-administerRule-dialog .item .fa-table\", function(){\r\n            $(this).parents(\"#luckysheet-administerRule-dialog\").hide();\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet select option:selected\").val();\r\n            if(sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(sheetIndex);\r\n            }\r\n\r\n            let txt = $(this).siblings(\"input\").val().trim();\r\n            let dataItem = $(this).parents(\".item\").attr(\"data-item\");\r\n\r\n            _this.multiRangeDialog(dataItem, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2],\r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2],\r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({\r\n                        \"left\": col_pre,\r\n                        \"width\": col - col_pre - 1,\r\n                        \"top\": row_pre,\r\n                        \"height\": row - row_pre - 1,\r\n                        \"left_move\": col_pre,\r\n                        \"width_move\": col - col_pre - 1,\r\n                        \"top_move\": row_pre,\r\n                        \"height_move\": row - row_pre - 1,\r\n                        \"row\": [r1, r2],\r\n                        \"column\": [c1, c2],\r\n                        \"row_focus\": r1,\r\n                        \"column_focus\": c1\r\n                    });\r\n                }\r\n            }\r\n\r\n            selectionCopyShow(_this.selectRange);\r\n        });\r\n        $(document).off(\"click.CFmultiRangeConfirm\").on(\"click.CFmultiRangeConfirm\", \"#luckysheet-multiRange-dialog-confirm\", function(){\r\n            $(this).parents(\"#luckysheet-multiRange-dialog\").hide();\r\n\r\n            let dataItem = $(this).attr(\"data-item\");\r\n            let v = $(this).parents(\"#luckysheet-multiRange-dialog\").find(\"input\").val();\r\n            $(\"#luckysheet-administerRule-dialog .item[data-item=\"+dataItem+\"] input\").val(v);\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][dataItem].cellrange = _this.getRangeByTxt(v);\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).off(\"click.CFmultiRangeClose\").on(\"click.CFmultiRangeClose\", \"#luckysheet-multiRange-dialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n\r\n        // \u65B0\u5EFA\u89C4\u5219\r\n        $(document).off(\"click.CFnewConditionRule\").on(\"click.CFnewConditionRule\", \"#newConditionRule\", function(){\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n            if(Store.luckysheet_select_save.length == 0){\r\n                if(isEditMode()){\r\n                    alert(conditionformat_Text.pleaseSelectRange);\r\n                }\r\n                else{\r\n                    tooltip.info(conditionformat_Text.pleaseSelectRange, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            _this.newConditionRuleDialog(1);\r\n        });\r\n        $(document).off(\"click.CFnewConditionRuleConfirm\").on(\"click.CFnewConditionRuleConfirm\", \"#luckysheet-newConditionRule-dialog-confirm\", function(){\r\n\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let index = $(\"#luckysheet-newConditionRule-dialog .ruleTypeItem.on\").index();\r\n            let type1 = $(\"#luckysheet-newConditionRule-dialog #type1 option:selected\").val();\r\n            let type2 = $(\"#luckysheet-newConditionRule-dialog .\" + type1 + \"Box #type2 option:selected\").val();\r\n\r\n            let format, rule;\r\n            if(index == 0){\r\n                if(type1 == \"dataBar\"){ //\u6570\u636E\u6761\r\n                    let color = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"get\").toHexString();\r\n\r\n                    if(type2 == \"gradient\"){ //\u6E10\u53D8\u586B\u5145\r\n                        format = [color, \"#ffffff\"];\r\n                    }\r\n                    else if(type2 == \"solid\"){ //\u5B9E\u5FC3\u586B\u5145\r\n                        format = [color];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"dataBar\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"colorGradation\"){ //\u8272\u9636\r\n                    let maxcolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let midcolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let mincolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n\r\n                    if(type2 == \"threeColor\"){ //\u4E09\u8272\r\n                        format = [maxcolor, midcolor, mincolor];\r\n                    }\r\n                    else if(type2 == \"twoColor\"){ //\u53CC\u8272\r\n                        format = [maxcolor, mincolor];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"colorGradation\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"icons\"){ //\u56FE\u6807\u96C6\r\n                    let len = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-len\");\r\n                    let leftMin = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-leftmin\");\r\n                    let top = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-top\");\r\n\r\n                    format = {\r\n                        \"len\": len,\r\n                        \"leftMin\": leftMin,\r\n                        \"top\": top\r\n                    };\r\n\r\n                    rule = {\r\n                        \"type\": \"icons\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n            }\r\n            else{\r\n                let conditionName = \"\", conditionRange = [], conditionValue = [];\r\n\r\n                if(index == 1){\r\n                    if(type1 == \"number\"){ //\u5355\u5143\u683C\u503C\r\n                        conditionName = type2;\r\n\r\n                        if(type2 == \"betweenness\"){\r\n                            let v1 = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n                            let v2 = $(\"#luckysheet-newConditionRule-dialog #conditionVal2 input\").val().trim();\r\n\r\n                            //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                            let rangeArr1 = _this.getRangeByTxt(v1);\r\n                            if(rangeArr1.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr1.length == 1){\r\n                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr1.length == 0){\r\n                                if(isNaN(v1) || v1 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                            }\r\n\r\n                            let rangeArr2 = _this.getRangeByTxt(v2);\r\n                            if(rangeArr2.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr2.length == 1){\r\n                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr2.length == 0){\r\n                                if(isNaN(v2) || v2 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            //\u6761\u4EF6\u503C\r\n                            let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                            //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                            let rangeArr = _this.getRangeByTxt(v);\r\n                            if(rangeArr.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr.length == 1){\r\n                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                    conditionValue.push(v);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr.length == 0){\r\n                                if(isNaN(v) || v == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"text\"){ //\u7279\u5B9A\u6587\u672C\r\n                        conditionName = \"textContains\";\r\n\r\n                        //\u6761\u4EF6\u503C\r\n                        let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                        //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                        let rangeArr = _this.getRangeByTxt(v);\r\n                        if(rangeArr.length > 1){\r\n                            _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                            return;\r\n                        }\r\n                        else if(rangeArr.length == 1){\r\n                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                            if(r1 == r2 && c1 == c2){\r\n                                v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                conditionValue.push(v);\r\n                            }\r\n                            else{\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                        }\r\n                        else if(rangeArr.length == 0){\r\n                            if(v == \"\"){\r\n                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                return;\r\n                            }\r\n                            else{\r\n                                conditionValue.push(v);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"date\"){ //\u53D1\u751F\u65E5\u671F\r\n                        conditionName = \"occurrenceDate\";\r\n\r\n                        //\u6761\u4EF6\u503C\r\n                        let v = $(\"#luckysheet-newConditionRule-dialog #daterange-btn\").val();\r\n\r\n                        if(v == \"\" || v == null){\r\n                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                            return;\r\n                        }\r\n\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n                else if(index == 2){ //\u6392\u540D\u9760\u524D\u9760\u540E\r\n                    //\u6761\u4EF6\u540D\u79F0\r\n                    if(type1 == \"top\"){\r\n                        if($(\"#luckysheet-newConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"top10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"top10\";\r\n                        }\r\n                    }\r\n                    else if(type1 == \"last\"){\r\n                        if($(\"#luckysheet-newConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"last10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"last10\";\r\n                        }\r\n                    }\r\n\r\n                    //\u6761\u4EF6\u503C\r\n                    let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                    if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(parseInt(v));\r\n                }\r\n                else if(index == 3){ //\u5E73\u5747\u503C\r\n                    if(type1 == \"AboveAverage\"){\r\n                        conditionName = \"AboveAverage\";\r\n                        conditionValue.push(\"AboveAverage\");\r\n                    }\r\n                    else if(type1 == \"SubAverage\"){\r\n                        conditionName = \"SubAverage\";\r\n                        conditionValue.push(\"SubAverage\");\r\n                    }\r\n                }\r\n                else if(index == 4){ //\u91CD\u590D\u503C\r\n                    conditionName = \"duplicateValue\";\r\n                    conditionValue.push(type1);\r\n                }\r\n                else if(index == 5){ //\u516C\u5F0F\r\n                    conditionName = \"formula\";\r\n\r\n                    //\u6761\u4EF6\u503C\r\n                    let v = $(\"#luckysheet-newConditionRule-dialog #formulaConditionVal input\").val().trim(); \r\n\r\n                    if(v == \"\"){\r\n                        _this.infoDialog(\"Condition value cannot be empty!\", \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n\r\n                //\u683C\u5F0F\u989C\u8272\r\n                let textcolor;\r\n                if($(\"#luckysheet-newConditionRule-dialog #checkTextColor\").is(\":checked\")){\r\n                    textcolor = $(\"#luckysheet-newConditionRule-dialog #textcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    textcolor = null;\r\n                }\r\n\r\n                let cellcolor;\r\n                if($(\"#luckysheet-newConditionRule-dialog #checkCellColor\").is(\":checked\")){\r\n                    cellcolor = $(\"#luckysheet-newConditionRule-dialog #cellcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    cellcolor = null;\r\n                }\r\n\r\n                format = {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                };\r\n\r\n                rule = {\r\n                    \"type\": \"default\",\r\n                    \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                    \"format\": format,\r\n                    \"conditionName\": conditionName,\r\n                    \"conditionRange\": conditionRange,\r\n                    \"conditionValue\": conditionValue\r\n                };\r\n            }\r\n\r\n            $(\"#luckysheet-newConditionRule-dialog\").hide();\r\n\r\n            //\u65B0\u5EFA\u89C4\u5219\u7684\u5165\u53E3\r\n            let source = $(this).attr(\"data-source\");\r\n\r\n            if(source == 0){\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n                //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n                let fileH = $.extend(true, [], Store.luckysheetfile);\r\n                let historyRules = _this.getHistoryRules(fileH);\r\n\r\n                //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n                let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"];\r\n                ruleArr.push(rule);\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n                let fileC = $.extend(true, [], Store.luckysheetfile);\r\n                let currentRules = _this.getCurrentRules(fileC);\r\n\r\n                //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n                _this.ref(historyRules, currentRules);\r\n\r\n                //\u53D1\u9001\u7ED9\u540E\u53F0\r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n            else if(source == 1){\r\n                //\u4E34\u65F6\u5B58\u50A8\u65B0\u89C4\u5219\r\n                let ruleArr = !!_this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] : [];\r\n                ruleArr.push(rule);\r\n                _this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n                //\u65B0\u5EFA\u89C4\u5219\u9690\u85CF\uFF0C\u7BA1\u7406\u89C4\u5219\u663E\u793A\r\n                _this.administerRuleDialog();\r\n            }\r\n        });\r\n        $(document).off(\"click.CFnewConditionRuleClose\").on(\"click.CFnewConditionRuleClose\", \"#luckysheet-newConditionRule-dialog-close\", function(){\r\n            //\u65B0\u5EFA\u89C4\u5219\u7684\u5165\u53E3\r\n            let source = $(this).attr(\"data-source\");\r\n            if(source == 0){\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            }\r\n            if(source == 1){\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n            }\r\n\r\n            //\u65B0\u5EFA\u89C4\u5219\u9690\u85CF\r\n            $(\"#luckysheet-newConditionRule-dialog\").hide();\r\n\r\n            //\u9690\u85CF\u865A\u7EBF\u6846\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        });\r\n\r\n        // \u7F16\u8F91\u89C4\u5219\r\n        $(document).off(\"click.CFeditorConditionRule\").on(\"click.CFeditorConditionRule\", \"#editorConditionRule\", function(){\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n\r\n            let itemIndex = $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item.on\").attr(\"data-item\");\r\n            let rule = {\r\n                \"sheetIndex\": sheetIndex,\r\n                \"itemIndex\": itemIndex,\r\n                \"data\": _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][itemIndex]\r\n            };\r\n            _this.editorRule = rule;\r\n            _this.editorConditionRuleDialog();\r\n        });\r\n        $(document).off(\"click.CFeditorConditionRuleConfirm\").on(\"click.CFeditorConditionRuleConfirm\", \"#luckysheet-editorConditionRule-dialog-confirm\",function(){\r\n            let index = $(\"#luckysheet-editorConditionRule-dialog .ruleTypeItem.on\").index();\r\n            let type1 = $(\"#luckysheet-editorConditionRule-dialog #type1 option:selected\").val();\r\n            let type2 = $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box #type2 option:selected\").val();\r\n\r\n            let cellrange = _this.editorRule[\"data\"].cellrange;\r\n\r\n            let format, rule;\r\n            if(index == 0){\r\n                if(type1 == \"dataBar\"){ //\u6570\u636E\u6761\r\n                    let color = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"get\").toHexString();\r\n\r\n                    if(type2 == \"gradient\"){ //\u6E10\u53D8\u586B\u5145\r\n                        format = [color, \"#ffffff\"];\r\n                    }\r\n                    else if(type2 == \"solid\"){ //\u5B9E\u5FC3\u586B\u5145\r\n                        format = [color];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"dataBar\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"colorGradation\"){ //\u8272\u9636\r\n                    let maxcolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let midcolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let mincolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n\r\n                    if(type2 == \"threeColor\"){ //\u4E09\u8272\r\n                        format = [maxcolor, midcolor, mincolor];\r\n                    }\r\n                    else if(type2 == \"twoColor\"){ //\u53CC\u8272\r\n                        format = [maxcolor, mincolor];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"colorGradation\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"icons\"){ //\u56FE\u6807\u96C6\r\n                    let len = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-len\");\r\n                    let leftMin = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-leftmin\");\r\n                    let top = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-top\");\r\n\r\n                    format = {\r\n                        \"len\": len,\r\n                        \"leftMin\": leftMin,\r\n                        \"top\": top\r\n                    };\r\n\r\n                    rule = {\r\n                        \"type\": \"icons\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n            }\r\n            else{\r\n                let conditionName = \"\", conditionRange = [], conditionValue = [];\r\n\r\n                if(index == 1){\r\n                    if(type1 == \"number\"){ //\u5355\u5143\u683C\u503C\r\n                        conditionName = type2;\r\n\r\n                        if(type2 == \"betweenness\"){\r\n                            let v1 = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n                            let v2 = $(\"#luckysheet-editorConditionRule-dialog #conditionVal2 input\").val().trim();\r\n\r\n                            //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                            let rangeArr1 = _this.getRangeByTxt(v1);\r\n                            if(rangeArr1.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr1.length == 1){\r\n                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr1.length == 0){\r\n                                if(isNaN(v1) || v1 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                            }\r\n\r\n                            let rangeArr2 = _this.getRangeByTxt(v2);\r\n                            if(rangeArr2.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr2.length == 1){\r\n                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr2.length == 0){\r\n                                if(isNaN(v2) || v2 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            //\u6761\u4EF6\u503C\r\n                            let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                            //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                            let rangeArr = _this.getRangeByTxt(v);\r\n                            if(rangeArr.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr.length == 1){\r\n                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                    conditionValue.push(v);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr.length == 0){\r\n                                if(isNaN(v) || v == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"text\"){ //\u7279\u5B9A\u6587\u672C\r\n                        conditionName = \"textContains\";\r\n\r\n                        //\u6761\u4EF6\u503C\r\n                        let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                        //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                        let rangeArr = _this.getRangeByTxt(v);\r\n                        if(rangeArr.length > 1){\r\n                            _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                            return;\r\n                        }\r\n                        else if(rangeArr.length == 1){\r\n                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                            if(r1 == r2 && c1 == c2){\r\n                                v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                conditionValue.push(v);\r\n                            }\r\n                            else{\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                        }\r\n                        else if(rangeArr.length == 0){\r\n                            if(isNaN(v) || v == \"\"){\r\n                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                return;\r\n                            }\r\n                            else{\r\n                                conditionValue.push(v);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"date\"){ //\u53D1\u751F\u65E5\u671F\r\n                        conditionName = \"occurrenceDate\";\r\n\r\n                        //\u6761\u4EF6\u503C\r\n                        let v = $(\"#luckysheet-editorConditionRule-dialog #daterange-btn\").val();\r\n\r\n                        if(v == \"\" || v == null){\r\n                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                            return;\r\n                        }\r\n\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n                else if(index == 2){ //\u6392\u540D\u9760\u524D\u9760\u540E\r\n                    //\u6761\u4EF6\u540D\u79F0\r\n                    if(type1 == \"top\"){\r\n                        if($(\"#luckysheet-editorConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"top10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"top10\";\r\n                        }\r\n                    }\r\n                    else if(type1 == \"last\"){\r\n                        if($(\"#luckysheet-editorConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"last10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"last10\";\r\n                        }\r\n                    }\r\n\r\n                    //\u6761\u4EF6\u503C\r\n                    let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                    if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n                else if(index == 3){ //\u5E73\u5747\u503C\r\n                    if(type1 == \"AboveAverage\"){\r\n                        conditionName = \"AboveAverage\";\r\n                        conditionValue.push(\"AboveAverage\");\r\n                    }\r\n                    else if(type1 == \"SubAverage\"){\r\n                        conditionName = \"SubAverage\";\r\n                        conditionValue.push(\"SubAverage\");\r\n                    }\r\n                }\r\n                else if(index == 4){ //\u91CD\u590D\u503C\r\n                    conditionName = \"duplicateValue\";\r\n                    conditionValue.push(type1);\r\n                }\r\n                else if(index == 5){ //\u516C\u5F0F\r\n                    conditionName = \"formula\";\r\n\r\n                    //\u6761\u4EF6\u503C\r\n                    let v = $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val().trim(); \r\n                    console.log(v)\r\n                    if(v == \"\"){\r\n                        _this.infoDialog(\"Condition value cannot be empty!\", \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n\r\n                //\u683C\u5F0F\u989C\u8272\r\n                let textcolor;\r\n                if($(\"#luckysheet-editorConditionRule-dialog #checkTextColor\").is(\":checked\")){\r\n                    textcolor = $(\"#luckysheet-editorConditionRule-dialog #textcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    textcolor = null;\r\n                }\r\n\r\n                let cellcolor;\r\n                if($(\"#luckysheet-editorConditionRule-dialog #checkCellColor\").is(\":checked\")){\r\n                    cellcolor = $(\"#luckysheet-editorConditionRule-dialog #cellcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    cellcolor = null;\r\n                }\r\n\r\n                format = {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                };\r\n\r\n                rule = {\r\n                    \"type\": \"default\",\r\n                    \"cellrange\": cellrange,\r\n                    \"format\": format,\r\n                    \"conditionName\": conditionName,\r\n                    \"conditionRange\": conditionRange,\r\n                    \"conditionValue\": conditionValue\r\n                };\r\n            }\r\n\r\n            //\u4FEE\u6539\u7F16\u8F91\u7684\u89C4\u5219\r\n            let sheetIndex = _this.editorRule[\"sheetIndex\"];\r\n            let itemIndex = _this.editorRule[\"itemIndex\"];\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][itemIndex] = rule;\r\n\r\n            //\u7F16\u8F91\u89C4\u5219\u9690\u85CF\uFF0C\u7BA1\u7406\u89C4\u5219\u663E\u793A\r\n            $(\"#luckysheet-editorConditionRule-dialog\").hide();\r\n            _this.administerRuleDialog();\r\n        });\r\n        $(document).off(\"click.CFeditorConditionRuleClose\").on(\"click.CFeditorConditionRuleClose\", \"#luckysheet-editorConditionRule-dialog-close\",function(){\r\n            //\u7F16\u8F91\u89C4\u5219\u9690\u85CF\uFF0C\u7BA1\u7406\u89C4\u5219\u663E\u793A\r\n            $(\"#luckysheet-editorConditionRule-dialog\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n            //\u9690\u85CF\u865A\u7EBF\u6846\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        });\r\n\r\n        // \u65B0\u5EFA\u89C4\u5219\u3001\u7F16\u8F91\u89C4\u5219 \u7C7B\u578B\u5207\u6362\r\n        $(document).off(\"click.CFnewEditorRuleItem\").on(\"click.CFnewEditorRuleItem\", \".luckysheet-newEditorRule-dialog .ruleTypeItem\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n            let index = $(this).index();\r\n            $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".ruleExplainBox\").html(_this.getRuleExplain(index));\r\n\r\n            _this.colorSelectInit();\r\n        });\r\n        $(document).off(\"change.CFnewEditorRuleType1\").on(\"change.CFnewEditorRuleType1\", \".luckysheet-newEditorRule-dialog #type1\", function(){\r\n            let optionVal = $(this).find(\"option:selected\").val();\r\n\r\n            if(optionVal == \"dataBar\" || optionVal == \"colorGradation\" || optionVal == \"icons\" || optionVal == \"number\" || optionVal == \"text\" || optionVal == \"date\"){\r\n                $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".\" + optionVal + \"Box\").show().siblings().hide();\r\n            }\r\n\r\n            if(optionVal == \"date\"){\r\n                _this.daterangeInit($(this).parents(\".luckysheet-newEditorRule-dialog\").attr(\"id\"));\r\n            }\r\n        });\r\n        $(document).off(\"change.CFnewEditorRuleType2\").on(\"change.CFnewEditorRuleType2\", \".luckysheet-newEditorRule-dialog #type2\", function(){\r\n            let type1 = $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#type1 option:selected\").val();\r\n\r\n            if(type1 == \"colorGradation\"){\r\n                let type2 = $(this).find(\"option:selected\").val();\r\n\r\n                if(type2 == \"threeColor\"){\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".midVal\").show();\r\n                }\r\n                else{\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".midVal\").hide();\r\n                }\r\n            }\r\n            else if(type1 == \"number\"){\r\n                let type2 = $(this).find(\"option:selected\").val();\r\n\r\n                if(type2 == \"betweenness\"){\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".txt\").show();\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#conditionVal2\").show();\r\n                }\r\n                else{\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".txt\").hide();\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#conditionVal2\").hide();\r\n                }\r\n            }\r\n        });\r\n        $(document).off(\"click.CFiconsShowbox\").on(\"click.CFiconsShowbox\", \".luckysheet-newEditorRule-dialog .iconsBox .showbox\", function(){\r\n            $(this).parents(\".iconsBox\").find(\"ul\").toggle();\r\n        });\r\n        $(document).off(\"click.CFiconsLi\").on(\"click.CFiconsLi\", \".luckysheet-newEditorRule-dialog .iconsBox li\", function(){\r\n            let len = $(this).find(\"div\").attr(\"data-len\");\r\n            let leftmin = $(this).find(\"div\").attr(\"data-leftmin\");\r\n            let top = $(this).find(\"div\").attr(\"data-top\");\r\n            let title = $(this).find(\"div\").attr(\"title\");\r\n            let position = $(this).find(\"div\").css(\"background-position\");\r\n\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").css(\"background-position\", position);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-len\", len);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-leftmin\", leftmin);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-top\", top);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"title\", title);\r\n\r\n            $(this).parents(\"ul\").hide();\r\n        });\r\n\r\n        // \u5220\u9664\u89C4\u5219\r\n        $(document).off(\"click.CFdeleteConditionRule\").on(\"click.CFdeleteConditionRule\", \"#deleteConditionRule\", function(){\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let itemIndex = $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item.on\").attr(\"data-item\");\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"].splice(itemIndex, 1);\r\n            _this.administerRuleDialog();\r\n        });\r\n\r\n        // \u89C4\u5219\u5B50\u83DC\u5355\u5F39\u51FA\u5C42 \u70B9\u51FB\u786E\u5B9A\u4FEE\u6539\u6837\u5F0F\r\n        $(document).off(\"click.CFdefault\").on(\"click.CFdefault\", \"#luckysheet-conditionformat-dialog-confirm\", function(){\r\n\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            //\u6761\u4EF6\u540D\u79F0\r\n            let conditionName = $(\"#luckysheet-conditionformat-dialog .box\").attr(\"data-itemvalue\");\r\n\r\n            //\u6761\u4EF6\u5355\u5143\u683C\r\n            let conditionRange = [];\r\n\r\n            //\u6761\u4EF6\u503C\r\n            let conditionValue = [];\r\n            if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"equal\" || conditionName == \"textContains\"){\r\n                let v = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n\r\n                //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                let rangeArr = _this.getRangeByTxt(v);\r\n                if(rangeArr.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr.length == 1){\r\n                    let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                    let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                        conditionValue.push(v);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr.length == 0){\r\n                    if(isNaN(v) || v == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n            }\r\n            else if(conditionName == \"betweenness\"){//\u4ECB\u4E8E\r\n                let v1 = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n                let v2 = $(\"#luckysheet-conditionformat-dialog #conditionVal2\").val().trim();\r\n\r\n                //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n                let rangeArr1 = _this.getRangeByTxt(v1);\r\n                if(rangeArr1.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr1.length == 1){\r\n                    let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                    let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                        conditionValue.push(v1);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr1.length == 0){\r\n                    if(isNaN(v1) || v1 == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v1);\r\n                    }\r\n                }\r\n\r\n                let rangeArr2 = _this.getRangeByTxt(v2);\r\n                if(rangeArr2.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr2.length == 1){\r\n                    let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                    let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                        conditionValue.push(v2);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr2.length == 0){\r\n                    if(isNaN(v2) || v2 == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v2);\r\n                    }\r\n                }\r\n            }\r\n            else if(conditionName == \"occurrenceDate\"){//\u65E5\u671F\r\n                let v = $(\"#luckysheet-conditionformat-dialog #daterange-btn\").val();\r\n\r\n                if(v == \"\" || v == null){\r\n                    _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                    return;\r\n                }\r\n\r\n                conditionValue.push(v);\r\n            }\r\n            else if(conditionName == \"duplicateValue\"){//\u91CD\u590D\u503C\r\n                conditionValue.push($(\"#luckysheet-conditionformat-dialog #conditionVal option:selected\").val());\r\n            }\r\n            else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                let v = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n\r\n                if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                    _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                    return;\r\n                }\r\n\r\n                conditionValue.push(v);\r\n            }\r\n            else if(conditionName == \"AboveAverage\"){ //\u9AD8\u4E8E\u5E73\u5747\u503C\r\n                conditionValue.push(\"AboveAverage\");\r\n            }\r\n            else if(conditionName == \"SubAverage\"){ //\u4F4E\u4E8E\u5E73\u5747\u503C\r\n                conditionValue.push(\"SubAverage\");\r\n            }\r\n\r\n            //\u683C\u5F0F\u989C\u8272\r\n            let textcolor;\r\n            if($(\"#checkTextColor\").is(\":checked\")){\r\n                textcolor = $(\"#textcolorshow\").spectrum(\"get\").toHexString();\r\n            }\r\n            else{\r\n                textcolor = null;\r\n            }\r\n\r\n            let cellcolor;\r\n            if($(\"#checkCellColor\").is(\":checked\")){\r\n                cellcolor = $(\"#cellcolorshow\").spectrum(\"get\").toHexString();\r\n            }\r\n            else{\r\n                cellcolor = null;\r\n            }\r\n\r\n            //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n            let fileH = $.extend(true, [], Store.luckysheetfile);\r\n            let historyRules = _this.getHistoryRules(fileH);\r\n\r\n            //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n            let rule = {\r\n                \"type\": \"default\",\r\n                \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                \"format\": {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                },\r\n                \"conditionName\": conditionName,\r\n                \"conditionRange\": conditionRange,\r\n                \"conditionValue\": conditionValue\r\n            };\r\n            let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"];\r\n            ruleArr.push(rule);\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n            let fileC = $.extend(true, [], Store.luckysheetfile);\r\n            let currentRules = _this.getCurrentRules(fileC);\r\n\r\n            //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            //\u9690\u85CF\u4E00\u4E9Bdom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-conditionformat-dialog\").hide();\r\n\r\n            //\u53D1\u9001\u7ED9\u540E\u53F0\r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n            }\r\n        });\r\n\r\n        // \u56FE\u6807\u96C6\u5F39\u51FA\u5C42 \u9009\u62E9\r\n        $(document).off(\"click.CFicons\").on(\"click.CFicons\", \"#luckysheet-CFicons-dialog .item\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-CFicons-dialog\").hide();\r\n\r\n            if(Store.luckysheet_select_save.length > 0){\r\n                let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                let format = {\r\n                    \"len\": $(this).attr(\"data-len\"),\r\n                    \"leftMin\": $(this).attr(\"data-leftMin\"),\r\n                    \"top\": $(this).attr(\"data-top\")\r\n                }\r\n\r\n                _this.updateItem(\"icons\", cellrange, format);\r\n            }\r\n        });\r\n\r\n        // \u9009\u62E9\u5355\u5143\u683C\r\n        $(document).on(\"click\", \".range .fa-table\", function(){\r\n            let id = $(this).parents(\".luckysheet-modal-dialog\").attr(\"id\");\r\n            $(\"#\" + id).hide();\r\n            //\u5165\u53E3\r\n            let source;\r\n            \r\n            if(id == \"luckysheet-conditionformat-dialog\"){\r\n                let $id = $(this).siblings(\"input\").attr(\"id\");\r\n                \r\n                if($id == \"conditionVal\"){\r\n                    source = \"0_1\";\r\n                }\r\n                else{\r\n                    source = \"0_2\";\r\n                }\r\n            }\r\n            else if(id == \"luckysheet-newConditionRule-dialog\"){\r\n                let $id = $(this).parents(\".range\").attr(\"id\");\r\n\r\n                if($id == \"formulaConditionVal\"){\r\n                    source = \"1_0\";\r\n                }\r\n                else if($id == \"conditionVal\"){\r\n                    source = \"1_1\";\r\n                }\r\n                else{\r\n                    source = \"1_2\";\r\n                }\r\n            }\r\n            else if(id == \"luckysheet-editorConditionRule-dialog\"){\r\n                let $id = $(this).parents(\".range\").attr(\"id\");\r\n\r\n                if($id == \"formulaConditionVal\"){\r\n                    source = \"2_0\";\r\n                }\r\n                else if($id == \"conditionVal\"){\r\n                    source = \"2_1\";\r\n                }\r\n                else{\r\n                    source = \"2_2\";\r\n                }\r\n            }\r\n            //input\u503C\r\n            let v = $(this).siblings(\"input\").val();\r\n\r\n            _this.singleRangeDialog(source, v);\r\n            selectionCopyShow(_this.getRangeByTxt(v));\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-singleRange-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(this).parents(\"#luckysheet-singleRange-dialog\").hide();\r\n\r\n            let source = $(this).attr(\"data-source\");\r\n            let v = $(this).parents(\"#luckysheet-singleRange-dialog\").find(\"input\").val();\r\n\r\n            if(source == \"0_1\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n                $(\"#luckysheet-conditionformat-dialog #conditionVal\").val(v);\r\n            }\r\n            else if(source == \"0_2\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n                $(\"#luckysheet-conditionformat-dialog #conditionVal2\").val(v);\r\n            }\r\n            else if(source == \"1_0\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #formulaConditionVal input\").val(v);\r\n            }\r\n            else if(source == \"1_1\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val(v);\r\n            }\r\n            else if(source == \"1_2\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #conditionVal2 input\").val(v);\r\n            }\r\n            else if(source == \"2_0\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val(v);\r\n            }\r\n            else if(source == \"2_1\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val(v);\r\n            }\r\n            else if(source == \"2_2\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #conditionVal2 input\").val(v);\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-singleRange-dialog-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(this).parents(\"#luckysheet-singleRange-dialog\").hide();\r\n\r\n            let source = $(this).attr(\"data-source\");\r\n            if(source == \"0_1\" || source == \"0_2\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n            }\r\n            else if(source == \"1_0\" || source == \"1_1\" || source == \"1_2\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n            }\r\n            else if(source == \"2_0\" || source == \"2_1\" || source == \"2_2\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n\r\n        // \u5F39\u51FA\u5C42\u53F3\u4E0A\u89D2\u5173\u95ED\u6309\u94AE\r\n        $(document).on(\"click\", \".luckysheet-modal-dialog-title-close\", function(){\r\n            let id = $(this).parents(\".luckysheet-modal-dialog\").attr(\"id\");\r\n\r\n            //\u65B0\u5EFA\u89C4\u5219\u5F39\u51FA\u5C42\r\n            if(id == \"luckysheet-newConditionRule-dialog\"){\r\n                let source = $(\"#\" + id).find(\"#luckysheet-newConditionRule-dialog-close\").attr(\"data-source\");\r\n                //\u65B0\u5EFA\u89C4\u5219\u5165\u53E3\r\n                if(source == 1){\r\n                    $(\"#luckysheet-administerRule-dialog\").show();\r\n                }\r\n            }\r\n\r\n            //\u7F16\u8F91\u89C4\u5219\u5F39\u51FA\u5C42\r\n            if(id == \"luckysheet-editorConditionRule-dialog\"){\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n            }\r\n\r\n            //\u9009\u62E9\u5355\u5143\u683C\u5F39\u51FA\u5C42\r\n            if(id == \"luckysheet-singleRange-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n                let source = $(this).parents(\"#luckysheet-singleRange-dialog\").find(\"#luckysheet-singleRange-dialog-confirm\").attr(\"data-source\");\r\n                if(source == \"0_1\" || source == \"0_2\"){\r\n                    $(\"#luckysheet-conditionformat-dialog\").show();\r\n                }\r\n                else if(source == \"1_1\" || source == \"1_2\"){\r\n                    $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                }\r\n                else if(source == \"2_1\" || source == \"2_2\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                }\r\n\r\n                let range = [];\r\n                selectionCopyShow(range);\r\n            }\r\n\r\n            //\u9009\u62E9\u5E94\u7528\u8303\u56F4\u5F39\u51FA\u5C42\r\n            if(id == \"luckysheet-multiRange-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n                let range = [];\r\n                selectionCopyShow(range);\r\n            }\r\n\r\n            //\u63D0\u793A\u6846\r\n            if(id == \"luckysheet-conditionformat-info-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n            }\r\n        });\r\n\r\n        //\u63D0\u793A\u6846\r\n        $(document).on(\"click\", \"#luckysheet-conditionformat-info-dialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-conditionformat-info-dialog\").hide();\r\n        });\r\n    },\r\n    singleRangeDialog: function(source, value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-singleRange-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-singleRange-dialog\",\r\n            \"addclass\": \"luckysheet-singleRange-dialog\",\r\n            \"title\": conditionformat_Text.selectCell,\r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectCell}\" value=\"${value}\"/>`,\r\n            \"botton\":  `<button id=\"luckysheet-singleRange-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${source}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-singleRange-dialog-close\" class=\"btn btn-default\" data-source=\"${source}\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-singleRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-singleRange-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    multiRangeDialog: function(dataItem, value){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-multiRange-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-multiRange-dialog\",\r\n            \"addclass\": \"luckysheet-multiRange-dialog\",\r\n            \"title\": conditionformat_Text.selectRange,\r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectRange}\" value=\"${value}\"/>`,\r\n            \"botton\":  `<button id=\"luckysheet-multiRange-dialog-confirm\" class=\"btn btn-primary\" data-item=\"${dataItem}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-multiRange-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-multiRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-multiRange-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        selectionCopyShow(_this.getRangeByTxt(value));\r\n    },\r\n    getTxtByRange: function(range){\r\n        if(range.length > 0){\r\n            let txt = [];\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                txt.push(getRangetxt(Store.currentSheetIndex, { \"row\": [r1, r2], \"column\": [c1, c2] }, Store.currentSheetIndex));\r\n            }\r\n\r\n            return txt.join(\",\");\r\n        }\r\n    },\r\n    getRangeByTxt: function(txt){\r\n        let range = [];\r\n\r\n        txt = txt.toString();\r\n\r\n        if(txt.indexOf(\",\") != -1){\r\n            let arr = txt.split(\",\");\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(formula.iscelldata(arr[i])){\r\n                    range.push(formula.getcellrange(arr[i]));\r\n                }\r\n                else{\r\n                    range = [];\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(formula.iscelldata(txt)){\r\n                range.push(formula.getcellrange(txt));\r\n            }\r\n        }\r\n        return range;\r\n    },\r\n    colorSelectInit: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\".luckysheet-conditionformat-config-color\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly:true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            // flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            // showButtons: false,//\u9690\u85CF\u9009\u62E9\u53D6\u6D88\u6309\u94AE\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            // color: currenColor,\r\n            cancelText: conditionformat_Text.cancel,\r\n            chooseText: conditionformat_Text.confirmColor,\r\n            togglePaletteMoreText: \"\u81EA\u5B9A\u4E49\",\r\n            togglePaletteLessText: \"\u6536\u8D77\",\r\n            togglePaletteOnly: true,\r\n            clearText: conditionformat_Text.clearColorSelect,\r\n            noColorSelectedText: \"\u6CA1\u6709\u989C\u8272\u88AB\u9009\u62E9\",\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [[\"#000\",\"#444\",\"#666\",\"#999\",\"#ccc\",\"#eee\",\"#f3f3f3\",\"#fff\"],\r\n            [\"#f00\",\"#f90\",\"#ff0\",\"#0f0\",\"#0ff\",\"#00f\",\"#90f\",\"#f0f\"],\r\n            [\"#f4cccc\",\"#fce5cd\",\"#fff2cc\",\"#d9ead3\",\"#d0e0e3\",\"#cfe2f3\",\"#d9d2e9\",\"#ead1dc\"],\r\n            [\"#ea9999\",\"#f9cb9c\",\"#ffe599\",\"#b6d7a8\",\"#a2c4c9\",\"#9fc5e8\",\"#b4a7d6\",\"#d5a6bd\"],\r\n            [\"#e06666\",\"#f6b26b\",\"#ffd966\",\"#93c47d\",\"#76a5af\",\"#6fa8dc\",\"#8e7cc3\",\"#c27ba0\"],\r\n            [\"#c00\",\"#e69138\",\"#f1c232\",\"#6aa84f\",\"#45818e\",\"#3d85c6\",\"#674ea7\",\"#a64d79\"],\r\n            [\"#900\",\"#b45f06\",\"#bf9000\",\"#38761d\",\"#134f5c\",\"#0b5394\",\"#351c75\",\"#741b47\"],\r\n            [\"#600\",\"#783f04\",\"#7f6000\",\"#274e13\",\"#0c343d\",\"#073763\",\"#20124d\",\"#4c1130\"]],\r\n            change: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n            }\r\n        });\r\n    },\r\n    conditionformatDialog: function(title, content){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-conditionformat-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-conditionformat-dialog\",\r\n            \"addclass\": \"luckysheet-conditionformat-dialog\",\r\n            \"title\": title,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-conditionformat-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:9999\"\r\n        }));\r\n        let $t = $(\"#luckysheet-conditionformat-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-conditionformat-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        _this.init();\r\n        _this.colorSelectInit();\r\n\r\n        if(title == locale().conditionformat.conditionformat_occurrenceDate){\r\n            _this.daterangeInit(\"luckysheet-conditionformat-dialog\");\r\n        }\r\n    },\r\n    CFiconsDialog: function(){\u3000\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-CFicons-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div style=\"margin-bottom: 10px;\">${conditionformat_Text.pleaseSelectIcon}</div>\r\n                            <div class=\"title\">${conditionformat_Text.direction}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 0;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"1\" title=\"${conditionformat_Text.threeTriangles}\"><div style=\"background-position:0 -20px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"0\" data-top=\"2\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 -40px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"3\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 -60px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px 0;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"1\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px -20px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"5\" data-top=\"2\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px -40px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.shape}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})\"><div style=\"background-position:0 -80px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"5\" title=\"${conditionformat_Text.threeSigns}\"><div style=\"background-position:0 -100px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"0\" data-top=\"6\" title=\"${conditionformat_Text.greenRedBlackGradient}\"><div style=\"background-position:0 -120px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})\"><div style=\"background-position:-131px -80px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"5\" title=\"${conditionformat_Text.fourColorTrafficLight}\"><div style=\"background-position:-131px -100px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.mark}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})\"><div style=\"background-position:0 -140px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"8\" title=\"${conditionformat_Text.tricolorFlag}\"><div style=\"background-position:0 -160px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})\"><div style=\"background-position:-131px -140px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.grade}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"9\" title=\"${conditionformat_Text.threeStars}\"><div style=\"background-position:0 -180px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"10\" title=\"${conditionformat_Text.fiveQuadrantDiagram}\"><div style=\"background-position:0 -200px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"11\" title=\"${conditionformat_Text.fiveBoxes}\"><div style=\"background-position:0 -220px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"9\" title=\"${conditionformat_Text.grade4}\"><div style=\"background-position:-131px -180px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"5\" data-top=\"10\" title=\"${conditionformat_Text.grade5}\"><div style=\"background-position:-131px -200px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-CFicons-dialog\",\r\n            \"addclass\": \"luckysheet-CFicons-dialog\",\r\n            \"title\": conditionformat_Text.icons,\r\n            \"content\": content,\r\n            \"botton\": `<button class=\"btn btn-default luckysheet-model-close-btn\">${conditionformat_Text.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-CFicons-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-CFicons-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    administerRuleDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //\u5DE5\u4F5C\u8868\r\n        let opHtml = '';\r\n        for(let j = 0; j < Store.luckysheetfile.length; j++){\r\n            if(Store.luckysheetfile[j].status == \"1\"){\r\n                opHtml +=  `<option value=\"${Store.luckysheetfile[j][\"index\"]}\" selected=\"selected\">\r\n                                ${conditionformat_Text.currentSheet}\uFF1A${Store.luckysheetfile[j][\"name\"]}\r\n                            </option>`;\r\n            }\r\n            else{\r\n                opHtml +=  `<option value=\"${Store.luckysheetfile[j][\"index\"]}\">\r\n                                ${conditionformat_Text.sheet}\uFF1A${Store.luckysheetfile[j][\"name\"]}\r\n                            </option>`;\r\n            }\r\n        }\r\n\r\n        let content =  `<div class=\"chooseSheet\">\r\n                            <label>${conditionformat_Text.showRules}\uFF1A</label>\r\n                            <select>${opHtml}</select>\r\n                        </div>\r\n                        <div class=\"ruleBox\">\r\n                            <div class=\"ruleBtn\">\r\n                                <button id=\"newConditionRule\" class=\"btn btn-default\">${conditionformat_Text.newRule}</button>\r\n                                <button id=\"editorConditionRule\" class=\"btn btn-default\">${conditionformat_Text.editRule}</button>\r\n                                <button id=\"deleteConditionRule\" class=\"btn btn-default\">${conditionformat_Text.deleteRule}</button>\r\n                            </div>\r\n                            <div class=\"ruleList\">\r\n                                <div class=\"listTitle\">\r\n                                    <span>${conditionformat_Text.rule}</span>\r\n                                    <span>${conditionformat_Text.format}</span>\r\n                                    <span>${conditionformat_Text.applyRange}</span>\r\n                                </div>\r\n                                <div class=\"listBox\"></div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-administerRule-dialog\",\r\n            \"addclass\": \"luckysheet-administerRule-dialog\",\r\n            \"title\": conditionformat_Text.conditionformatManageRules,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-administerRule-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-administerRule-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-administerRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-administerRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        //\u5F53\u524D\u5DE5\u4F5C\u8868\u7684\u89C4\u5219\u5217\u8868\r\n        let index = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n        this.getConditionRuleList(index);\r\n    },\r\n    getConditionRuleList: function(index){\r\n\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-administerRule-dialog .ruleList .listBox\").empty();\r\n\r\n        let ruleArr = _this.fileClone[getSheetIndex(index)].luckysheet_conditionformat_save; //\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u96C6\u5408\r\n        if(ruleArr != null && ruleArr.length > 0){\r\n            const conditionformat_Text = locale().conditionformat;\r\n\r\n            for(let i = 0; i < ruleArr.length; i++){\r\n                let type = ruleArr[i][\"type\"];            //\u89C4\u5219\u7C7B\u578B\r\n                let format = ruleArr[i][\"format\"];        //\u89C4\u5219\u6837\u5F0F\r\n                let cellrange = ruleArr[i][\"cellrange\"];  //\u89C4\u5219\u5E94\u7528\u8303\u56F4\r\n\r\n                let ruleName;         //\u89C4\u5219\u540D\u79F0\r\n                let formatHtml = '';  //\u6837\u5F0Fdom\r\n                if(type == \"dataBar\"){\r\n                    ruleName = conditionformat_Text.dataBar;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else if(type == \"colorGradation\"){\r\n                    ruleName = conditionformat_Text.colorGradation;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else if(type == \"icons\"){\r\n                    ruleName = conditionformat_Text.icons;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else{\r\n                    ruleName = _this.getConditionRuleName(ruleArr[i].conditionName, ruleArr[i].conditionRange, ruleArr[i].conditionValue);\r\n\r\n                    if(format[\"textColor\"] != null){\r\n                        formatHtml += '<span class=\"colorbox\" title=\"'+ conditionformat_Text.textColor +'\" style=\"background-color:' + format[\"textColor\"] + '\"></span>';\r\n                    }\r\n\r\n                    if(format[\"cellColor\"] != null){\r\n                        formatHtml += '<span class=\"colorbox\" title=\"'+ conditionformat_Text.cellColor +'\" style=\"background-color:' + format[\"cellColor\"] + '\"></span>';\r\n                    }\r\n                }\r\n\r\n                //\u5E94\u7528\u8303\u56F4dom\r\n                let rangeTxtArr = [];\r\n                for(let s = 0; s < cellrange.length; s++){\r\n                    let r1 = cellrange[s].row[0], r2 = cellrange[s].row[1];\r\n                    let c1 = cellrange[s].column[0], c2 = cellrange[s].column[1];\r\n\r\n                    rangeTxtArr.push(chatatABC(c1) + (r1 + 1) + \":\" + chatatABC(c2) + (r2 + 1));\r\n                }\r\n\r\n                //\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u5217\u8868dom\r\n                let itemHtml =  '<div class=\"item\" data-item=\"' + i + '\">' +\r\n                                    '<div class=\"ruleName\" title=\"' + ruleName + '\">' + ruleName + '</div>' +\r\n                                    '<div class=\"format\">' + formatHtml + '</div>' +\r\n                                    '<div class=\"ruleRange\">' +\r\n                                        '<input class=\"formulaInputFocus\" readonly=\"true\" value=\"' + rangeTxtArr.join(\",\") + '\"/>' +\r\n                                        '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+ conditionformat_Text.selectRange +'\"></i>' +\r\n                                    '</div>' +\r\n                                '</div>';\r\n\r\n                $(\"#luckysheet-administerRule-dialog .ruleList .listBox\").prepend(itemHtml);\r\n            }\r\n\r\n            $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item canvas\").each(function(i){\r\n                let x = $(this).closest(\".item\").attr(\"data-item\");\r\n\r\n                let type = ruleArr[x][\"type\"];\r\n                let format = ruleArr[x][\"format\"];\r\n\r\n                let can = $(this).get(0).getContext(\"2d\");\r\n                if(type == \"dataBar\"){\r\n                    if(format.length == 2){\r\n                        let my_gradient = can.createLinearGradient(0, 0, 46, 0);\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n                        can.fillStyle = my_gradient;\r\n                        can.fillRect(0, 0, 46, 18);\r\n\r\n                        can.beginPath();\r\n                        can.moveTo(0, 0);\r\n                        can.lineTo(0, 18);\r\n                        can.lineTo(46, 18);\r\n                        can.lineTo(46, 0);\r\n                        can.lineTo(0, 0);\r\n                        can.lineWidth = Store.devicePixelRatio;\r\n                        can.strokeStyle = format[0];\r\n                        can.stroke();\r\n                        can.closePath();\r\n                    }\r\n                    else if(format.length == 1){\r\n                        can.fillStyle = format[0];\r\n                        can.fillRect(0, 0, 46, 18);\r\n\r\n                        can.beginPath();\r\n                        can.moveTo(0, 0);\r\n                        can.lineTo(0, 18);\r\n                        can.lineTo(46, 18);\r\n                        can.lineTo(46, 0);\r\n                        can.lineTo(0, 0);\r\n                        can.lineWidth = Store.devicePixelRatio;\r\n                        can.strokeStyle = format[0];\r\n                        can.stroke();\r\n                        can.closePath();\r\n                    }\r\n                }\r\n                else if(type == \"colorGradation\"){\r\n                    let my_gradient = can.createLinearGradient(0, 0, 46, 0);\r\n\r\n                    if(format.length == 3){\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(0.5, format[1]);\r\n                        my_gradient.addColorStop(1, format[2]);\r\n                    }\r\n                    else if(format.length == 2){\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n                    }\r\n\r\n                    can.fillStyle = my_gradient;\r\n                    can.fillRect(0, 0, 46, 18);\r\n                }\r\n                else if(type == \"icons\"){\r\n                    let len = format[\"len\"];\r\n                    let l = format[\"leftMin\"];\r\n                    let t = format[\"top\"];\r\n\r\n                    let w1 = 32 * len + 10 * (len - 1);\r\n                    let h1 = 32;\r\n                    let w2 = 46;\r\n                    let h2 = 46 * 32 / w1;\r\n\r\n                    if(l == \"0\"){\r\n                        can.drawImage(luckysheet_CFiconsImg, 0, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2);\r\n                    }\r\n                    else if(l == \"5\"){\r\n                        can.drawImage(luckysheet_CFiconsImg, 210, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2);\r\n                    }\r\n                }\r\n            })\r\n\r\n            $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item\").eq(0).addClass(\"on\");\r\n        }\r\n    },\r\n    getConditionRuleName: function(conditionName, conditionRange, conditionValue){\r\n        //v \u6709\u6761\u4EF6\u5355\u5143\u683C\u53D6\u6761\u4EF6\u5355\u5143\u683C\uFF0C\u82E5\u65E0\u53D6\u6761\u4EF6\u503C\r\n        let v\r\n        if(conditionRange[0]!=null){\r\n            v = chatatABC(conditionRange[0][\"column\"][0]) + (conditionRange[0][\"row\"][0] + 1);\r\n        }\r\n        else{\r\n            v = conditionValue[0];\r\n        }\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //\u8FD4\u56DE\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u540D\u79F0\r\n        if(conditionName == \"greaterThan\"){\r\n            return conditionformat_Text.cellValue + \" > \" + v;\r\n        }\r\n        else if(conditionName == \"lessThan\"){\r\n            return conditionformat_Text.cellValue + \" < \" + v;\r\n        }\r\n        else if(conditionName == \"betweenness\"){\r\n            let v2;\r\n            if(conditionRange[1] != null){\r\n                v2 = chatatABC(conditionRange[1][\"column\"][0]) + (conditionRange[1][\"row\"][0] + 1);\r\n            }\r\n            else{\r\n                v2 = conditionValue[1];\r\n            }\r\n            return conditionformat_Text.cellValue + \" \" + conditionformat_Text.between + \" \" + v + \" \" + conditionformat_Text.in + \" \" + v2 + \" \" + conditionformat_Text.between2;\r\n        }\r\n        else if(conditionName == \"equal\"){\r\n            return conditionformat_Text.cellValue + \" = \" + v;\r\n        }\r\n        else if(conditionName == \"textContains\"){\r\n            return conditionformat_Text.cellValue + conditionformat_Text.contain + \" =\" + v;\r\n        }\r\n        else if(conditionName == \"occurrenceDate\"){\r\n            return conditionValue;\r\n        }\r\n        else if(conditionName == \"duplicateValue\"){\r\n            if(conditionValue == \"0\"){\r\n                return conditionformat_Text.duplicateValue;\r\n            }\r\n            if(conditionValue == \"1\"){\r\n                return conditionformat_Text.uniqueValue;\r\n            }\r\n        }\r\n        else if(conditionName == \"top10\"){\r\n            return conditionformat_Text.top + \" \" + v + \" \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"top10%\"){\r\n            return conditionformat_Text.top + \" \" + v + \"% \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"last10\"){\r\n            return conditionformat_Text.last + \" \" + v + \" \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"last10%\"){\r\n            return conditionformat_Text.last + \" \" + v + \"% \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"AboveAverage\"){\r\n            return conditionformat_Text.aboveAverage;\r\n        }\r\n        else if(conditionName == \"SubAverage\"){\r\n            return conditionformat_Text.belowAverage;\r\n        }\r\n        else if(conditionName == \"formula\"){\r\n            if(v.slice(0, 1) != '='){\r\n                v = '=' + v;\r\n            }\r\n\r\n            return conditionformat_Text.formula + ': ' + v;\r\n        }\r\n    },\r\n    newConditionRuleDialog: function(source){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //\u89C4\u5219\u8BF4\u660E\r\n        let ruleExplainHtml = _this.getRuleExplain(0);\r\n\r\n        //\u5F39\u51FA\u5C42\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").hide();\r\n        $(\"#luckysheet-newConditionRule-dialog\").remove();\r\n\r\n        let content = '<div>' +\r\n                        '<div class=\"boxTitle\">' + conditionformat_Text.chooseRuleType + '\uFF1A</div>' +\r\n                        _this.ruleTypeHtml() +\r\n                        '<div class=\"boxTitle\">' + conditionformat_Text.editRuleDescription + '\uFF1A</div>' +\r\n                        '<div class=\"ruleExplainBox\">' +\r\n                            ruleExplainHtml +\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-newConditionRule-dialog\",\r\n            \"addclass\": \"luckysheet-newEditorRule-dialog\",\r\n            \"title\": conditionformat_Text.newFormatRule,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-newConditionRule-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${source}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-newConditionRule-dialog-close\" class=\"btn btn-default\" data-source=\"${source}\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-newConditionRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-newConditionRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        //index\u7684\u89C4\u5219\u7C7B\u578Bfocus\r\n        $(\"#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)\").addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n        _this.colorSelectInit();\r\n    },\r\n    editorConditionRuleDialog: function(){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let rule = _this.editorRule.data;\r\n\r\n        if(rule == null){\r\n            return;\r\n        }\r\n\r\n        let ruleType = rule[\"type\"],\r\n            ruleFormat = rule[\"format\"],\r\n            conditionName = rule[\"conditionName\"];\r\n\r\n        let index, type1;\r\n        if(ruleType == \"dataBar\" || ruleType == \"colorGradation\" || ruleType == \"icons\"){\r\n            index = 0;\r\n            type1 = ruleType;\r\n        }\r\n        else{\r\n            if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"betweenness\" || conditionName == \"equal\" || conditionName == \"textContains\" || conditionName == \"occurrenceDate\"){\r\n                index = 1;\r\n\r\n                if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"betweenness\" || conditionName == \"equal\"){\r\n                    type1 = \"number\";\r\n                }\r\n                else if(conditionName == \"textContains\"){\r\n                    type1 = \"text\";\r\n                }\r\n                else if(conditionName == \"occurrenceDate\"){\r\n                    type1 = \"date\";\r\n                }\r\n            }\r\n            else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                index = 2;\r\n\r\n                if(conditionName == \"top10\" || conditionName == \"top10%\"){\r\n                    type1 = \"top\";\r\n                }\r\n                else if(conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                    type1 = \"last\";\r\n                }\r\n            }\r\n            else if(conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                index = 3;\r\n                type1 = conditionName;\r\n            }\r\n            else if(conditionName == \"duplicateValue\"){\r\n                index = 4;\r\n                type1 = rule[\"conditionValue\"];\r\n            }\r\n            else if(conditionName == \"formula\"){\r\n                index = 5;\r\n            }\r\n        }\r\n\r\n        //\u89C4\u5219\u8BF4\u660E\r\n        let ruleExplainHtml = _this.getRuleExplain(index);\r\n\r\n        //\u5F39\u51FA\u5C42\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").hide();\r\n        $(\"#luckysheet-editorConditionRule-dialog\").remove();\r\n\r\n        let content = '<div>' +\r\n                        '<div class=\"boxTitle\">'+ conditionformat_Text.chooseRuleType +'\uFF1A</div>' +\r\n                        _this.ruleTypeHtml() +\r\n                        '<div class=\"boxTitle\">'+ conditionformat_Text.editRuleDescription +'\uFF1A</div>' +\r\n                        '<div class=\"ruleExplainBox\">' +\r\n                            ruleExplainHtml +\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-editorConditionRule-dialog\",\r\n            \"addclass\": \"luckysheet-newEditorRule-dialog\",\r\n            \"title\": conditionformat_Text.editFormatRule,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-editorConditionRule-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-editorConditionRule-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-editorConditionRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-editorConditionRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        _this.colorSelectInit();\r\n\r\n        //\u89C4\u5219\u7C7B\u578Bfocus\r\n        $(\"#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(\" + index + \")\").addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n        //type1\r\n        $(\"#luckysheet-editorConditionRule-dialog #type1\").val(type1);\r\n        if(type1 == \"dataBar\" || type1 == \"colorGradation\" || type1 == \"icons\" || type1 == \"number\" || type1 == \"text\" || type1 == \"date\"){\r\n            $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box\").show();\r\n            $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box\").siblings().hide();\r\n        }\r\n\r\n        if(type1 == \"date\"){\r\n            _this.daterangeInit(\"luckysheet-editorConditionRule-dialog\");\r\n        }\r\n\r\n        //type2  format  value\r\n        if(ruleType == \"dataBar\" || ruleType == \"colorGradation\" || ruleType == \"icons\"){\r\n            if(type1 == \"dataBar\"){\r\n                if(ruleFormat.length == 2){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .dataBarBox #type2\").val(\"gradient\");\r\n                }\r\n                else if(ruleFormat.length == 1){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .dataBarBox #type2\").val(\"solid\");\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n            }\r\n            else if(type1 == \"colorGradation\"){\r\n                if(ruleFormat.length == 3){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox #type2\").val(\"threeColor\");\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal\").show();\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[1]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[2]);\r\n                }\r\n                else if(ruleFormat.length == 2){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox #type2\").val(\"twoColor\");\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal\").hide();\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[1]);\r\n                }\r\n            }\r\n            else if(type1 == \"icons\"){\r\n                let len = ruleFormat[\"len\"];\r\n                let l = ruleFormat[\"leftMin\"];\r\n                let t = ruleFormat[\"top\"];\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .iconsBox li\").each(function(i, e){\r\n                    if($(e).find(\"div\").attr(\"data-len\") == len && $(e).find(\"div\").attr(\"data-leftmin\") == l && $(e).find(\"div\").attr(\"data-top\") == t){\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").css(\"background-position\", $(e).find(\"div\").css(\"background-position\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-len\", $(e).find(\"div\").attr(\"data-len\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-leftmin\", $(e).find(\"div\").attr(\"data-leftmin\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-top\", $(e).find(\"div\").attr(\"data-leftmin\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"title\", $(e).find(\"div\").attr(\"title\"));\r\n\r\n                        return true;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        else{\r\n            if(type1 == \"number\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog .numberBox #type2\").val(conditionName);\r\n\r\n                let val1;\r\n                if(rule.conditionRange[0] != null){\r\n                    val1 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[0][\"row\"], \"column\": rule.conditionRange[0][\"column\"] }, Store.currentSheetIndex);\r\n                }\r\n                else{\r\n                    val1 = rule.conditionValue[0];\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input\").val(val1);\r\n\r\n                if(conditionName == \"betweenness\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox .txt\").show();\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2\").show();\r\n\r\n                    let val2;\r\n                    if(rule.conditionRange[1] != null){\r\n                        val2 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[1][\"row\"], \"column\": rule.conditionRange[1][\"column\"] }, Store.currentSheetIndex);\r\n                    }\r\n                    else{\r\n                        val2 = rule.conditionValue[1];\r\n                    }\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input\").val(val2);\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox .txt\").hide();\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2\").hide();\r\n                }\r\n            }\r\n            else if(type1 == \"text\"){\r\n                let val1;\r\n                if(rule.conditionRange[0] != null){\r\n                    val1 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[0][\"row\"], \"column\": rule.conditionRange[0][\"column\"] }, Store.currentSheetIndex);\r\n                }\r\n                else{\r\n                    val1 = rule.conditionValue[0];\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .textBox #conditionVal input\").val(val1);\r\n            }\r\n            else if(type1 == \"date\"){\r\n                _this.daterangeInit(\"luckysheet-editorConditionRule-dialog\");\r\n\r\n                let val1 = rule.conditionValue[0];\r\n                $(\"#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn\").val(val1);\r\n            }\r\n            else if(type1 == \"top\" || type1 == \"last\"){\r\n                let val1 = rule.conditionValue[0];\r\n\r\n                if(conditionName == \"top10%\" || conditionName == \"last10%\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog #isPercent\").attr(\"checked\", \"checked\");\r\n                }\r\n            }\r\n            else{\r\n                if(conditionName == \"formula\"){\r\n                    let val1 = rule.conditionValue[0];\r\n                    $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val(val1);\r\n                }\r\n            }\r\n\r\n            $(\"#luckysheet-editorConditionRule-dialog #textcolorshow\").spectrum(\"set\", ruleFormat.textColor);\r\n            $(\"#luckysheet-editorConditionRule-dialog #cellcolorshow\").spectrum(\"set\", ruleFormat.cellColor);\r\n        }\r\n    },\r\n    infoDialog: function(title, content){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-conditionformat-info-dialog\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-conditionformat-info-dialog\",\r\n            \"addclass\": \"\",\r\n            \"title\": title,\r\n            \"content\": content,\r\n            \"botton\": `<button id=\"luckysheet-conditionformat-info-dialog-close\" class=\"btn btn-default\">${locale().conditionformat.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-conditionformat-info-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-conditionformat-info-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    getRuleExplain: function(index){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let textCellColorHtml = this.textCellColorHtml();\r\n\r\n        let ruleExplainHtml;\r\n        switch(index){\r\n            case 0: //\u57FA\u4E8E\u5404\u81EA\u503C\u8BBE\u7F6E\u6240\u6709\u5355\u5143\u683C\u7684\u683C\u5F0F\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem1}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                        <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.formatStyle}\uFF1A</label>\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"dataBar\">${conditionformat_Text.dataBar}</option>\r\n                                            <option value=\"colorGradation\">${conditionformat_Text.colorGradation}</option>\r\n                                            <option value=\"icons\">${conditionformat_Text.icons}</option>\r\n                                        </select>\r\n                                    </div>\r\n                                    <div>\r\n                                        <div class=\"type1Box dataBarBox\">\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.fillType}\uFF1A</label>\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"gradient\">${conditionformat_Text.gradient}</option>\r\n                                                    <option value=\"solid\">${conditionformat_Text.solid}</option>\r\n                                                </select>\r\n                                            </div>\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.color}\uFF1A</label>\r\n                                                <input data-tips=\"${conditionformat_Text.dataBarColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#638ec6\" style=\"display: none;\"> \r\n                                            </div>\r\n                                        </div>\r\n                                        <div class=\"type1Box colorGradationBox\" style=\"display: none;\">\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.fillType}\uFF1A</label>\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"threeColor\">${conditionformat_Text.tricolor}</option>\r\n                                                    <option value=\"twoColor\">${conditionformat_Text.twocolor}</option>\r\n                                                </select>\r\n                                            </div>\r\n                                            <div class=\"maxVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.maxValue}\uFF1A</label>\r\n                                                <input data-tips=\"${conditionformat_Text.maxValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(99, 190, 123)\" style=\"display: none;\">\r\n                                            </div>\r\n                                            <div class=\"midVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.medianValue}\uFF1A</label>\r\n                                                <input data-tips=\"${conditionformat_Text.medianValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(255, 235, 132)\" style=\"display: none;\">\r\n                                            </div>\r\n                                            <div class=\"minVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.minValue}\uFF1A</label>\r\n                                                <input data-tips=\"${conditionformat_Text.minValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(248, 105, 107)\" style=\"display: none;\">\r\n                                            </div>\r\n                                        </div>\r\n                                        <div class=\"type1Box iconsBox\" style=\"display: none;\">\r\n                                            <label>${conditionformat_Text.fillType}\uFF1A</label>\r\n                                            <div class=\"showbox\">\r\n                                                <div class=\"model\" data-len=\"3\" data-leftmin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 0;\"></div>\r\n                                                <span class=\"ui-selectmenu-icon ui-icon ui-icon-triangle-1-s\" style=\"margin-top: 2px;\"></span>\r\n                                            </div>\r\n                                            <ul>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 0;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px 0;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"1\" title=\"${conditionformat_Text.threeTriangles}\" style=\"background-position: 0 -20px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"0\" data-top=\"2\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 -40px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"1\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px -20px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"3\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 -60px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"5\" data-top=\"2\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px -40px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})\" style=\"background-position: 0 -80px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})\" style=\"background-position: -131px -80px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"5\" title=\"${conditionformat_Text.threeSigns}\" style=\"background-position: 0 -100px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"5\" title=\"${conditionformat_Text.fourColorTrafficLight}\" style=\"background-position: -131px -100px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"0\" data-top=\"6\" title=\"${conditionformat_Text.greenRedBlackGradient}\" style=\"background-position: 0 -120px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})\" style=\"background-position: 0 -140px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})\" style=\"background-position: -131px -140px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"8\" title=\"${conditionformat_Text.tricolorFlag}\" style=\"background-position: 0 -160px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"9\" title=\"${conditionformat_Text.threeStars}\" style=\"background-position: 0 -180px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"10\" title=\"${conditionformat_Text.fiveQuadrantDiagram}\" style=\"background-position: 0 -200px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"11\" title=\"${conditionformat_Text.fiveBoxes}\" style=\"background-position: 0 -220px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"9\" title=\"${conditionformat_Text.grade4}\" style=\"background-position: -131px -180px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"5\" data-top=\"10\" title=\"${conditionformat_Text.grade5}\" style=\"background-position: -131px -200px;\"></div></li>\r\n                                            </ul>\r\n                                        </div>\r\n                                    </div>`;\r\n                break;\r\n            case 1: //\u53EA\u4E3A\u5305\u542B\u4EE5\u4E0B\u5185\u5BB9\u7684\u5355\u5143\u683C\u8BBE\u7F6E\u683C\u5F0F\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem2_title}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"number\">${conditionformat_Text.cellValue}</option>\r\n                                            <option value=\"text\">${conditionformat_Text.specificText}</option>\r\n                                            <option value=\"date\">${conditionformat_Text.occurrence}</option>\r\n                                        </select>\r\n                                        <div>\r\n                                            <div class=\"type1Box numberBox\">\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"greaterThan\">${conditionformat_Text.greaterThan}</option>\r\n                                                    <option value=\"lessThan\">${conditionformat_Text.lessThan}</option>\r\n                                                    <option value=\"betweenness\">${conditionformat_Text.between}</option>\r\n                                                    <option value=\"equal\">${conditionformat_Text.equal}</option>\r\n                                                </select>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <span class=\"txt\" style=\"display: none;\">${conditionformat_Text.in}</span>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal2\" style=\"display: none;\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectDataRange}\"></i>\r\n                                                </div>\r\n                                            </div>\r\n                                            <div class=\"type1Box textBox\" style=\"display: none;\">\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"\">${conditionformat_Text.contain}</option>\r\n                                                </select>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                                </div>\r\n                                            </div>\r\n                                            <div class=\"type1Box dateBox\" style=\"display: none;\">\r\n                                                <div style=\"width: 162px;\" class=\"inpbox\">\r\n                                                    <input style=\"width: 150px;\" id=\"daterange-btn\" readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectADate}\"/>\r\n                                                </div>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`;\r\n                break;\r\n            case 2: //\u4EC5\u5BF9\u6392\u540D\u9760\u524D\u6216\u9760\u540E\u7684\u6570\u503C\u8BBE\u7F6E\u683C\u5F0F\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem3_title}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"top\">${conditionformat_Text.top}</option>\r\n                                            <option value=\"last\">${conditionformat_Text.last}</option>\r\n                                        </select>\r\n                                        <div class=\"inpbox\" id=\"conditionVal\">\r\n                                            <input class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                        </div>\r\n                                        <input id=\"isPercent\" type=\"checkbox\"/>\r\n                                        <label for=\"isPercent\" class=\"txt\">${conditionformat_Text.selectRange_percent}</label>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}\uFF1A</div>${textCellColorHtml}`;\r\n                break;\r\n            case 3: //\u4EC5\u5BF9\u9AD8\u4E8E\u6216\u4F4E\u4E8E\u5E73\u5747\u503C\u7684\u6570\u503C\u8BBE\u7F6E\u683C\u5F0F\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem4_title}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"AboveAverage\">${conditionformat_Text.above}</option>\r\n                                            <option value=\"SubAverage\">${conditionformat_Text.below}</option>\r\n                                        </select>\r\n                                        <span class=\"txt\">${conditionformat_Text.selectRange_average}</span>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}\uFF1A</div>${textCellColorHtml}`;\r\n                break;\r\n            case 4: //\u4EC5\u5BF9\u552F\u4E00\u503C\u6216\u91CD\u590D\u503C\u8BBE\u7F6E\u683C\u5F0F\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.all}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"0\">${conditionformat_Text.duplicateValue}</option>\r\n                                            <option value=\"1\">${conditionformat_Text.uniqueValue}</option>\r\n                                        </select>\r\n                                        <span class=\"txt\">${conditionformat_Text.selectRange_value}</span>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}\uFF1A</div>${textCellColorHtml}`;\r\n                break;\r\n            case 5: //\u4F7F\u7528\u516C\u5F0F\u786E\u5B9A\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u5355\u5143\u683C\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem2_title}\uFF1A</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <div class=\"inpbox range\" id=\"formulaConditionVal\" style=\"width: 250px;\">\r\n                                            <input class=\"formulaInputFocus\" style=\"width: 200px;\"/>\r\n                                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`;\r\n                break;\r\n        }\r\n\r\n        return ruleExplainHtml;\r\n    },\r\n    daterangeInit: function(id){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //\u65E5\u671F\u9009\u62E9\u63D2\u4EF6\r\n        $('.ranges_1 ul').remove();\r\n        $('#' + id).find(\"#daterange-btn\").flatpickr({\r\n            mode: \"range\",\r\n            onChange: function (data, label) {\r\n                const [start, end] = data\r\n                //label:\u901A\u8FC7\u5B83\u6765\u77E5\u9053\u7528\u6237\u9009\u62E9\u7684\u662F\u4EC0\u4E48\uFF0C\u4F20\u7ED9\u540E\u53F0\u8FDB\u884C\u76F8\u5E94\u7684\u5C55\u793A\r\n                let format1 = [\r\n                    conditionformat_Text.yesterday,\r\n                    conditionformat_Text.today\r\n                ];\r\n\r\n                let format2 = [\r\n                    conditionformat_Text.lastWeek,\r\n                    conditionformat_Text.thisWeek,\r\n                    conditionformat_Text.lastMonth,\r\n                    conditionformat_Text.thisMonth,\r\n                    conditionformat_Text.lastYear,\r\n                    conditionformat_Text.thisYear,\r\n                    conditionformat_Text.last7days,\r\n                    conditionformat_Text.last30days\r\n                ]\r\n\r\n                if (label == conditionformat_Text.all) {\r\n                    $('#daterange-btn').val('');\r\n                } else if (format1.indexOf(label) > -1) {\r\n                    $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD'));\r\n                } else if (format2.indexOf(label) > -1) {\r\n                    $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD') + '-' + dayjs(end).format('YYYY/MM/DD'));\r\n                }\r\n            }\r\n        });\r\n    },\r\n    CFSplitRange: function(range1, range2, range3, type){\r\n        let range = [];\r\n\r\n        let offset_r = range3[\"row\"][0] - range2[\"row\"][0];\r\n        let offset_c = range3[\"column\"][0] - range2[\"column\"][0];\r\n\r\n        let r1 = range1[\"row\"][0], r2 = range1[\"row\"][1];\r\n        let c1 = range1[\"column\"][0], c2 = range1[\"column\"][1];\r\n\r\n        if(r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u5168\u90E8\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u884C\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E0A\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u884C\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E0B\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u884C\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //\u9009\u533A \u5217\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u5DE6\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //\u9009\u533A \u5217\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u53F3\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //\u9009\u533A \u5217\u8D2F\u7A7F \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u5DE6\u4E0A\u89D2\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u53F3\u4E0A\u89D2\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u5DE6\u4E0B\u89D2\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u53F3\u4E0B\u89D2\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u5DE6\u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u53F3\u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E0A\u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E0B\u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1]){\r\n            //\u9009\u533A \u5305\u542B \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u6B63\u4E2D\u95F4\u90E8\u5206\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else{\r\n            //\u9009\u533A \u5728 \u6761\u4EF6\u683C\u5F0F\u5E94\u7528\u8303\u56F4 \u4E4B\u5916\r\n\r\n            if(type == \"allPart\"){ //\u6240\u6709\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //\u5269\u4F59\u90E8\u5206\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //\u64CD\u4F5C\u90E8\u5206\r\n                range = [];\r\n            }\r\n        }\r\n\r\n        return range;\r\n    },\r\n    getcolorGradation: function(color1, color2, value1, value2, value){\r\n        let rgb1 = color1.split(',');\r\n        let r1 = parseInt(rgb1[0].split('(')[1]);\r\n        let g1 = parseInt(rgb1[1]);\r\n        let b1 = parseInt(rgb1[2].split(')')[0]);\r\n\r\n        let rgb2 = color2.split(',');\r\n        let r2 = parseInt(rgb2[0].split('(')[1]);\r\n        let g2 = parseInt(rgb2[1]);\r\n        let b2 = parseInt(rgb2[2].split(')')[0]);\r\n\r\n        let r = Math.round(r1 - (r1 - r2) / (value1 - value2) * (value1 - value));\r\n        let g = Math.round(g1 - (g1 - g2) / (value1 - value2) * (value1 - value));\r\n        let b = Math.round(b1 - (b1 - b2) / (value1 - value2) * (value1 - value));\r\n\r\n        return \"rgb(\"+ r +\", \"+ g +\", \"+ b +\")\";\r\n    },\r\n    getCFPartRange: function(sheetIndex, range1, range2){\r\n        let ruleArr = [];\r\n\r\n        let cf = Store.luckysheetfile[getSheetIndex(sheetIndex)].luckysheet_conditionformat_save;\r\n        if(cf != null && cf.length > 0){\r\n            label:  for(let i = 0; i < cf.length; i++){\r\n                        let cellrange = cf[i].cellrange;\r\n\r\n                        for(let j = 0; j < cellrange.length; j++){\r\n                            let r1 = cellrange[j].row[0], r2 = cellrange[j].row[1];\r\n                            let c1 = cellrange[j].column[0], c2 = cellrange[j].column[1];\r\n\r\n                            for(let s = 0; s < range.length; s++){\r\n                                if((range[s].row[0] >= r1 && range[s].row[0] <= r2) || (range[s].row[1] >= r1 && range[s].row[1] <= r2) || (range[s].column[0] >= c1 && range[s].column[0] <= c2) || (range[s].column[1] >= c1 && range[s].column[1] <= c2)){\r\n                                    ruleArr.push(cf[i]);\r\n\r\n                                    continue label;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n        }\r\n\r\n        return ruleArr;\r\n    },\r\n    checksCF: function(r, c, computeMap){\r\n        if(computeMap != null &&\u3000(r + \"_\" + c) in computeMap){\r\n            return computeMap[r + \"_\" + c];\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    getComputeMap: function(sheetIndex){\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        if(sheetIndex != null){\r\n            index = getSheetIndex(sheetIndex);\r\n        }\r\n\r\n        let ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n        let data = Store.luckysheetfile[index][\"data\"];\r\n\r\n        if(data == null){\r\n            return null;\r\n        }\r\n\r\n        let computeMap = this.compute(ruleArr, data);\r\n\r\n        return computeMap;\r\n    },\r\n    compute: function(ruleArr, d){\r\n        let _this = this;\r\n\r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n\r\n        //\u6761\u4EF6\u8BA1\u7B97\u5B58\u50A8\r\n        let computeMap = {};\r\n\r\n        if(ruleArr.length > 0){\r\n            for(let i = 0; i < ruleArr.length; i++){\r\n                let type = ruleArr[i][\"type\"];\r\n                let cellrange = ruleArr[i][\"cellrange\"];\r\n                let format = ruleArr[i][\"format\"];\r\n\r\n                if(type == \"dataBar\"){ //\u6570\u636E\u6761\r\n                    let max = null, min = null;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        if(min < 0){ //\u9009\u533A\u8303\u56F4\u5185\u6709\u8D1F\u6570\r\n                            let plusLen = Math.round(max / (max - min) * 10) / 10;                //\u6B63\u6570\u6240\u5360\u6BD4\r\n                            let minusLen = Math.round(Math.abs(min) / (max - min) * 10) / 10;     //\u8D1F\u6570\u6240\u5360\u6BD4\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) < 0){ //\u8D1F\u6570\r\n                                                let valueLen = Math.round(Math.abs(parseInt(cell.v)) / Math.abs(min) * 100) / 100;\r\n\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"minus\", \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"minus\", \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                                }\r\n                                            }\r\n\r\n                                            if(parseInt(cell.v) > 0){ //\u6B63\u6570\r\n                                                let valueLen = Math.round(parseInt(cell.v) / max * 100) / 100;\r\n\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"plus\", \"plusLen\": plusLen, \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"plus\", \"plusLen\": plusLen, \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            let plusLen = 1;\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            let valueLen;\r\n                                            if(max == 0){\r\n                                                valueLen = 1;\r\n                                            }\r\n                                            else{\r\n                                                valueLen = Math.round(parseInt(cell.v) / max * 100) / 100;\r\n                                            }\r\n\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"plus\", \"plusLen\": plusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"plus\", \"plusLen\": plusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"colorGradation\"){ //\u8272\u9636\r\n                    let max = null, min = null, sum = 0, count = 0;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    count++;\r\n                                    sum += parseInt(cell.v);\r\n\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        if(format.length == 3){ //\u4E09\u8272\u8272\u9636\r\n                            let avg = Math.floor(sum / count);\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) == min){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[2];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[2] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > min && parseInt(cell.v) < avg){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == avg){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[1];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[1] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > avg && parseInt(cell.v) < max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[0];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[0] };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(format.length == 2){ //\u4E24\u8272\u8272\u9636\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) == min){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[1];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[1] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > min && parseInt(cell.v) < max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[0];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[0] };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"icons\"){ //\u56FE\u6807\u96C6\r\n                    let len = parseInt(format[\"len\"]);\r\n                    let leftMin = parseInt(format[\"leftMin\"]);\r\n                    let top = parseInt(format[\"top\"]);\r\n\r\n                    let max = null, min = null;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        let a = Math.floor((max - min + 1) / len);\r\n                        let b = (max - min + 1) % len;\r\n\r\n                        if(len == 3){ //\u4E00\u7EC4\u56FE\u6807\u6709\u4E09\u4E2A\r\n                            let v1, v2, v3;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(len == 4){ //\u4E00\u7EC4\u56FE\u6807\u6709\u56DB\u4E2A\r\n                            let v1, v2, v3, v4;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3];\r\n                                v4 = [min + a * 3 + 1, max];\r\n                            }\r\n                            else if(b == 3){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, min + a * 3 - 1];\r\n                                v4 = [min + a * 3, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 3, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 3, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(len == 5){ //\u4E00\u7EC4\u56FE\u6807\u6709\u4E94\u4E2A\r\n                            let v1, v2, v3, v4, v5;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3];\r\n                                v4 = [min + a * 3 + 1, min + a * 4];\r\n                                v5 = [min + a * 4 + 1, max];\r\n                            }\r\n                            else if(b == 3){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, min + a * 4 + 1];\r\n                                v5 = [min + a * 4 + 2, max];\r\n                            }\r\n                            else if(b == 4){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2 + 1];\r\n                                v3 = [min + a * 2 + 2, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, min + a * 4 + 2];\r\n                                v5 = [min + a * 4 + 3, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, min + a * 3 - 1];\r\n                                v4 = [min + a * 3, min + a * 4 - 1];\r\n                                v5 = [min + a * 4, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 4, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 4, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 3, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 3, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v5[0] && parseInt(cell.v) <= v5[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    //\u83B7\u53D6\u53D8\u91CF\u503C\r\n                    let conditionName = ruleArr[i].conditionName,         //\u6761\u4EF6\u540D\u79F0\r\n                        conditionValue0 = ruleArr[i].conditionValue[0],   //\u6761\u4EF6\u503C1\r\n                        conditionValue1 = ruleArr[i].conditionValue[1],   //\u6761\u4EF6\u503C2\r\n                        textColor = format.textColor,          //\u6761\u4EF6\u683C\u5F0F\u6587\u672C\u989C\u8272 fc\r\n                        cellColor = format.cellColor;          //\u6761\u4EF6\u683C\u5F0F\u5355\u5143\u683C\u989C\u8272 bg\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        //\u6761\u4EF6\u7C7B\u578B\u5224\u65AD\r\n                        if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"equal\" || conditionName == \"textContains\"){\r\n                            //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u5355\u5143\u683C\u503C\r\n                                    let cell = d[r][c];\r\n\r\n                                    if(getObjType(cell) != \"object\" || isRealNull(cell.v)){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u7B26\u5408\u6761\u4EF6\r\n                                    if(conditionName == \"greaterThan\" && cell.v > conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"lessThan\" && cell.v < conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"equal\" && cell.v == conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"textContains\" && cell.v.toString().indexOf(conditionValue0) != -1){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"betweenness\"){\r\n                            //\u6BD4\u8F83\u6761\u4EF6\u503C1\u548C\u6761\u4EF6\u503C2\u7684\u5927\u5C0F\r\n                            let vBig, vSmall;\r\n                            if(conditionValue0 > conditionValue1){\r\n                                vBig = conditionValue0;\r\n                                vSmall = conditionValue1;\r\n                            }\r\n                            else{\r\n                                vBig = conditionValue1;\r\n                                vSmall = conditionValue0;\r\n                            }\r\n                            //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u5355\u5143\u683C\u503C\r\n                                    let cell = d[r][c];\r\n\r\n                                    if(getObjType(cell) != \"object\" || isRealNull(cell.v)){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u7B26\u5408\u6761\u4EF6\r\n                                    if(cell.v >= vSmall && cell.v <= vBig){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"occurrenceDate\"){\r\n                            //\u83B7\u53D6\u65E5\u671F\u6240\u5BF9\u5E94\u7684\u6570\u503C\r\n                            let dBig, dSmall;\r\n                            if(conditionValue0.toString().indexOf(\"-\") == -1){\r\n                                dBig = genarate(conditionValue0)[2];\r\n                                dSmall = genarate(conditionValue0)[2];\r\n                            }\r\n                            else{\r\n                                let str = conditionValue0.toString().split(\"-\");\r\n                                dBig = genarate(str[1].trim())[2];\r\n                                dSmall = genarate(str[0].trim())[2];\r\n                            }\r\n                            //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u5355\u5143\u683C\u503C\u7C7B\u578B\u4E3A\u65E5\u671F\u7C7B\u578B\r\n                                    if(d[r][c].ct != null && d[r][c].ct.t == \"d\"){\r\n                                        //\u5355\u5143\u683C\u503C\r\n                                        let cellVal = getcellvalue(r, c, d);\r\n                                        //\u7B26\u5408\u6761\u4EF6\r\n                                        if(cellVal >= dSmall && cellVal <= dBig){\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"duplicateValue\"){\r\n                            //\u5E94\u7528\u8303\u56F4\u5355\u5143\u683C\u503C\u5904\u7406\r\n                            let dmap = {};\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    let item = getcellvalue(r, c, d);\r\n                                    if(!(item in dmap)){\r\n                                        dmap[item] = [];\r\n                                    }\r\n                                    dmap[item].push({\"r\": r, \"c\": c});\r\n                                }\r\n                            }\r\n                            //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                            if(conditionValue0 == \"0\"){//\u91CD\u590D\u503C\r\n                                for(let x in dmap){\r\n                                    if(x != \"null\" && x != \"undefined\" && dmap[x].length > 1){\r\n                                        for(let j = 0; j < dmap[x].length; j++){\r\n                                            if((dmap[x][j].r + \"_\" + dmap[x][j].c) in computeMap){\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c][\"textColor\"] = textColor;\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            if(conditionValue0 == \"1\"){//\u552F\u4E00\u503C\r\n                                for(let x in dmap){\r\n                                    if(x != \"null\" && x != \"undefined\" && dmap[x].length == 1){\r\n                                        if((dmap[x][0].r + \"_\" + dmap[x][0].c) in computeMap){\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c][\"textColor\"] = textColor;\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\" || conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                            //\u5E94\u7528\u8303\u56F4\u5355\u5143\u683C\u503C(\u6570\u503C\u578B)\r\n                            let dArr=[];\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //\u5355\u5143\u683C\u503C\u7C7B\u578B\u4E3A\u6570\u5B57\u7C7B\u578B\r\n                                    if(d[r][c].ct != null && d[r][c].ct.t == \"n\"){\r\n                                        dArr.push(getcellvalue(r, c, d));\r\n                                    }\r\n                                }\r\n                            }\r\n                            //\u6570\u7EC4\u5904\u7406\r\n                            if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                                //\u4ECE\u5927\u5230\u5C0F\u6392\u5E8F\r\n                                for(let j = 0; j < dArr.length; j++){\r\n                                    for(let k = 0; k < dArr.length - 1 - j; k++){\r\n                                        if(dArr[k]<dArr[k+1]){\r\n                                            let temp=dArr[k];\r\n                                            dArr[k]=dArr[k+1];\r\n                                            dArr[k+1]=temp;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                //\u53D6\u6761\u4EF6\u503C\u6570\u7EC4\r\n                                let cArr\r\n                                if(conditionName == \"top10\"){\r\n                                    cArr = dArr.slice(0, conditionValue0); //\u524D10\u9879\u6570\u7EC4\r\n                                }\r\n                                else if(conditionName == \"top10%\"){\r\n                                    cArr = dArr.slice(0, Math.floor(conditionValue0*dArr.length/100)); //\u524D10%\u6570\u7EC4\r\n                                }\r\n                                else if(conditionName == \"last10\"){\r\n                                    cArr = dArr.slice((dArr.length-conditionValue0), dArr.length); //\u6700\u540E10\u9879\u6570\u7EC4\r\n                                }\r\n                                else if(conditionName == \"last10%\"){\r\n                                    cArr = dArr.slice((dArr.length-Math.floor(conditionValue0*dArr.length/100)), dArr.length); //\u6700\u540E10%\u6570\u7EC4\r\n                                }\r\n                                //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        //\u5355\u5143\u683C\u503C\r\n                                        let cellVal = getcellvalue(r, c, d);\r\n                                        //\u7B26\u5408\u6761\u4EF6\r\n                                        if(cArr.indexOf(cellVal) != -1){\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if(conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                                //\u8BA1\u7B97\u6570\u7EC4\u5E73\u5747\u503C\r\n                                let sum = 0;\r\n                                for(let j = 0; j < dArr.length; j++){\r\n                                    sum += dArr[j];\r\n                                }\r\n                                let averageNum = sum / dArr.length;\r\n                                //\u5FAA\u73AF\u5E94\u7528\u8303\u56F4\u8BA1\u7B97\r\n                                if(conditionName == \"AboveAverage\"){ //\u9AD8\u4E8E\u5E73\u5747\u503C\r\n                                    for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                        for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                            if(d[r] == null || d[r][c] == null){\r\n                                                continue;\r\n                                            }\r\n\r\n                                            //\u5355\u5143\u683C\u503C\r\n                                            let cellVal = getcellvalue(r, c, d);\r\n                                            //\u7B26\u5408\u6761\u4EF6\r\n                                            if(cellVal > averageNum){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                                else if(conditionName == \"SubAverage\"){ //\u4F4E\u4E8E\u5E73\u5747\u503C\r\n                                    for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                        for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                            if(d[r] == null || d[r][c] == null){\r\n                                                continue;\r\n                                            }\r\n\r\n                                            //\u5355\u5143\u683C\u503C\r\n                                            let cellVal = getcellvalue(r, c, d);\r\n                                            //\u7B26\u5408\u6761\u4EF6\r\n                                            if(cellVal < averageNum){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"formula\"){\r\n                            let str = cellrange[s].row[0],\r\n                                edr = cellrange[s].row[1],\r\n                                stc = cellrange[s].column[0],\r\n                                edc = cellrange[s].column[1];\r\n\r\n                            let formulaTxt = conditionValue0;\r\n                            if(conditionValue0.toString().slice(0, 1) != '='){\r\n                                formulaTxt = '=' + conditionValue0;\r\n                            }\r\n\r\n                            for(let r = str; r <= edr; r++){\r\n                                for(let c = stc; c <= edc; c++){\r\n                                    let func = formulaTxt;\r\n                                    let offsetRow = r - str;\r\n                                    let offsetCol = c - stc;\r\n\r\n                                    if(offsetRow > 0){\r\n                                        func = \"=\" + formula.functionCopy(func, \"down\", offsetRow);\r\n                                    }\r\n\r\n                                    if(offsetCol > 0){\r\n                                        func = \"=\" + formula.functionCopy(func, \"right\", offsetCol);\r\n                                    }\r\n\r\n                                    let funcV = formula.execfunction(func);\r\n                                    let v = funcV[1];\r\n\r\n                                    if(typeof v != 'boolean'){\r\n                                        v = !!Number(v);\r\n                                    }\r\n\r\n                                    if(!v){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    if((r + \"_\" + c) in computeMap){\r\n                                        computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                        computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                    }\r\n                                    else{\r\n                                        computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return computeMap;\r\n    },\r\n    updateItem: function(type, cellrange, format){\r\n        if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n        let fileH = $.extend(true, [], Store.luckysheetfile);\r\n        let historyRules = _this.getHistoryRules(fileH);\r\n\r\n        //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n        let ruleArr;\r\n        if(type == \"delSheet\"){\r\n            ruleArr = [];\r\n        }\r\n        else{\r\n            let rule = {\r\n                \"type\": type,\r\n                \"cellrange\": cellrange,\r\n                \"format\": format\r\n            };\r\n            ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"] == null ? [] : Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n            ruleArr.push(rule);\r\n        }\r\n\r\n        Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n        let fileC = $.extend(true, [], Store.luckysheetfile);\r\n        let currentRules = _this.getCurrentRules(fileC);\r\n\r\n        //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        //\u53D1\u9001\u7ED9\u540E\u53F0\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n        }\r\n    },\r\n    getHistoryRules: function(fileH){\r\n        let historyRules = [];\r\n\r\n        for(let h = 0; h < fileH.length; h++){\r\n            historyRules.push({\"sheetIndex\": fileH[h][\"index\"], \"luckysheet_conditionformat_save\": fileH[h][\"luckysheet_conditionformat_save\"]});\r\n        }\r\n\r\n        return historyRules;\r\n    },\r\n    getCurrentRules: function(fileC){\r\n        let currentRules = [];\r\n\r\n        for(let c = 0; c < fileC.length; c++){\r\n            currentRules.push({\"sheetIndex\": fileC[c][\"index\"], \"luckysheet_conditionformat_save\": fileC[c][\"luckysheet_conditionformat_save\"]});\r\n        }\r\n\r\n        return currentRules;\r\n    },\r\n    ref: function(historyRules, currentRules){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateCF\";\r\n            redo[\"data\"] = {\"historyRules\": historyRules, \"currentRules\": currentRules};\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default conditionformat;\r\n", "import { selectHightlightShow, selectionCopyShow } from './select';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport {checkProtectionLockedRangeList} from './protection';\r\nimport editor from '../global/editor';\r\nimport tooltip from '../global/tooltip';\r\nimport formula from '../global/formula';\r\nimport { getBorderInfoCompute } from '../global/border';\r\nimport { getdatabyselection, getcellvalue, datagridgrowth } from '../global/getdata';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport { isEditMode, hasPartMC, isRealNum } from '../global/validate';\r\nimport { jfrefreshgrid, jfrefreshgrid_pastcut } from '../global/refresh';\r\nimport { genarate, update } from '../global/format';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { replaceHtml, getObjType, luckysheetfontformat } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport imageCtrl from './imageCtrl';\r\n\r\nconst selection = {\r\n    clearcopy: function (e) {\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) { // for chrome\r\n            if (!!e) {\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n        }\r\n        let cpdata = \" \";\r\n\r\n        Store.luckysheet_selection_range = [];\r\n        selectionCopyShow();\r\n        // Store.luckysheet_copy_save = {};\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\").css(\"visibility\", \"hidden\");\r\n            textarea.val(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            // \u7B4950\u6BEB\u79D2\uFF0CkeyPress\u4E8B\u4EF6\u53D1\u751F\u4E86\u518D\u53BB\u5904\u7406\u6570\u636E\r\n            setTimeout(function () { textarea.blur().css(\"visibility\", \"visible\"); }, 10);\r\n        }\r\n        else {\r\n            clipboardData.setData('Text', cpdata);\r\n            return false;//\u5426\u5219\u8BBE\u4E0D\u751F\u6548\r\n        }\r\n    },\r\n    getHtmlBorderStyle: function(type, color){\r\n        let style = \"\";\r\n        let borderType = {\r\n            \"0\": \"none\",\r\n            \"1\": \"Thin\",\r\n            \"2\": \"Hair\",\r\n            \"3\": \"Dotted\",\r\n            \"4\": \"Dashed\",\r\n            \"5\": \"DashDot\",\r\n            \"6\": \"DashDotDot\",\r\n            \"7\": \"Double\",\r\n            \"8\": \"Medium\",\r\n            \"9\": \"MediumDashed\",\r\n            \"10\": \"MediumDashDot\",\r\n            \"11\": \"MediumDashDotDot\",\r\n            \"12\": \"SlantedDashDot\",\r\n            \"13\": \"Thick\"\r\n        };\r\n        type = borderType[type.toString()];\r\n\r\n        if(type.indexOf(\"Medium\") > -1){\r\n            style += \"1pt \";\r\n        }\r\n        else if(type == \"Thick\"){\r\n            style += \"1.5pt \";\r\n        }\r\n        else {\r\n            style += \"0.5pt \";\r\n        }\r\n\r\n        if(type == \"Hair\"){\r\n            style += \"double \";\r\n        }\r\n        else if(type.indexOf(\"DashDotDot\") > -1){\r\n            style += \"dotted \";\r\n        }\r\n        else if(type.indexOf(\"DashDot\") > -1){\r\n            style += \"dashed \";\r\n        }\r\n        else if(type.indexOf(\"Dotted\") > -1){\r\n            style += \"dotted \";\r\n        }\r\n        else if(type.indexOf(\"Dashed\") > -1){\r\n            style += \"dashed \";\r\n        }\r\n        else{\r\n            style += \"solid \";\r\n        }\r\n\r\n        return style + color + \";\";\r\n    },\r\n    copy: function (e) {//copy\u4E8B\u4EF6\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) { // for chrome\r\n            clipboardData = e.originalEvent.clipboardData;\r\n        }\r\n\r\n        Store.luckysheet_selection_range = [];\r\n        //copy\u8303\u56F4\r\n        let rowIndexArr = [], colIndexArr = [];\r\n        let copyRange = [], RowlChange = false, HasMC = false;\r\n\r\n        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n            let range = Store.luckysheet_select_save[s];\r\n\r\n            let r1 = range.row[0],\r\n                r2 = range.row[1];\r\n            let c1 = range.column[0],\r\n                c2 = range.column[1];\r\n\r\n            for(let copyR = r1; copyR <= r2; copyR++){\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][copyR] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if(!rowIndexArr.includes(copyR)){\r\n                    rowIndexArr.push(copyR);\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && (copyR in Store.config[\"rowlen\"])){\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for(let copyC = c1; copyC <= c2; copyC++){\r\n                    if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][copyC] != null) {\r\n                        continue;\r\n                    }\r\n\r\n                    if(!colIndexArr.includes(copyC)){\r\n                        colIndexArr.push(copyC);\r\n                    }\r\n\r\n                    let cell = Store.flowdata[copyR][copyC];\r\n\r\n                    if(getObjType(cell) == \"object\" && (\"mc\" in cell) && cell.mc.rs != null){\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_selection_range.push({ \"row\": range.row, \"column\": range.column });\r\n            copyRange.push({ \"row\": range.row, \"column\": range.column });\r\n        }\r\n\r\n        selectionCopyShow();\r\n\r\n        //luckysheet\u5185copy\u4FDD\u5B58\r\n        Store.luckysheet_copy_save = {\r\n            \"dataSheetIndex\": Store.currentSheetIndex,\r\n            \"copyRange\": copyRange,\r\n            \"RowlChange\": RowlChange,\r\n            \"HasMC\": HasMC\r\n        };\r\n\r\n        //copy\u8303\u56F4\u6570\u636E\u62FC\u63A5\u6210table \u8D4B\u7ED9\u526A\u8D34\u677F\r\n        let _this = this;\r\n\r\n        let borderInfoCompute;\r\n        if(Store.config[\"borderInfo\"] && Store.config[\"borderInfo\"].length > 0){ //\u8FB9\u6846\r\n            borderInfoCompute = getBorderInfoCompute();\r\n        }\r\n\r\n        let cpdata = \"\",\r\n            d = editor.deepCopyFlowData(Store.flowdata);\r\n        let colgroup = \"\";\r\n\r\n        // rowIndexArr = rowIndexArr.sort();\r\n        // colIndexArr = colIndexArr.sort();\r\n\r\n        for (let i = 0; i < rowIndexArr.length; i++) {\r\n            let r = rowIndexArr[i];\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            cpdata += '<tr>';\r\n\r\n            for (let j = 0; j < colIndexArr.length; j++) {\r\n                let c = colIndexArr[j];\r\n\r\n                if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                    continue;\r\n                }\r\n\r\n                let column = '<td ${span} style=\"${style}\">';\r\n\r\n                if (d[r] != null && d[r][c] != null) {\r\n                    let style = \"\", span = \"\";\r\n\r\n                    if(r == rowIndexArr[0]){\r\n                        if(Store.config == null || Store.config[\"columnlen\"] == null || Store.config[\"columnlen\"][c.toString()] == null){\r\n                            colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                        }\r\n                        else {\r\n                            colgroup += '<colgroup width=\"'+ Store.config[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                        }\r\n                    }\r\n\r\n                    if(c == colIndexArr[0]){\r\n                        if(Store.config == null || Store.config[\"rowlen\"] == null || Store.config[\"rowlen\"][r.toString()] == null){\r\n                            style += 'height:19px;';\r\n                        }\r\n                        else {\r\n                            style += 'height:'+ Store.config[\"rowlen\"][r.toString()] + 'px;';\r\n                        }\r\n                    }\r\n\r\n                    let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n                    let c_value;\r\n                    if(d[r][c].ct != null && d[r][c].ct.fa != null && d[r][c].ct.fa.match(reg)){\r\n                        c_value = getcellvalue(r, c, d);\r\n                    }\r\n                    else{\r\n                        c_value = getcellvalue(r, c, d, \"m\");\r\n                    }\r\n\r\n                    style += menuButton.getStyleByCell(d, r, c);\r\n\r\n                    if(getObjType(d[r][c]) == \"object\" && (\"mc\" in d[r][c])){\r\n                        if(\"rs\" in d[r][c][\"mc\"]){\r\n                            span = 'rowspan=\"'+ d[r][c][\"mc\"].rs +'\" colspan=\"'+ d[r][c][\"mc\"].cs +'\"';\r\n\r\n                            //\u8FB9\u6846\r\n                            if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                                let bl_obj = { \"color\": {}, \"style\": {} },\r\n                                    br_obj = { \"color\": {}, \"style\": {} },\r\n                                    bt_obj = { \"color\": {}, \"style\": {} },\r\n                                    bb_obj = { \"color\": {}, \"style\": {} };\r\n\r\n                                for(let bd_r = r; bd_r < (r + d[r][c][\"mc\"].rs); bd_r++){\r\n                                    for(let bd_c = c; bd_c < (c + d[r][c][\"mc\"].cs); bd_c++){\r\n                                        if(bd_r == r && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].t){\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].t.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].t.color;\r\n\r\n                                            if(bt_obj[\"style\"][linetype] == null){\r\n                                                bt_obj[\"style\"][linetype] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bt_obj[\"style\"][linetype] = bt_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if(bt_obj[\"color\"][bcolor] == null){\r\n                                                bt_obj[\"color\"][bcolor] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bt_obj[\"color\"][bcolor] = bt_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if(bd_r == (r + d[r][c][\"mc\"].rs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].b){\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].b.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].b.color;\r\n\r\n                                            if(bb_obj[\"style\"][linetype] == null){\r\n                                                bb_obj[\"style\"][linetype] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bb_obj[\"style\"][linetype] = bb_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if(bb_obj[\"color\"][bcolor] == null){\r\n                                                bb_obj[\"color\"][bcolor] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bb_obj[\"color\"][bcolor] = bb_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if(bd_c == c && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].l){\r\n                                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].l.color;\r\n\r\n                                            if(bl_obj[\"style\"][linetype] == null){\r\n                                                bl_obj[\"style\"][linetype] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bl_obj[\"style\"][linetype] = bl_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if(bl_obj[\"color\"][bcolor] == null){\r\n                                                bl_obj[\"color\"][bcolor] = 1;\r\n                                            }\r\n                                            else{\r\n                                                bl_obj[\"color\"][bcolor] = bl_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if(bd_c == (c + d[r][c][\"mc\"].cs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].r){\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].r.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].r.color;\r\n\r\n                                            if(br_obj[\"style\"][linetype] == null){\r\n                                                br_obj[\"style\"][linetype] = 1;\r\n                                            }\r\n                                            else{\r\n                                                br_obj[\"style\"][linetype] = br_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if(br_obj[\"color\"][bcolor] == null){\r\n                                                br_obj[\"color\"][bcolor] = 1;\r\n                                            }\r\n                                            else{\r\n                                                br_obj[\"color\"][bcolor] = br_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                let rowlen = d[r][c][\"mc\"].rs, collen = d[r][c][\"mc\"].cs;\r\n\r\n                                if(JSON.stringify(bl_obj).length > 23){\r\n                                    let bl_color = null, bl_style = null;\r\n\r\n                                    for(let x in bl_obj.color){\r\n                                        if(bl_obj.color[x] >= (rowlen / 2)){\r\n                                            bl_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for(let x in bl_obj.style){\r\n                                        if(bl_obj.style[x] >= (rowlen / 2)){\r\n                                            bl_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bl_color != null && bl_style != null){\r\n                                        style += \"border-left:\" + _this.getHtmlBorderStyle(bl_style, bl_color);\r\n                                    }\r\n                                }\r\n\r\n                                if(JSON.stringify(br_obj).length > 23){\r\n                                    let br_color = null, br_style = null;\r\n\r\n                                    for(let x in br_obj.color){\r\n                                        if(br_obj.color[x] >= (rowlen / 2)){\r\n                                            br_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for(let x in br_obj.style){\r\n                                        if(br_obj.style[x] >= (rowlen / 2)){\r\n                                            br_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(br_color != null && br_style != null){\r\n                                        style += \"border-right:\" + _this.getHtmlBorderStyle(br_style, br_color);\r\n                                    }\r\n                                }\r\n\r\n                                if(JSON.stringify(bt_obj).length > 23){\r\n                                    let bt_color = null, bt_style = null;\r\n\r\n                                    for(let x in bt_obj.color){\r\n                                        if(bt_obj.color[x] >= (collen / 2)){\r\n                                            bt_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for(let x in bt_obj.style){\r\n                                        if(bt_obj.style[x] >= (collen / 2)){\r\n                                            bt_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bt_color != null && bt_style != null){\r\n                                        style += \"border-top:\" + _this.getHtmlBorderStyle(bt_style, bt_color);\r\n                                    }\r\n                                }\r\n\r\n                                if(JSON.stringify(bb_obj).length > 23){\r\n                                    let bb_color = null, bb_style = null;\r\n\r\n                                    for(let x in bb_obj.color){\r\n                                        if(bb_obj.color[x] >= (collen / 2)){\r\n                                            bb_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for(let x in bb_obj.style){\r\n                                        if(bb_obj.style[x] >= (collen / 2)){\r\n                                            bb_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bb_color != null && bb_style != null){\r\n                                        style += \"border-bottom:\" + _this.getHtmlBorderStyle(bb_style, bb_color);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            continue;\r\n                        }\r\n                    }\r\n                    else{\r\n                        //\u8FB9\u6846\r\n                        if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                            //\u5DE6\u8FB9\u6846\r\n                            if(borderInfoCompute[r + \"_\" + c].l){\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                                style += \"border-left:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //\u53F3\u8FB9\u6846\r\n                            if(borderInfoCompute[r + \"_\" + c].r){\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                                style += \"border-right:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //\u4E0B\u8FB9\u6846\r\n                            if(borderInfoCompute[r + \"_\" + c].b){\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                                style += \"border-bottom:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //\u4E0A\u8FB9\u6846\r\n                            if(borderInfoCompute[r + \"_\" + c].t){\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                                style += \"border-top:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    column = replaceHtml(column, {\"style\": style, \"span\": span});\r\n\r\n                    if(c_value == null){\r\n                        c_value = getcellvalue(r, c, d);\r\n                    }\r\n                    if(c_value == null && d[r][c] && d[r][c].ct && d[r][c].ct.t == 'inlineStr') {\r\n                      c_value = d[r][c].ct.s.map(val=>{\r\n                        const font = $('<font></font>')\r\n                        val.fs && font.css('font-size',val.fs)\r\n                        val.bl && font.css('font-weight',val.border)\r\n                        val.it && font.css('font-style',val.italic)\r\n                        val.cl==1 && font.css('text-decoration','underline')\r\n                        font.text(val.v)\r\n                        return font[0].outerHTML\r\n                      }).join('');\r\n                    }\r\n\r\n                    if(c_value == null){\r\n                        c_value = \"\";\r\n                    }\r\n\r\n                    column += c_value;\r\n                }\r\n                else {\r\n                    let style = \"\";\r\n\r\n                    //\u8FB9\u6846\r\n                    if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                        //\u5DE6\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].l){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                            style += \"border-left:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u53F3\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].r){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                            style += \"border-right:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u4E0B\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].b){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                            style += \"border-bottom:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u4E0A\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].t){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                            style += \"border-top:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n                    }\r\n\r\n                    column += \"\";\r\n\r\n                    if(r == rowIndexArr[0]){\r\n                        if(Store.config == null || Store.config[\"columnlen\"] == null || Store.config[\"columnlen\"][c.toString()] == null){\r\n                            colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                        }\r\n                        else {\r\n                            colgroup += '<colgroup width=\"'+ Store.config[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                        }\r\n                    }\r\n\r\n                    if(c == colIndexArr[0]){\r\n                        if(Store.config == null || Store.config[\"rowlen\"] == null || Store.config[\"rowlen\"][r.toString()] == null){\r\n                            style += 'height:19px;';\r\n                        }\r\n                        else {\r\n                            style += 'height:'+ Store.config[\"rowlen\"][r.toString()] + 'px;';\r\n                        }\r\n                    }\r\n\r\n                    column = replaceHtml(column, {\"style\": style, \"span\": \"\"});\r\n                    column += \"\";\r\n                }\r\n\r\n                column += '</td>';\r\n                cpdata += column;\r\n            }\r\n\r\n            cpdata += \"</tr>\";\r\n        }\r\n        cpdata = '<table data-type=\"luckysheet_copy_action_table\">' + colgroup + cpdata + '</table>';\r\n\r\n        Store.iscopyself = true;\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.html(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n\r\n            // \u7B4950\u6BEB\u79D2\uFF0CkeyPress\u4E8B\u4EF6\u53D1\u751F\u4E86\u518D\u53BB\u5904\u7406\u6570\u636E\r\n            setTimeout(function () {\r\n                $(\"#luckysheet-copy-content\").blur();\r\n            }, 10);\r\n\r\n            // var oInput = document.createElement('input');\r\n            // oInput.setAttribute('readonly', 'readonly');\r\n            // oInput.value = cpdata;\r\n            // document.body.appendChild(oInput);\r\n            // oInput.select(); // \u9009\u62E9\u5BF9\u8C61\r\n            // document.execCommand(\"Copy\");\r\n            // oInput.style.display='none';\r\n            // document.body.removeChild(oInput);\r\n        }\r\n        else {\r\n            clipboardData.setData('Text', cpdata);\r\n            return false;//\u5426\u5219\u8BBE\u4E0D\u751F\u6548\r\n        }\r\n    },\r\n    copybyformat: function (e, txt) {//copy\u4E8B\u4EF6\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) { // for chrome\r\n            clipboardData = e.originalEvent && e.originalEvent.clipboardData;\r\n        }\r\n\r\n        Store.luckysheet_selection_range = [{ \"row\": Store.luckysheet_select_save[0].row, \"column\": Store.luckysheet_select_save[0].column }];\r\n        selectionCopyShow();\r\n\r\n        let cpdata = txt;\r\n        Store.iscopyself = true;\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.text(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n            // \u7B4950\u6BEB\u79D2\uFF0CkeyPress\u4E8B\u4EF6\u53D1\u751F\u4E86\u518D\u53BB\u5904\u7406\u6570\u636E\r\n            setTimeout(function () { textarea.blur(); }, 10);\r\n        }\r\n        else {\r\n            clipboardData.setData('Text', cpdata);\r\n            return false;//\u5426\u5219\u8BBE\u4E0D\u751F\u6548\r\n        }\r\n    },\r\n    isPasteAction: false,\r\n    paste: function (e, triggerType) {//paste\u4E8B\u4EF6\r\n        let _this = this;\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const local_drag = _locale.drag;\r\n\r\n        let textarea = $(\"#luckysheet-copy-content\");\r\n        textarea.focus();\r\n        textarea.select();\r\n\r\n        // \u7B4950\u6BEB\u79D2\uFF0CkeyPress\u4E8B\u4EF6\u53D1\u751F\u4E86\u518D\u53BB\u5904\u7406\u6570\u636E\r\n        setTimeout(function () {\r\n            let data = textarea.html();\r\n\r\n            if (data.indexOf(\"luckysheet_copy_action_table\") >- 1 && Store.luckysheet_copy_save[\"copyRange\"] != null && Store.luckysheet_copy_save[\"copyRange\"].length > 0) {\r\n                if(Store.luckysheet_paste_iscut){\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    _this.pasteHandlerOfCutPaste(Store.luckysheet_copy_save);\r\n                    _this.clearcopy(e);\r\n                }\r\n                else{\r\n                    _this.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save);\r\n                }\r\n            }\r\n            else if(data.indexOf(\"luckysheet_copy_action_image\") > - 1){\r\n                imageCtrl.pasteImgItem();\r\n            }\r\n            else if (triggerType != \"btn\") {\r\n                _this.pasteHandler(data);\r\n            }\r\n            else {\r\n                if(isEditMode()){\r\n                    alert(local_drag.pasteMustKeybordAlert);\r\n                }\r\n                else{\r\n                    tooltip.info(local_drag.pasteMustKeybordAlertHTMLTitle, local_drag.pasteMustKeybordAlertHTML);\r\n                }\r\n            }\r\n        }, 10);\r\n    },\r\n    pasteHandler: function (data, borderInfo) {\r\n\r\n        if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(\"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\");\r\n            }\r\n            else{\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A', \"\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u62E9\u533A\u57DF\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u8BF7\u9009\u62E9\u5355\u4E2A\u533A\u57DF\uFF0C\u7136\u540E\u518D\u8BD5\");\r\n            }\r\n        }\r\n\r\n        if (typeof data == \"object\") {\r\n            if (data.length == 0) { return; };\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"merge\"] == null){\r\n                cfg[\"merge\"] = {};\r\n            }\r\n\r\n            if(JSON.stringify(borderInfo).length > 2 && cfg[\"borderInfo\"] == null){\r\n                cfg[\"borderInfo\"] = [];\r\n            }\r\n\r\n            let copyh = data.length, copyc = data[0].length;\r\n\r\n            let minh = Store.luckysheet_select_save[0].row[0], //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u884C\r\n                maxh = minh + copyh - 1;\r\n            let minc = Store.luckysheet_select_save[0].column[0], //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u5217\r\n                maxc = minc + copyc - 1;\r\n\r\n            //\u5E94\u7528\u8303\u56F4\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u5219return\u63D0\u793A\r\n            let has_PartMC = false;\r\n            if(cfg[\"merge\"] != null){\r\n                has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n                else{\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A', \"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n            let rowMaxLength = d.length;\r\n            let cellMaxLength = d[0].length;\r\n\r\n            //\u82E5\u5E94\u7528\u8303\u56F4\u8D85\u8FC7\u6700\u5927\u884C\u6216\u6700\u5927\u5217\uFF0C\u589E\u52A0\u884C\u5217\r\n            let addr = maxh - rowMaxLength + 1, addc = maxc - cellMaxLength + 1;\r\n            if(addr > 0 || addc > 0){\r\n                d = datagridgrowth([].concat(d), addr, addc, true);\r\n            }\r\n\r\n            if(cfg[\"rowlen\"] == null){\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            let RowlChange = false;\r\n            let offsetMC = {};\r\n            for (let h = minh; h <= maxh; h++) {\r\n                let x = [].concat(d[h]);\r\n\r\n                let currentRowLen = Store.defaultrowlen;\r\n                if(cfg[\"rowlen\"][h] != null){\r\n                    currentRowLen = cfg[\"rowlen\"][h];\r\n                }\r\n\r\n                for (let c = minc; c <= maxc; c++) {\r\n                    if(getObjType(x[c]) == \"object\" && (\"mc\" in x[c])){\r\n                        if(\"rs\" in x[c].mc){\r\n                            delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                        }\r\n\r\n                        delete x[c].mc;\r\n                    }\r\n\r\n                    let value = null;\r\n                    if (data[h - minh] != null && data[h - minh][c - minc] != null) {\r\n                        value = data[h - minh][c - minc];\r\n                    }\r\n\r\n                    x[c] = $.extend(true, {}, value);\r\n\r\n                    if(value != null && \"mc\" in x[c]){\r\n                        if(x[c][\"mc\"].rs != null){\r\n                            x[c][\"mc\"].r = h;\r\n                            x[c][\"mc\"].c = c;\r\n\r\n                            cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                            offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                        }\r\n                        else{\r\n                            x[c] = { \"mc\": { r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0], c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1] } }\r\n                        }\r\n                    }\r\n\r\n                    if(borderInfo[(h - minh) + \"_\" + (c - minc)]){\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"cell\",\r\n                            \"value\": {\r\n                                \"row_index\": h,\r\n                                \"col_index\": c,\r\n                                \"l\": borderInfo[(h - minh) + \"_\" + (c - minc)].l,\r\n                                \"r\": borderInfo[(h - minh) + \"_\" + (c - minc)].r,\r\n                                \"t\": borderInfo[(h - minh) + \"_\" + (c - minc)].t,\r\n                                \"b\": borderInfo[(h - minh) + \"_\" + (c - minc)].b\r\n                            }\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"].push(bd_obj);\r\n                    }\r\n\r\n                    let fontset = luckysheetfontformat(x[c]);\r\n                    let oneLineTextHeight = menuButton.getTextSize(\"\u7530\", fontset)[1];\r\n                    //\u6BD4\u8F83\u8BA1\u7B97\u9AD8\u5EA6\u548C\u5F53\u524D\u9AD8\u5EA6\u53D6\u6700\u5927\u9AD8\u5EA6\r\n                    if(oneLineTextHeight > currentRowLen){\r\n                        currentRowLen = oneLineTextHeight;\r\n                        RowlChange = true;\r\n                    }\r\n                }\r\n                d[h] = x;\r\n\r\n                if(currentRowLen != Store.defaultrowlen){\r\n                    cfg[\"rowlen\"][h] = currentRowLen;\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = [{ \"row\": [minh, maxh], \"column\": [minc, maxc] }];\r\n\r\n\r\n            if(addr > 0 || addc > 0 || RowlChange){\r\n                let allParam = {\r\n                    \"cfg\": cfg,\r\n                    \"RowlChange\": true\r\n                }\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n            }\r\n            else{\r\n                let allParam = {\r\n                    \"cfg\": cfg\r\n                }\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n                selectHightlightShow();\r\n            }\r\n        }\r\n        else {\r\n            data = data.replace(/\\r/g, \"\");\r\n            let dataChe = [];\r\n            let che = data.split(\"\\n\"),\r\n                colchelen = che[0].split(\"\\t\").length;\r\n\r\n            for (let i = 0; i < che.length; i++) {\r\n                if (che[i].split(\"\\t\").length < colchelen) {\r\n                    continue;\r\n                }\r\n\r\n                dataChe.push(che[i].split(\"\\t\"));\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n            let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n            let rlen = dataChe.length, clen = dataChe[0].length;\r\n\r\n            //\u5E94\u7528\u8303\u56F4\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u5219return\u63D0\u793A\r\n            let has_PartMC = false;\r\n            if(Store.config[\"merge\"] != null){\r\n                has_PartMC = hasPartMC(Store.config, curR, curR + rlen - 1, curC, curC + clen - 1);\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n                else{\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A',\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            let addr = curR + rlen - d.length, addc = curC + clen - d[0].length;\r\n            if(addr > 0 || addc > 0){\r\n                d = datagridgrowth([].concat(d), addr, addc, true);\r\n            }\r\n\r\n            for (let r = 0; r < rlen; r++) {\r\n                let x = [].concat(d[r + curR]);\r\n                for (let c = 0; c < clen; c++) {\r\n                    let originCell = x[c + curC];\r\n                    let value = dataChe[r][c];\r\n                    if(isRealNum(value)){\r\n                        // \u5982\u679C\u5355\u5143\u683C\u8BBE\u7F6E\u4E86\u7EAF\u6587\u672C\u683C\u5F0F\uFF0C\u90A3\u4E48\u5C31\u4E0D\u8981\u8F6C\u6210\u6570\u503C\u7C7B\u578B\u4E86\uFF0C\u9632\u6B62\u6570\u503C\u8FC7\u5927\u81EA\u52A8\u8F6C\u6210\u79D1\u5B66\u8BA1\u6570\u6CD5\r\n                        if (originCell && originCell.ct && originCell.ct.fa === '@') {\r\n                            value = String(value);\r\n                        } else {\r\n                            value = parseFloat(value);\r\n                        } \r\n                    }\r\n                    if(originCell instanceof Object){\r\n                        originCell.v = value;\r\n                        if(originCell.ct!=null && originCell.ct.fa!=null){\r\n                            originCell.m = update(originCell[\"ct\"][\"fa\"], value);\r\n                        }\r\n                        else{\r\n                            originCell.m = value;\r\n                        }\r\n\r\n                        if(originCell.f!=null && originCell.f.length>0){\r\n                            originCell.f = \"\";\r\n                            formula.delFunctionGroup(r + curR,c + curC,Store.currentSheetIndex);\r\n                        }\r\n                    }\r\n                    else{\r\n                        let cell = {};\r\n                        let mask = genarate(value);\r\n                        cell.v = mask[2];\r\n                        cell.ct = mask[1];\r\n                        cell.m = mask[0];\r\n\r\n                        x[c + curC] = cell;\r\n                    }\r\n\r\n                }\r\n                d[r + curR] = x;\r\n            }\r\n\r\n            last[\"row\"] = [curR, curR + rlen - 1];\r\n            last[\"column\"] = [curC, curC + clen - 1];\r\n\r\n            if (addr > 0 || addc > 0) {\r\n                let allParam = {\r\n                    \"RowlChange\": true\r\n                }\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n            }\r\n            else {\r\n                jfrefreshgrid(d, Store.luckysheet_select_save);\r\n                selectHightlightShow();\r\n            }\r\n        }\r\n    },\r\n    pasteHandlerOfCutPaste: function(copyRange){\r\n        if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n        if(Store.allowEdit === false){\r\n            return;\r\n        }\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if(cfg[\"merge\"] == null){\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let copyData = $.extend(true, [], getdatabyselection({\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]}, copySheetIndex));\r\n\r\n        let copyh = copyData.length, copyc = copyData[0].length;\r\n\r\n        //\u5E94\u7528\u8303\u56F4\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row_focus\"], maxh = minh + copyh - 1;         //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u884C\r\n        let minc = last[\"column_focus\"], maxc = minc + copyc - 1;      //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u5217\r\n\r\n        //\u5E94\u7528\u8303\u56F4\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u5219\u63D0\u793A\r\n        let has_PartMC = false;\r\n        if(cfg[\"merge\"] != null){\r\n            has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n        }\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n            }\r\n            else{\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A',\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n        let rowMaxLength = d.length;\r\n        let cellMaxLength = d[0].length;\r\n\r\n        let addr = copyh + minh - rowMaxLength, addc = copyc + minc - cellMaxLength;\r\n        if(addr > 0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"dataVerification\"]);\r\n        let dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"]);\r\n\r\n        //\u526A\u5207\u7C98\u8D34\u5728\u5F53\u524D\u8868\u64CD\u4F5C\uFF0C\u5220\u9664\u526A\u5207\u8303\u56F4\u5185\u6570\u636E\u3001\u5408\u5E76\u5355\u5143\u683C\u548C\u6570\u636E\u9A8C\u8BC1\r\n        if(Store.currentSheetIndex == copySheetIndex){\r\n            for(let i = c_r1; i <= c_r2; i++){\r\n                for(let j = c_c1; j <= c_c2; j++){\r\n                    let cell = d[i][j];\r\n\r\n                    if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                        if(\"rs\" in cell[\"mc\"]){\r\n                            delete cfg[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                        delete cell[\"mc\"];\r\n                    }\r\n\r\n                    d[i][j] = null;\r\n\r\n                    delete dataVerification[i + \"_\" + j];\r\n                }\r\n            }\r\n\r\n            //\u8FB9\u6846\r\n            if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){\r\n                let source_borderInfo = [];\r\n\r\n                for(let i = 0; i < cfg[\"borderInfo\"].length; i++){\r\n                    let bd_rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                    if(bd_rangeType == \"range\"){\r\n                        let bd_range = cfg[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for(let j = 0; j < bd_range.length; j++){\r\n                            bd_emptyRange = bd_emptyRange.concat(conditionformat.CFSplitRange(\r\n                                bd_range[j],\r\n                                {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                                {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                                \"restPart\"\r\n                            ));\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        source_borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                    else if(bd_rangeType == \"cell\"){\r\n                        let bd_r = cfg[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if(!(bd_r >= c_r1 && bd_r <= c_r2 && bd_c >= c_c1 && bd_c <= c_c2)){\r\n                            source_borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                cfg[\"borderInfo\"] = source_borderInfo;\r\n            }\r\n        }\r\n\r\n        let offsetMC = {};\r\n        for (let h = minh; h <= maxh; h++) {\r\n            let x = [].concat(d[h]);\r\n\r\n            for (let c = minc; c <= maxc; c++) {\r\n                if(borderInfoCompute[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)]){\r\n                    let bd_obj = {\r\n                        \"rangeType\": \"cell\",\r\n                        \"value\": {\r\n                            \"row_index\": h,\r\n                            \"col_index\": c,\r\n                            \"l\": borderInfoCompute[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)].l,\r\n                            \"r\": borderInfoCompute[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)].r,\r\n                            \"t\": borderInfoCompute[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)].t,\r\n                            \"b\": borderInfoCompute[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)].b\r\n                        }\r\n                    }\r\n\r\n                    if(cfg[\"borderInfo\"] == null){\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"].push(bd_obj);\r\n                }\r\n                else if(borderInfoCompute[h + \"_\" + c]){\r\n                    let bd_obj = {\r\n                        \"rangeType\": \"cell\",\r\n                        \"value\": {\r\n                            \"row_index\": h,\r\n                            \"col_index\": c,\r\n                            \"l\": null,\r\n                            \"r\": null,\r\n                            \"t\": null,\r\n                            \"b\": null\r\n                        }\r\n                    }\r\n\r\n                    if(cfg[\"borderInfo\"] == null){\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"].push(bd_obj);\r\n                }\r\n\r\n                //\u6570\u636E\u9A8C\u8BC1 \u526A\u5207\r\n                if(c_dataVerification[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)]){\r\n                    dataVerification[h + \"_\" + c] = c_dataVerification[(c_r1 + h - minh) + \"_\" + (c_c1 + c - minc)];\r\n                }\r\n\r\n                if(getObjType(x[c]) == \"object\" && (\"mc\" in x[c])){\r\n                    if(\"rs\" in x[c].mc){\r\n                        delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                    }\r\n                    delete x[c].mc;\r\n                }\r\n\r\n                let value = null;\r\n                if (copyData[h - minh] != null && copyData[h - minh][c - minc] != null) {\r\n                    value = copyData[h - minh][c - minc];\r\n                }\r\n\r\n                x[c] = $.extend(true, {}, value);\r\n\r\n                if(value != null && copyHasMC && (\"mc\" in x[c])){\r\n                    if(x[c][\"mc\"].rs != null){\r\n                        x[c][\"mc\"].r = h;\r\n                        x[c][\"mc\"].c = c;\r\n\r\n                        cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                        offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                    }\r\n                    else{\r\n                        x[c] = { \"mc\": { r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0], c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1] } }\r\n                    }\r\n                }\r\n            }\r\n\r\n            d[h] = x;\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        //\u82E5\u6709\u884C\u9AD8\u6539\u53D8\uFF0C\u91CD\u65B0\u8BA1\u7B97\u884C\u9AD8\u6539\u53D8\r\n        if(copyRowlChange){\r\n            if(Store.currentSheetIndex != copySheetIndex){\r\n                cfg = rowlenByRange(d, minh, maxh, cfg);\r\n            }\r\n            else{\r\n                cfg = rowlenByRange(d, c_r1, c_r2, cfg);\r\n                cfg = rowlenByRange(d, minh, maxh, cfg);\r\n            }\r\n        }\r\n\r\n        let source, target;\r\n        if(Store.currentSheetIndex != copySheetIndex){\r\n            //\u8DE8\u8868\u64CD\u4F5C\r\n            let sourceData = $.extend(true, [], Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"data\"]);\r\n            let sourceConfig = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"config\"]);\r\n\r\n            let sourceCurData = $.extend(true, [], sourceData);\r\n            let sourceCurConfig = $.extend(true, {}, sourceConfig);\r\n            if(sourceCurConfig[\"merge\"] == null){\r\n                sourceCurConfig[\"merge\"] = {};\r\n            }\r\n\r\n            for(let source_r = c_r1; source_r <= c_r2; source_r++){\r\n                for(let source_c = c_c1; source_c <= c_c2; source_c++){\r\n                    let cell = sourceCurData[source_r][source_c];\r\n\r\n                    if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                        if(\"rs\" in cell[\"mc\"]){\r\n                            delete sourceCurConfig[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                        delete cell[\"mc\"];\r\n                    }\r\n                    sourceCurData[source_r][source_c] = null;\r\n                }\r\n            }\r\n\r\n            if(copyRowlChange){\r\n                sourceCurConfig = rowlenByRange(sourceCurData, c_r1, c_r2, sourceCurConfig);\r\n            }\r\n\r\n            //\u8FB9\u6846\r\n            if(sourceCurConfig[\"borderInfo\"] && sourceCurConfig[\"borderInfo\"].length > 0){\r\n                let source_borderInfo = [];\r\n\r\n                for(let i = 0; i < sourceCurConfig[\"borderInfo\"].length; i++){\r\n                    let bd_rangeType = sourceCurConfig[\"borderInfo\"][i].rangeType;\r\n\r\n                    if(bd_rangeType == \"range\"){\r\n                        let bd_range = sourceCurConfig[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for(let j = 0; j < bd_range.length; j++){\r\n                            bd_emptyRange = bd_emptyRange.concat(conditionformat.CFSplitRange(\r\n                                bd_range[j],\r\n                                {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                                {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                                \"restPart\"\r\n                            ));\r\n                        }\r\n\r\n                        sourceCurConfig[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        source_borderInfo.push(sourceCurConfig[\"borderInfo\"][i]);\r\n                    }\r\n                    else if(bd_rangeType == \"cell\"){\r\n                        let bd_r = sourceCurConfig[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = sourceCurConfig[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if(!(bd_r >= c_r1 && bd_r <= c_r2 && bd_c >= c_c1 && bd_c <= c_c2)){\r\n                            source_borderInfo.push(sourceCurConfig[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                sourceCurConfig[\"borderInfo\"] = source_borderInfo;\r\n            }\r\n\r\n            //\u6761\u4EF6\u683C\u5F0F\r\n            let source_cdformat = $.extend(true, [], Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n            let source_curCdformat = $.extend(true, [], source_cdformat);\r\n            let ruleArr = [];\r\n            if(source_curCdformat != null && source_curCdformat.length > 0){\r\n                for(let i = 0; i < source_curCdformat.length; i++){\r\n                    let source_curCdformat_cellrange = source_curCdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n                    let emptyRange2 = [];\r\n\r\n                    for(let j = 0; j < source_curCdformat_cellrange.length; j++){\r\n                        let range = conditionformat.CFSplitRange(\r\n                            source_curCdformat_cellrange[j],\r\n                            {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                            {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                            \"restPart\"\r\n                        );\r\n\r\n                        emptyRange = emptyRange.concat(range);\r\n\r\n                        let range2 = conditionformat.CFSplitRange(\r\n                            source_curCdformat_cellrange[j],\r\n                            {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                            {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                            \"operatePart\"\r\n                        );\r\n\r\n                        if(range2.length > 0){\r\n                            emptyRange2 = emptyRange2.concat(range2);\r\n                        }\r\n                    }\r\n\r\n                    source_curCdformat[i].cellrange = emptyRange;\r\n\r\n                    if(emptyRange2.length > 0){\r\n                        let ruleObj = $.extend(true, {}, source_curCdformat[i]);\r\n                        ruleObj.cellrange = emptyRange2;\r\n                        ruleArr.push(ruleObj);\r\n                    }\r\n                }\r\n            }\r\n\r\n            let target_cdformat = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n            let target_curCdformat = $.extend(true, [], target_cdformat);\r\n            if(ruleArr.length > 0){\r\n                target_curCdformat = target_curCdformat.concat(ruleArr);\r\n            }\r\n\r\n            //\u6570\u636E\u9A8C\u8BC1\r\n            for(let i = c_r1; i <= c_r2; i++){\r\n                for(let j = c_c1; j <= c_c2; j++){\r\n                    delete c_dataVerification[i + \"_\" + j];\r\n                }\r\n            }\r\n\r\n            source = {\r\n                \"sheetIndex\": copySheetIndex,\r\n                \"data\": sourceData,\r\n                \"curData\": sourceCurData,\r\n                \"config\": sourceConfig,\r\n                \"curConfig\": sourceCurConfig,\r\n                \"cdformat\": source_cdformat,\r\n                \"curCdformat\": source_curCdformat,\r\n                \"dataVerification\": $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"dataVerification\"]),\r\n                \"curDataVerification\": c_dataVerification,\r\n                \"range\": {\r\n                    \"row\": [c_r1, c_r2],\r\n                    \"column\": [c_c1, c_c2]\r\n                }\r\n            }\r\n            target = {\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"data\": Store.flowdata,\r\n                \"curData\": d,\r\n                \"config\": $.extend(true, {}, Store.config),\r\n                \"curConfig\": cfg,\r\n                \"cdformat\": target_cdformat,\r\n                \"curCdformat\": target_curCdformat,\r\n                \"dataVerification\": $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"]),\r\n                \"curDataVerification\": dataVerification,\r\n                \"range\": {\r\n                    \"row\": [minh, maxh],\r\n                    \"column\": [minc, maxc]\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            //\u6761\u4EF6\u683C\u5F0F\r\n            let cdformat = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n            let curCdformat = $.extend(true, [], cdformat);\r\n            if(curCdformat != null && curCdformat.length > 0){\r\n                for(let i = 0; i < curCdformat.length; i++){\r\n                    let cellrange = curCdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n\r\n                    for(let j = 0; j < cellrange.length; j++){\r\n                        let range = conditionformat.CFSplitRange(\r\n                            cellrange[j],\r\n                            {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                            {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                            \"allPart\"\r\n                        );\r\n\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n\r\n                    curCdformat[i].cellrange = emptyRange;\r\n                }\r\n            }\r\n\r\n            //\u5F53\u524D\u8868\u64CD\u4F5C\r\n            source = {\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"data\": Store.flowdata,\r\n                \"curData\": d,\r\n                \"config\": $.extend(true, {}, Store.config),\r\n                \"curConfig\": cfg,\r\n                \"cdformat\": cdformat,\r\n                \"curCdformat\": curCdformat,\r\n                \"dataVerification\": $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"]),\r\n                \"curDataVerification\": dataVerification,\r\n                \"range\": {\r\n                    \"row\": [c_r1, c_r2],\r\n                    \"column\": [c_c1, c_c2]\r\n                }\r\n            }\r\n            target = {\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"data\": Store.flowdata,\r\n                \"curData\": d,\r\n                \"config\": $.extend(true, {}, Store.config),\r\n                \"curConfig\": cfg,\r\n                \"cdformat\": cdformat,\r\n                \"curCdformat\": curCdformat,\r\n                \"dataVerification\": $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"]),\r\n                \"curDataVerification\": dataVerification,\r\n                \"range\": {\r\n                    \"row\": [minh, maxh],\r\n                    \"column\": [minc, maxc]\r\n                }\r\n            }\r\n        }\r\n\r\n        if(addr > 0 || addc > 0){\r\n            jfrefreshgrid_pastcut(source, target, true);\r\n        }\r\n        else{\r\n            jfrefreshgrid_pastcut(source, target, copyRowlChange);\r\n        }\r\n    },\r\n    pasteHandlerOfCopyPaste: function(copyRange){\r\n        if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if(cfg[\"merge\"] == null){\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let arr = [], isSameRow = false;\r\n        for(let i = 0; i < copyRange[\"copyRange\"].length; i++){\r\n            let arrData = getdatabyselection({\"row\": copyRange[\"copyRange\"][i].row, \"column\": copyRange[\"copyRange\"][i].column}, copySheetIndex);\r\n            if(copyRange[\"copyRange\"].length > 1){\r\n                if(c_r1 == copyRange[\"copyRange\"][1].row[0] && c_r2 == copyRange[\"copyRange\"][1].row[1]){\r\n                    arrData = arrData[0].map(function(col, a){\r\n                        return arrData.map(function(row){\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    arr = arr.concat(arrData);\r\n\r\n                    isSameRow = true;\r\n                }\r\n                else if(c_c1 == copyRange[\"copyRange\"][1].column[0] && c_c2 == copyRange[\"copyRange\"][1].column[1]){\r\n                    arr = arr.concat(arrData);\r\n                }\r\n            }\r\n            else{\r\n                arr = arrData;\r\n            }\r\n        }\r\n\r\n        if(isSameRow){\r\n            arr = arr[0].map(function(col, b){\r\n                return arr.map(function(row){\r\n                    return row[b];\r\n                })\r\n            })\r\n        }\r\n\r\n        let copyData = $.extend(true, [], arr);\r\n\r\n        //\u591A\u91CD\u9009\u62E9\u9009\u62E9\u533A\u57DF \u5355\u5143\u683C\u5982\u679C\u6709\u51FD\u6570 \u5219\u53EA\u53D6\u503C \u4E0D\u53D6\u51FD\u6570\r\n        if(copyRange[\"copyRange\"].length > 1){\r\n            for(let i = 0; i < copyData.length; i++){\r\n                for(let j = 0; j < copyData[i].length; j++){\r\n                    if(copyData[i][j] != null && copyData[i][j].f != null){\r\n                        delete copyData[i][j].f;\r\n                        delete copyData[i][j].spl;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let copyh = copyData.length, copyc = copyData[0].length;\r\n\r\n        //\u5E94\u7528\u8303\u56F4\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row\"][0], maxh = last[\"row\"][1];         //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u884C\r\n        let minc = last[\"column\"][0], maxc = last[\"column\"][1];   //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u5217\r\n\r\n        let mh = (maxh - minh + 1) % copyh;\r\n        let mc = (maxc - minc + 1) % copyc;\r\n\r\n        if(mh != 0 || mc != 0){ //\u82E5\u5E94\u7528\u8303\u56F4\u4E0D\u662Fcopydata\u884C\u5217\u6570\u7684\u6574\u6570\u500D\uFF0C\u5219\u53D6copydata\u7684\u884C\u5217\u6570\r\n            maxh = minh + copyh - 1;\r\n            maxc = minc + copyc - 1;\r\n        }\r\n\r\n        //\u5E94\u7528\u8303\u56F4\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u5219\u63D0\u793A\r\n        let has_PartMC = false;\r\n        if(cfg[\"merge\"] != null){\r\n            has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n        }\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n            }\r\n            else{\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A',\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let timesH = (maxh - minh + 1) / copyh;\r\n        let timesC = (maxc - minc + 1) / copyc;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n        let rowMaxLength = d.length;\r\n        let cellMaxLength = d[0].length;\r\n\r\n        //\u82E5\u5E94\u7528\u8303\u56F4\u8D85\u8FC7\u6700\u5927\u884C\u6216\u6700\u5927\u5217\uFF0C\u589E\u52A0\u884C\u5217\r\n        let addr = copyh + minh - rowMaxLength, addc = copyc + minc - cellMaxLength;\r\n        if(addr > 0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)].dataVerification);\r\n        let dataVerification = null;\r\n\r\n        let mth = 0, mtc = 0, maxcellCahe = 0, maxrowCache = 0;\r\n        for(let th = 1; th <= timesH; th++){\r\n            for(let tc = 1; tc <= timesC; tc++){\r\n                mth = minh + (th - 1) * copyh;\r\n                mtc = minc + (tc - 1) * copyc;\r\n                maxrowCache = minh + th * copyh;\r\n                maxcellCahe = minc + tc * copyc;\r\n\r\n                //\u884C\u5217\u4F4D\u79FB\u503C \u7528\u4E8E\u5355\u5143\u683C\u6709\u51FD\u6570\r\n                let offsetRow = mth - c_r1;\r\n                let offsetCol = mtc - c_c1;\r\n\r\n                let offsetMC = {};\r\n                for (let h = mth; h < maxrowCache; h++) {\r\n                    let x = [].concat(d[h]);\r\n\r\n                    for (let c = mtc; c < maxcellCahe; c++) {\r\n                        if(borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": h,\r\n                                    \"col_index\": c,\r\n                                    \"l\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].l,\r\n                                    \"r\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].r,\r\n                                    \"t\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].t,\r\n                                    \"b\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].b\r\n                                }\r\n                            }\r\n\r\n                            if(cfg[\"borderInfo\"] == null){\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[h + \"_\" + c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": h,\r\n                                    \"col_index\": c,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            if(cfg[\"borderInfo\"] == null){\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1 \u590D\u5236\r\n                        if(c_dataVerification[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)]){\r\n                            if(dataVerification == null){\r\n                                dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].dataVerification)\r\n                            }\r\n\r\n                            dataVerification[h + \"_\" + c] = c_dataVerification[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)];\r\n                        }\r\n\r\n                        if(getObjType(x[c]) == \"object\" && \"mc\" in x[c]){\r\n                            if(\"rs\" in x[c].mc){\r\n                                delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                            }\r\n                            delete x[c].mc;\r\n                        }\r\n\r\n                        let value = null;\r\n                        if (copyData[h - mth] != null && copyData[h - mth][c - mtc] != null) {\r\n                            value = $.extend(true, {}, copyData[h - mth][c - mtc]);\r\n                        }\r\n\r\n                        if(value != null && value.f != null){\r\n                            let func = value.f;\r\n\r\n                            if(offsetRow > 0){\r\n                                func = \"=\" + formula.functionCopy(func, \"down\", offsetRow);\r\n                            }\r\n\r\n                            if(offsetRow < 0){\r\n                                func = \"=\" + formula.functionCopy(func, \"up\", Math.abs(offsetRow));\r\n                            }\r\n\r\n                            if(offsetCol > 0){\r\n                                func = \"=\" + formula.functionCopy(func, \"right\", offsetCol);\r\n                            }\r\n\r\n                            if(offsetCol < 0){\r\n                                func = \"=\" + formula.functionCopy(func, \"left\", Math.abs(offsetCol));\r\n                            }\r\n\r\n                            let funcV = formula.execfunction(func, h, c, undefined, true);\r\n\r\n                            if(value.spl != null){\r\n                                value.f = funcV[2];\r\n                                value.v = funcV[1];\r\n                                value.spl = funcV[3].data;\r\n                            }\r\n                            else{\r\n                                value.f = funcV[2];\r\n                                value.v = funcV[1];\r\n\r\n                                if(value.ct != null && value.ct[\"fa\"] != null){\r\n                                    value.m = update(value.ct[\"fa\"], funcV[1]);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        x[c] = $.extend(true, {}, value);\r\n\r\n                        if(value != null && copyHasMC && (\"mc\" in x[c])){\r\n                            if(x[c][\"mc\"].rs != null){\r\n                                x[c][\"mc\"].r = h;\r\n                                x[c][\"mc\"].c = c;\r\n\r\n                                cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                                offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                            }\r\n                            else{\r\n                                x[c] = { \"mc\": { r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0], c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1] } }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    d[h] = x;\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4 \u662F\u5426\u6709 \u6761\u4EF6\u683C\u5F0F\u548C\u6570\u636E\u9A8C\u8BC1\r\n        let cdformat = null;\r\n        if(copyRange[\"copyRange\"].length == 1){\r\n            let c_file = Store.luckysheetfile[getSheetIndex(copySheetIndex)];\r\n            let a_file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            let ruleArr_cf = $.extend(true, [], c_file[\"luckysheet_conditionformat_save\"]);\r\n\r\n            if(ruleArr_cf != null && ruleArr_cf.length > 0){\r\n                cdformat = $.extend(true, [], a_file[\"luckysheet_conditionformat_save\"]);\r\n\r\n                for(let i = 0; i < ruleArr_cf.length; i++){\r\n                    let cf_range = ruleArr_cf[i].cellrange;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for(let th = 1; th <= timesH; th++){\r\n                        for(let tc = 1; tc <= timesC; tc++){\r\n                            mth = minh + (th - 1) * copyh;\r\n                            mtc = minc + (tc - 1) * copyc;\r\n                            maxrowCache = minh + th * copyh;\r\n                            maxcellCahe = minc + tc * copyc;\r\n\r\n                            for(let j = 0; j < cf_range.length; j++){\r\n                                let range = conditionformat.CFSplitRange(\r\n                                    cf_range[j],\r\n                                    {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                                    {\"row\": [mth, maxrowCache - 1], \"column\": [mtc, maxcellCahe - 1]},\r\n                                    \"operatePart\"\r\n                                );\r\n\r\n                                if(range.length > 0){\r\n                                    emptyRange = emptyRange.concat(range);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(emptyRange.length > 0){\r\n                        ruleArr_cf[i].cellrange = emptyRange;\r\n                        cdformat.push(ruleArr_cf[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        if(copyRowlChange || addr > 0 || addc > 0){\r\n            cfg = rowlenByRange(d, minh, maxh, cfg);\r\n\r\n            let allParam = {\r\n                \"cfg\": cfg,\r\n                \"RowlChange\": true,\r\n                \"cdformat\": cdformat,\r\n                \"dataVerification\": dataVerification\r\n            }\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n        }\r\n        else{\r\n            let allParam = {\r\n                \"cfg\": cfg,\r\n                \"cdformat\": cdformat,\r\n                \"dataVerification\": dataVerification\r\n            }\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    pasteHandlerOfPaintModel: function(copyRange){\r\n        if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if(cfg[\"merge\"] == null){\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let copyData = $.extend(true, [], getdatabyselection({\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]}, copySheetIndex));\r\n\r\n        //\u5E94\u7528\u8303\u56F4\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row\"][0], maxh = last[\"row\"][1];         //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u884C\r\n        let minc = last[\"column\"][0], maxc = last[\"column\"][1];   //\u5E94\u7528\u8303\u56F4\u9996\u5C3E\u5217\r\n\r\n        let copyh = copyData.length, copyc = copyData[0].length;\r\n\r\n        if(minh == maxh && minc == maxc){\r\n            //\u5E94\u7528\u8303\u56F4\u662F\u4E00\u4E2A\u5355\u5143\u683C\uFF0C\u81EA\u52A8\u589E\u52A0\u5230\u590D\u5236\u8303\u56F4\u5927\u5C0F (\u82E5\u81EA\u52A8\u589E\u52A0\u7684\u8303\u56F4\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u5219\u63D0\u793A)\r\n            let has_PartMC = false;\r\n            if(cfg[\"merge\"] != null){\r\n                has_PartMC = hasPartMC(cfg, minh, minh + copyh - 1, minc, minc + copyc - 1);\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n                else{\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>\u63D0\u793A',\"\u4E0D\u80FD\u5BF9\u5408\u5E76\u5355\u5143\u683C\u505A\u90E8\u5206\u66F4\u6539\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            maxh = minh + copyh - 1;\r\n            maxc = minc + copyc - 1;\r\n        }\r\n\r\n        let timesH = Math.ceil((maxh - minh + 1) / copyh);  //\u590D\u5236\u884C \u7EC4\u6570\r\n        let timesC = Math.ceil((maxc - minc + 1) / copyc);  //\u590D\u5236\u5217 \u7EC4\u6570\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n        let cellMaxLength = d[0].length;\r\n        let rowMaxLength = d.length;\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)].dataVerification);\r\n        let dataVerification = null;\r\n\r\n        let mth = 0, mtc = 0, maxcellCahe = 0, maxrowCache = 0;\r\n        for (let th = 1; th <= timesH; th++) {\r\n            for (let tc = 1; tc <= timesC; tc++) {\r\n                mth = minh + (th - 1) * copyh;\r\n                mtc = minc + (tc - 1) * copyc;\r\n\r\n                maxrowCache = minh + th * copyh > rowMaxLength ? rowMaxLength : minh + th * copyh;\r\n                if(maxrowCache > (maxh + 1)){\r\n                    maxrowCache = maxh + 1;\r\n                }\r\n\r\n                maxcellCahe = minc + tc * copyc > cellMaxLength ? cellMaxLength : minc + tc * copyc;\r\n                if(maxcellCahe > (maxc + 1)){\r\n                    maxcellCahe = maxc + 1;\r\n                }\r\n\r\n                let offsetMC = {};\r\n                for (let h = mth; h < maxrowCache; h++) {\r\n                    let x = [].concat(d[h]);\r\n\r\n                    for (let c = mtc; c < maxcellCahe; c++) {\r\n                        if(borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": h,\r\n                                    \"col_index\": c,\r\n                                    \"l\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].l,\r\n                                    \"r\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].r,\r\n                                    \"t\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].t,\r\n                                    \"b\": borderInfoCompute[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)].b\r\n                                }\r\n                            }\r\n\r\n                            if(cfg[\"borderInfo\"] == null){\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[h + \"_\" + c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": h,\r\n                                    \"col_index\": c,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            if(cfg[\"borderInfo\"] == null){\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //\u6570\u636E\u9A8C\u8BC1 \u590D\u5236\r\n                        if(c_dataVerification[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)]){\r\n                            if(dataVerification == null){\r\n                                dataVerification = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].dataVerification)\r\n                            }\r\n\r\n                            dataVerification[h + \"_\" + c] = c_dataVerification[(c_r1 + h - mth) + \"_\" + (c_c1 + c - mtc)];\r\n                        }\r\n\r\n                        if(getObjType(x[c]) == \"object\" && (\"mc\" in x[c])){\r\n                            if(\"rs\" in x[c].mc){\r\n                                delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                            }\r\n                            delete x[c].mc;\r\n                        }\r\n\r\n                        let value = null;\r\n                        if (copyData[h - mth] != null && copyData[h - mth][c - mtc] != null) {\r\n                            value = copyData[h - mth][c - mtc];\r\n                        }\r\n\r\n                        if(value != null){\r\n                            delete value[\"v\"];\r\n                            delete value[\"m\"];\r\n                            delete value[\"f\"];\r\n                            delete value[\"spl\"];\r\n\r\n                            if(value.ct && value.ct.t == 'inlineStr'){\r\n                                delete value.ct;\r\n                            }\r\n\r\n                            if(getObjType(x[c]) == \"object\"){\r\n                                if(x[c].ct && x[c].ct.t === \"inlineStr\"){\r\n                                    delete value[\"ct\"];\r\n                                }else{\r\n                                    let format = ['bg','fc','ct','ht','vt','bl','it','cl','un','fs','ff','tb']\r\n                                    format.forEach(item=>{\r\n                                        Reflect.deleteProperty(x[c],item);\r\n                                    })\r\n                                }\r\n                            }\r\n                            else{\r\n                                x[c] = {\"v\": x[c] };\r\n                            }\r\n\r\n                            x[c] = $.extend(true, x[c], value);\r\n                            if(x[c].ct && x[c].ct.t === \"inlineStr\"){  \r\n                                x[c].ct.s.forEach(item=> item = $.extend(true, item, value))\r\n                            }\r\n\r\n                            if(copyHasMC && (\"mc\" in x[c])){\r\n                                if(x[c][\"mc\"].rs != null){\r\n                                    x[c][\"mc\"].r = h;\r\n                                    if(x[c][\"mc\"].rs + h >= maxrowCache){\r\n                                        x[c][\"mc\"].rs = maxrowCache - h;\r\n                                    }\r\n\r\n                                    x[c][\"mc\"].c = c;\r\n                                    if(x[c][\"mc\"].cs + c >= maxcellCahe){\r\n                                        x[c][\"mc\"].cs = maxcellCahe - c;\r\n                                    }\r\n\r\n                                    cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                                    offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                                }\r\n                                else{\r\n                                    x[c] = { \"mc\": { r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0], c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1] } }\r\n                                }\r\n                            }\r\n\r\n                            if(x[c].v != null){\r\n                                if(value[\"ct\"] != null && value[\"ct\"][\"fa\"] != null){\r\n                                    let mask = update(value[\"ct\"][\"fa\"], x[c].v);\r\n                                    x[c].m = mask;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    d[h] = x;\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4 \u662F\u5426\u6709 \u6761\u4EF6\u683C\u5F0F\r\n        let cdformat = null;\r\n        let ruleArr = $.extend(true, [], Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n\r\n        if(ruleArr != null && ruleArr.length > 0){\r\n            cdformat = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n\r\n            for(let i = 0; i < ruleArr.length; i++){\r\n                let cdformat_cellrange = ruleArr[i].cellrange;\r\n                let emptyRange = [];\r\n\r\n                for(let j = 0; j < cdformat_cellrange.length; j++){\r\n                    let range = conditionformat.CFSplitRange(\r\n                        cdformat_cellrange[j],\r\n                        {\"row\": [c_r1, c_r2], \"column\": [c_c1, c_c2]},\r\n                        {\"row\": [minh, maxh], \"column\": [minc, maxc]},\r\n                        \"operatePart\"\r\n                    );\r\n\r\n                    if(range.length > 0){\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                }\r\n\r\n                if(emptyRange.length > 0){\r\n                    ruleArr[i].cellrange = [{\"row\": [minh, maxh], \"column\": [minc, maxc]}];\r\n                    cdformat.push(ruleArr[i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        if(copyRowlChange){\r\n            cfg = rowlenByRange(d, minh, maxh, cfg);\r\n\r\n            let allParam = {\r\n                \"cfg\": cfg,\r\n                \"RowlChange\": true,\r\n                \"cdformat\": cdformat,\r\n                \"dataVerification\": dataVerification\r\n            }\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n        }\r\n        else{\r\n            // \u9009\u533A\u683C\u5F0F\u5237\u5B58\u5728\u8D85\u51FA\u8FB9\u754C\u7684\u60C5\u51B5\r\n             if(maxh >= d.length){\r\n                maxh = d.length - 1;\r\n            }\r\n            cfg = rowlenByRange(d, minh, maxh, cfg); //\u66F4\u65B0\u884C\u9AD8\r\n            let allParam = {\r\n                \"cfg\": cfg,\r\n                \"RowlChange\": true,\r\n                \"cdformat\": cdformat,\r\n                \"dataVerification\": dataVerification\r\n            }\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    matchcopy: function (data1, data2) {\r\n        let data1cache = [], data2cache = [], data1len, data2len;\r\n        if (typeof data1 == \"object\") {\r\n            data1cache = data1;\r\n        }\r\n        else {\r\n            data1cache = data1.split(\"\\n\");\r\n            for (let i = 0; i < data1cache.length; i++) {\r\n                data1cache[i] = data1cache[i].split(\"\\t\");\r\n            }\r\n        }\r\n\r\n        data1len = data1cache.length;\r\n\r\n        if (typeof data2 == \"object\") {\r\n            data2cache = data2;\r\n        }\r\n        else {\r\n            data2cache = data2.split(\"\\n\");\r\n            for (let i = 0; i < data2cache.length; i++) {\r\n                data2cache[i] = data2cache[i].split(\"\\t\");\r\n            }\r\n        }\r\n\r\n        data2len = data2cache.length;\r\n\r\n        if (data1len != data2len) {\r\n            return false;\r\n        }\r\n\r\n\r\n        for (let r1 = 0; r1 < data1len; r1++) {\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r1] != null) {\r\n                continue;\r\n            }\r\n\r\n            for (let r2 = 0; r2 < data2len; r2++) {\r\n                if (data1cache[r1].length != data2cache[r2].length) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        for (let r = 0; r < data1len; r++) {\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            for (let c = 0; c < data1cache[0].length; c++) {\r\n                if (getcellvalue(r, c, data1cache) != getcellvalue(r, c, data2cache)) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n};\r\n\r\nexport default selection;", "import selection from '../controllers/selection';\r\nimport menuButton from '../controllers/menuButton';\r\n\r\nexport default function cleargridelement(event) {\r\n    $(\"#luckysheet-cols-h-hover\").hide();\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n\r\n    $(\"#luckysheet-cell-selected-boxs .luckysheet-cell-selected\").hide();\r\n    $(\"#luckysheet-cols-h-selected .luckysheet-cols-h-selected\").hide();\r\n    $(\"#luckysheet-rows-h-selected .luckysheet-rows-h-selected\").hide();\r\n\r\n    $(\"#luckysheet-cell-selected-focus\").hide();\r\n    $(\"#luckysheet-rows-h-hover\").hide();\r\n    $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n    $(\"#luckysheet-cols-menu-btn\").hide();\r\n    $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n    if (!event) {\r\n        selection.clearcopy(event);\r\n    }\r\n    //else{\r\n    //\tselection.clearcopy();\r\n    //}\r\n\r\n    //\u9009\u533A\u4E0B\u62C9icon\u9690\u85CF\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        if(event){\r\n            $(\"#luckysheet-dropCell-icon\").remove();\r\n        }\r\n    }\r\n    //\u683C\u5F0F\u5237\r\n    if(menuButton.luckysheetPaintModelOn && !event){\r\n        menuButton.cancelPaintModel();\r\n    }\r\n}", "import { \r\n    gridHTML, \r\n    menuToolBar, \r\n    flow, \r\n    columnHeaderHTML,\r\n    maskHTML,\r\n    colsmenuHTML,\r\n    rightclickHTML,\r\n    inputHTML,\r\n    filtermenuHTML,\r\n    filtersubmenuHTML,\r\n    sheetconfigHTML,\r\n} from '../controllers/constant';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport luckysheetPostil from '../controllers/postil';\r\nimport { datagridgrowth } from './getdata';\r\nimport editor from './editor';\r\nimport rhchInit from './rhchInit';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\nexport default function luckysheetcreatedom(colwidth, rowheight, data, menu, title) {\r\n    // //\u6700\u5C1130\u884C\r\n    // if(rowheight < 30){\r\n    //     rowheight = 30;\r\n    // }\r\n\r\n    // //\u6700\u5C1122\u5217\r\n    // if(colwidth < 22){\r\n    //     colwidth = 22;\r\n    // }\r\n\r\n    let gh = gridHTML();\r\n    gh = replaceHtml(gh, { \"logotitle\": title });//\u8BBE\u7F6Etitle\r\n    gh = replaceHtml(gh, { \"menu\": menuToolBar() });//\u8BBE\u7F6E\u9700\u8981\u663E\u793A\u7684\u83DC\u5355\r\n\r\n    // if (data.length == 0) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight, colwidth);\r\n    // }\r\n    // else if (data.length < rowheight && data[0].length < colwidth) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight - data.length, colwidth - data[0].length);\r\n    // }\r\n    // else if (data.length < rowheight) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight - data.length, 0);\r\n    // }\r\n    // else if (data[0].length < colwidth) {\r\n    //     Store.flowdata = datagridgrowth(data, 0, colwidth - data[0].length);\r\n    // }\r\n    // else {\r\n    //     Store.flowdata = data;\r\n    // }\r\n    \r\n    let flowHTML = flow;\r\n    if(Store.config == null){\r\n        Store.config = {};\r\n    }\r\n\r\n    rhchInit(rowheight, colwidth);\r\n\r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n\r\n    let addControll = '<button id=\"luckysheet-bottom-add-row\" class=\"btn btn-default\">'+locale_info.add+'</button><input id=\"luckysheet-bottom-add-row-input\" type=\"text\" class=\"luckysheet-datavisual-config-input luckysheet-mousedown-cancel\" placeholder=\"'+(luckysheetConfigsetting.addRowCount || 100)+'\"><span style=\"font-size: 14px;\">'+ locale_info.row +'</span><span style=\"font-size: 14px;color: #9c9c9c;\">('+locale_info.addLast+')</span>';\r\n    let backControll = ' <button id=\"luckysheet-bottom-bottom-top\" class=\"btn btn-default\" style=\"\">'+ locale_info.backTop +'</button>';\r\n    // let pageControll = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">\u5171'+ luckysheetConfigsetting.pageInfo.totalPage +'\u9875\uFF0C\u5F53\u524D\u5DF2\u663E\u793A'+ (luckysheetConfigsetting.pageInfo.currentPage) +'\u9875\uFF0C\u6BCF\u9875'+ luckysheetConfigsetting.pageInfo.pageSize +'\u6761</span> <button id=\"luckysheet-bottom-page-next\" class=\"btn btn-danger\" style=\"\">\u4E0B\u4E00\u9875</button>';\r\n    let pageInfo = replaceHtml(locale_info.pageInfo,{\r\n        total:luckysheetConfigsetting.total?luckysheetConfigsetting.total:\"\",\r\n        totalPage:luckysheetConfigsetting.pageInfo.totalPage?luckysheetConfigsetting.pageInfo.totalPage:\"\",\r\n        currentPage:luckysheetConfigsetting.pageInfo.currentPage?luckysheetConfigsetting.pageInfo.currentPage:\"\",\r\n    });\r\n    let pageControll = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">'+ pageInfo +'</span> <button id=\"luckysheet-bottom-page-next\" class=\"btn btn-danger\" style=\"\">\u4E0B\u4E00\u9875</button>';\r\n    let pageControll2 = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">'+pageInfo+'</span>';\r\n\r\n    let bottomControll = \"\";\r\n    if(luckysheetConfigsetting.enableAddRow){\r\n        bottomControll += addControll;\r\n    }\r\n\r\n    if(luckysheetConfigsetting.enablePage){\r\n        if(parseInt(luckysheetConfigsetting.pageInfo.totalPage) == 1){\r\n            bottomControll += pageControll2;\r\n        }\r\n        else{\r\n            bottomControll += pageControll;\r\n        }\r\n    }\r\n\r\n    if(luckysheetConfigsetting.enableAddBackTop){\r\n        bottomControll += backControll;\r\n    }\r\n\r\n    let flowstr = replaceHtml('<div id=\"luckysheetcoltable_0\" class=\"luckysheet-cell-flow-col\"> <div id =\"luckysheet-sheettable_0\" class=\"luckysheet-cell-sheettable\" style=\"height:${height}px;width:${width}px;\"></div><div id=\"luckysheet-bottom-controll-row\" class=\"luckysheet-bottom-controll-row\"> '+ bottomControll +' </div> </div>', { \"height\": Store.rh_height, \"width\": Store.ch_width - 1 });\r\n\r\n    let colsheader = replaceHtml(columnHeaderHTML, { \"width\": Store.ch_width, \"index\": 0, \"column\": \"\" });\r\n\r\n    flowHTML = replaceHtml(flowHTML, { \"width\": Store.ch_width, \"flow\": flowstr, \"index\": 0 });\r\n\r\n    gh = replaceHtml(gh, { \"flow\": flowHTML, \"rowHeader\": \"<div style='height:\" + Store.rh_height + \"px' id='luckysheetrowHeader_0' class='luckysheetsheetchange'></div>\", \"columnHeader\": colsheader, \"functionButton\": luckysheetConfigsetting.functionButton });//\u8BBE\u7F6E\u9700\u8981\u663E\u793A\u7684\u83DC\u5355\r\n\r\n    $(\"#\" + Store.container).append(gh);\r\n\r\n    $(\"#luckysheet-scrollbar-x div\").width(Store.ch_width);\r\n    $(\"#luckysheet-scrollbar-y div\").height(Store.rh_height + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3);\r\n\r\n    //\u65B0\u5EFA\u884C\u83DC\u5355\r\n    $(\"body\").append(maskHTML);\r\n    $(\"body\").append(colsmenuHTML);\r\n    $(\"body\").append(rightclickHTML());\r\n    $(\"body\").append(inputHTML);\r\n    $(\"body\").append(replaceHtml(filtermenuHTML(), { \"menuid\": \"filter\" }));\r\n    $(\"body\").append(replaceHtml(filtersubmenuHTML(), { \"menuid\": \"filter\" }));\r\n    $(\"body\").append(sheetconfigHTML());\r\n\r\n    $(\"#luckysheet-rows-h\").width((Store.rowHeaderWidth-1.5));\r\n    $(\"#luckysheet-cols-h-c\").height((Store.columnHeaderHeight-1.5));\r\n    $(\"#luckysheet-left-top\").css({width:Store.rowHeaderWidth-1.5, height:Store.columnHeaderHeight-1.5});\r\n\r\n    // //\u6279\u6CE8\r\n    // luckysheetPostil.buildAllPs(Store.flowdata);\r\n\r\n    $(\"#luckysheet_info_detail_input\").val(luckysheetConfigsetting.title);\r\n}", "/**\r\n * \u751F\u6210\u968F\u673A\u56FE\u8868id\r\n */\r\nfunction generateRandomKey(prefix) {\r\n    if (prefix == null) {\r\n        prefix = 'chart'\r\n    }\r\n\r\n    var userAgent = window.navigator.userAgent\r\n        .replace(/[^a-zA-Z0-9]/g, '')\r\n        .split('')\r\n    var mid = ''\r\n    for (var i = 0; i < 12; i++) {\r\n        mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))]\r\n    }\r\n    var time = new Date().getTime()\r\n\r\n    return prefix + '_' + mid + '_' + time\r\n}\r\n/**\r\n * \u6DF1\u5EA6\u514B\u9686\u6570\u636E,\u5305\u62EC\u5BF9\u8C61\uFF0C\u6570\u7EC4\uFF0Cmap\r\n * @param {*} obj \u5BF9\u8C61\uFF0C\u6570\u7EC4\uFF0Cmap\r\n */\r\nfunction deepCopy(obj) {\r\n    if (!isObject(obj) && !isMap(obj)) {\r\n        return obj;\r\n    }\r\n\r\n    let cloneObj;\r\n    if (isMap(obj)) {\r\n        cloneObj = new Map();\r\n        for (let key of obj.keys()) {\r\n            let value = obj.get(key);\r\n            if (isMap(value) || isObject(value) || Array.isArray(obj)) {\r\n                let copyVal = deepCopy(value);\r\n                cloneObj.set(key, copyVal);\r\n            } else {\r\n                cloneObj.set(key, value);\r\n            }\r\n        }\r\n    } else if (typeof obj === \"function\") {\r\n        cloneObj = obj\r\n    } else {\r\n        cloneObj = Array.isArray(obj) ? [] : {};\r\n        if (obj instanceof HTMLElement) {\r\n            cloneObj = obj.cloneNode(true)\r\n        } else {\r\n            for (let key in obj) {\r\n                // if (obj.hasOwnProperty(key)) {\r\n                if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n                    cloneObj[key] =\r\n                        isMap(obj[key]) || isObject(obj[key])\r\n                            ? deepCopy(obj[key])\r\n                            : obj[key];\r\n                }\r\n            }\r\n\r\n        }\r\n    }\r\n    return cloneObj;\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u53C2\u6570\u662F\u5426\u662FObject\u7C7B\u578B\r\n * @param {*} o \r\n */\r\nfunction isObject(o) {\r\n    return (\r\n        !isMap(o) &&\r\n        (typeof o === 'object' || typeof o === 'function') &&\r\n        o !== null\r\n    );\r\n}\r\n\r\n/**\r\n * \u5224\u65AD\u53C2\u6570\u662F\u5426\u662FMap\u7C7B\u578B\r\n * @param {*} obj \r\n */\r\nfunction isMap(obj) {\r\n    if (obj instanceof Map) {\r\n        return true;\r\n    } else {\r\n        return false;\r\n    }\r\n}\r\n\r\n// \u66FF\u6362temp\u4E2D\u7684${xxx}\u4E3A\u6307\u5B9A\u5185\u5BB9 ,temp:\u5B57\u7B26\u4E32\uFF0C\u8FD9\u91CC\u6307html\u4EE3\u7801\uFF0Cdataarry\uFF1A\u4E00\u4E2A\u5BF9\u8C61{\"xxx\":\"\u66FF\u6362\u7684\u5185\u5BB9\"}\r\n// \u4F8B\uFF1Aluckysheet.replaceHtml(\"${image}\",{\"image\":\"abc\",\"jskdjslf\":\"abc\"})   ==>  abc\r\nfunction replaceHtml(temp, dataarry) {\r\n    return temp.replace(/\\$\\{([\\w]+)\\}/g, function (s1, s2) { var s = dataarry[s2]; if (typeof (s) != \"undefined\") { return s; } else { return s1; } });\r\n}\r\n\r\nfunction hasChinaword(s) {\r\n    var patrn = /[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]/gi;\r\n    if (!patrn.exec(s)) {\r\n        return false;\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n\r\nexport {\r\n    isMap,\r\n    isObject,\r\n    deepCopy,\r\n    generateRandomKey,\r\n    replaceHtml\r\n}", "import { getObjType } from '../utils/util';\r\nimport { isRealNum, isRealNull, valueIsError } from './validate';\r\nimport { update } from './format';\r\nimport formula from './formula';\r\nimport dayjs from \"dayjs\";\r\n\r\nconst error = {\r\n    v: \"#VALUE!\",    //\u9519\u8BEF\u7684\u53C2\u6570\u6216\u8FD0\u7B97\u7B26\r\n    n: \"#NAME?\",     //\u516C\u5F0F\u540D\u79F0\u9519\u8BEF\r\n    na: \"#N/A\",      //\u51FD\u6570\u6216\u516C\u5F0F\u4E2D\u6CA1\u6709\u53EF\u7528\u6570\u503C\r\n    r: \"#REF!\",      //\u5220\u9664\u4E86\u7531\u5176\u4ED6\u516C\u5F0F\u5F15\u7528\u7684\u5355\u5143\u683C\r\n    d: \"#DIV/0!\",    //\u9664\u6570\u662F0\u6216\u7A7A\u5355\u5143\u683C\r\n    nm: \"#NUM!\",     //\u5F53\u516C\u5F0F\u6216\u51FD\u6570\u4E2D\u67D0\u4E2A\u6570\u5B57\u6709\u95EE\u9898\u65F6\r\n    nl: \"#NULL!\",    //\u4EA4\u53C9\u8FD0\u7B97\u7B26\uFF08\u7A7A\u683C\uFF09\u4F7F\u7528\u4E0D\u6B63\u786E\r\n    sp: \"#SPILL!\"    //\u6570\u7EC4\u8303\u56F4\u6709\u5176\u5B83\u503C\r\n}\r\n\r\nconst func_methods = {\r\n    //\u5355\u5143\u683C\u6570\u636E\u751F\u6210\u4E00\u7EF4\u6570\u7EC4\r\n    getCellDataArr: function(rangeObj, nullCellType, isNeglectNullCell){\r\n        let dataArr = [];\r\n\r\n        if(rangeObj.data == null){\r\n            if(!isNeglectNullCell){\r\n                if(nullCellType === \"number\"){\r\n                    dataArr.push(0);\r\n                }\r\n                else if(nullCellType === \"text\"){\r\n                    dataArr.push(\"\");\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(getObjType(rangeObj.data) === \"array\"){\r\n                for(let i = 0; i < rangeObj.data.length; i++){\r\n                    for(let j = 0; j < rangeObj.data[i].length; j++){\r\n                        let cell = rangeObj.data[i][j];\r\n                        let value = cell\r\n\r\n                        if(getObjType(cell) === 'object'){\r\n                            value = cell.v\r\n                        }\r\n\r\n                        if(value == null ){\r\n                            if(!isNeglectNullCell){\r\n                                if(nullCellType === \"number\"){\r\n                                    value = 0;\r\n                                }\r\n                                else if(nullCellType === \"text\"){\r\n                                    value = '';\r\n                                }\r\n\r\n                                dataArr.push(value);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataArr.push(value);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(isRealNull(rangeObj.data.v)){\r\n                    if(!isNeglectNullCell){\r\n                        if(nullCellType == \"number\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                        else if(nullCellType == \"text\"){\r\n                            dataArr.push(\"\");\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    dataArr.push(rangeObj.data.v);\r\n                }\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //\u5355\u5143\u683C\u6570\u636E\u751F\u6210\u4E8C\u7EF4\u6570\u7EC4\r\n    getCellDataDyadicArr: function(rangeObj, nullCellType){\r\n        let dataArr = [];\r\n\r\n        if(rangeObj.data == null){\r\n            let rowArr = [];\r\n\r\n            if(nullCellType == \"number\"){\r\n                rowArr.push(0);\r\n            }\r\n            else if(nullCellType == \"text\"){\r\n                rowArr.push(\"\");\r\n            }\r\n\r\n            dataArr.push(rowArr);\r\n        }\r\n        else{\r\n            if(getObjType(rangeObj.data) == \"array\"){\r\n                for(let i = 0; i < rangeObj.data.length; i++){\r\n                    let rowArr = [];\r\n\r\n                    for(let j = 0; j < rangeObj.data[i].length; j++){\r\n                        let cell = rangeObj.data[i][j];\r\n                        let value = cell;\r\n\r\n                        if(getObjType(cell) === 'object'){\r\n                            value = cell.v\r\n                        }\r\n\r\n                        if(value == null){\r\n                            if(nullCellType === \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType === \"text\"){\r\n                                value = '';\r\n                            }\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    dataArr.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                let rowArr = [];\r\n\r\n                let value = rangeObj.data.v;\r\n\r\n                if(isRealNull(value)){\r\n                    if(nullCellType == \"number\"){\r\n                        value = 0;\r\n                    }\r\n                    else if(nullCellType == \"text\"){\r\n                        value = \"\";\r\n                    }\r\n                }\r\n\r\n                rowArr.push(value);\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //\u6570\u7EC4\u6570\u636E\u751F\u6210\u4E00\u7EF4\u6570\u7EC4\r\n    getDataArr: function(arr, isNeglectNaN){\r\n        let dataArr = [];\r\n\r\n        if(isNeglectNaN == null){\r\n            isNeglectNaN = false;\r\n        }\r\n\r\n        if(getObjType(arr[0]) == \"array\"){\r\n            for(let i = 0; i < arr.length; i++){\r\n                for(let j = 0; j < arr[i].length; j++){\r\n                    if(isNeglectNaN && !isRealNum(arr[i][j])){\r\n                        continue;\r\n                    }\r\n\r\n                    dataArr.push(arr[i][j]);\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(isNeglectNaN && !isRealNum(arr[i])){\r\n                    continue;\r\n                }\r\n\r\n                dataArr.push(arr[i]);\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    getDataDyadicArr: function(arr){\r\n        let dataArr = [];\r\n\r\n        if(getObjType(arr[0]) == \"array\"){\r\n            for(let i = 0; i < arr.length; i++){\r\n                let rowArr = [];\r\n\r\n                for(let j = 0; j < arr[i].length; j++){\r\n                    rowArr.push(arr[i][j]);\r\n                }\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n        }\r\n        else{\r\n            let rowArr = [];\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                rowArr.push(arr[i]);\r\n            }\r\n\r\n            dataArr.push(rowArr);\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //\u662F\u5426\u662F\u89C4\u5219\u4E8C\u7EF4\u6570\u7EC4\r\n    isDyadicArr: function(arr){\r\n        let isDyadic = true;\r\n\r\n        if(arr.length > 1){\r\n            let collen = arr[0].length;\r\n\r\n            for(let i = 1; i < arr.length; i++){\r\n                if(arr[i].length != collen){\r\n                    isDyadic = false;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        return isDyadic;\r\n    },\r\n    //\u83B7\u53D6\u5355\u4E2A\u5355\u5143\u683C\u6570\u636E\uFF0C\u6570\u7EC4\u7B2C\u4E00\u4E2A\u503C\r\n    getFirstValue: function(data, nullCellType){\r\n        let _this = this;\r\n\r\n        if(nullCellType == null){\r\n            nullCellType = \"number\";\r\n        }\r\n\r\n        let value;\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\"){\r\n                if(!_this.isDyadicArr(data)){\r\n                    return error.v;\r\n                }\r\n\r\n                value = data[0][0];\r\n            }\r\n            else{\r\n                value = data[0];\r\n            }\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null){\r\n                if(nullCellType == \"number\"){\r\n                    value = 0;\r\n                }\r\n                else if(nullCellType == \"text\"){\r\n                    value = \"\";\r\n                }\r\n            }\r\n            else{\r\n                let cell_r = window.luckysheetCurrentRow;\r\n                let cell_c = window.luckysheetCurrentColumn;\r\n\r\n                if(data.rowl == 1 && data.coll == 1){\r\n                    value = data.data;\r\n\r\n                    if(value == null || isRealNull(value.v)){\r\n                        if(nullCellType == \"number\"){\r\n                            value = 0;\r\n                        }\r\n                        else if(nullCellType == \"text\"){\r\n                            value = \"\";\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = value.v;\r\n                    }\r\n                }\r\n                else{\r\n                    if(data.data[0][0].mc != null && data.data[0][0].mc.rs == data.rowl && data.data[0][0].mc.cs == data.coll){\r\n                        value = data.data[0][0];\r\n\r\n                        if(value == null || isRealNull(value.v)){\r\n                            if(nullCellType == \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType == \"text\"){\r\n                                value = \"\";\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = value.v;\r\n                        }\r\n                    }\r\n                    else if(data.rowl == 1 || data.coll == 1){\r\n                        let cellrange = formula.getcellrange(data.startCell);\r\n                        let str = cellrange.row[0],\r\n                            edr = str + data.rowl - 1,\r\n                            stc = cellrange.column[0],\r\n                            edc = stc + data.coll - 1;\r\n\r\n                        if(data.rowl == 1){\r\n                            if(cell_c < stc || cell_c > edc){\r\n                                return error.v;\r\n                            }\r\n\r\n                            value = data.data[0][cell_c - stc];\r\n                        }\r\n                        else if(data.coll == 1){\r\n                            if(cell_r < str || cell_r > edr){\r\n                                return error.v;\r\n                            }\r\n\r\n                            value = data.data[cell_r - str][0];\r\n                        }\r\n\r\n                        if(value == null || isRealNull(value.v) || value.mc != null){\r\n                            if(nullCellType == \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType == \"text\"){\r\n                                value = \"\";\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = value.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        return error.v;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            value = data;\r\n        }\r\n\r\n        return value;\r\n    },\r\n    //\u83B7\u53D6\u5355\u5143\u683C\u7684\u903B\u8F91\u503C\r\n    getCellBoolen: function(data){\r\n        let _this = this;\r\n\r\n        let cumulative = _this.getFirstValue(data);\r\n\r\n        if(valueIsError(cumulative)){\r\n            return cumulative;\r\n        }\r\n\r\n        if(getObjType(cumulative) == \"boolean\"){\r\n\r\n        }\r\n        else if(getObjType(cumulative) == \"string\" && (cumulative.toLowerCase() == \"true\" || cumulative.toLowerCase() == \"false\")){\r\n            if(cumulative.toLowerCase() == \"true\"){\r\n                cumulative = true;\r\n            }\r\n            else if(cumulative.toLowerCase() == \"false\"){\r\n                cumulative = false;\r\n            }\r\n        }\r\n        else if(isRealNum(cumulative)){\r\n            cumulative = parseFloat(cumulative);\r\n\r\n            cumulative = cumulative == 0 ? false : true;\r\n        }\r\n        else{\r\n            return error.v;\r\n        }\r\n\r\n        return cumulative;\r\n    },\r\n    //\u83B7\u53D6\u5355\u5143\u683C\u7684\u65E5\u671F\r\n    getCellDate: function(data){\r\n        let _this = this;\r\n\r\n        let date_text;\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\"){\r\n                if(!_this.isDyadicArr(data)){\r\n                    return error.v;\r\n                }\r\n\r\n                date_text = data[0][0];\r\n            }\r\n            else{\r\n                date_text = data[0];\r\n            }\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null || getObjType(data.data) == \"array\" || isRealNull(data.data.v)){\r\n                return error.v;\r\n            }\r\n\r\n            date_text = data.data.v;\r\n\r\n            if(data.data.ct != null && data.data.ct.t == \"d\"){\r\n                date_text = update(\"YYYY-MM-DD h:mm:ss\", date_text);\r\n            }\r\n        }\r\n        else{\r\n            date_text = data;\r\n        }\r\n\r\n        return date_text;\r\n    },\r\n    getCellrangeDate: function(data){\r\n        let _this = this;\r\n\r\n        let date = [];\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\" && !_this.isDyadicArr(data)){\r\n                return error.v;\r\n            }\r\n\r\n            date = date.concat(_this.getDataArr(data, false));\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null){\r\n                date.push(0);\r\n            }\r\n            else{\r\n                if(getObjType(data.data) == \"array\"){\r\n                    for(let i = 0; i < data.data.length; i++){\r\n                        for(let j = 0; j < data.data[i].length; j++){\r\n                            if(data.data[i][j] != null && !isRealNull(data.data[i][j].v)){\r\n                                let value = data.data[i][j].v;\r\n\r\n                                if(data.data[i][j].ct != null && data.data[i][j].ct.t == \"d\"){\r\n                                    value = update(\"YYYY-MM-DD h:mm:ss\", value);\r\n                                }\r\n\r\n                                date.push(value);\r\n                            }\r\n                            else{\r\n                                date.push(0);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    let value = data.data.v;\r\n\r\n                    if(data.data.ct != null && data.data.ct.t == \"d\"){\r\n                        value = update(\"YYYY-MM-DD h:mm:ss\", value);\r\n                    }\r\n\r\n                    date.push(value);\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            date.push(data);\r\n        }\r\n\r\n        return date;\r\n    },\r\n    //\u83B7\u53D6\u6B63\u5219\u5B57\u7B26\u4E32\uFF08\u5904\u7406 . * ? ~* ~?\uFF09\r\n    getRegExpStr: function(str){\r\n        return str.replace(\"~*\", \"\\\\*\").replace(\"~?\", \"\\\\?\").replace(\".\", \"\\\\.\").replace(\"*\", \".*\").replace(\"?\", \".\");\r\n    },\r\n    //\u9636\u4E58\r\n    factorial: function(num){\r\n        if (num == 0 || num == 1) {\r\n            return 1;\r\n        }\r\n        else {\r\n            return (num * this.factorial(num - 1));\r\n        }\r\n    },\r\n    //\u53CC\u9636\u4E58\r\n    factorialDouble: function(num){\r\n        if (num <= 0) {\r\n            return 1;\r\n        }\r\n        else {\r\n            return (num * this.factorialDouble(num - 2));\r\n        }\r\n    },\r\n    //\u603B\u4F53\u65B9\u5DEE\r\n    variance: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return sum_variance / count;\r\n    },\r\n    //\u6837\u672C\u65B9\u5DEE\r\n    variance_s: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return sum_variance / (count - 1);\r\n    },\r\n    //\u603B\u4F53\u6807\u51C6\u504F\u5DEE\r\n    standardDeviation: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return Math.sqrt(sum_variance / count);\r\n    },\r\n    //\u6837\u672C\u6807\u51C6\u504F\u5DEE\r\n    standardDeviation_s: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return Math.sqrt(sum_variance / (count - 1));\r\n    },\r\n    //\u662F\u5426\u662F\u95F0\u5E74\r\n    isLeapYear: function(year){\r\n        return new Date(year, 1, 29).getMonth() === 1;\r\n    },\r\n    //2\u6708\u662F\u5426\u670929\r\n    feb29Between: function(date1, date2){\r\n        let _this = this;\r\n\r\n        let year1 = dayjs(date1).year();\r\n        let mar1year1 = dayjs().set({ 'year': year1, 'month': 2, 'date': 1 });\r\n\r\n        if (_this.isLeapYear(year1) && dayjs(date1) < dayjs(mar1year1) && dayjs(date2) >= dayjs(mar1year1)) {\r\n            return true;\r\n        }\r\n\r\n        let year2 = dayjs(date2).year();\r\n        let mar1year2 = dayjs().set({ 'year': year2, 'month': 2, 'date': 1 });\r\n\r\n        return (_this.isLeapYear(year2) && dayjs(date2) >= dayjs(mar1year2) && dayjs(date1) < dayjs(mar1year2));\r\n    },\r\n    //SQL \u67E5\u8BE2\r\n    findResultIndex: function(database, criterias){\r\n        let matches = {};\r\n\r\n        for (let i = 1; i < database[0].length; ++i) {\r\n            matches[i] = true;\r\n        }\r\n\r\n        let maxCriteriaLength = criterias[0].length;\r\n\r\n        for (i = 1; i < criterias.length; ++i) {\r\n            if (criterias[i].length > maxCriteriaLength) {\r\n                maxCriteriaLength = criterias[i].length;\r\n            }\r\n        }\r\n\r\n        for (let k = 1; k < database.length; ++k) {\r\n            for (let l = 1; l < database[k].length; ++l) {\r\n                let currentCriteriaResult = false;\r\n                let hasMatchingCriteria   = false;\r\n\r\n                for (let j = 0; j < criterias.length; ++j) {\r\n                    let criteria = criterias[j];\r\n\r\n                    if (criteria.length < maxCriteriaLength) {\r\n                        continue;\r\n                    }\r\n\r\n                    let criteriaField = criteria[0];\r\n\r\n                    if (database[k][0] !== criteriaField) {\r\n                        continue;\r\n                    }\r\n\r\n                    hasMatchingCriteria = true;\r\n\r\n                    for (let p = 1; p < criteria.length; ++p) {\r\n                        currentCriteriaResult = currentCriteriaResult || (new Function(\"return \" + database[k][l] + criteria[p])());  // jshint ignore:line\r\n                    }\r\n                }\r\n\r\n                if (hasMatchingCriteria) {\r\n                    matches[l] = matches[l] && currentCriteriaResult;\r\n                }\r\n            }\r\n        }\r\n\r\n        let result = [];\r\n\r\n        for (let n = 0; n < database[0].length; ++n) {\r\n            if (matches[n]) {\r\n                result.push(n - 1);\r\n            }\r\n        }\r\n\r\n        return result;\r\n    },\r\n    findField: function(database, title){\r\n        let index = null;\r\n\r\n        for (let i = 0; i < database.length; i++) {\r\n            if (database[i][0] == title) {\r\n                index = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (index == null) {\r\n            return error.v;\r\n        }\r\n\r\n        return index;\r\n    },\r\n    rest: function(array, idx){\r\n        idx = idx || 1;\r\n\r\n        if (!array || typeof array.slice !== 'function') {\r\n            return array;\r\n        }\r\n\r\n        return array.slice(idx);\r\n    },\r\n    compact: function(array){\r\n        if (!array) {\r\n            return array;\r\n        }\r\n\r\n        let result = [];\r\n\r\n        for (let i = 0; i < array.length; ++i) {\r\n            if (!array[i]) {\r\n                continue;\r\n            }\r\n\r\n            result.push(array[i]);\r\n        }\r\n\r\n        return result;\r\n    }\r\n}\r\n\r\nexport default func_methods;\r\n", "var matrix = ({});\r\n\r\nvar init = function init(matrix){\r\n    var sylvester_matrix = function() {};\r\n\r\n    sylvester_matrix.precision = 1e-6;\r\n\r\n    sylvester_matrix.create = function(elements) {\r\n        var M = new sylvester_matrix();\r\n        return M.setElements(elements);\r\n    };\r\n    var $M = sylvester_matrix.create;\r\n    \r\n    sylvester_matrix.I = function(n) {\r\n        var els = [], i = n, j;\r\n        while (i--) { j = n;\r\n            els[i] = [];\r\n            while (j--) {\r\n                els[i][j] = (i === j) ? 1 : 0;\r\n            }\r\n        }\r\n        return sylvester_matrix.create(els);\r\n    };\r\n\r\n    sylvester_matrix.prototype = {\r\n        e: function(i,j) {\r\n            if (i < 1 || i > this.elements.length || j < 1 || j > this.elements[0].length) { return null; }\r\n            return this.elements[i-1][j-1];\r\n        },\r\n        dimensions: function() {\r\n            var cols = (this.elements.length === 0) ? 0 : this.elements[0].length;\r\n            return {rows: this.elements.length, cols: cols};\r\n        },\r\n        rows: function() {\r\n            return this.elements.length;\r\n        },\r\n        cols: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            return this.elements[0].length;\r\n        },\r\n        eql: function(matrix) {\r\n            var M = matrix.elements || matrix;\r\n            if (!M[0] || typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (this.elements.length === 0 || M.length === 0) {\r\n                return this.elements.length === M.length;\r\n            }\r\n            if (this.elements.length !== M.length) { return false; }\r\n            if (this.elements[0].length !== M[0].length) { return false; }\r\n            var i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(this.elements[i][j] - M[i][j]) > sylvester_matrix.precision) { return false; }\r\n                }\r\n            }\r\n            return true;\r\n        },\r\n        dup: function() {\r\n            return sylvester_matrix.create(this.elements);\r\n        },\r\n        map: function(fn, context) {\r\n            if (this.elements.length === 0) { \r\n                return sylvester_matrix.create([]); \r\n            }\r\n            var els = [], i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { \r\n                j = nj;\r\n                els[i] = [];\r\n                while (j--) {\r\n                    els[i][j] = fn.call(context, this.elements[i][j], i + 1, j + 1);\r\n                }\r\n            }\r\n            return sylvester_matrix.create(els);\r\n        },\r\n        isSameSizeAs: function(matrix) {\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { \r\n                M = sylvester_matrix.create(M).elements; \r\n            }\r\n            if (this.elements.length === 0) { \r\n                return M.length === 0; \r\n            }\r\n            return (this.elements.length === M.length && this.elements[0].length === M[0].length);\r\n        },\r\n        add: function(matrix) {\r\n            if (this.elements.length === 0) return this.map(function(x) { return x });\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.isSameSizeAs(M)) { return null; }\r\n            return this.map(function(x, i, j) { return x + M[i-1][j-1]; });\r\n        },\r\n        subtract: function(matrix) {\r\n            if (this.elements.length === 0) return this.map(function(x) { return x });\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.isSameSizeAs(M)) { return null; }\r\n            return this.map(function(x, i, j) { return x - M[i-1][j-1]; });\r\n        },\r\n        canMultiplyFromLeft: function(matrix) {\r\n            if (this.elements.length === 0) { return false; }\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            // this.columns should equal matrix.rows\r\n            return (this.elements[0].length === M.length);\r\n        },\r\n        multiply: function(matrix) {\r\n            if (this.elements.length === 0) { return null; }\r\n            if (!matrix.elements) {\r\n                return this.map(function(x) { return x * matrix; });\r\n            }\r\n            var returnVector = matrix.modulus ? true : false;\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.canMultiplyFromLeft(M)) { return null; }\r\n            var i = this.elements.length, nj = M[0].length, j;\r\n            var cols = this.elements[0].length, c, elements = [], sum;\r\n            while (i--) { j = nj;\r\n                elements[i] = [];\r\n                while (j--) { c = cols;\r\n                    sum = 0;\r\n                    while (c--) {\r\n                        sum += this.elements[i][c] * M[c][j];\r\n                    }\r\n                    elements[i][j] = sum;\r\n                }\r\n            }\r\n            var M = sylvester_matrix.create(elements);\r\n            return returnVector ? M.col(1) : M;\r\n        },\r\n        minor: function(a, b, c, d) {\r\n            if (this.elements.length === 0) { return null; }\r\n            var elements = [], ni = c, i, nj, j;\r\n            var rows = this.elements.length, cols = this.elements[0].length;\r\n            while (ni--) { i = c - ni - 1;\r\n                elements[i] = [];\r\n                nj = d;\r\n                while (nj--) { j = d - nj - 1;\r\n                    elements[i][j] = this.elements[(a+i-1)%rows][(b+j-1)%cols];\r\n                }\r\n            }\r\n            return sylvester_matrix.create(elements);\r\n        },\r\n        transpose: function() {\r\n            if (this.elements.length === 0) return sylvester_matrix.create([]);\r\n            var rows = this.elements.length, i, cols = this.elements[0].length, j;\r\n            var elements = [], i = cols;\r\n            while (i--) { j = rows;\r\n                elements[i] = [];\r\n                while (j--) {\r\n                    elements[i][j] = this.elements[j][i];\r\n                }\r\n            }\r\n            return sylvester_matrix.create(elements);\r\n        },\r\n        isSquare: function() {\r\n            var cols = (this.elements.length === 0) ? 0 : this.elements[0].length;\r\n            return (this.elements.length === cols);\r\n        },\r\n        max: function() {\r\n            if (this.elements.length === 0) { return null; }\r\n            var m = 0, i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(this.elements[i][j]) > Math.abs(m)) { m = this.elements[i][j]; }\r\n                }\r\n            }\r\n            return m;\r\n        },\r\n        indexOf: function(x) {\r\n            if (this.elements.length === 0) { return null; }\r\n            var index = null, ni = this.elements.length, i, nj = this.elements[0].length, j;\r\n            for (i = 0; i < ni; i++) {\r\n                for (j = 0; j < nj; j++) {\r\n                    if (this.elements[i][j] === x) { return {i: i+1, j: j+1}; }\r\n                }\r\n            }\r\n            return null;\r\n        },\r\n        diagonal: function() {\r\n            if (!this.isSquare) { return null; }\r\n            var els = [], n = this.elements.length;\r\n            for (var i = 0; i < n; i++) {\r\n                els.push(this.elements[i][i]);\r\n            }\r\n            return sylvester_matrix.create(els);\r\n        },\r\n        toRightTriangular: function() {\r\n            if (this.elements.length === 0) return sylvester_matrix.create([]);\r\n            var M = this.dup(), els;\r\n            var n = this.elements.length, i, j, np = this.elements[0].length, p;\r\n            for (i = 0; i < n; i++) {\r\n                if (M.elements[i][i] === 0) {\r\n                    for (j = i + 1; j < n; j++) {\r\n                        if (M.elements[j][i] !== 0) {\r\n                            els = [];\r\n                            for (p = 0; p < np; p++) { \r\n                                els.push(M.elements[i][p] + M.elements[j][p]); \r\n                            }\r\n                            M.elements[i] = els;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                if (M.elements[i][i] !== 0) {\r\n                    for (j = i + 1; j < n; j++) {\r\n                        var multiplier = M.elements[j][i] / M.elements[i][i];\r\n                        els = [];\r\n                        for (p = 0; p < np; p++) {\r\n                            // Elements with column numbers up to an including the number of the\r\n                            // row that we're subtracting can safely be set straight to zero,\r\n                            // since that's the point of this routine and it avoids having to\r\n                            // loop over and correct rounding errors later\r\n                            els.push(p <= i ? 0 : M.elements[j][p] - M.elements[i][p] * multiplier);\r\n                        }\r\n                        M.elements[j] = els;\r\n                    }\r\n                }\r\n            }\r\n            return M;\r\n        },\r\n        determinant: function() {\r\n            if (this.elements.length === 0) { return 1; }\r\n            if (!this.isSquare()) { return null; }\r\n            var M = this.toRightTriangular();\r\n            var det = M.elements[0][0], n = M.elements.length;\r\n            for (var i = 1; i < n; i++) {\r\n                det = det * M.elements[i][i];\r\n            }\r\n            return det;\r\n        },\r\n        isSingular: function() {\r\n            return (this.isSquare() && this.determinant() === 0);\r\n        },\r\n        trace: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            if (!this.isSquare()) { return null; }\r\n            var tr = this.elements[0][0], n = this.elements.length;\r\n            for (var i = 1; i < n; i++) {\r\n                tr += this.elements[i][i];\r\n            }\r\n            return tr;\r\n        },\r\n        rank: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            var M = this.toRightTriangular(), rank = 0;\r\n            var i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(M.elements[i][j]) > sylvester_matrix.precision) { rank++; break; }\r\n                }\r\n            }\r\n            return rank;\r\n        },\r\n        augment: function(matrix) {\r\n            if (this.elements.length === 0) { return this.dup(); }\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            var T = this.dup(), cols = T.elements[0].length;\r\n            var i = T.elements.length, nj = M[0].length, j;\r\n            if (i !== M.length) { return null; }\r\n            while (i--) { \r\n                j = nj;\r\n                while (j--) {\r\n                    T.elements[i][cols + j] = M[i][j];\r\n                }\r\n            }\r\n            return T;\r\n        },\r\n        inverse: function() {\r\n            if (this.elements.length === 0) { return null; }\r\n            if (!this.isSquare() || this.isSingular()) { return null; }\r\n            var n = this.elements.length, i= n, j;\r\n            var M = this.augment(sylvester_matrix.I(n)).toRightTriangular();\r\n            var np = M.elements[0].length, p, els, divisor;\r\n            var inverse_elements = [], new_element;\r\n            // Sylvester.Matrix is non-singular so there will be no zeros on the\r\n            // diagonal. Cycle through rows from last to first.\r\n            while (i--) {\r\n                // First, normalise diagonal elements to 1\r\n                els = [];\r\n                inverse_elements[i] = [];\r\n                divisor = M.elements[i][i];\r\n                for (p = 0; p < np; p++) {\r\n                    new_element = M.elements[i][p] / divisor;\r\n                    els.push(new_element);\r\n                    // Shuffle off the current row of the right hand side into the results\r\n                    // array as it will not be modified by later runs through this loop\r\n                    if (p >= n) { inverse_elements[i].push(new_element); }\r\n                }\r\n                M.elements[i] = els;\r\n                // Then, subtract this row from those above it to give the identity matrix\r\n                // on the left hand side\r\n                j = i;\r\n                while (j--) {\r\n                    els = [];\r\n                    for (p = 0; p < np; p++) {\r\n                        els.push(M.elements[j][p] - M.elements[i][p] * M.elements[j][i]);\r\n                    }\r\n                    M.elements[j] = els;\r\n                }\r\n            }\r\n            return sylvester_matrix.create(inverse_elements);\r\n        },\r\n        round: function() {\r\n            return this.map(function(x) { return Math.round(x); });\r\n        },\r\n        snapTo: function(x) {\r\n            return this.map(function(p) {\r\n                return (Math.abs(p - x) <= sylvester_matrix.precision) ? x : p;\r\n            });\r\n        },\r\n        setElements: function(els) {\r\n            var i, j, elements = els.elements || els;\r\n            if (elements[0] && typeof(elements[0][0]) !== 'undefined') {\r\n                i = elements.length;\r\n                this.elements = [];\r\n                while (i--) { j = elements[i].length;\r\n                    this.elements[i] = [];\r\n                    while (j--) {\r\n                        this.elements[i][j] = elements[i][j];\r\n                    }\r\n                }\r\n                return this;\r\n            }\r\n            var n = elements.length;\r\n            this.elements = [];\r\n            for (i = 0; i < n; i++) {\r\n                this.elements.push([elements[i]]);\r\n            }\r\n            return this;\r\n        }\r\n    };\r\n\r\n    matrix.sylvester_matrix = sylvester_matrix;\r\n}\r\ninit(matrix);\r\n\r\nexport function inverse(els){\r\n    var M = matrix.sylvester_matrix.create(els);\r\n    return M.inverse().elements;\r\n}", "import func_methods from '../global/func_methods';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport { isRealNum, valueIsError,error } from '../global/validate';\r\nimport { getdatabyselectionD } from '../global/getdata';\r\nimport { genarate } from '../global/format';\r\nimport { inverse } from '../function/matrix_methods';\r\nimport { getSheetIndex, getluckysheetfile, getRangetxt } from '../methods/get';\r\nimport { getObjType, ABCatNum } from '../utils/util';\r\nimport Store from '../store';\r\nimport numeral from 'numeral';\r\n\r\n//\u51FD\u6570\u529F\u80FD\uFF1A\u6BD4\u8F83\u6216\u8FD0\u7B97\r\nfunction luckysheet_compareWith() {\r\n    //\u7B2C\u4E00\u4E2A\u53C2\u6570\u548C\u7B2C\u4E09\u4E2A\u53C2\u6570\uFF0C\u8FD4\u56DE\u6BD4\u8F83\u7ED3\u679C\u7684\u5E03\u5C14\u503C\u6216\u8005\u8FD0\u7B97\u503C\r\n    //formula.operatorjson; \u5B58\u50A8\u8FD0\u7B97\u7B26\u548C\u6BD4\u8F83\u7B26\r\n    let sp = arguments[1]; //\u64CD\u4F5C\u7B26\r\n\r\n    //\u53C2\u6570\u4E00\r\n    let data_fp = arguments[0];\r\n    let fp;\r\n    if(getObjType(data_fp) == \"object\" && data_fp.startCell != null){ //\u53C2\u6570\u662F\u9009\u533A\r\n        if(sp == \"&\"){\r\n            fp = func_methods.getCellDataDyadicArr(data_fp, \"text\");\r\n        }\r\n        else{\r\n            fp = func_methods.getCellDataDyadicArr(data_fp, \"number\");\r\n        }\r\n\r\n        if(fp.length == 1 && fp[0].length == 1){\r\n            fp = fp[0][0];\r\n        }\r\n    }\r\n    else{\r\n        fp = data_fp;\r\n    }\r\n\r\n    //\u53C2\u6570\u4E8C\r\n    let data_tp = arguments[2];\r\n    let tp;\r\n    if(getObjType(data_tp) == \"object\" && data_tp.startCell != null){ //\u53C2\u6570\u662F\u9009\u533A\r\n        if(sp == \"&\"){\r\n            tp = func_methods.getCellDataDyadicArr(data_tp, \"text\");\r\n        }\r\n        else{\r\n            tp = func_methods.getCellDataDyadicArr(data_tp, \"number\");\r\n        }\r\n\r\n        if(tp.length == 1 && tp[0].length == 1){\r\n            tp = tp[0][0];\r\n        }\r\n    }\r\n    else{\r\n        tp = data_tp;\r\n    }\r\n\r\n    if(valueIsError(fp)){\r\n        return fp;\r\n    }\r\n\r\n    if(valueIsError(tp)){\r\n        return tp;\r\n    }\r\n\r\n    //\u53C2\u6570\u662F\u4E0D\u89C4\u5219\u4E8C\u7EF4\u6570\u7EC4 \u65F6 return #VALUE! \u9519\u8BEF\r\n    if(getObjType(fp) == \"array\" && getObjType(fp[0]) == \"array\" && !func_methods.isDyadicArr(fp)){\r\n        return error.v;   \r\n    }\r\n\r\n    if(getObjType(tp) == \"array\" && getObjType(tp[0]) == \"array\" && !func_methods.isDyadicArr(tp)){\r\n        return error.v;   \r\n    }\r\n\r\n    if(sp == \"<>\"){\r\n        sp = \"!=\";\r\n    }\r\n\r\n    if(sp == \"=\"){\r\n        sp = \"==\";\r\n    }\r\n\r\n    if(fp==null && tp==null){\r\n        return \"#INVERSE!\";\r\n    }\r\n    else if(fp==\"#INVERSE!\"){\r\n        fp =0;\r\n        if(sp==\"-\"){\r\n            sp = \"+\";\r\n        }\r\n        else if(sp==\"+\"){\r\n            sp = \"-\";\r\n        }\r\n    }\r\n    else if(sp == \"-\" && fp == null){\r\n        fp = 0;\r\n    }\r\n    else if(sp == \"/\" && (tp == 0 || tp == null)){\r\n        return error.d;\r\n    }\r\n\r\n    //\u8BA1\u7B97result\r\n    function booleanOperation(a, operator, b){\r\n        if(isRealNum(a)){\r\n            a = parseFloat(a);\r\n        }\r\n\r\n        if(isRealNum(b)){\r\n            b = parseFloat(b);\r\n        }\r\n\r\n        if(operator == \"==\"){\r\n            if(a == b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"!=\"){\r\n            if(a != b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \">=\"){\r\n            if(a >= b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"<=\"){\r\n            if(a <= b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \">\"){\r\n            if(a > b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"<\"){\r\n            if(a < b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    //\u5E03\u5C14\u503C\u5BF9\u5E94\u6570\u5B57\uFF08true = 1, false = 1\uFF09\r\n    function booleanToNum(v){\r\n        if(v == null){\r\n            return v;\r\n        }\r\n\r\n        if(v.toString().toLowerCase() == \"true\"){\r\n            return 1;\r\n        }\r\n\r\n        if(v.toString().toLowerCase() == \"false\"){\r\n            return 0;\r\n        }\r\n\r\n        return v;\r\n    }\r\n      \r\n    if(sp == \"*\"){ //\u4E58\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u76F8\u4E58\uFF08m*n \u4E0E m*n \u7B49\u4E8E m*n\uFF1Bm*p \u4E0E p*n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09 \r\n                if(fp.length == tp.length && fp[0].length == tp[0].length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);//parseFloat(fp[m][n]) * parseFloat(tp[m][n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == tp.length){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < fp[0].length; p++){\r\n                                fp[m][p] = booleanToNum(fp[m][p]);\r\n                                tp[p][n] = booleanToNum(tp[p][n]);\r\n\r\n                                if(isRealNum(fp[m][p]) && isRealNum(tp[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[m][p], sp, tp[p][n]);//parseFloat(fp[m][p]) * parseFloat(tp[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp.length == tp[0].length){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < tp[0].length; p++){\r\n                                fp[p][n] = booleanToNum(fp[p][n]);\r\n                                tp[m][p] = booleanToNum(tp[m][p]);\r\n\r\n                                if(isRealNum(tp[m][p]) && isRealNum(fp[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[p][n], sp, tp[m][p]);//parseFloat(tp[m][p]) * parseFloat(fp[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u4E58\uFF08m*n \u4E0E n \u7B49\u4E8E m*n\uFF1Bm*1 \u4E0E n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09\r\n                if(fp[0].length == tp.length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);//parseFloat(fp[m][n]) * parseFloat(tp[n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == 1){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[m][0] = booleanToNum(fp[m][0]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][0]) && isRealNum(tp[n])){\r\n                                value = luckysheet_calcADPMM(fp[m][0], sp, tp[n]);// parseFloat(fp[m][0]) * parseFloat(tp[n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u4E58\uFF08m*n \u4E0E n \u7B49\u4E8E m*n\uFF1Bm*1 \u4E0E n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09\r\n                if(tp[0].length == fp.length){\r\n                    for(let m = 0; m < tp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < tp[m].length; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);// parseFloat(fp[n]) * parseFloat(tp[m][n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(tp[0].length == 1){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][0] = booleanToNum(tp[m][0]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][0])){\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][0]);//parseFloat(fp[n]) * parseFloat(tp[m][0]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else{\r\n                //\u4E00\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u4E58\u65F6\uFF0C\u6570\u7EC4\u5927\u5C0F\u4E0D\u4E00\u6837\u662F\u9519\u8BEF\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        value = luckysheet_calcADPMM(fp[n], sp, tp[n]);// parseFloat(fp[n]) * parseFloat(tp[n]);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            value = luckysheet_calcADPMM(fp[m][n], sp, tp);// parseFloat(fp[m][n]) * parseFloat(tp);\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        value = luckysheet_calcADPMM(fp[n], sp, tp);// parseFloat(fp[n]) * parseFloat(tp);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[m][n]);// parseFloat(fp) * parseFloat(tp[m][n]);\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        value = luckysheet_calcADPMM(fp, sp, tp[n]);//parseFloat(fp) * parseFloat(tp[n]);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                result = luckysheet_calcADPMM(fp, sp, tp);//parseFloat(fp) * parseFloat(tp);\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"/\"){ //\u9664\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u76F8\u9664\uFF08m*n \u4E0E m*n \u7B49\u4E8E m*n\uFF1Bm*p \u4E0E p*n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09 \r\n                if(fp.length == tp.length && fp[0].length == tp[0].length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                                if(parseFloat(tp[m][n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);// parseFloat(fp[m][n]) / parseFloat(tp[m][n]);    \r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == tp.length){\r\n                    let tp_inverse = inverse(tp);\r\n\r\n                    let rowlen = fp.length;\r\n                    let collen = tp_inverse[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < fp[0].length; p++){\r\n                                fp[m][p] = booleanToNum(fp[m][p]);\r\n                                tp_inverse[p][n] = booleanToNum(tp_inverse[p][n]);\r\n\r\n                                if(isRealNum(fp[m][p]) && isRealNum(tp_inverse[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[m][p], \"*\", tp_inverse[p][n]);// parseFloat(fp[m][p]) * parseFloat(tp_inverse[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u9664\uFF08m*n \u4E0E n \u7B49\u4E8E m*n\uFF1Bm*1 \u4E0E n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09\r\n                if(fp[0].length == tp.length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                                if(parseFloat(tp[n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);// parseFloat(fp[m][n]) / parseFloat(tp[n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == 1){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[m][0] = booleanToNum(fp[m][0]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][0]) && isRealNum(tp[n])){\r\n                                if(parseFloat(tp[n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][0], sp, tp[n]);// parseFloat(fp[m][0]) / parseFloat(tp[n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                //\u4E8C\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u9664\uFF08m*n \u4E0E n \u7B49\u4E8E m*n\uFF1Bm*1 \u4E0E n \u7B49\u4E8E m*n\uFF1B\u5176\u5B83\u9519\u8BEF\uFF09\r\n                if(tp[0].length == fp.length){\r\n                    for(let m = 0; m < tp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < tp[m].length; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                                if(parseFloat(tp[m][n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);//parseFloat(fp[n]) / parseFloat(tp[m][n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(tp[0].length == 1){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][0] = booleanToNum(tp[m][0]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][0])){\r\n                                if(parseFloat(tp[m][0]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[n], sp, tp[m][0]);//parseFloat(fp[n]) / parseFloat(tp[m][0]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else{\r\n                //\u4E00\u7EF4\u6570\u7EC4\u4E0E\u4E00\u7EF4\u6570\u7EC4\u76F8\u9664\u65F6\uFF0C\u6570\u7EC4\u5927\u5C0F\u4E0D\u4E00\u6837\u662F\u9519\u8BEF\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        if(parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp[n]);//parseFloat(fp[n]) / parseFloat(tp[n]);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            if(parseFloat(tp) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp);//parseFloat(fp[m][n]) / parseFloat(tp);\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        if(parseFloat(tp) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp);//parseFloat(fp[n]) / parseFloat(tp);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            if(parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp, sp, tp[m][n]);//parseFloat(fp) / parseFloat(tp[m][n]);\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        if(parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[n]);//parseFloat(fp) / parseFloat(tp[n]);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                if(parseFloat(tp) == 0){\r\n                    result = error.d;\r\n                }\r\n                else{\r\n                    result = luckysheet_calcADPMM(fp, sp, tp);//parseFloat(fp) / parseFloat(tp);\r\n                }\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"+\" || sp == \"-\" || sp == \"%\"){ //\u52A0 \u51CF \u53D6\u4F59\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);// eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[n] = booleanToNum(tp[n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                            if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);//eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        fp[n] = booleanToNum(fp[n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);//eval(parseFloat(fp[n]) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp[n]);//eval(parseFloat(fp[n]) + sp + \"(\" + parseFloat(tp[n]) + \")\" );    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            if(sp == \"%\" && parseFloat(tp) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp);//eval(parseFloat(fp[m][n]) + sp + parseFloat(tp));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        if(sp == \"%\" && parseFloat(tp) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp);//eval(parseFloat(fp[n]) + sp + parseFloat(tp));    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp, sp, tp[m][n]);//eval(parseFloat(fp) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[n]);//eval(parseFloat(fp) + sp + parseFloat(tp[n]));    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                if(sp == \"%\" && parseFloat(tp) == 0){\r\n                    result = error.d;\r\n                }\r\n                else{\r\n                    result = luckysheet_calcADPMM(fp, sp, tp);//eval(parseFloat(fp) + sp + \"(\" + parseFloat(tp) + \")\");    \r\n                }\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"==\" || sp == \"!=\" || sp == \">=\" || sp == \"<=\" || sp == \">\" || sp == \"<\"){ //\u6BD4\u8F83\u8FD0\u7B97\u7B26\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp[n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        let value = booleanOperation(fp[n], sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    let value = booleanOperation(fp[n], sp, tp[n]);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    let value = booleanOperation(fp[n], sp, tp);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        let value = booleanOperation(fp, sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    let value = booleanOperation(fp, sp, tp[n]);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            return booleanOperation(fp, sp, tp);\r\n        }\r\n    }\r\n    else if(sp == \"&\"){ //\u8FDE\u63A5\u7B26\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp[n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        rowArr.push(fp[n] + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    result.push(fp[n] + \"\" + tp[n]);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    result.push(fp[n] + \"\" + tp);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        rowArr.push(fp + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    result.push(fp + \"\" + tp[n]);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            return fp + \"\" + tp;\r\n        }\r\n    }\r\n    else if(sp == \"^\"){ //\u5E42\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[n] = booleanToNum(tp[n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        fp[n] = booleanToNum(fp[n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp[n]), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        value = Math.pow(parseFloat(fp[n]), parseFloat(tp[n]));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        value = Math.pow(parseFloat(fp[n]), parseFloat(tp));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        value = Math.pow(parseFloat(fp), parseFloat(tp[n]));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                result = Math.pow(parseFloat(fp), parseFloat(tp));\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n}\r\n\r\n//\u89E3\u6790 \u516C\u5F0F\u4E2D{1,2,3;2,3,4} \u4E3A\u6570\u7EC4[[1,2,3],[2,3,4]]\r\nfunction luckysheet_getarraydata() {\r\n    let fp = arguments[0];\r\n\r\n    fp = fp.replace(\"{\", \"\").replace(\"}\", \"\").replace(/\\\"/g, '');\r\n\r\n    let arr = [];\r\n\r\n    if(fp.indexOf(\";\") > -1){\r\n        arr = fp.split(\";\");\r\n\r\n        for(let i = 0; i < arr.length; i++){\r\n            arr[i] = arr[i].split(\",\");\r\n        }\r\n    }\r\n    else{\r\n        arr = fp.split(\",\");    \r\n    }\r\n\r\n    return arr;\r\n}\r\n\r\nfunction luckysheet_calcADPMM(fp, sp, tp){\r\n    let value;\r\n    if(sp==\"+\"){\r\n        value = numeral(fp).add(tp).value();\r\n    }\r\n    else if(sp==\"-\"){\r\n        value = numeral(fp).subtract(tp).value();\r\n    }\r\n    else if(sp==\"%\"){\r\n        value = new Function(\"return \" + parseFloat(fp) + sp + \"(\" + parseFloat(tp) + \")\" )();\r\n    }\r\n    else if(sp==\"/\"){\r\n        value = numeral(fp).divide(tp).value();\r\n    }\r\n    else if(sp==\"*\"){\r\n        value = numeral(fp).multiply(tp).value();\r\n    }\r\n    return value;\r\n}\r\n\r\nfunction luckysheet_getcelldata(txt) {\r\n    if (window.luckysheet_getcelldata_cache == null) {\r\n        window.luckysheet_getcelldata_cache = {};\r\n    }\r\n\r\n    if (txt in window.luckysheet_getcelldata_cache) {\r\n        return window.luckysheet_getcelldata_cache[txt];\r\n    }\r\n\r\n    let luckysheetfile = getluckysheetfile();\r\n    let val = txt.split(\"!\");\r\n    let sheettxt = \"\",\r\n        rangetxt = \"\",\r\n        sheetIndex = -1,\r\n        sheetdata = null;\r\n    \r\n    if (val.length > 1) {\r\n        sheettxt = val[0].replace(/''/g,\"'\");\r\n        rangetxt = val[1];\r\n\r\n        if(sheettxt.substr(0,1)==\"'\" && sheettxt.substr(sheettxt.length-1,1)==\"'\"){\r\n            sheettxt = sheettxt.substring(1,sheettxt.length-1);\r\n        }\r\n        \r\n        for (let i in luckysheetfile) {\r\n            if (sheettxt == luckysheetfile[i].name) {\r\n                sheetIndex = luckysheetfile[i].index;\r\n                sheetdata = luckysheetfile[i].data;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (sheetIndex == -1) {\r\n            sheetIndex = 0;\r\n        }\r\n    } \r\n    else {\r\n        let index = getSheetIndex(Store.calculateSheetIndex);\r\n        sheettxt = luckysheetfile[index].name;\r\n        sheetIndex = luckysheetfile[index].index;\r\n        // sheetdata = Store.flowdata;\r\n        sheetdata = luckysheetfile[index].data;\r\n        rangetxt = val[0];\r\n\r\n        // \u53D6\u6D88execFunctionGroupData\uFF0C\u6539\u7528execFunctionGlobalData\r\n        // if (formula.execFunctionGroupData != null) {\r\n        //     sheetdata = formula.execFunctionGroupData;\r\n        // }\r\n    }\r\n\r\n    if (rangetxt.indexOf(\":\") == -1) {\r\n        let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n        let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n        if (!isNaN(row) && !isNaN(col)) {\r\n            let ret = getdatabyselectionD(sheetdata, {\r\n                \"row\": [row, row],\r\n                \"column\": [col, col]\r\n            })[0][0];\r\n\r\n            if (formula.execFunctionGlobalData != null) {\r\n                let ef = formula.execFunctionGlobalData[row+\"_\"+col+\"_\"+sheetIndex];\r\n                if(ef!=null){\r\n                    ret = ef;\r\n                }\r\n            }\r\n\r\n            //\u8303\u56F4\u7684\u957F\u5BBD\r\n            let rowl = 1;\r\n            let coll = 1;\r\n            let retAll= {\r\n                \"sheetName\": sheettxt,\r\n                \"startCell\": rangetxt,\r\n                \"rowl\": rowl,\r\n                \"coll\": coll,\r\n                \"data\": ret\r\n            };\r\n\r\n            window.luckysheet_getcelldata_cache[txt] = retAll;\r\n\r\n            return retAll;\r\n        } \r\n        else {\r\n            return [];\r\n        }\r\n    } \r\n    else {\r\n        rangetxt = rangetxt.split(\":\");\r\n        let row = [], col = [];\r\n        row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n        row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n        \r\n        if (isNaN(row[0])) {\r\n            row[0] = 0;\r\n        }\r\n\r\n        if (isNaN(row[1])) {\r\n            row[1] = sheetdata.length - 1;\r\n        }\r\n\r\n        if (row[0] > row[1]) {\r\n            tooltip.info(\"\u9009\u62E9\u5931\u8D25\", \"\u8F93\u5165\u8303\u56F4\u9519\u8BEF\uFF01\");\r\n            return [];\r\n        }\r\n\r\n        col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n        col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n        \r\n        if (isNaN(col[0])) {\r\n            col[0] = 0;\r\n        }\r\n\r\n        if (isNaN(col[1])) {\r\n            col[1] = sheetdata[0].length - 1;\r\n        }\r\n\r\n        if (col[0] > col[1]) {\r\n            tooltip.info(\"\u9009\u62E9\u5931\u8D25\", \"\u8F93\u5165\u8303\u56F4\u9519\u8BEF\uFF01\");\r\n            return [];\r\n        }\r\n        \r\n        let ret = getdatabyselectionD(sheetdata, {\r\n            \"row\": row,\r\n            \"column\": col\r\n        });\r\n\r\n        if(formula.execFunctionGlobalData!=null){\r\n            for(let r=row[0];r<=row[1];r++){\r\n                for(let c=col[0];c<=col[1];c++){\r\n                    let ef = formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+sheetIndex];\r\n                    if(ef!=null){\r\n                        ret[r-row[0]][c-col[0]] = ef;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        \r\n        //\u8303\u56F4\u7684\u957F\u5BBD\r\n        let rowl = row[1] - row[0] + 1;\r\n        let coll = col[1] - col[0] + 1;\r\n        let retAll= {\r\n            \"sheetName\": sheettxt,\r\n            \"startCell\": rangetxt[0],\r\n            \"rowl\": rowl,\r\n            \"coll\": coll,\r\n            \"data\": ret\r\n        };\r\n        \r\n        window.luckysheet_getcelldata_cache[txt] = retAll;\r\n\r\n        return retAll;\r\n    }\r\n}\r\n\r\n//\u89E3\u6790\u5355\u4E2A\u53D6\u5F97\u7684\u503C\uFF0C\u6709\u5B57\u7B26\u4E32\uFF0C\u6570\u5B57\uFF0C\u5F15\u7528\u5355\u5143\u683C\u6216\u8005\u51FD\u6570\r\nfunction luckysheet_parseData(value) {\r\n    if(typeof value === \"object\" ){\r\n        if(value == null){\r\n            return \"\";\r\n        }\r\n        else if(Array.isArray(value)){ //\u51FD\u6570\u8FD4\u56DE\u7684\u5E26\u671F\u671B\u683C\u5F0F\u7684\u6570\u7EC4\uFF0C\u53EF\u63D0\u53D6\u683C\u5F0F\r\n            let v = genarate(value[0]);\r\n            return v[2];\r\n        }\r\n        else{ //getcelldat\u5F15\u7528\u5355\u5143\u683C\u5BF9\u8C61\uFF0C\u5E26\u6709\u683C\u5F0F\r\n            if(Array.isArray(value.data)){ //\u5355\u5143\u683C\u533A\u57DF\r\n                return error.v;             \r\n            }\r\n            else{ //\u5355\u4E2A\u5355\u5143\u683C\r\n                if(value.data.v === undefined){\r\n                    return \"\";\r\n                }\r\n                else{\r\n                    return value.data.v;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if(!formula.isCompareOperator(value).flag){\r\n        let v = genarate(value);\r\n        return v[2];\r\n    }\r\n    else if(typeof value === \"string\" || typeof value === \"number\"){\r\n        return value;\r\n    }\r\n\r\n    return error.v;\r\n}\r\n\r\nfunction luckysheet_getValue() {\r\n    //\u89E3\u6790\u83B7\u53D6\u51FD\u6570\u53C2\u6570\uFF0C\u65E0\u683C\u5F0F\uFF0C\u4E14\u53EF\u5305\u542B\u5E26\u64CD\u4F5C\u7B26\u7684\">5\"\r\n    //\u6570\u636E\u7C7B\u578B\uFF1A1.\u624B\u52A8\u8F93\u5165\u6216\u51FD\u6570\u8FD4\u56DE\u7684\u5B57\u7B26\u4E32\uFF0C\u666E\u901A\u5B57\u7B26\u4E32\u6216\u6570\u5B57\u76F4\u63A5\u53D6\u503C\uFF0C\u7279\u6B8A\u683C\u5F0F\u9700\u8F6C\u5316 \u5982\uFF1A\"2019-1-1\"\uFF08\u7279\u6B8A\u683C\u5F0F\u8F6C\u5316\u4E3A\u6570\u5B57\uFF09\u3001\">5\"\u6216\u6570\u5B57\r\n    //2.\u5F15\u7528\u5355\u5143\u683C\u5BF9\u8C61\uFF0C\u53D6\u5F97\u4E8C\u7EF4\u6570\u7EC4\u6216\u5355\u4E2A\u7684v \u5982\uFF1AA1\r\n    //3.\u51FD\u6570\u8FD4\u56DE\u7684\u5E26\u671F\u671B\u683C\u5F0F\u7684\u6570\u7EC4\uFF0C\u53D6\u5F97\u7B2C\u4E00\u4E2A\u53C2\u6570\uFF0C\u8F6C\u5316\u4E3A\u6570\u5B57 \u5982\uFF1A[\"2019-1-1\",true]\r\n    let args = arguments[0];\r\n\r\n    for(let i = 0; i < args.length; i++){\r\n        let value = args[i];\r\n\r\n        if(typeof value === \"object\" ){\r\n            if(value == null){\r\n                value = \"\";\r\n            }\r\n            else if(Array.isArray(value)){ //\u51FD\u6570\u8FD4\u56DE\u7684\u5E26\u671F\u671B\u683C\u5F0F\u7684\u6570\u7EC4\uFF0C\u53EF\u63D0\u53D6\u683C\u5F0F\r\n                let v = genarate(value[0]);\r\n                value = v[2];\r\n            }\r\n            else{ //getcelldat\u5F15\u7528\u5355\u5143\u683C\u5BF9\u8C61\uFF0C\u5E26\u6709\u683C\u5F0F\r\n                if(Array.isArray(value.data)){ //\u5355\u5143\u683C\u533A\u57DF\r\n                    value = value.data;                \r\n                }\r\n                else{ //\u5355\u4E2A\u5355\u5143\u683C\r\n                    if(value.data.v === undefined){ //\u7A7A\u767D\u5355\u5143\u683C\r\n                        value = \"\";\r\n                    }\r\n                    else{\r\n                        value = value.data.v;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(!formula.isCompareOperator(value).flag){\r\n            let v = genarate(value);\r\n            value = v[2];\r\n        }\r\n        \r\n        args[i] = value;\r\n    }\r\n}\r\n\r\n\r\nfunction luckysheet_indirect_check() {\r\n    let cellTxt = arguments[0];\r\n    if (cellTxt == null || cellTxt.length == 0) {\r\n        return null;\r\n    }\r\n    return cellTxt;\r\n}\r\n\r\nfunction luckysheet_indirect_check_return(txt) {\r\n    return txt;\r\n}\r\n\r\nfunction luckysheet_offset_check() {\r\n    if (!(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    var reference = arguments[0].startCell;\r\n\r\n    //\u8981\u504F\u79FB\u7684\u884C\u6570\r\n    var rows = func_methods.getFirstValue(arguments[1]);\r\n    if (valueIsError(rows)) {\r\n        return rows;\r\n    }\r\n\r\n    if (!isRealNum(rows)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    rows = parseInt(rows);\r\n\r\n    //\u8981\u504F\u79FB\u7684\u5217\u6570\r\n    var cols = func_methods.getFirstValue(arguments[2]);\r\n    if (valueIsError(cols)) {\r\n        return cols;\r\n    }\r\n\r\n    if (!isRealNum(cols)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    cols = parseInt(cols);\r\n\r\n    //\u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u9AD8\u5EA6\r\n    var height = arguments[0].rowl;\r\n    if (arguments.length >= 4) {\r\n        height = func_methods.getFirstValue(arguments[3]);\r\n        if (valueIsError(height)) {\r\n            return height;\r\n        }\r\n\r\n        if (!isRealNum(height)) {\r\n            return formula.error.v;\r\n        }\r\n\r\n        height = parseInt(height);\r\n    }\r\n\r\n    //\u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u5BBD\u5EA6\r\n    var width = arguments[0].coll;\r\n    if (arguments.length == 5) {\r\n        width = func_methods.getFirstValue(arguments[4]);\r\n        if (valueIsError(width)) {\r\n            return width;\r\n        }\r\n\r\n        if (!isRealNum(width)) {\r\n            return formula.error.v;\r\n        }\r\n\r\n        width = parseInt(width);\r\n    }\r\n\r\n    if (height < 1 || width < 1) {\r\n        return formula.error.r;\r\n    }\r\n\r\n    //\u8BA1\u7B97\r\n    var cellrange = formula.getcellrange(reference);\r\n    var cellRow0 = cellrange[\"row\"][0];\r\n    var cellCol0 = cellrange[\"column\"][0];\r\n\r\n    cellRow0 += rows;\r\n    cellCol0 += cols;\r\n\r\n    var cellRow1 = cellRow0 + height - 1;\r\n    var cellCol1 = cellCol0 + width - 1;\r\n\r\n    if (cellRow0 < 0 || cellRow1 >= Store.flowdata.length || cellCol0 < 0 || cellCol1 >= Store.flowdata[0].length) {\r\n        return formula.error.r;\r\n    }\r\n\r\n    return getRangetxt(Store.calculateSheetIndex, {\r\n        row: [cellRow0, cellRow1],\r\n        column: [cellCol0, cellCol1]\r\n    });\r\n}\r\n\r\n\r\nfunction luckysheet_getSpecialReference(isCellFirst, param1, param2) {\r\n    let functionRange, rangeTxt;\r\n    if(isCellFirst){\r\n        rangeTxt = param1;\r\n        functionRange = param2;\r\n    }\r\n    else{\r\n        functionRange = param1;\r\n        rangeTxt = param2;\r\n    }\r\n\r\n    if(functionRange.startCell.indexOf(\":\")>-1 || rangeTxt.indexOf(\":\")>-1){\r\n        return error.v;\r\n    }\r\n\r\n\r\n    if(isCellFirst){\r\n        return luckysheet_getcelldata(rangeTxt + \":\" +functionRange.startCell);\r\n    }\r\n    else{\r\n        let rangeT = rangeTxt, sheetName=\"\";\r\n        if(rangeTxt.indexOf(\"!\")>-1){\r\n            let rangetxtArr = rangeTxt.split(\"!\");\r\n            sheetName = rangetxtArr[0] + \"!\";\r\n            rangeT = rangetxtArr[1];\r\n        }\r\n        return luckysheet_getcelldata(sheetName + functionRange.startCell + \":\" + rangeT);\r\n    }\r\n\r\n    \r\n\r\n}\r\n\r\nexport {\r\n    luckysheet_compareWith,\r\n    luckysheet_getarraydata,\r\n    luckysheet_getcelldata,\r\n    luckysheet_parseData,\r\n    luckysheet_getValue,\r\n    luckysheet_indirect_check,\r\n    luckysheet_indirect_check_return,\r\n    luckysheet_offset_check,\r\n    luckysheet_calcADPMM,\r\n    luckysheet_getSpecialReference\r\n}", "import { seriesLoadScripts, loadLinks, $$, arrayRemoveItem } from '../../utils/util'\r\nimport { generateRandomKey, replaceHtml } from '../../utils/chartUtil'\r\nimport { getdatabyselection, getcellvalue } from '../../global/getdata';\r\nimport chartInfo from '../../store'\r\nimport formula from '../../global/formula';\r\nimport { luckysheet_getcelldata } from '../../function/func';\r\nimport { getSheetIndex, getRangetxt, getvisibledatacolumn, getvisibledatarow } from '../../methods/get'\r\nimport { rowLocation, colLocation, mouseposition } from '../../global/location'\r\nimport { setluckysheet_scroll_status } from '../../methods/set'\r\nimport {\r\n    luckysheetMoveHighlightCell,\r\n    luckysheetMoveHighlightCell2, \r\n    luckysheetMoveHighlightRange,\r\n    luckysheetMoveHighlightRange2,\r\n    luckysheetMoveEndCell\r\n} from '../../controllers/sheetMove';\r\nimport { isEditMode } from '../../global/validate';\r\nimport luckysheetsizeauto from '../../controllers/resize';\r\nlet _rowLocation = rowLocation\r\nlet _colLocation = colLocation\r\n\r\n// Dynamically load dependent scripts and styles\r\nconst dependScripts = [\r\n    'https://cdn.jsdelivr.net/npm/vue@2.6.11',\r\n    'https://unpkg.com/vuex@3.4.0',\r\n    'https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/index.js',\r\n    'https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts.min.js',\r\n    './assets/dist/expendPlugins/chart/chartmix.umd.min.js',\r\n    // 'http://26.26.26.1:8000/chartmix.umd.js'\r\n]\r\n\r\nconst dependLinks = [\r\n    'https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/theme-chalk/index.css',\r\n    './assets/dist/expendPlugins/chart/chartmix.css',\r\n    // 'http://26.26.26.1:8000/chartmix.css'\r\n]\r\n\r\n// Initialize the chart component\r\nfunction chart(data, isDemo) {\r\n    loadLinks(dependLinks);\r\n\r\n    seriesLoadScripts(dependScripts, null, function () {\r\n        const store = new Vuex.Store()\r\n        console.info('chartmix::', chartmix.default)\r\n\r\n        Vue.use(chartmix.default, { store })\r\n        let outDom = document.getElementsByTagName('body')[0]\r\n        chartmix.default.initChart(outDom, chartInfo.lang)\r\n\r\n        $('.chartSetting').css({\r\n            top: '1px',\r\n            bottom: '1px',\r\n            position: 'absolute',\r\n            right: '0px',\r\n            width: '350px',\r\n            background: '#fff',\r\n\r\n            border: '1px solid #E5E5E5',\r\n            'z-index': 1004,\r\n            'box-shadow': '0px 2px 4px rgba(0,0,0,0.2)',\r\n            '-webkit-box-shadow': '0px 2px 4px rgba(0,0,0,0.2)',\r\n            '-moz-box-shadow': '0px 2px 4px rgba(0,0,0,0.2)',\r\n            '-moz-user-select': 'none',\r\n            '-khtml-user-select': 'none',\r\n            '-webkit-user-select': 'none',\r\n            '-ms-user-select': 'none',\r\n            'user-select': 'none',\r\n            'padding-left': '30px',\r\n            display: 'none'\r\n        })\r\n\r\n\r\n        chartInfo.createChart = chartmix.default.createChart\r\n        chartInfo.highlightChart = chartmix.default.highlightChart\r\n        chartInfo.deleteChart = chartmix.default.deleteChart\r\n        chartInfo.resizeChart = chartmix.default.resizeChart\r\n        chartInfo.changeChartRange = chartmix.default.changeChartRange\r\n        chartInfo.changeChartCellData = chartmix.default.changeChartCellData\r\n        chartInfo.getChartJson = chartmix.default.getChartJson\r\n        chartInfo.chart_selection = chart_selection()\r\n        chartInfo.chartparam.jfrefreshchartall = jfrefreshchartall\r\n        chartInfo.chartparam.changeChartCellData = chartmix.default.changeChartCellData\r\n        chartInfo.chartparam.renderChart = chartmix.default.renderChart\r\n        chartInfo.chartparam.getChartJson = chartmix.default.getChartJson\r\n        chartInfo.chartparam.insertToStore = chartmix.default.insertToStore\r\n\r\n        // Initialize the rendering chart\r\n        for (let i = 0; i < data.length; i++) {\r\n            // if (data[i].status == '1') {\r\n                renderCharts(data[i].chart, isDemo)\r\n            // }\r\n        }\r\n\r\n        for (let i = 0; i < data.length; i++) {\r\n            if (data[i].status == '1') {\r\n                renderChartShow(data[i].index)\r\n            }\r\n        }\r\n\r\n        // After the chart is loaded, mark it\r\n        arrayRemoveItem(chartInfo.asyncLoad,'chart');\r\n\r\n    });\r\n}\r\n\r\n// rendercharts\r\nfunction renderCharts(chartLists, isDemo) {\r\n\r\n    // no chart\r\n    if(chartLists == undefined){\r\n        return;\r\n    }\r\n\r\n    for (let i = 0; i < chartLists.length; i++) {\r\n        let chart = chartLists[i]\r\n\r\n        if (isDemo) {\r\n            chartInfo.chartparam.insertToStore({ chart_id: chart.chart_id, chartOptions: chart.chartOptions })\r\n        }\r\n\r\n        let chart_id = chart.chart_id\r\n        let chart_id_c = chart_id + '_c'\r\n        let modelChartShowHTML =\r\n            '<div id=\"${id}\"class=\"luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}\"tabindex=\"0\"role=\"dialog\"aria-labelledby=\":41e\"dir=\"ltr\"><div class=\"luckysheet-modal-dialog-resize\"><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\"data-type=\"lt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\"data-type=\"mt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\"data-type=\"lm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\"data-type=\"rm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\"data-type=\"rt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\"data-type=\"lb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\"data-type=\"mb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\"data-type=\"rb\"></div></div><div class=\"luckysheet-modal-dialog-controll\"><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-update\"role=\"button\"tabindex=\"0\"aria-label=\"\u4FEE\u6539\u56FE\u8868\"title=\"\u4FEE\u6539\u56FE\u8868\"><i class=\"fa fa-pencil\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-max\"role=\"butluckysheet_chartIns_indexton\"tabindex=\"0\"aria-label=\"\u6700\u5927\u5316\"title=\"\u6700\u5927\u5316\"><i class=\"fa fa-window-maximize\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\"role=\"button\"tabindex=\"0\"aria-label=\"\u5220\u9664\"title=\"\u5220\u9664\"><i class=\"fa fa-trash\"aria-hidden=\"true\"></i></span></div><div class=\"luckysheet-modal-dialog-content\">${content}</div></div>'\r\n\r\n        let $t = $(\r\n            replaceHtml(modelChartShowHTML, {\r\n                id: chart_id_c,\r\n                addclass: 'luckysheet-data-visualization-chart',\r\n                title: '\u56FE\u8868\u751F\u6210',\r\n                content: ''\r\n            })\r\n        ).appendTo($('.luckysheet-cell-main'))\r\n\r\n        setChartMoveableEffect($t);\r\n\r\n        $(`#${chart_id_c}`).children('.luckysheet-modal-dialog-content')[0].id = chart_id\r\n\r\n        let container = document.getElementById(chart_id_c)\r\n\r\n\r\n        let chart_json\r\n        chart_json = chartInfo.chartparam.getChartJson(chart.chart_id)\r\n\r\n        chartInfo.chartparam.renderChart({ chart_id: chart.chart_id, chartOptions: chart_json })\r\n        chartInfo.currentChart = chart_json\r\n\r\n        //\u5904\u7406\u533A\u57DF\u9AD8\u4EAE\u6846\u53C2\u6570\uFF0C\u5F53\u524D\u9875\u4E2D\uFF0C\u53EA\u6709\u5F53\u524D\u7684\u56FE\u8868\u7684needRangShow\u4E3Atrue,\u5176\u4ED6\u4E3Afalse\r\n        showNeedRangeShow(chart_id);\r\n\r\n        // delete current chart\r\n        $(`#${chart_id}_c .luckysheet-modal-controll-del`).click(function (e) {\r\n            delChart(chart_id)\r\n        })\r\n\r\n        // edit current chart\r\n        $(`#${chart_id}_c .luckysheet-modal-controll-update`).click(function (e) {\r\n            showChartSettingComponent()\r\n        })\r\n\r\n        $t.children('.luckysheet-modal-dialog-content').mousedown(function (e) {\r\n            if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n                //\u5F53\u524D\u56FE\u8868\u663E\u793A\u533A\u57DF\u9AD8\u4EAE\r\n                showNeedRangeShow(chart_id);\r\n            }\r\n            e.stopPropagation()\r\n        })\r\n        $t.mousedown(function (e) {  // move chart\r\n\r\n                if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n                    //\u5F53\u524D\u56FE\u8868\u663E\u793A\u533A\u57DF\u9AD8\u4EAE\r\n                    showNeedRangeShow(chart_id);\r\n                    setluckysheet_scroll_status(true);\r\n\r\n                    //\u5141\u8BB8\u62D6\u52A8\u6E32\u67D3\u6846\r\n                    if (\r\n                        !$(e.target).is(\".luckysheet-modal-dialog-controll\") &&\r\n                        !$(e.target).is(\".luckysheet-modal-controll-btn\") &&\r\n                        !$(e.target).is(\"i\")\r\n                    ) {\r\n                        // Debounce\r\n                        chartInfo.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout(\r\n                            function () {\r\n                                chartInfo.chartparam.luckysheetCurrentChartMove = true;\r\n                            },\r\n                            100\r\n                        );\r\n                    }\r\n\r\n                    var toffset = chartInfo.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n                    var tpsition = chartInfo.chartparam.luckysheetCurrentChartMoveObj.position();\r\n                    //luckysheetCurrentChartMoveXy: [\u9F20\u6807\u70B9\u76F8\u5BF9chart\u6846\u7684\u8DDD\u79BBX\u65B9\u5411\uFF0C\u9F20\u6807\u70B9\u76F8\u5BF9chart\u6846\u7684\u8DDD\u79BBY\u65B9\u5411\uFF0Cchart\u6846\u76F8\u5BF9cell-main\u7684\u8DDD\u79BBX\u65B9\u5411\uFF0Cchart\u6846\u76F8\u5BF9cell-main\u7684\u8DDD\u79BBY\u65B9\u5411\uFF0C\u6C34\u5E73\u6EDA\u52A8\u6761\u7684\u4F4D\u7F6E\uFF0C\u5782\u76F4\u6EDA\u52A8\u6761\u7684\u4F4D\u7F6E]\r\n                    chartInfo.chartparam.luckysheetCurrentChartMoveXy = [\r\n                        e.pageX - toffset.left,\r\n                        e.pageY - toffset.top,\r\n                        tpsition.left,\r\n                        tpsition.top,\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop()\r\n                    ];\r\n                    chartInfo.chartparam.luckysheetCurrentChartMoveWinH = $(\r\n                        \"#luckysheet-cell-main\"\r\n                    )[0].scrollHeight;\r\n                    chartInfo.chartparam.luckysheetCurrentChartMoveWinW = $(\r\n                        \"#luckysheet-cell-main\"\r\n                    )[0].scrollWidth;\r\n\r\n                    if (\r\n                        !$(e.target).hasClass(\"luckysheet-mousedown-cancel\") &&\r\n                        $(e.target).filter(\"[class*='sp-palette']\").length == 0 &&\r\n                        $(e.target).filter(\"[class*='sp-thumb']\").length == 0 &&\r\n                        $(e.target).filter(\"[class*='sp-']\").length == 0\r\n                    ) {\r\n                        $(\"#luckysheet-rightclick-menu\").hide();\r\n                        $(\"#luckysheet-cols-h-hover\").hide();\r\n                        $(\"#luckysheet-cols-menu-btn\").hide();\r\n                        $(\"#luckysheet-rightclick-menu\").hide();\r\n                        $(\r\n                            \"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\"\r\n                        ).hide();\r\n                        $(\r\n                            \"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\"\r\n                        ).hide();\r\n\r\n                    }\r\n\r\n                    e.stopPropagation();\r\n\r\n                }\r\n\r\n            }).find(\".luckysheet-modal-dialog-resize-item\")\r\n            .mousedown(function (e) {\r\n                if (chartInfo.chartparam.luckysheetCurrentChartActive) {\r\n                    chartInfo.chartparam.luckysheetCurrentChartResize = $(this).data(\"type\"); //\u5F00\u59CB\u72B6\u6001resize\r\n\r\n                    var mouse = mouseposition(e.pageX, e.pageY),\r\n                        scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                    var x = mouse[0] + scrollLeft;\r\n                    var y = mouse[1] + scrollTop;\r\n                    var position = chartInfo.chartparam.luckysheetCurrentChartResizeObj.position();\r\n                    //\u53C2\u6570\uFF1Ax,y:\u9F20\u6807\u4F4D\u7F6E\uFF0C$t.width(), $t.height(): chart\u6846\u5BBD\u9AD8\uFF0C position.left + scrollLeft, position.top + scrollTop \uFF1Achart\u6846\u4F4D\u7F6E \uFF0CscrollLeft, scrollTop\uFF1A\u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeXy = [\r\n                        x,\r\n                        y,\r\n                        $t.width(),\r\n                        $t.height(),\r\n                        position.left + scrollLeft,\r\n                        position.top + scrollTop,\r\n                        scrollLeft,\r\n                        scrollTop\r\n                    ];\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeWinH = $(\r\n                        \"#luckysheet-cell-main\"\r\n                    )[0].scrollHeight;\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeWinW = $(\r\n                        \"#luckysheet-cell-main\"\r\n                    )[0].scrollWidth;\r\n\r\n                    chartInfo.chartparam.luckysheetCurrentChart = chart_id;\r\n\r\n                    e.stopPropagation();\r\n\r\n                }\r\n            })\r\n\r\n\r\n        let width = chart.width\r\n        let height = chart.height\r\n        let left = chart.left\r\n        let top = chart.top\r\n        container.style.width = width + 'px'\r\n        container.style.height = height + 'px'\r\n        container.style.position = 'absolute'\r\n        container.style.background = '#fff'\r\n        container.style.left = left + 'px'\r\n        container.style.top = top + 'px'\r\n        container.style.zIndex = chartInfo.zIndex ? chartInfo.zIndex : 15\r\n        chartInfo.zIndex++\r\n\r\n    }\r\n}\r\n\r\nfunction jfrefreshchartall(flowdata1, r_st, r_ed, c_st, c_ed) {\r\n    let chart = chartInfo.currentChart\r\n    if (!chart) {\r\n        return\r\n    }\r\n    if (chart.rangeArray.length == 1) {\r\n        var row = chart.rangeArray[0].row;\r\n        var column = chart.rangeArray[0].column;\r\n        //\u4E0D\u5728\u8303\u56F4\u5185\u7684\u4E0D\u66F4\u65B0\r\n        if (\r\n            r_st > row[1] ||\r\n            r_ed < row[0] ||\r\n            c_st > column[1] ||\r\n            c_ed < column[0]\r\n        ) {\r\n            return\r\n        }\r\n        //\u6839\u636E\u539F\u6709\u7684\u8303\u56F4\u53D6\u5F97\u6570\u636E\r\n        var luckysheetgetcellrange = formula.getcellrange(\r\n            chart.rangeTxt\r\n        );\r\n        var sheetIndex =\r\n            luckysheetgetcellrange.sheetIndex == -1\r\n                ? 0\r\n                : luckysheetgetcellrange.sheetIndex; //sheetIndex\u4E3A-1\u65F6\uFF0C\u8F6C\u5316\u4E3A0\r\n\r\n        var selection = {\r\n            row: luckysheetgetcellrange.row,\r\n            column: luckysheetgetcellrange.column,\r\n            dataSheetIndex: sheetIndex\r\n        }; //\u6570\u7EC4\r\n        var getcelldata = luckysheet_getcelldata(chart.rangeTxt);\r\n\r\n        if (\r\n            typeof getcelldata === \"object\" &&\r\n            getcelldata.length != 0 &&\r\n            getcelldata.data.length != null\r\n        ) {\r\n            //getcelldata\u6709\u503C\uFF0C\u4E14\u4E0D\u4E3A\u7A7A\u6570\u7EC4 && getcelldata.data\u4E3A\u4E8C\u7EF4\u6570\u7EC4\r\n            var chartData = getcelldata.data;\r\n            chartInfo.chartparam.changeChartCellData(chart.chart_id, chartData);\r\n        }\r\n    }\r\n}\r\n\r\nfunction chart_selection() {\r\n    return {\r\n        create: function () {\r\n            var chart_json = chartInfo.currentChart\r\n\r\n            if (chart_json.rangeArray.length > 1) {\r\n                return\r\n            }\r\n\r\n            $('#luckysheet-chart-rangeShow').empty()\r\n            $('#luckysheet-cell-selected-boxs').hide()\r\n            $('#luckysheet-cell-selected-focus').hide()\r\n            $('#luckysheet-rows-h-selected').empty()\r\n            $('#luckysheet-cols-h-selected').empty()\r\n            $('#luckysheet-row-count-show').hide()\r\n            $('#luckysheet-column-count-show').hide()\r\n\r\n            var st_r = chart_json.rangeArray[0].row[0]\r\n            var st_c = chart_json.rangeArray[0].column[0]\r\n\r\n            var rangeSplitArray = chart_json.rangeSplitArray\r\n\r\n            //\u9996\u884C\u662F\u5426\u6807\u9898\r\n            var rangeRowCheck = chart_json.rangeRowCheck\r\n\r\n            if (rangeRowCheck.exits) {\r\n                var chart_rowtitle_html = getRangeShowHtml(\r\n                    'rowtitle',\r\n                    rangeSplitArray.rowtitle.row[0] + st_r,\r\n                    rangeSplitArray.rowtitle.row[1] + st_r,\r\n                    rangeSplitArray.rowtitle.column[0] + st_c,\r\n                    rangeSplitArray.rowtitle.column[1] + st_c\r\n                )\r\n            } else {\r\n                var chart_rowtitle_html = ''\r\n            }\r\n\r\n            //\u9996\u5217\u662F\u5426\u6807\u9898\r\n            var rangeColCheck = chart_json.rangeColCheck\r\n\r\n            if (rangeColCheck.exits) {\r\n                var chart_coltitle_html = getRangeShowHtml(\r\n                    'coltitle',\r\n                    rangeSplitArray.coltitle.row[0] + st_r,\r\n                    rangeSplitArray.coltitle.row[1] + st_r,\r\n                    rangeSplitArray.coltitle.column[0] + st_c,\r\n                    rangeSplitArray.coltitle.column[1] + st_c\r\n                )\r\n            } else {\r\n                var chart_coltitle_html = ''\r\n            }\r\n\r\n            //\u5185\u5BB9\u5757\r\n            var chart_content_html = getRangeShowHtml(\r\n                'content',\r\n                rangeSplitArray.content.row[0] + st_r,\r\n                rangeSplitArray.content.row[1] + st_r,\r\n                rangeSplitArray.content.column[0] + st_c,\r\n                rangeSplitArray.content.column[1] + st_c\r\n            )\r\n\r\n            $('#luckysheet-chart-rangeShow').append(\r\n                chart_rowtitle_html + chart_coltitle_html + chart_content_html\r\n            )\r\n\r\n            function getRangeShowHtml(type, r1, r2, c1, c2) {\r\n                var visibledatarow = getvisibledatarow()\r\n                var visibledatacolumn = getvisibledatacolumn()\r\n\r\n                var row = visibledatarow[r2],\r\n                    row_pre = r1 - 1 == -1 ? 0 : visibledatarow[r1 - 1]\r\n                var col = visibledatacolumn[c2],\r\n                    col_pre = c1 - 1 == -1 ? 0 : visibledatacolumn[c1 - 1]\r\n\r\n                if (type == 'rowtitle') {\r\n                    var color = '#C65151'\r\n                }\r\n\r\n                if (type == 'coltitle') {\r\n                    var color = '#9667C0'\r\n                }\r\n\r\n                if (type == 'content') {\r\n                    var color = '#4970D1'\r\n                }\r\n\r\n                var html =\r\n                    '<div id=\"luckysheet-chart-rangeShow-' +\r\n                    type +\r\n                    '\" style=\"left: ' +\r\n                    col_pre +\r\n                    'px;width: ' +\r\n                    (col - col_pre - 1) +\r\n                    'px;top: ' +\r\n                    row_pre +\r\n                    'px;height: ' +\r\n                    (row - row_pre - 1) +\r\n                    'px;border: none;margin: 0;position: absolute;z-index: 14;\">' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"top\" style=\"height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: 0;right: 0;top: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"right\" style=\"width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;bottom: 0;right: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"bottom\" style=\"height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: 0;right: 0;bottom: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"left\" style=\"width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;bottom: 0;left: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div style=\"border: 2px solid #85c0fc;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 15;opacity: 0.1;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"lt\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: -3px;top: -3px;z-index: 19;cursor: se-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"rt\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;right: -3px;top: -3px;z-index: 19;cursor: ne-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"lb\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: -3px;bottom: -3px;z-index: 19;cursor: ne-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"rb\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;right: -3px;bottom: -3px;z-index: 19;cursor: se-resize;\"></div>' +\r\n                    '</div>'\r\n\r\n                return html\r\n            }\r\n        },\r\n        rangeMove: false,\r\n        rangeMovexy: null,\r\n        rangeMoveIndex: null,\r\n        rangeMoveObj: null,\r\n        rangeMoveDraging: function (event, sheetBarHeight, statisticBarHeight) {\r\n            var chart_json = chartInfo.currentChart\r\n            var st_r = chart_json.rangeArray[0].row[0]\r\n            var st_c = chart_json.rangeArray[0].column[0]\r\n            var rangeRowCheck = chart_json.rangeRowCheck\r\n            var rangeColCheck = chart_json.rangeColCheck\r\n            var rangeSplitArray = chart_json.rangeSplitArray\r\n\r\n            var mouse = mouseposition(event.pageX, event.pageY)\r\n            var scrollLeft = $('#luckysheet-cell-main').scrollLeft()\r\n            var scrollTop = $('#luckysheet-cell-main').scrollTop()\r\n\r\n            var x = mouse[0] + scrollLeft\r\n            var y = mouse[1] + scrollTop\r\n\r\n            var winH =\r\n                $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft\r\n\r\n            var rowLocation = _rowLocation(y),\r\n                row_index = rowLocation[2]\r\n            var colLocation = _colLocation(x),\r\n                col_index = colLocation[2]\r\n\r\n            var visibledatarow = getvisibledatarow()\r\n            var visibledatacolumn = getvisibledatacolumn()\r\n\r\n            var $id = chartInfo.chart_selection.rangeMoveObj.attr('id')\r\n\r\n            if ($id == 'luckysheet-chart-rangeShow-content') {\r\n                //\u884C\r\n                var row_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[0] -\r\n                    chartInfo.chart_selection.rangeMovexy[0] +\r\n                    row_index\r\n\r\n                if (rangeRowCheck.exits) {\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1\r\n                    }\r\n                } else {\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0\r\n                    }\r\n                }\r\n\r\n                var row_e =\r\n                    rangeSplitArray.content.row[1] - rangeSplitArray.content.row[0] + row_s\r\n\r\n                if (row_e >= visibledatarow.length - 1 || y > winH) {\r\n                    row_s =\r\n                        visibledatarow.length -\r\n                        1 -\r\n                        rangeSplitArray.content.row[1] +\r\n                        rangeSplitArray.content.row[0]\r\n                    row_e = visibledatarow.length - 1\r\n                }\r\n\r\n                //\u5217\r\n                var col_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[1] -\r\n                    chartInfo.chart_selection.rangeMovexy[1] +\r\n                    col_index\r\n                if (rangeColCheck.exits) {\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1\r\n                    }\r\n                } else {\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0\r\n                    }\r\n                }\r\n\r\n                var col_e =\r\n                    rangeSplitArray.content.column[1] -\r\n                    rangeSplitArray.content.column[0] +\r\n                    col_s\r\n\r\n                if (col_e >= visibledatacolumn.length - 1 || x > winW) {\r\n                    col_s =\r\n                        visibledatacolumn.length -\r\n                        1 -\r\n                        rangeSplitArray.content.column[1] +\r\n                        rangeSplitArray.content.column[0]\r\n                    col_e = visibledatacolumn.length - 1\r\n                }\r\n\r\n                //\u66F4\u65B0\r\n                if (rangeRowCheck.exits && rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [st_r, row_e], column: [st_c, col_e] }]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: [st_c, col_e]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: [col_s - st_c, col_e - st_c]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [col_s - st_c, col_e - st_c]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column\r\n                    }\r\n                } else if (rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [st_r, row_e], column: [col_s, col_e] }]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: [col_s, col_e]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column\r\n                    }\r\n                } else if (rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [row_s, row_e], column: [st_c, col_e] }]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: [st_c, col_e]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [col_s - st_c, col_e - st_c]\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: [row_s, row_e], column: [col_s, col_e] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: [col_s, col_e]\r\n                    }\r\n                }\r\n            } else if ($id == 'luckysheet-chart-rangeShow-rowtitle') {\r\n                //\u5217\r\n                var col_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[1] -\r\n                    chartInfo.chart_selection.rangeMovexy[1] +\r\n                    col_index\r\n\r\n                if (rangeColCheck.exits) {\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1\r\n                    }\r\n                } else {\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0\r\n                    }\r\n                }\r\n\r\n                var col_e =\r\n                    rangeSplitArray.rowtitle.column[1] -\r\n                    rangeSplitArray.rowtitle.column[0] +\r\n                    col_s\r\n\r\n                if (col_e >= visibledatacolumn.length - 1 || x > winW) {\r\n                    col_s =\r\n                        visibledatacolumn.length -\r\n                        1 -\r\n                        rangeSplitArray.rowtitle.column[1] +\r\n                        rangeSplitArray.rowtitle.column[0]\r\n                    col_e = visibledatacolumn.length - 1\r\n                }\r\n\r\n                //\u66F4\u65B0\r\n                if (rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [\r\n                        { row: chart_json.rangeArray[0].row, column: [st_c, col_e] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [st_c, col_e]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [col_s - st_c, col_e - st_c]\r\n                    }\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [col_s - st_c, col_e - st_c]\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: chart_json.rangeArray[0].row, column: [col_s, col_e] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [col_s, col_e]\r\n                    }\r\n                }\r\n            } else if ($id == 'luckysheet-chart-rangeShow-coltitle') {\r\n                //\u884C\r\n                var row_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[0] -\r\n                    chartInfo.chart_selection.rangeMovexy[0] +\r\n                    row_index\r\n                if (rangeRowCheck.exits) {\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1\r\n                    }\r\n                } else {\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0\r\n                    }\r\n                }\r\n\r\n                //\u66F4\u65B0\r\n                var row_e =\r\n                    rangeSplitArray.coltitle.row[1] -\r\n                    rangeSplitArray.coltitle.row[0] +\r\n                    row_s\r\n\r\n                if (row_e >= visibledatarow.length - 1 || y > winH) {\r\n                    row_s =\r\n                        visibledatarow.length -\r\n                        1 -\r\n                        rangeSplitArray.coltitle.row[1] +\r\n                        rangeSplitArray.coltitle.row[0]\r\n                    row_e = visibledatarow.length - 1\r\n                }\r\n\r\n                if (rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [\r\n                        { row: [st_r, row_e], column: chart_json.rangeArray[0].column }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: chart_json.rangeArray[0].column\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column\r\n                    }\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: [row_s, row_e], column: chart_json.rangeArray[0].column }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: chart_json.rangeArray[0].column\r\n                    }\r\n                }\r\n            }\r\n\r\n            chartInfo.chart_selection.create()\r\n        },\r\n        rangeMoveDragged: function () {\r\n            chartInfo.chart_selection.rangeMove = false\r\n\r\n            var updateJson = chartInfo.currentChart\r\n\r\n            updateJson.rangeTxt = getRangetxt(\r\n                chartInfo.currentSheetIndex,\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex\r\n            )\r\n            updateJson.chartData = getdatabyselection(\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex\r\n            )\r\n            // \u6E32\u67D3\r\n            chartInfo.changeChartRange(updateJson.chart_id, updateJson.chartData, updateJson.rangeArray, updateJson.rangeTxt)\r\n        },\r\n        rangeResize: false,\r\n        rangeResizexy: null,\r\n        rangeResizeIndex: null,\r\n        rangeResizeObj: null,\r\n        rangeResizeDraging: function (event, sheetBarHeight, statisticBarHeight) {\r\n            var chart_json = chartInfo.currentChart\r\n\r\n            var st_r = chart_json.rangeArray[0].row[0]\r\n            var st_c = chart_json.rangeArray[0].column[0]\r\n            var rangeRowCheck = chart_json.rangeRowCheck\r\n            var rangeColCheck = chart_json.rangeColCheck\r\n            var rangeSplitArray = chart_json.rangeSplitArray\r\n\r\n            var mouse = mouseposition(event.pageX, event.pageY)\r\n            var scrollLeft = $('#luckysheet-cell-main').scrollLeft()\r\n            var scrollTop = $('#luckysheet-cell-main').scrollTop()\r\n\r\n            var x = mouse[0] + scrollLeft\r\n            var y = mouse[1] + scrollTop\r\n\r\n            var winH =\r\n                $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft\r\n\r\n            var rowLocation = _rowLocation(y),\r\n                row_index = rowLocation[2]\r\n            var colLocation = _colLocation(x),\r\n                col_index = colLocation[2]\r\n\r\n            var visibledatarow = getvisibledatarow()\r\n            var visibledatacolumn = getvisibledatacolumn()\r\n\r\n            var $id = chartInfo.chart_selection.rangeResizeObj.attr('id')\r\n\r\n            if ($id == 'luckysheet-chart-rangeShow-content') {\r\n                var r1, r2, c1, c2\r\n\r\n                if (chartInfo.chart_selection.rangeResize == 'lt') {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n                } else if (chartInfo.chart_selection.rangeResize == 'lb') {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n                } else if (chartInfo.chart_selection.rangeResize == 'rt') {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n                } else if (chartInfo.chart_selection.rangeResize == 'rb') {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n                }\r\n\r\n                //\u884C\r\n                if (rangeRowCheck.exits) {\r\n                    var row_s = r1 - chartInfo.chart_selection.rangeResizexy[0] + row_index\r\n\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1\r\n                    }\r\n                } else {\r\n                    var row_s = st_r - chartInfo.chart_selection.rangeResizexy[0] + row_index\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1\r\n                    }\r\n                }\r\n\r\n                //\u5217\r\n                if (rangeColCheck.exits) {\r\n                    var col_s = c1 - chartInfo.chart_selection.rangeResizexy[1] + col_index\r\n\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1\r\n                    }\r\n                } else {\r\n                    var col_s = st_c - chartInfo.chart_selection.rangeResizexy[1] + col_index\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1\r\n                    }\r\n                }\r\n\r\n                var obj_r1, obj_r2, obj_c1, obj_c2\r\n\r\n                if (row_s > r2) {\r\n                    obj_r1 = r2\r\n                    obj_r2 = row_s\r\n                } else {\r\n                    obj_r1 = row_s\r\n                    obj_r2 = r2\r\n                }\r\n\r\n                if (col_s > c2) {\r\n                    obj_c1 = c2\r\n                    obj_c2 = col_s\r\n                } else {\r\n                    obj_c1 = col_s\r\n                    obj_c2 = c2\r\n                }\r\n\r\n                if (!rangeRowCheck.exits && !rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [\r\n                        { row: [obj_r1, obj_r2], column: [obj_c1, obj_c2] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [obj_r1, obj_r2],\r\n                        column: [obj_c1, obj_c2]\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: [st_r, obj_r2], column: [st_c, obj_c2] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, obj_r2],\r\n                        column: [st_c, obj_c2]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c]\r\n                    }\r\n\r\n                    if (rangeRowCheck.exits) {\r\n                        chart_json.rangeSplitArray.rowtitle = {\r\n                            row: chart_json.rangeSplitArray.rowtitle.row,\r\n                            column: [obj_c1 - st_c, obj_c2 - st_c]\r\n                        }\r\n                    }\r\n\r\n                    if (rangeColCheck.exits) {\r\n                        chart_json.rangeSplitArray.coltitle = {\r\n                            row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                            column: chart_json.rangeSplitArray.coltitle.column\r\n                        }\r\n                    }\r\n                }\r\n            } else if ($id == 'luckysheet-chart-rangeShow-rowtitle') {\r\n                var c1, c2\r\n\r\n                if (\r\n                    chartInfo.chart_selection.rangeResize == 'lt' ||\r\n                    chartInfo.chart_selection.rangeResize == 'lb'\r\n                ) {\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n                } else if (\r\n                    chartInfo.chart_selection.rangeResize == 'rt' ||\r\n                    chartInfo.chart_selection.rangeResize == 'rb'\r\n                ) {\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1]\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0]\r\n                }\r\n\r\n                //\u5217\r\n                if (rangeColCheck.exits) {\r\n                    var col_s = c1 - chartInfo.chart_selection.rangeResizexy[1] + col_index\r\n\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1\r\n                    }\r\n                } else {\r\n                    var col_s = st_c - chartInfo.chart_selection.rangeResizexy[1] + col_index\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1\r\n                    }\r\n                }\r\n\r\n                var obj_c1, obj_c2\r\n\r\n                if (col_s > c2) {\r\n                    obj_c1 = c2\r\n                    obj_c2 = col_s\r\n                } else {\r\n                    obj_c1 = col_s\r\n                    obj_c2 = c2\r\n                }\r\n\r\n                //\u66F4\u65B0\r\n                if (!rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [\r\n                        { row: chart_json.rangeArray[0].row, column: [obj_c1, obj_c2] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [obj_c1, obj_c2]\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: chart_json.rangeArray[0].row, column: [st_c, obj_c2] }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [st_c, obj_c2]\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c]\r\n                    }\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c]\r\n                    }\r\n                }\r\n            } else if ($id == 'luckysheet-chart-rangeShow-coltitle') {\r\n                var r1, r2\r\n\r\n                if (\r\n                    chartInfo.chart_selection.rangeResize == 'lt' ||\r\n                    chartInfo.chart_selection.rangeResize == 'rt'\r\n                ) {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                } else if (\r\n                    chartInfo.chart_selection.rangeResize == 'lb' ||\r\n                    chartInfo.chart_selection.rangeResize == 'rb'\r\n                ) {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1]\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0]\r\n                }\r\n\r\n                //\u884C\r\n                if (rangeRowCheck.exits) {\r\n                    var row_s = r1 - chartInfo.chart_selection.rangeResizexy[0] + row_index\r\n\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1\r\n                    }\r\n                } else {\r\n                    var row_s = st_r - chartInfo.chart_selection.rangeResizexy[0] + row_index\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1\r\n                    }\r\n                }\r\n\r\n                var obj_r1, obj_r2\r\n\r\n                if (row_s > r2) {\r\n                    obj_r1 = r2\r\n                    obj_r2 = row_s\r\n                } else {\r\n                    obj_r1 = row_s\r\n                    obj_r2 = r2\r\n                }\r\n\r\n                //\u66F4\u65B0\r\n                if (!rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [\r\n                        { row: [obj_r1, obj_r2], column: chart_json.rangeArray[0].column }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [obj_r1, obj_r2],\r\n                        column: chart_json.rangeArray[0].column\r\n                    }\r\n                } else {\r\n                    chart_json.rangeArray = [\r\n                        { row: [st_r, obj_r2], column: chart_json.rangeArray[0].column }\r\n                    ]\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, obj_r2],\r\n                        column: chart_json.rangeArray[0].column\r\n                    }\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column\r\n                    }\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column\r\n                    }\r\n                }\r\n            }\r\n\r\n            chartInfo.chart_selection.create()\r\n        },\r\n        rangeResizeDragged: function () {\r\n            chartInfo.chart_selection.rangeResize = null\r\n            var updateJson = chartInfo.currentChart\r\n\r\n            updateJson.rangeTxt = getRangetxt(\r\n                chartInfo.currentSheetIndex,\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex\r\n            )\r\n            updateJson.chartData = getdatabyselection(\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex\r\n            )\r\n            // \u6E32\u67D3\r\n            chartInfo.changeChartRange(updateJson.chart_id, updateJson.chartData, updateJson.rangeArray, updateJson.rangeTxt)\r\n\r\n        }\r\n    }\r\n}\r\n\r\n// create chart\r\nfunction createLuckyChart(width, height, left, top) {\r\n    //\u5982\u679C\u53EA\u9009\u4E2D\u4E00\u4E2A\u5355\u5143\u683C\uFF0C\u5219\u81EA\u52A8\u586B\u5145\u9009\u53D6\r\n    var jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n    if (\r\n        jfgird_select_save.length == 1 &&\r\n        jfgird_select_save[0].row[0] == jfgird_select_save[0].row[1] &&\r\n        jfgird_select_save[0].column[0] == jfgird_select_save[0].column[1]\r\n    ) {\r\n        luckysheetMoveHighlightRange2(\"right\", \"rangeOfSelect\");\r\n\r\n        luckysheetMoveHighlightRange2(\"down\", \"rangeOfSelect\");\r\n\r\n        jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n    }\r\n    //\u5904\u7406\u53F3\u8FB9\u7684\u7A7A\u767D\u5355\u5143\u683C\uFF0C\u81EA\u52A8\u7565\u8FC7\u5E76\u4FEE\u6539\u9009\u533A ---------------start\r\n    var shiftpositon_row = -1;\r\n\r\n    var row_ed =\r\n        jfgird_select_save[0][\"row\"][1] - jfgird_select_save[0][\"row\"][0];\r\n    for (\r\n        var r = jfgird_select_save[0][\"row\"][0];\r\n        r <= jfgird_select_save[0][\"row\"][1];\r\n        r++\r\n    ) {\r\n        for (\r\n            var c = jfgird_select_save[0][\"column\"][0];\r\n            c <= jfgird_select_save[0][\"column\"][1];\r\n            c++\r\n        ) {\r\n            var value = getcellvalue(r, c, luckysheet.flowdata());\r\n            //console.log(\"value,r,c\",value,r,c);\r\n            if (value != null && value.toString().length > 0) {\r\n                shiftpositon_row = r;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (shiftpositon_row !== -1) {\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (shiftpositon_row == -1) {\r\n        shiftpositon_row = 0;\r\n    }\r\n\r\n    jfgird_select_save[0][\"row\"] = [shiftpositon_row, shiftpositon_row];\r\n    jfgird_select_save[0].row_focus =shiftpositon_row;\r\n    luckysheet.setluckysheet_select_save(jfgird_select_save);\r\n\r\n    chartInfo.luckysheet_shiftpositon = $.extend(true, {}, jfgird_select_save[0]);\r\n    luckysheetMoveEndCell(\"down\", \"range\", false, row_ed);\r\n    jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n\r\n    var shiftpositon_col = -1;\r\n    var column_ed =\r\n        jfgird_select_save[0][\"column\"][1] - jfgird_select_save[0][\"column\"][0];\r\n    for (\r\n        var c = jfgird_select_save[0][\"column\"][0];\r\n        c <= jfgird_select_save[0][\"column\"][1];\r\n        c++\r\n    ) {\r\n        for (\r\n            var r = jfgird_select_save[0][\"row\"][0];\r\n            r <= jfgird_select_save[0][\"row\"][1];\r\n            r++\r\n        ) {\r\n            var value = getcellvalue(r, c, luckysheet.flowdata());\r\n            if (value != null && value.toString().length > 0) {\r\n                shiftpositon_col = c;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (shiftpositon_col !== -1) {\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (shiftpositon_col == -1) {\r\n        shiftpositon_col = 0;\r\n    }\r\n\r\n    jfgird_select_save[0][\"column\"] = [shiftpositon_col, shiftpositon_col];\r\n    jfgird_select_save[0].column_focus = shiftpositon_col;\r\n    luckysheet.setluckysheet_select_save(jfgird_select_save);\r\n\r\n    chartInfo.luckysheet_shiftpositon = $.extend(true, {}, jfgird_select_save[0]);\r\n    luckysheetMoveEndCell(\"right\", \"range\", false, column_ed);\r\n    jfgird_select_save = luckysheet.getluckysheet_select_save()\r\n\r\n    var rangeArray = $.extend(true, [], jfgird_select_save);\r\n\r\n    var rangeTxt = getRangetxt(chartInfo.currentSheetIndex, rangeArray[0], chartInfo.currentSheetIndex)\r\n\r\n\r\n    let chartData = getdatabyselection()\r\n    console.dir(chartData)\r\n\r\n    let chart_id = generateRandomKey('chart')\r\n\r\n    let chart_id_c = chart_id + '_c'\r\n\r\n    let modelChartShowHTML =\r\n        '<div id=\"${id}\"class=\"luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}\"tabindex=\"0\"role=\"dialog\"aria-labelledby=\":41e\"dir=\"ltr\"><div class=\"luckysheet-modal-dialog-resize\"><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\"data-type=\"lt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\"data-type=\"mt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\"data-type=\"lm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\"data-type=\"rm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\"data-type=\"rt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\"data-type=\"lb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\"data-type=\"mb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\"data-type=\"rb\"></div></div><div class=\"luckysheet-modal-dialog-controll\"><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-update\"role=\"button\"tabindex=\"0\"aria-label=\"\u4FEE\u6539\u56FE\u8868\"title=\"\u4FEE\u6539\u56FE\u8868\"><i class=\"fa fa-pencil\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-max\"role=\"butluckysheet_chartIns_indexton\"tabindex=\"0\"aria-label=\"\u6700\u5927\u5316\"title=\"\u6700\u5927\u5316\"><i class=\"fa fa-window-maximize\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\"role=\"button\"tabindex=\"0\"aria-label=\"\u5220\u9664\"title=\"\u5220\u9664\"><i class=\"fa fa-trash\"aria-hidden=\"true\"></i></span></div><div class=\"luckysheet-modal-dialog-content\">${content}</div></div>'\r\n\r\n    let $t = $(\r\n        replaceHtml(modelChartShowHTML, {\r\n            id: chart_id_c,\r\n            addclass: 'luckysheet-data-visualization-chart',\r\n            title: '\u56FE\u8868\u751F\u6210',\r\n            content: ''\r\n        })\r\n    ).appendTo($('.luckysheet-cell-main'))\r\n\r\n    let container = document.getElementById(chart_id_c)\r\n\r\n    let { render, chart_json } = chartInfo.createChart($(`#${chart_id_c}`).children('.luckysheet-modal-dialog-content')[0], chartData, chart_id, rangeArray, rangeTxt)\r\n    // chartInfo.currentChart = chart_json.chartOptions\r\n    console.dir(JSON.stringify(chart_json))\r\n\r\n    width = width ? width : 400\r\n    height = height ? height : 250\r\n    left = left ? left : 0\r\n    top = top ? top : 0\r\n    container.style.width = width + 'px'\r\n    container.style.height = height + 'px'\r\n    container.style.position = 'absolute'\r\n    container.style.background = '#fff'\r\n    container.style.left = left + 'px'\r\n    container.style.top = top + 'px'\r\n    render.style.width = '100%'\r\n    render.style.height = '100%'\r\n    container.style.zIndex = chartInfo.zIndex ? chartInfo.zIndex : 15\r\n    chartInfo.zIndex++\r\n\r\n    // insert chartinfo\r\n    let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)];\r\n\r\n    if (!sheetFile.chart) {\r\n        sheetFile.chart = [];\r\n    }\r\n    sheetFile.chart.push({\r\n        chart_id,\r\n        width,\r\n        height,\r\n        left,\r\n        top,\r\n        sheetIndex: sheetFile.index\r\n    })\r\n\r\n    //\u5904\u7406\u533A\u57DF\u9AD8\u4EAE\u6846\u53C2\u6570\uFF0C\u5F53\u524D\u9875\u4E2D\uFF0C\u53EA\u6709\u5F53\u524D\u7684\u56FE\u8868\u7684needRangShow\u4E3Atrue,\u5176\u4ED6\u4E3Afalse\r\n    showNeedRangeShow(chart_id);\r\n\r\n    // delete current chart\r\n    $(`#${chart_id}_c .luckysheet-modal-controll-del`).click(function (e) {\r\n        delChart(chart_id)\r\n    })\r\n\r\n    setChartMoveableEffect($t);\r\n\r\n    // edit current chart\r\n    $(`#${chart_id}_c .luckysheet-modal-controll-update`).click(function (e) {\r\n        showChartSettingComponent()\r\n    })\r\n\r\n    $t.children('.luckysheet-modal-dialog-content').mousedown(function (e) {\r\n        if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n            //\u5F53\u524D\u56FE\u8868\u663E\u793A\u533A\u57DF\u9AD8\u4EAE\r\n            showNeedRangeShow(chart_id);\r\n        }\r\n        e.stopPropagation()\r\n    })\r\n    $t.mousedown(function (e) {  //move chart\r\n\r\n        if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n            //\u5F53\u524D\u56FE\u8868\u663E\u793A\u533A\u57DF\u9AD8\u4EAE\r\n            showNeedRangeShow(chart_id);\r\n            setluckysheet_scroll_status(true);\r\n\r\n            //\u5141\u8BB8\u62D6\u52A8\u6E32\u67D3\u6846\r\n            if (\r\n                !$(e.target).is(\".luckysheet-modal-dialog-controll\") &&\r\n                !$(e.target).is(\".luckysheet-modal-controll-btn\") &&\r\n                !$(e.target).is(\"i\")\r\n            ) {\r\n                // Debounce\r\n                chartInfo.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout(\r\n                    function () {\r\n                        chartInfo.chartparam.luckysheetCurrentChartMove = true;\r\n                    },\r\n                    100\r\n                );\r\n            }\r\n\r\n            var toffset = chartInfo.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n            var tpsition = chartInfo.chartparam.luckysheetCurrentChartMoveObj.position();\r\n            //luckysheetCurrentChartMoveXy: [\u9F20\u6807\u70B9\u76F8\u5BF9chart\u6846\u7684\u8DDD\u79BBX\u65B9\u5411\uFF0C\u9F20\u6807\u70B9\u76F8\u5BF9chart\u6846\u7684\u8DDD\u79BBY\u65B9\u5411\uFF0Cchart\u6846\u76F8\u5BF9cell-main\u7684\u8DDD\u79BBX\u65B9\u5411\uFF0Cchart\u6846\u76F8\u5BF9cell-main\u7684\u8DDD\u79BBY\u65B9\u5411\uFF0C\u6C34\u5E73\u6EDA\u52A8\u6761\u7684\u4F4D\u7F6E\uFF0C\u5782\u76F4\u6EDA\u52A8\u6761\u7684\u4F4D\u7F6E]\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveXy = [\r\n                e.pageX - toffset.left,\r\n                e.pageY - toffset.top,\r\n                tpsition.left,\r\n                tpsition.top,\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop()\r\n            ];\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveWinH = $(\r\n                \"#luckysheet-cell-main\"\r\n            )[0].scrollHeight;\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveWinW = $(\r\n                \"#luckysheet-cell-main\"\r\n            )[0].scrollWidth;\r\n\r\n            if (\r\n                !$(e.target).hasClass(\"luckysheet-mousedown-cancel\") &&\r\n                $(e.target).filter(\"[class*='sp-palette']\").length == 0 &&\r\n                $(e.target).filter(\"[class*='sp-thumb']\").length == 0 &&\r\n                $(e.target).filter(\"[class*='sp-']\").length == 0\r\n            ) {\r\n                $(\"#luckysheet-rightclick-menu\").hide();\r\n                $(\"#luckysheet-cols-h-hover\").hide();\r\n                $(\"#luckysheet-cols-menu-btn\").hide();\r\n                $(\"#luckysheet-rightclick-menu\").hide();\r\n                $(\r\n                    \"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\"\r\n                ).hide();\r\n                $(\r\n                    \"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\"\r\n                ).hide();\r\n\r\n            }\r\n\r\n            e.stopPropagation();\r\n\r\n        }\r\n\r\n    }).find(\".luckysheet-modal-dialog-resize-item\")\r\n        .mousedown(function (e) {\r\n            if (chartInfo.chartparam.luckysheetCurrentChartActive) {\r\n                chartInfo.chartparam.luckysheetCurrentChartResize = $(this).data(\"type\"); //\u5F00\u59CB\u72B6\u6001resize\r\n\r\n                var mouse = mouseposition(e.pageX, e.pageY),\r\n                    scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                    scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                var x = mouse[0] + scrollLeft;\r\n                var y = mouse[1] + scrollTop;\r\n                var position = chartInfo.chartparam.luckysheetCurrentChartResizeObj.position();\r\n                //\u53C2\u6570\uFF1Ax,y:\u9F20\u6807\u4F4D\u7F6E\uFF0C$t.width(), $t.height(): chart\u6846\u5BBD\u9AD8\uFF0C position.left + scrollLeft, position.top + scrollTop \uFF1Achart\u6846\u4F4D\u7F6E \uFF0CscrollLeft, scrollTop\uFF1A\u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeXy = [\r\n                    x,\r\n                    y,\r\n                    $t.width(),\r\n                    $t.height(),\r\n                    position.left + scrollLeft,\r\n                    position.top + scrollTop,\r\n                    scrollLeft,\r\n                    scrollTop\r\n                ];\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeWinH = $(\r\n                    \"#luckysheet-cell-main\"\r\n                )[0].scrollHeight;\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeWinW = $(\r\n                    \"#luckysheet-cell-main\"\r\n                )[0].scrollWidth;\r\n\r\n                chartInfo.chartparam.luckysheetCurrentChart = chart_id;\r\n\r\n                e.stopPropagation();\r\n\r\n            }\r\n        })\r\n}\r\n\r\n/**\r\n * \u8BBE\u7F6E\u56FE\u8868\u53EF\u62D6\u52A8\u533A\u57DF\u9AD8\u4EAE\u6548\u679C\uFF0C\u9F20\u6807\u7ECF\u8FC7\u53EF\u62D6\u52A8\u533A\u57DF\u65F6\u9F20\u6807\u663E\u793A\u201C\u5341\u5B57\u201D\uFF0C\u4E0D\u53EF\u62D6\u52A8\u533A\u57DF\u663E\u793A\u7BAD\u5934\r\n * @param {JQuery} $container \u56FE\u8868\u7684\u5BB9\u5668DIV\r\n */\r\nfunction setChartMoveableEffect($container) {\r\n  $container.find('.luckysheet-modal-dialog-content').hover(function () {\r\n    $container.removeClass(\"chart-moveable\");\r\n  }, function () {\r\n    $container.addClass(\"chart-moveable\");\r\n  });\r\n\r\n  $container.hover(function () {\r\n    $container.addClass(\"chart-moveable\");\r\n  }, function () {\r\n    $container.removeClass(\"chart-moveable\");\r\n  });\r\n}\r\n\r\n// delete chart\r\nfunction delChart(chart_id) {\r\n    // delete container\r\n    $(`.luckysheet-cell-main #${chart_id}_c`).remove()\r\n\r\n    // Hide selected range\r\n    hideAllNeedRangeShow()\r\n\r\n    // delete storage\r\n    let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)]\r\n    let index = sheetFile.chart.findIndex(item => item.chart_id == chart_id)\r\n    sheetFile.chart.splice(index, 1)\r\n    // api call\r\n    chartInfo.deleteChart(chart_id)\r\n}\r\n\r\n//\u8BBE\u7F6E\u67D0\u4E2A\u56FE\u8868\u7684\u9AD8\u4EAE\u533A\u57DF\u72B6\u6001\u4E3A\u663E\u793A,\u5904\u7406\u5F53\u524D\u9875\u7684\u6240\u6709\u56FE\u8868\uFF0C\u53EA\u53D6\u4E00\u4E2A\u56FE\u8868\u8BBE\u7F6E\u4E3A\u663E\u793A\uFF0C\u5176\u4ED6\u9690\u85CF\uFF0C\u5176\u4ED6\u9875\u4E0D\u7BA1\r\nfunction showNeedRangeShow(chart_id) {\r\n\r\n    let chartLists = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)].chart;\r\n\r\n    for (let chartId in chartLists) {\r\n        // if (chartLists[chartId].sheetIndex == chartInfo.currentSheetIndex) {\r\n        //\u5F53\u524Dsheet\u7684\u56FE\u8868\u5148\u8BBE\u7F6E\u4E3Afalse\r\n        chartLists[chartId].needRangeShow = false\r\n        if (chartLists[chartId].chart_id == chart_id) {\r\n            chartLists[chartId].needRangeShow = true;\r\n\r\n            chartInfo.currentChart = chartInfo.getChartJson(chart_id)\r\n        }\r\n        // }\r\n\r\n    }\r\n\r\n    //\u64CD\u4F5CDOM\u5F53\u524D\u56FE\u8868\u9009\u62E9\u533A\u57DF\u9AD8\u4EAE\r\n    selectRangeBorderShow(chart_id)\r\n}\r\n//\u9690\u85CF\u5F53\u524Dsheet\u6240\u6709\u7684\u56FE\u8868\u9AD8\u4EAE\u533A\u57DF\r\nfunction hideAllNeedRangeShow() {\r\n    let chartLists = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)].chart;\r\n    for (let chartId in chartLists) {\r\n        // if (chartLists[chartId].sheetIndex == chartInfo.currentSheetIndex) {\r\n        //\u5F53\u524Dsheet\u7684\u56FE\u8868\u8BBE\u7F6E\u4E3Afalse\r\n        chartLists[chartId].needRangeShow = false\r\n        // }\r\n\r\n    }\r\n\r\n    //\u64CD\u4F5CDOM \u5F53\u524D\u56FE\u8868\u9009\u62E9\u533A\u57DF\u9690\u85CF\r\n    selectRangeBorderHide()\r\n}\r\n\r\n//\u9009\u62E9\u533A\u57DF\u9AD8\u4EAE\r\nfunction selectRangeBorderShow(chart_id) {\r\n\r\n    let $t = $('#' + chart_id + '_c')\r\n\r\n    // Highlight of data range\r\n    chartInfo.chart_selection.create()\r\n\r\n    chartInfo.chartparam.luckysheetCurrentChartActive = true\r\n    chartInfo.chartparam.luckysheetCurrentChartMoveObj = $t\r\n    chartInfo.chartparam.luckysheetCurrentChartResizeObj = $t\r\n    chartInfo.chartparam.luckysheetCurrentChart = chart_id\r\n\r\n    //luckysheet\u53D6cell-main\uFF0C\u540E\u7EED\u6269\u5C55\u5230\u5176\u4ED6\u7684\u7528\u6237\u81EA\u5B9A\u4E49\u5143\u7D20\r\n    $('#luckysheet-cell-main')\r\n        .find('.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize')\r\n        .hide()\r\n    $('#luckysheet-cell-main')\r\n        .find('.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll')\r\n        .hide()\r\n\r\n    $t.css('z-index', chartInfo.chartparam.luckysheetCurrentChartZIndexRank++)\r\n    $t.find('.luckysheet-modal-dialog-resize').show()\r\n    $t.find('.luckysheet-modal-dialog-controll').show()\r\n\r\n    if (\r\n        ($('.chartSetting').is(':visible') || chartInfo.chartparam.luckysheet_chart_redo_click) &&\r\n        chart_id != chartInfo.chartparam.luckysheetCurrentChart\r\n    ) {\r\n        // TODO: \u7B2C\u4E00\u6B21\u521B\u5EFA\u56FE\u8868\u65F6\u5019\u9700\u8981\u521D\u59CB\u5316\u6570\u636E\u9009\u62E9\u6846 qkSelection\r\n        // generator.ini(chartMixConfig)\r\n        $('body .luckysheet-cols-menu').hide()\r\n    }\r\n\r\n    // \u5207\u6362\u5230\u5F53\u524D\u56FE\u8868\u8BBE\u7F6E\u9879\r\n    chartInfo.currentChart = chartInfo.highlightChart(chart_id)\r\n}\r\n\r\n//\u9009\u62E9\u533A\u57DF\u9AD8\u4EAE\u9690\u85CF\r\nfunction selectRangeBorderHide(settingShow) {\r\n\r\n    $('#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll').hide()\r\n    $('#luckysheet-cell-main').find('.luckysheet-datavisual-selection-set div').remove()\r\n    chartInfo.chartparam.luckysheetCurrentChartActive = false\r\n\r\n    $('#luckysheet-chart-rangeShow').empty()\r\n\r\n    //\u6807\u8BC6\uFF1A\u662F\u5426\u5904\u7406\u8BBE\u7F6E\u754C\u9762\r\n    if (!settingShow && $('.chartSetting').is(':visible') && !isEditMode()) {\r\n        hideChartSettingComponent()\r\n    }\r\n}\r\n\r\n// \u663E\u793A\u56FE\u8868\u8BBE\u7F6E\u754C\u9762\r\nfunction showChartSettingComponent(refresh, chart_id) {\r\n    if (!$('.chartSetting').is(':visible')) {\r\n\r\n        //\u9690\u85CF\u8BBE\u7F6E\u754C\u9762\r\n        $('.chartSetting').show();\r\n\r\n        $('#luckysheet-cell-main').find('.luckysheet-datavisual-selection-set div').show()\r\n        chartInfo.chartparam.luckysheetCurrentChartActive = true\r\n        setTimeout(function () {\r\n            luckysheetsizeauto()\r\n        }, 0)\r\n    }\r\n}\r\n\r\n// \u9690\u85CF\u56FE\u8868\u8BBE\u7F6E\u754C\u9762\r\nfunction hideChartSettingComponent(refresh) {\r\n    if ($('.chartSetting').is(':visible')) {\r\n\r\n        //\u9690\u85CF\u8BBE\u7F6E\u754C\u9762\r\n        $('.chartSetting').hide();\r\n        //.luckysheet-modal-dialog-resize\u4E3A\u56FE\u8868\u663E\u793A\u6846\u7684\u7F29\u653E\u6846\uFF0C.luckysheet-modal-dialog-controll\u4E3A\u663E\u793A\u6846\u53F3\u8FB9\u7684\u63A7\u5236\u6309\u94AE\r\n        $('#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll').hide()\r\n\r\n        $('#luckysheet-cell-main').find('.luckysheet-datavisual-selection-set div').remove()\r\n\r\n        chartInfo.chartparam.luckysheetCurrentChartActive = false\r\n        if (!isEditMode() && !refresh) {\r\n\r\n            setTimeout(function () {\r\n                luckysheetsizeauto()\r\n            }, 0)\r\n\r\n        }\r\n\r\n    }\r\n}\r\n\r\n// \u9690\u85CF\u5176\u4ED6sheet\u7684\u56FE\u8868\uFF0C\u663E\u793A\u5F53\u524Dsheet\u7684\u56FE\u8868 chartMix \u5207\u6362sheet\u9875\u663E\u793A\u9690\u85CF\u56FE\u8868\r\nfunction renderChartShow(index) {\r\n    //\u4F20\u5165index\uFF0C\u56FE\u8868\u663E\u793A\u9690\u85CF\r\n    selectRangeBorderHide('true') //\u9690\u85CF\u6570\u636E\u9AD8\u4EAE\u533A\u57DF\uFF0C\u968F\u610F\u4F20\u5165\u4E00\u4E2A\u5B57\u7B26\u4E32\uFF0C\u8868\u793A\u4E0D\u5904\u7406chartSetting\u754C\u9762\r\n\r\n    const luckysheetfile = chartInfo.luckysheetfile;\r\n    luckysheetfile.forEach((file) => {\r\n        //\u5207\u6362\u5F53\u524D\u9875\u7684\u6240\u6709\u56FE\u8868\u90FD\u663E\u793A\u51FA\u6765\r\n        if (file.index == index) {\r\n\r\n            const chartLists = file.chart || [];\r\n\r\n            chartLists.forEach((chart) => {\r\n                chart.isShow = true;\r\n                $('#' + chart.chart_id + '_c').show();\r\n\r\n                chartInfo.resizeChart(chart.chart_id)\r\n\r\n                if (chart.needRangeShow == true) {\r\n                    //\u4E00\u4E2Asheet\u9875\u53EA\u6709\u4E00\u4E2A\u56FE\u8868\u9AD8\u4EAE\u663E\u793A,//\u91CD\u8981\uFF01\u56E0\u4E3A\u5728store\u4E86\u505A\u4E86\u5B58\u50A8\uFF0C\u6240\u4EE5\u80FD\u5728\u6B64\u5904\u627E\u5230\u5BF9\u5E94\u56FE\u8868\u8BBE\u7F6E\u663E\u793A\u9690\u85CF\r\n                    //\u64CD\u4F5CDOM\u5F53\u524D\u56FE\u8868\u9009\u62E9\u533A\u57DF\u9AD8\u4EAE\r\n                    chartInfo.currentChart = chartInfo.getChartJson(chart.chart_id)\r\n                    selectRangeBorderShow(chart.chart_id)\r\n                }\r\n\r\n            })\r\n\r\n        }\r\n\r\n        // \u9690\u85CF\u5176\u4ED6\u9875\u7684\u56FE\u8868\r\n        else {\r\n            const chartLists = file.chart || [];\r\n\r\n            chartLists.forEach((chart) => {\r\n                chart.isShow = false;\r\n                $('#' + chart.chart_id + '_c').hide();\r\n            })\r\n        }\r\n    });\r\n\r\n}\r\n\r\nexport { chart, createLuckyChart, hideAllNeedRangeShow, renderChartShow }\r\n", "import Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { replaceHtml } from '../utils/util';\r\nimport sheetmanage from './sheetmanage';\r\nimport {changeSheetContainerSize} from './resize';\r\nimport { jfrefreshgrid_rhcw } from '../global/refresh';\r\nimport server from './server';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\n\r\n\r\n\r\nlet luckysheetZoomTimeout = null;\r\n\r\nexport function zoomChange(ratio){\r\n    if(Store.flowdata==null || Store.flowdata.length==0){\r\n        return;\r\n    }\r\n\r\n    clearTimeout(luckysheetZoomTimeout);\r\n    luckysheetZoomTimeout = setTimeout(() => {\r\n        if (Store.clearjfundo) {\r\n            Store.jfredo.push({ \r\n                \"type\": \"zoomChange\", \r\n                \"zoomRatio\": Store.zoomRatio, \r\n                \"curZoomRatio\": ratio, \r\n                \"sheetIndex\": Store.currentSheetIndex, \r\n            });\r\n        }\r\n        currentWheelZoom = null;\r\n        Store.zoomRatio = ratio;\r\n\r\n        let currentSheet = sheetmanage.getSheetByIndex();\r\n\r\n        //\u6279\u6CE8\r\n        luckysheetPostil.buildAllPs(currentSheet.data);\r\n\r\n        //\u56FE\u7247\r\n        imageCtrl.images = currentSheet.images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n\r\n        if(currentSheet.config==null){\r\n            currentSheet.config = {};\r\n        }\r\n    \r\n        if(currentSheet.config.sheetViewZoom==null){\r\n            currentSheet.config.sheetViewZoom = {};\r\n        }\r\n\r\n        let type = currentSheet.config.curentsheetView;\r\n        if(type==null){\r\n            type = \"viewNormal\";\r\n        }\r\n        currentSheet.config.sheetViewZoom[type+\"ZoomScale\"] = ratio;\r\n    \r\n        server.saveParam(\"all\", Store.currentSheetIndex, Store.zoomRatio, { \"k\": \"zoomRatio\" });\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, currentSheet.config[\"sheetViewZoom\"], { \"k\": \"sheetViewZoom\" });\r\n\r\n        zoomRefreshView();\r\n    }, 100);\r\n    \r\n}\r\n\r\nexport function zoomRefreshView(){\r\n    // let $scrollLeft = $(\"#luckysheet-scrollbar-x\"), $scrollTop = $(\"#luckysheet-scrollbar-y\");\r\n    // let sl = $scrollLeft.scrollLeft(), st = $scrollTop.scrollTop();\r\n\r\n    // let wp = $scrollLeft.find(\"div\").width(), hp = $scrollTop.find(\"div\").height();\r\n\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    changeSheetContainerSize();\r\n\r\n    // let wc = $scrollLeft.find(\"div\").width(), hc = $scrollTop.find(\"div\").height();\r\n\r\n    // $scrollLeft.scrollLeft(sl+wc-wp);\r\n    // $scrollTop.scrollTop(st+hc-hp);\r\n}\r\n\r\nlet currentWheelZoom = null;\r\nexport function zoomInitial(){\r\n\r\n    // \u7F29\u653E\u6B65\u957F\r\n    const ZOOM_WHEEL_STEP = 0.02; // ctrl + \u9F20\u6807\u6EDA\u8F6E\r\n    const ZOOM_STEP = 0.1; // \u70B9\u51FB\u4EE5\u53CA Ctrl + +-\r\n    \r\n    // \u7F29\u653E\u6700\u5927\u6700\u5C0F\u6BD4\u4F8B\r\n    const MAX_ZOOM_RATIO = 4;\r\n    const MIN_ZOOM_RATIO = .1;\r\n    \r\n    $(\"#luckysheet-zoom-minus\").click(function(){\r\n        let currentRatio;\r\n        if(Store.zoomRatio==null){\r\n            currentRatio = Store.zoomRatio = 1;\r\n        }\r\n        else{\r\n            currentRatio = Math.ceil(Store.zoomRatio*10)/10;\r\n        }\r\n\r\n        currentRatio = currentRatio-ZOOM_STEP;\r\n\r\n        if(currentRatio==Store.zoomRatio){\r\n            currentRatio = currentRatio-ZOOM_STEP;\r\n        }\r\n\r\n        if(currentRatio<=MIN_ZOOM_RATIO){\r\n            currentRatio = MIN_ZOOM_RATIO;\r\n        }\r\n\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-plus\").click(function(){\r\n        let currentRatio;\r\n        if(Store.zoomRatio==null){\r\n            currentRatio = Store.zoomRatio = 1;\r\n        }\r\n        else{\r\n            currentRatio = Math.floor(Store.zoomRatio*10)/10;\r\n        }\r\n\r\n        currentRatio = currentRatio+ZOOM_STEP;\r\n\r\n        if(currentRatio==Store.zoomRatio){\r\n            currentRatio = currentRatio+ZOOM_STEP;\r\n        }\r\n\r\n        if(currentRatio>=MAX_ZOOM_RATIO){\r\n            currentRatio = MAX_ZOOM_RATIO;\r\n        }\r\n\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-slider\").mousedown(function(e){\r\n        let xoffset = $(this).offset().left, pageX = e.pageX;\r\n\r\n        let currentRatio = positionToRatio(pageX-xoffset);\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-cursor\").mousedown(function(e){\r\n        let curentX = e.pageX,cursorLeft = parseFloat($(\"#luckysheet-zoom-cursor\").css(\"left\"));\r\n        $(\"#luckysheet-zoom-cursor\").css(\"transition\",\"none\");\r\n        $(document).off(\"mousemove.zoomCursor\").on(\"mousemove.zoomCursor\",function(event){\r\n            let moveX = event.pageX;\r\n            let offsetX = moveX - curentX;\r\n            // console.log(moveX, curentX, offsetX);\r\n            // curentX = moveX;\r\n            // let left = parseFloat($(\"#luckysheet-zoom-cursor\").css(\"left\"));\r\n            let pos = cursorLeft + offsetX; \r\n            let currentRatio = positionToRatio(pos);\r\n\r\n            if(currentRatio>MAX_ZOOM_RATIO){\r\n                currentRatio = MAX_ZOOM_RATIO;\r\n                pos = 100;\r\n            }\r\n\r\n            if(currentRatio<MIN_ZOOM_RATIO){\r\n                currentRatio = MIN_ZOOM_RATIO;\r\n                pos = 0;\r\n            }\r\n\r\n            // Store.zoomRatio = currentRatio;\r\n            zoomChange(currentRatio);\r\n            let r = Math.round(currentRatio*100) + \"%\";\r\n            $(\"#luckysheet-zoom-ratioText\").html(r);\r\n            $(\"#luckysheet-zoom-cursor\").css(\"left\", pos-4);\r\n        });\r\n\r\n        $(document).off(\"mouseup.zoomCursor\").on(\"mouseup.zoomCursor\",function(event){\r\n            $(document).off(\".zoomCursor\");\r\n            $(\"#luckysheet-zoom-cursor\").css(\"transition\",\"all 0.3s\");\r\n        });\r\n\r\n        e.stopPropagation();\r\n    }).click(function(e){\r\n        e.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-ratioText\").click(function(){\r\n        // Store.zoomRatio = 1;\r\n        zoomChange(1);\r\n        zoomNumberDomBind(1);\r\n    });\r\n\r\n    zoomNumberDomBind(Store.zoomRatio);\r\n\r\n    currentWheelZoom = null;\r\n    // \u62E6\u622A\u7CFB\u7EDF\u7F29\u653E\u5FEB\u6377\u952E Ctrl + wheel\r\n    document.addEventListener(\r\n        'wheel',\r\n        function (ev) {\r\n            if (!ev.ctrlKey || !ev.deltaY) {\r\n                return;\r\n            }\r\n            if (currentWheelZoom === null) {\r\n                currentWheelZoom = Store.zoomRatio || 1;\r\n            }\r\n            currentWheelZoom += ev.deltaY < 0 ? ZOOM_WHEEL_STEP : -ZOOM_WHEEL_STEP;\r\n            if (currentWheelZoom >= MAX_ZOOM_RATIO) {\r\n                currentWheelZoom = MAX_ZOOM_RATIO;\r\n            } else if (currentWheelZoom < MIN_ZOOM_RATIO) {\r\n                currentWheelZoom = MIN_ZOOM_RATIO;\r\n            }\r\n            zoomChange(currentWheelZoom);\r\n            zoomNumberDomBind(currentWheelZoom);\r\n            ev.preventDefault();\r\n            ev.stopPropagation();\r\n        },\r\n        { capture: true, passive: false }\r\n    );\r\n\r\n    // \u62E6\u622A\u7CFB\u7EDF\u7F29\u653E\u5FEB\u6377\u952E Ctrl + +/- 0\r\n    document.addEventListener(\r\n        'keydown',\r\n        function (ev) {\r\n            if (!ev.ctrlKey) {\r\n                return;\r\n            }\r\n            let handled = false;\r\n            let zoom = Store.zoomRatio || 1;\r\n            if (ev.key === '-' || ev.which === 189) {\r\n                zoom -= ZOOM_STEP;\r\n                handled = true;\r\n            } else if (ev.key === '+' || ev.which === 187) {\r\n                zoom += ZOOM_STEP;\r\n                handled = true;\r\n            } else if (ev.key === '0' || ev.which === 48) {\r\n                zoom = 1;\r\n                handled = true;\r\n            }\r\n    \r\n            if (handled) {\r\n                ev.preventDefault();\r\n                if (zoom >= MAX_ZOOM_RATIO) {\r\n                    zoom = MAX_ZOOM_RATIO;\r\n                } else if (zoom < MIN_ZOOM_RATIO) {\r\n                    zoom = MIN_ZOOM_RATIO;\r\n                }\r\n                zoomChange(zoom);\r\n                zoomNumberDomBind(zoom);\r\n            }\r\n        },\r\n        { capture: true }\r\n    );\r\n}\r\n\r\n\r\nfunction zoomSlierDown(){\r\n\r\n}\r\n\r\nfunction positionToRatio(pos){\r\n    let ratio = 1;\r\n    if(pos<50){\r\n        ratio = Math.round((pos*1.8/100 + 0.1)*100)/100;\r\n    }\r\n    else if(pos>50){\r\n        ratio = Math.round(((pos-50)*6/100 + 1)*100)/100;\r\n    }\r\n\r\n    return ratio;\r\n}\r\n\r\nfunction zoomSlierDomBind(ratio){\r\n    let domPos = 50;\r\n    if(ratio<1){\r\n        domPos = Math.round((ratio - 0.1)*100 / 0.18)/10;\r\n    }\r\n    else if(ratio>1){\r\n        domPos = Math.round((ratio - 1)*100 / 0.6)/10+50;\r\n    }\r\n    $(\"#luckysheet-zoom-cursor\").css(\"left\", domPos-4);\r\n}\r\n\r\nexport function zoomNumberDomBind(ratio){\r\n    let r = Math.round(ratio*100) + \"%\";\r\n    $(\"#luckysheet-zoom-ratioText\").html(r);\r\n    zoomSlierDomBind(ratio);\r\n}\r\n\r\n", "import { isEditMode } from '../global/validate';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { getcellvalue, datagridgrowth,getcellFormula } from '../global/getdata';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport luckysheetcreatedom from '../global/createdom';\r\nimport tooltip from '../global/tooltip';\r\nimport formula from '../global/formula';\r\nimport { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh';\r\nimport rhchInit from '../global/rhchInit';\r\nimport editor from '../global/editor';\r\nimport { luckysheetextendtable, luckysheetdeletetable } from '../global/extend';\r\nimport { isRealNum } from '../global/validate';\r\nimport { replaceHtml, getObjType, chatatABC, arrayRemoveItem } from '../utils/util';\r\nimport { sheetHTML,luckysheetlodingHTML } from './constant';\r\nimport server from './server';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport pivotTable from './pivotTable';\r\nimport luckysheetsizeauto from './resize';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport luckysheetFreezen from './freezen';\r\nimport { createFilterOptions, labelFilterOptionState } from './filter';\r\nimport { selectHightlightShow, selectionCopyShow } from './select';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { renderChartShow } from '../expendPlugins/chart/plugin';\r\nimport {changeSheetContainerSize, menuToolBarWidth} from './resize';\r\nimport {zoomNumberDomBind} from './zoom';\r\nimport menuButton from './menuButton';\r\nimport method from '../global/method';\r\n\r\nconst sheetmanage = {\r\n    generateRandomSheetIndex: function(prefix) {\r\n        if(prefix == null){\r\n            prefix = \"Sheet\";\r\n        }\r\n\r\n        let userAgent = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, \"\").split(\"\");\r\n\r\n        let mid = \"\";\r\n\r\n        for(let i = 0; i < 12; i++){\r\n            mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];\r\n        }\r\n\r\n        let time = new Date().getTime();\r\n\r\n        return prefix + \"_\" + mid + \"_\" + time;\r\n    },\r\n    generateRandomSheetName: function(file, isPivotTable) {\r\n        let index = file.length;\r\n\r\n        const locale_pivotTable = locale().pivotTable;\r\n        const title = locale_pivotTable.title;\r\n\r\n        for(let i = 0; i < file.length; i++){\r\n            if(file[i].name.indexOf(\"Sheet\") > -1 || file[i].name.indexOf(title) > -1){\r\n                let suffix = parseFloat(file[i].name.replace(\"Sheet\", \"\").replace(title, \"\"));\r\n\r\n                if(suffix != \"NaN\" && Math.ceil(suffix) > index){\r\n                    index = Math.ceil(suffix);\r\n                }\r\n            }\r\n        }\r\n\r\n        if(isPivotTable){\r\n            return title + (index + 1);\r\n        }\r\n        else{\r\n            return \"Sheet\" + (index + 1);\r\n        }\r\n    },\r\n    generateCopySheetName: function(file, name) {\r\n        let copySheetName = \"\";\r\n\r\n        let _locale = locale();\r\n        let locale_info = _locale.info;\r\n\r\n        if(name.toString().indexOf(\"(\"+locale_info.copy) > -1){\r\n            let copy_i = name.toString().indexOf(\"(\"+locale_info.copy);\r\n            let name2 = name.toString().substring(0, copy_i) + \"(\"+locale_info.copy;\r\n            let index = null;\r\n\r\n            for(let i = 0; i < file.length; i++){\r\n                let fileName = file[i].name.toString();\r\n                let st_i = fileName.indexOf(name2);\r\n\r\n                if(st_i > -1){\r\n                    let ed_i = fileName.indexOf(\")\", st_i + name2.length);\r\n                    let num = fileName.substring(st_i + name2.length, ed_i);\r\n\r\n                    if(isRealNum(num)){\r\n                        if(index == null || parseInt(num) > index){\r\n                            index = parseInt(num);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(index == null){\r\n                copySheetName = name2 + \"2)\";\r\n            }\r\n            else{\r\n                index++;\r\n                copySheetName = name2 + index + \")\";\r\n            }\r\n        }\r\n        else{\r\n            let index = null;\r\n            let hascopy = false;\r\n            let name2 = name + \"(\"+locale_info.copy;\r\n\r\n            for(let i = 0; i < file.length; i++){\r\n                let fileName = file[i].name.toString();\r\n                let st_i = fileName.indexOf(name2);\r\n\r\n                if(st_i > -1){\r\n                    hascopy = true;\r\n                    let ed_i = fileName.indexOf(\")\", st_i + name2.length);\r\n                    let num = fileName.substring(st_i + name2.length, ed_i);\r\n\r\n                    if(isRealNum(num)){\r\n                        if(index == null || parseInt(num) > index){\r\n                            index = parseInt(num);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(hascopy){\r\n                if(index == null){\r\n                    copySheetName = name + \"(\"+ locale_info.copy +\"2)\";\r\n                }\r\n                else{\r\n                    index++;\r\n                    copySheetName = name + \"(\"+ locale_info.copy +\"\" + index + \")\";\r\n                }\r\n            }\r\n            else{\r\n                copySheetName = name + \"(\"+ locale_info.copy +\")\";\r\n            }\r\n        }\r\n\r\n        return copySheetName;\r\n    },\r\n    getSheetByIndex: function(index) {\r\n        let _this = this;\r\n\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let i = _this.getSheetIndex(index);\r\n        \r\n        return Store.luckysheetfile[i];\r\n    },\r\n    getSheetByName: function(name) {\r\n        let _this = this;\r\n\r\n        if(name == null){\r\n            return null;\r\n        }\r\n\r\n        for(let i=0;i<Store.luckysheetfile.length;i++){\r\n            let file = Store.luckysheetfile[i];\r\n            if(file.name==name){\r\n                return file;\r\n            }\r\n        }\r\n        \r\n        return null;\r\n    },\r\n    getCurSheetnoset: function() {\r\n        let curindex = 0;\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i].status == 1) {\r\n                curindex = Store.luckysheetfile[i].index;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return curindex;\r\n    },\r\n    getCurSheet: function() {\r\n        if (Store.luckysheetfile.length) {\r\n            let hasActive = false, indexs = []\r\n            Store.luckysheetfile.forEach(item => {\r\n                if ('undefined' === typeof item.index) {\r\n                    item.index = this.generateRandomSheetIndex()\r\n                }\r\n                if (indexs.includes(item.index)) {\r\n                    item.index = this.generateRandomSheetIndex()\r\n                }else {\r\n                    indexs.push(item.index)\r\n                }\r\n\r\n                if ('undefined' === typeof item.status) {\r\n                    item.status = 0\r\n                }\r\n                if (item.status == 1) {\r\n                    if (hasActive) {\r\n                        item.status = 0\r\n                    }else {\r\n                        hasActive = true\r\n                    }\r\n                }\r\n            })\r\n            if (!hasActive) {\r\n                Store.luckysheetfile[0].status = 1\r\n            }\r\n        }\r\n        Store.currentSheetIndex = Store.luckysheetfile[0].index;\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i].status == 1) {\r\n                Store.currentSheetIndex = Store.luckysheetfile[i].index;\r\n                break;\r\n            }\r\n        }\r\n        \r\n        return Store.currentSheetIndex;\r\n    },\r\n    addNewSheet: function(e, isPivotTable) {\r\n        if(isEditMode() || Store.allowEdit===false){\r\n            // alert(\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n            return;\r\n        }\r\n        // \u94A9\u5B50 sheetCreateBefore\r\n        if(!method.createHookFunction('sheetCreateBefore')){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let order = Store.luckysheetfile.length;\r\n        let index = _this.generateRandomSheetIndex();\r\n\r\n        let sheetname = _this.generateRandomSheetName(Store.luckysheetfile, isPivotTable);\r\n        \r\n        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": index, \"active\": \"\", \"name\": sheetname, \"style\": \"\",\"colorset\":\"\" }));\r\n\r\n        let sheetconfig = { \r\n            \"name\": sheetname, \r\n            \"color\": \"\", \r\n            \"status\": \"0\", \r\n            \"order\": order, \r\n            \"index\": index, \r\n            \"celldata\": [], \r\n            \"row\": Store.defaultrowNum, \r\n            \"column\": Store.defaultcolumnNum, \r\n            \"config\": {}, \r\n            \"pivotTable\": null, \r\n            \"isPivotTable\": !!isPivotTable \r\n        };\r\n        Store.luckysheetfile.push(sheetconfig);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n        cleargridelement(e);\r\n\r\n        server.saveParam(\"sha\", null, $.extend(true, {}, sheetconfig));\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            let redo = {};\r\n            redo[\"type\"] = \"addSheet\";\r\n            redo[\"sheetconfig\"] = $.extend(true, {}, sheetconfig);\r\n            redo[\"index\"] = index;\r\n            redo[\"currentSheetIndex\"] = Store.currentSheetIndex;\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        _this.changeSheetExec(index, isPivotTable, true);\r\n\r\n        // \u94A9\u5B50 sheetCreateAfter \u4E0D\u5E94\u8BE5\u5728\u8FD9\u91CC \u5E94\u5728\u7ED8\u5236\u5B8C\u6210\u540E \u56E0\u6B64\u5728 changeSheet \u5B9E\u73B0\r\n    },\r\n    setSheetHide: function(index, isDelete) {\r\n        let _this = this;\r\n        let currentIdx = _this.getSheetIndex(index);\r\n        // \u94A9\u5B50 sheetHideBefore\r\n        if(!isDelete && !method.createHookFunction('sheetHideBefore', {sheet: Store.luckysheetfile[currentIdx]})){\r\n            return;\r\n        }\r\n        Store.luckysheetfile[currentIdx].hide = 1;\r\n        \r\n        let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + index);\r\n        luckysheetcurrentSheetitem.hide();\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        \r\n        let indicator;\r\n        if(luckysheetConfigsetting.showsheetbarConfig.sheet){\r\n            indicator = luckysheetcurrentSheetitem.nextAll(\":visible\");\r\n            if (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n                indicator = indicator.eq(0).data(\"index\");\r\n            }\r\n            else {\r\n                indicator = luckysheetcurrentSheetitem.prevAll(\":visible\").eq(0).data(\"index\");\r\n            }\r\n        }else{\r\n            let  nextActiveIdx , showSheetIdxs = [];\r\n            Store.luckysheetfile.forEach((ele,index)=>{\r\n                if(1 !== ele.hide) showSheetIdxs.push(index);\r\n            });\r\n            let len = showSheetIdxs.length;\r\n            if(1 === len){\r\n                nextActiveIdx = showSheetIdxs[0];\r\n            }else{\r\n                nextActiveIdx = showSheetIdxs[len-1] > currentIdx ? showSheetIdxs.find(e => e>currentIdx ) : showSheetIdxs[len-1];\r\n            }\r\n\r\n            indicator = Store.luckysheetfile[nextActiveIdx].index;\r\n        }\r\n        \r\n        $(\"#luckysheet-sheets-item\" + indicator).addClass(\"luckysheet-sheets-item-active\");\r\n        \r\n        _this.changeSheetExec(indicator);\r\n\r\n        server.saveParam(\"sh\", luckysheetcurrentSheetitem.data(\"index\"), 1, { \"op\": \"hide\", \"cur\": indicator });\r\n        // \u94A9\u5B50 sheetHideAfter\r\n        if (!isDelete) {\r\n            method.createHookFunction('sheetHideAfter', {sheet: Store.luckysheetfile[currentIdx]});\r\n        }\r\n    },\r\n    setSheetShow: function(index) {\r\n        let _this = this;\r\n        const file = Store.luckysheetfile[_this.getSheetIndex(index)]\r\n        // \u94A9\u5B50 sheetShowBefore\r\n        if(!method.createHookFunction('sheetShowBefore', {sheet: file})){\r\n            return;\r\n        }\r\n        file.hide = 0;\r\n        _this.changeSheetExec(index);\r\n\r\n        server.saveParam(\"sh\", index, 0, {\"op\": \"show\", \"cur\": null});\r\n        // \u94A9\u5B50 sheetShowAfter\r\n        method.createHookFunction('sheetShowAfter', {sheet: file});\r\n    },\r\n    sheetMaxIndex: 0,\r\n    ordersheet: function(property) {\r\n        return function (a, b) {\r\n            let value1 = a[property];\r\n            let value2 = b[property];\r\n            return value1 - value2;\r\n        }\r\n    },\r\n    getCurrentOrder: function() {\r\n        let orders = {};\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").each(function (a) {\r\n            let index = $(this).data(\"index\");\r\n\r\n            for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n                if (Store.luckysheetfile[i].index == index) {\r\n                    orders[index.toString()] = a;\r\n                    break;\r\n                }\r\n            }\r\n        });\r\n\r\n        return orders;\r\n    },\r\n    reOrderAllSheet: function() {\r\n        let orders = {};\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").each(function (a) {\r\n            let index = $(this).data(\"index\");\r\n\r\n            for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n                if (Store.luckysheetfile[i].index == index) {\r\n                    Store.luckysheetfile[i].order = a;\r\n                    orders[index.toString()] = a;\r\n                    break;\r\n                }\r\n            }\r\n        });\r\n\r\n        server.saveParam(\"shr\", null, orders);\r\n\r\n        Store.luckysheetfile.sort((x, y) => {\r\n            let order_x = x.order;\r\n            let order_y = y.order;\r\n    \r\n            if(order_x != null && order_y != null){\r\n                return order_x - order_y;\r\n            }\r\n            else if(order_x != null){\r\n                return -1;\r\n            }\r\n            else if(order_y != null){\r\n                return 1;\r\n            }\r\n            else{\r\n                return 1;\r\n            }\r\n        })\r\n    },\r\n    createSheet: function() { //\u4FEE\u590D\u62D6\u52A8sheet\u66F4\u65B0\u540E\u53F0\u540E\uFF0C\u91CD\u65B0\u6253\u5F00\u663E\u793A\u9519\u8BEF\r\n        let _this = this;\r\n\r\n        let btn = [];\r\n        Store.luckysheetfile.sort(_this.ordersheet('order'));\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let display = \"\";\r\n            let sheetIndex = Store.luckysheetfile[i].index;\r\n\r\n            let colorset = '';\r\n            if(Store.luckysheetfile[i].color != null){\r\n                colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + Store.luckysheetfile[i].color + ';\"></div>';\r\n            }\r\n\r\n            if (Store.currentSheetIndex == sheetIndex) { //\u4F7F\u7528Store.luckysheetfile\u4E2D\u7684index\u6BD4\u8F83\uFF0C\u800C\u4E0D\u662Forder\r\n                btn.push(replaceHtml(sheetHTML, { \"index\": sheetIndex, \"active\": \"luckysheet-sheets-item-active\", \"name\": Store.luckysheetfile[i].name, \"style\": \"\",\"colorset\":colorset }));\r\n            }\r\n            else {\r\n                if (Store.luckysheetfile[i].hide == 1) {\r\n                    btn.push(replaceHtml(sheetHTML, { \"index\": sheetIndex, \"active\": \"\", \"name\": Store.luckysheetfile[i].name, \"style\": \"display:none;\",\"colorset\":colorset }));\r\n                }\r\n                else {\r\n                    btn.push(replaceHtml(sheetHTML, { \"index\": sheetIndex, \"active\": \"\", \"name\": Store.luckysheetfile[i].name, \"style\": \"\",\"colorset\":colorset }));\r\n                }\r\n                display = \"style='display:none;'\";\r\n            }\r\n            //Store.luckysheetfile[i].index = i; //index\u5373\u4E3A\u9ED8\u8BA4\r\n            // if(sheetIndex > this.sheetMaxIndex){\r\n            //     this.sheetMaxIndex = sheetIndex;\r\n            // }\r\n\r\n            $(\"#luckysheet-cell-main\").append('<div ' + display + ' id=\"luckysheet-datavisual-selection-set-' + sheetIndex + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-container-c\").append(btn.join(\"\"));\r\n\r\n        _this.locationSheet();\r\n    },\r\n    locationSheet: function() {\r\n        let $c = $(\"#luckysheet-sheet-container-c\"), winW = $(\"#\"+Store.container).width();\r\n        let $cursheet = $(\"#luckysheet-sheet-container-c > div.luckysheet-sheets-item-active\").eq(0);\r\n\r\n        let scrollLeftpx = 0;\r\n        let c_width = 0;\r\n\r\n        $(\"#luckysheet-sheet-container-c > div.luckysheet-sheets-item:visible\").each(function(){\r\n            if($(this).hasClass(\"luckysheet-sheets-item-active\")){\r\n                scrollLeftpx = c_width;\r\n            }\r\n            c_width += $(this).outerWidth();\r\n        });\r\n        \r\n        setTimeout(function(){\r\n            $c.scrollLeft(scrollLeftpx - 10);\r\n\r\n            if (c_width >= winW * 0.7) {\r\n                if(luckysheetConfigsetting.showsheetbarConfig.sheet){\r\n                    $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"inline-block\");\r\n                    $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n                }\r\n                \r\n            }\r\n        }, 1)\r\n    },\r\n    copySheet: function(copyindex, e) {\r\n        if(isEditMode() || Store.allowEdit===false){\r\n            // alert(\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let order = Store.luckysheetfile.length;\r\n        let index = _this.generateRandomSheetIndex();\r\n        \r\n        let copyarrindex = _this.getSheetIndex(copyindex);\r\n        let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]);\r\n        copyjson.order = order;\r\n        copyjson.index = index;\r\n        copyjson.name = _this.generateCopySheetName(Store.luckysheetfile, copyjson.name);\r\n\r\n        // \u94A9\u5B50 sheetCreateBefore\r\n        if(!method.createHookFunction('sheetCopyBefore', {\r\n            targetSheet: Store.luckysheetfile[copyarrindex],\r\n            copySheet: copyjson\r\n        })){\r\n            return;\r\n        }\r\n        \r\n        let colorset = '';\r\n        if(copyjson.color != null){\r\n            colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + copyjson.color + ';\"></div>';\r\n        }\r\n\r\n        let copyobject = $(\"#luckysheet-sheets-item\" + copyindex);\r\n        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": copyjson.index, \"active\": \"\", \"name\": copyjson.name, \"order\": copyjson.order, \"style\": \"\", \"colorset\": colorset }));\r\n        $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(copyobject);\r\n        Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n        cleargridelement(e);\r\n\r\n        server.saveParam(\"shc\", index, { \"copyindex\": copyindex, \"name\": copyjson.name });\r\n\r\n        _this.changeSheetExec(index, undefined, undefined, true);\r\n        _this.reOrderAllSheet();\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfredo.push({ \r\n                \"type\": \"copySheet\", \r\n                \"copyindex\": copyindex, \r\n                \"index\": copyjson.index, \r\n                \"sheetIndex\": copyjson.index \r\n            });\r\n        }\r\n        else if (Store.jfredo.length > 0) {\r\n            let jfredostr = Store.jfredo[Store.jfredo.length - 1];\r\n\r\n            if (jfredostr.type == \"copySheet\") {\r\n                jfredostr.index = copyjson.index;\r\n                jfredostr.sheetIndex = copyjson.index;\r\n            }\r\n        }\r\n    },\r\n    hasSheet: function(index) {\r\n        if (index == null) {\r\n            return false;\r\n        }\r\n\r\n        index = this.getSheetIndex(index);\r\n        \r\n        if (index == null) {\r\n            return false;\r\n        }\r\n        else {\r\n            return true;\r\n        }\r\n    },\r\n    createSheetbydata: function(data, isrenew, isBefore=true) {\r\n        let _this = this;\r\n\r\n        let colorset = '';\r\n        if(data.color != null){\r\n            colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + data.color + ';\"></div>';\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": data.index, \"active\": \"\", \"name\": data.name, \"order\": data.order, \"style\": \"\", \"colorset\": colorset }));\r\n\r\n        if(isBefore){\r\n            let previndex = data.order;\r\n            if(previndex >= Store.luckysheetfile.length){\r\n                previndex = Store.luckysheetfile.length - 1;\r\n                $(\"#luckysheet-sheets-item\" + data.index).insertAfter($(\"#luckysheet-sheets-item\" + Store.luckysheetfile[previndex].index));\r\n            }\r\n            else{\r\n                $(\"#luckysheet-sheets-item\" + data.index).insertBefore($(\"#luckysheet-sheets-item\" + Store.luckysheetfile[previndex].index));\r\n            }\r\n        }\r\n        \r\n        Store.luckysheetfile.push(data);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + data.index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + data.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n        cleargridelement();\r\n\r\n        if(isrenew != null){\r\n            server.saveParam(\"shre\", null, { \"reIndex\": data.index });\r\n            data.hide = 0;\r\n            server.saveParam(\"sh\", data.index, 0, {\"op\": \"show\", \"cur\": null});\r\n        }\r\n        else{\r\n            server.saveParam(\"sha\", null, data);\r\n        }\r\n\r\n        _this.changeSheetExec(data.index, data.isPivotTable, true);\r\n        _this.reOrderAllSheet();\r\n    },\r\n    deleteSheet: function(index) {\r\n        let _this = this;\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let arrIndex = _this.getSheetIndex(index);\r\n\r\n        const file = Store.luckysheetfile[arrIndex];\r\n\r\n        // \u94A9\u5B50 sheetDeleteBefore\r\n        if(!method.createHookFunction('sheetDeleteBefore', { sheet: file })){\r\n            return;\r\n        }\r\n\r\n        _this.setSheetHide(index, true);\r\n\r\n        $(\"#luckysheet-sheets-item\" + index).remove();\r\n        $(\"#luckysheet-datavisual-selection-set-\" + index).remove();\r\n        \r\n        let removedsheet = Store.luckysheetfile.splice(arrIndex, 1);\r\n        _this.reOrderAllSheet();\r\n\r\n        server.saveParam(\"shd\", null, {\"deleIndex\": index });\r\n\r\n        if (Store.clearjfundo) {\r\n            removedsheet[0].type = \"deleteSheet\";\r\n            Store.jfredo.push(removedsheet[0]);\r\n        }\r\n        // \u94A9\u5B50 sheetDeleteAfter\r\n        method.createHookFunction('sheetDeleteAfter', { sheet: file });\r\n    },\r\n    nulldata: null,\r\n    getGridData: function(d) {\r\n        let ret = [];\r\n\r\n        for(let r = 0; r < d.length; r++){\r\n            for(let c = 0; c < d[0].length; c++){\r\n                if(d[r][c] == null){\r\n                    continue;\r\n                }\r\n\r\n                ret.push({r:r, c:c, v:d[r][c]});\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    buildGridData: function(file) {\r\n        // \u5982\u679C\u5DF2\u7ECF\u5B58\u5728\u4E8C\u7EF4\u6570\u636Edata,\u90A3\u4E48\u76F4\u63A5\u8FD4\u56DEdata\uFF1B\u5982\u679C\u53EA\u6709celldata\uFF0C\u90A3\u4E48\u5C31\u8F6C\u5316\u6210\u4E8C\u7EF4\u6570\u7EC4data\uFF0C\u518D\u8FD4\u56DE\r\n        let row = file.row == null ? Store.defaultrowNum : file.row, \r\n            column = file.column == null ? Store.defaultcolumnNum : file.column,\r\n            data = file.data && file.data.length > 0 ? file.data : datagridgrowth([], row, column),\r\n            celldata = file.celldata;\r\n        if (file.data && file.data.length > 0) {\r\n            for (let i = 0; i < data.length; i++) {\r\n                for (let j = 0; j < data[0].length; j++) {\r\n                    setcellvalue(i, j, data, data[i][j]);\r\n                }\r\n            }\r\n        } else {\r\n            if(celldata && celldata.length > 0){\r\n                for(let i = 0; i < celldata.length; i++){\r\n                    let item = celldata[i];\r\n                    let r = item.r;\r\n                    let c = item.c;\r\n                    let v = item.v;\r\n    \r\n                    if(r >= data.length){\r\n                        data = datagridgrowth(data, r - data.length + 1, 0);\r\n                    }\r\n                    if(c >= data[0].length){\r\n                        data = datagridgrowth(data, 0, c - data[0].length + 1);\r\n                    }\r\n                    setcellvalue(r, c, data, v);\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u4EBF\u4E07\u683C\u5F0F+\u7CBE\u786E\u5EA6 \u6062\u590D\u5168\u5C40\u521D\u59CB\u5316\r\n        luckysheetConfigsetting.autoFormatw = false;  \r\n        luckysheetConfigsetting.accuracy = undefined;\r\n        return data;\r\n    },\r\n    cutGridData: function(d) {\r\n        let rowindex = 0;\r\n\r\n        for(let r = d.length - 1; r >= 0; r--){\r\n            let isnull = true;\r\n            \r\n            for(let c = 0; c < d[0].length; c++){\r\n                let value = getcellvalue(r, c);\r\n                \r\n                if(value != null && $.trim(value).length > 0){\r\n                    isnull = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(!isnull){\r\n                break;\r\n            }\r\n            else{\r\n                rowindex = r;\r\n            }\r\n        }\r\n\r\n        return d.slice(0, rowindex);\r\n    },\r\n    addGridData: function(celldata, row, column) {\r\n        let data = datagridgrowth([], row, column);\r\n        \r\n        if(celldata != null){\r\n            for(let i = 0; i < celldata.length; i++){\r\n                let item = celldata[i];\r\n                let r = item.r;\r\n                let c = item.c;\r\n                let v = item.v;\r\n\r\n                if(r >= data.length){\r\n                    data = datagridgrowth(data, r - data.length + 1, 0);\r\n                }\r\n\r\n                if(c >= data[0].length){\r\n                    data = datagridgrowth(data, 0, c - data[0].length + 1);\r\n                }\r\n\r\n                setcellvalue(r, c, data, v)\r\n            }\r\n        }\r\n        \r\n        return data;\r\n    },\r\n    sheetParamRestore: function(file, data) {\r\n        Store.luckysheet_select_save = file[\"luckysheet_select_save\"];\r\n        if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n            if(data[0] != null && data[0][0] != null && data[0][0].mc != null){\r\n                Store.luckysheet_select_save = [{ \r\n                    \"row\": [0, data[0][0].mc.rs - 1], \r\n                    \"column\": [0, data[0][0].mc.cs - 1] \r\n                }];\r\n            }\r\n            else{\r\n                Store.luckysheet_select_save = [{ \r\n                    \"row\": [0, 0], \r\n                    \"column\": [0, 0] \r\n                }];\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_selection_range = file[\"luckysheet_selection_range\"] == null ? [] : file[\"luckysheet_selection_range\"];\r\n        Store.config = file[\"config\"] == null ? {} : file[\"config\"];\r\n\r\n        Store.zoomRatio = file[\"zoomRatio\"] == null ? 1 : file[\"zoomRatio\"];\r\n\r\n        if(file[\"defaultRowHeight\"]!=null){\r\n            Store.defaultrowlen = parseFloat(file[\"defaultRowHeight\"]);\r\n        }\r\n        else{\r\n            Store.defaultrowlen = luckysheetConfigsetting[\"defaultRowHeight\"];\r\n        }\r\n\r\n        if(file[\"defaultColWidth\"]!=null){\r\n            Store.defaultcollen = parseFloat(file[\"defaultColWidth\"]);\r\n        }\r\n        else{\r\n            Store.defaultcollen = luckysheetConfigsetting[\"defaultColWidth\"];\r\n        }\r\n\r\n        if(file[\"showGridLines\"]!=null){\r\n            let showGridLines = file[\"showGridLines\"];\r\n            if(showGridLines==0 || showGridLines==false){\r\n                Store.showGridLines = false;\r\n            }\r\n            else{\r\n                Store.showGridLines = true;\r\n            }\r\n        }\r\n        else{\r\n            Store.showGridLines = true;\r\n        }\r\n    },\r\n    initialjfFile: function(menu, title) {\r\n        let _this = this;\r\n\r\n        _this.getCurSheet();\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(Store.currentSheetIndex)];\r\n        _this.nulldata = datagridgrowth([], Store.defaultrowNum, Store.defaultcolumnNum);\r\n        let data = _this.buildGridData(file);\r\n\r\n        //\u521D\u59CB\u5316\u7684\u65F6\u5019 \u8BB0\u5F55\u9009\u533A\r\n        let select_save = [];\r\n        file.jfgird_select_save = file.jfgird_select_save || [];\r\n        file.jfgird_select_save.forEach(item=>select_save.push({\"row\":item.row,\"column\":item.column}));\r\n        file.luckysheet_select_save = select_save;\r\n        \r\n        this.sheetParamRestore(file, data);\r\n\r\n        let r2 = Store.luckysheet_select_save[0].row[1], \r\n            c2 = Store.luckysheet_select_save[0].column[1];\r\n        \r\n        if(Store.luckysheet_select_save.length > 1){\r\n            for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                if(Store.luckysheet_select_save[i].row[1] > r2){\r\n                    r2 = Store.luckysheet_select_save[i].row[1];\r\n                }\r\n\r\n                if(Store.luckysheet_select_save[i].column[1] > c2){\r\n                    c2 = Store.luckysheet_select_save[i].column[1];\r\n                }\r\n            }\r\n        }\r\n\r\n        menuButton.fontInitial(Store.fontList);//initial font\r\n\r\n        file.data = data;\r\n\r\n        let rowheight = data.length;\r\n        if(r2 > rowheight - 1){\r\n            rowheight = r2 + 1;\r\n        }\r\n\r\n        let colwidth = data[0].length;\r\n        if(c2 > colwidth - 1){\r\n            colwidth = c2 + 1;\r\n        }\r\n\r\n        //\u94A9\u5B50\u51FD\u6570 \u8868\u683C\u521B\u5EFA\u4E4B\u524D\u89E6\u53D1\r\n        if(typeof luckysheetConfigsetting.beforeCreateDom == \"function\" ){\r\n            luckysheetConfigsetting.beforeCreateDom(luckysheet);\r\n        }\r\n\r\n        if(typeof luckysheetConfigsetting.workbookCreateBefore == \"function\"){\r\n            luckysheetConfigsetting.workbookCreateBefore(luckysheet);\r\n        }\r\n\r\n        // Store.flowdata = data;\r\n\r\n        luckysheetcreatedom(colwidth, rowheight, data, menu, title);\r\n\r\n        setTimeout(function () {\r\n            tooltip.createHoverTip(\"#luckysheet_info_detail\" ,\".luckysheet_info_detail_back, .luckysheet_info_detail_input, .luckysheet_info_detail_update\");\r\n            tooltip.createHoverTip(\"#luckysheet-wa-editor\" ,\".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button\");\r\n\r\n            Store.luckysheetTableContentHW = [\r\n                $(\"#luckysheet-cell-main\").width() + Store.rowHeaderWidth - Store.cellMainSrollBarSize, \r\n                $(\"#luckysheet-cell-main\").height() + Store.columnHeaderHeight - Store.cellMainSrollBarSize\r\n            ];\r\n            $(\"#luckysheetTableContent, #luckysheetTableContentF\").attr({ \r\n                width: Math.ceil(Store.luckysheetTableContentHW[0] * Store.devicePixelRatio), \r\n                height: Math.ceil(Store.luckysheetTableContentHW[1] * Store.devicePixelRatio) \r\n            }).css({ \r\n                width: Store.luckysheetTableContentHW[0], \r\n                height: Store.luckysheetTableContentHW[1] \r\n            }).get(0).getContext(\"2d\");\r\n            let locale_info = locale().info;\r\n            let key = server.gridKey;\r\n            let cahce_key = key + \"__qkcache\";\r\n\r\n            let ini = function(){\r\n                file[\"load\"] = \"1\";\r\n\r\n                _this.createSheet();\r\n\r\n                let execF = function(){\r\n                    _this.mergeCalculation(file[\"index\"]);\r\n                    _this.setSheetParam(false);\r\n                    // editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n                    _this.storeSheetParam();\r\n                    _this.restoreselect();\r\n                    _this.CacheNotLoadControll = [];\r\n                    _this.restoreCache();\r\n                    formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                    _this.restoreSheetAll(Store.currentSheetIndex);\r\n                    \r\n                    // luckysheetrefreshgrid(0, 0);\r\n                    $(\"#luckysheet_info_detail_save\").html(locale_info.detailSave);\r\n\r\n                    if (!!file.isPivotTable) {\r\n                        Store.luckysheetcurrentisPivotTable = true;\r\n                        // pivotTable.changePivotTable(Store.currentSheetIndex); //\u6B64\u65B9\u6CD5\u9700\u8981\u6CE8\u91CA\u6389\uFF0C\u5728restoreSheetAll\u4E2D\u5DF2\u7ECF\u6267\u884C\u4E86\u5237\u65B0\u4E86\u6570\u636E\u900F\u89C6\u8868\uFF0C\u8FD9\u91CC\u5C31\u4E0D\u9700\u8981\u4E86\r\n                    }\r\n                    else {\r\n                        Store.luckysheetcurrentisPivotTable = false;\r\n                        $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                    }\r\n\r\n                    // Store toolbar button width value\r\n                    menuToolBarWidth();\r\n\r\n                    luckysheetsizeauto();\r\n\r\n                    //\u7B49\u5F85\u6EDA\u52A8\u6761dom\u5BBD\u9AD8\u52A0\u8F7D\u5B8C\u6210\u540E \u521D\u59CB\u5316\u6EDA\u52A8\u4F4D\u7F6E\r\n                    if(file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0){\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"]);\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n                    }\r\n            \r\n                    if(file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0){\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"]);\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n                    }\r\n\r\n                    // \u6B64\u5904\u5DF2\u7ECF\u6E32\u67D3\u5B8C\u6210\u8868\u683C\uFF0C\u5E94\u8BE5\u632A\u5230\u524D\u9762\r\n                    // //\u94A9\u5B50\u51FD\u6570 \u8868\u683C\u521B\u5EFA\u4E4B\u524D\u89E6\u53D1\r\n                    // if(typeof luckysheetConfigsetting.beforeCreateDom == \"function\" ){\r\n                    //     luckysheetConfigsetting.beforeCreateDom(luckysheet);\r\n                    // }\r\n\r\n                    // if(typeof luckysheetConfigsetting.workbookCreateBefore == \"function\"){\r\n                    //     luckysheetConfigsetting.workbookCreateBefore(luckysheet);\r\n                    // }\r\n\r\n                    arrayRemoveItem(Store.asyncLoad,'core');\r\n\r\n                    if(luckysheetConfigsetting.pointEdit){\r\n                        setTimeout(function(){\r\n                            Store.loadingObj.close()\r\n                        }, 0);\r\n                    }\r\n                    else{\r\n                        setTimeout(function(){\r\n                            Store.loadingObj.close()\r\n                        }, 500);\r\n                    }\r\n                }\r\n\r\n                let loadSheetUrl = server.loadSheetUrl;\r\n                \r\n                if(loadSheetUrl == \"\"){\r\n                //     execF();\r\n                // }\r\n                // else if(sheetindex.length>0 && loadSheetUrl == \"\"){\r\n                    // for(let i = 0;i<Store.luckysheetfile.length;i++){\r\n                    //     let otherfile = Store.luckysheetfile[i];\r\n                    //     if(otherfile.index == file.index){\r\n                    //         continue;\r\n                    //     }\r\n                    //     // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]; \r\n                    //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                    //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                    //         otherfile[\"load\"] = \"1\";\r\n                    //     }\r\n                    // }\r\n\r\n                    _this.loadOtherFile(file);\r\n                    execF();\r\n                }\r\n                else{\r\n                    let sheetindexset = _this.checkLoadSheetIndex(file);\r\n                    let sheetindex = [];\r\n    \r\n                    for(let i = 0; i < sheetindexset.length; i++){\r\n                        let item = sheetindexset[i];\r\n    \r\n                        if(item == file[\"index\"]){\r\n                            continue;\r\n                        }\r\n    \r\n                        sheetindex.push(item);\r\n                    }\r\n\r\n                    // No request is sent if it is not linked to other worksheets\r\n                    if(sheetindex.length === 0){\r\n                        execF();\r\n                        return;\r\n                    }\r\n                    $.post(loadSheetUrl, {\"gridKey\" : server.gridKey, \"index\": sheetindex.join(\",\")}, function (d) {\r\n                        let dataset = new Function(\"return \" + d)();\r\n                        \r\n                        for(let item in dataset){\r\n                            if(item == file[\"index\"]){\r\n                                continue;\r\n                            }\r\n\r\n                            let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n                            \r\n                            if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                                otherfile.celldata = dataset[item.toString()];\r\n                                otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                                otherfile[\"load\"] = \"1\";\r\n                            }\r\n                        }\r\n\r\n                        execF();\r\n                    });\r\n                }\r\n            }\r\n\r\n            try {\r\n                localforage.getItem(cahce_key).then(function(readValue) {\r\n                    if(readValue != null){\r\n                        _this.CacheNotLoadControll = readValue;\r\n                    }\r\n                    server.clearcachelocaldata(function(){\r\n                        ini();\r\n                    });\r\n                });\r\n            } catch(e) {\r\n                ini();\r\n                console.log(\"\u7F13\u5B58\u64CD\u4F5C\u5931\u8D25\");\r\n            }\r\n        }, 1);\r\n    },\r\n    storeSheetParam: function() {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n        file[\"config\"] = Store.config;\r\n        file[\"visibledatarow\"] = Store.visibledatarow;\r\n        file[\"visibledatacolumn\"] = Store.visibledatacolumn;\r\n        file[\"ch_width\"] = Store.ch_width;\r\n        file[\"rh_height\"] = Store.rh_height;\r\n        file[\"luckysheet_select_save\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        file[\"luckysheet_selection_range\"] = $.extend(true, [], Store.luckysheet_selection_range);\r\n\r\n        if($(\"#luckysheet-scrollbar-x\")[0].scrollWidth > $(\"#luckysheet-scrollbar-x\")[0].offsetWidth){\r\n            file[\"scrollLeft\"] = $(\"#luckysheet-scrollbar-x\").scrollLeft(); //\u6A2A\u5411\u6EDA\u52A8\u6761\r\n        }\r\n\r\n        if($(\"#luckysheet-scrollbar-y\")[0].scrollHeight > $(\"#luckysheet-scrollbar-y\")[0].offsetHeight){\r\n            file[\"scrollTop\"] = $(\"#luckysheet-scrollbar-y\").scrollTop(); //\u7EB5\u5411\u6EDA\u52A8\u6761\r\n        }\r\n\r\n        file[\"zoomRatio\"] = Store.zoomRatio;\r\n    },\r\n    setSheetParam: function(isload=true) {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        Store.flowdata = file[\"data\"];\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n\r\n        // formula.execFunctionGroupData = null;\r\n        formula.execFunctionGlobalData = null;\r\n        window.luckysheet_getcelldata_cache = null;\r\n\r\n        this.sheetParamRestore(file, Store.flowdata);\r\n\r\n        if(file[\"freezen\"] == null){\r\n            luckysheetFreezen.freezenhorizontaldata = null;\r\n            luckysheetFreezen.freezenverticaldata = null;\r\n        }\r\n        else{\r\n            luckysheetFreezen.freezenhorizontaldata = file[\"freezen\"].horizontal == null ? null : file[\"freezen\"].horizontal.freezenhorizontaldata;\r\n            luckysheetFreezen.freezenverticaldata = file[\"freezen\"].vertical == null ? null : file[\"freezen\"].vertical.freezenverticaldata;\r\n        }\r\n        \r\n        if(isload){\r\n            rhchInit(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n\r\n        //\u6279\u6CE8\r\n        luckysheetPostil.buildAllPs(Store.flowdata);\r\n\r\n        //\u56FE\u7247\r\n        imageCtrl.currentImgId = null;\r\n        imageCtrl.images = file.images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n\r\n        //\u6570\u636E\u9A8C\u8BC1\r\n        dataVerificationCtrl.dataVerification = file.dataVerification;\r\n        dataVerificationCtrl.init();\r\n\r\n        //\u94FE\u63A5\r\n        hyperlinkCtrl.hyperlink = file.hyperlink;\r\n        hyperlinkCtrl.init();\r\n        \r\n        createFilterOptions(file[\"filter_select\"], file[\"filter\"]);\r\n    },\r\n    restoreselect: function() {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        //\u9009\u533A\r\n        selectHightlightShow(true);\r\n\r\n        //\u590D\u5236\u9009\u533A\u865A\u7EBF\u6846\r\n        selectionCopyShow();\r\n\r\n        if (file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"]); //\u5217\u6807\u9898\r\n        }\r\n        else {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n        }\r\n\r\n        if (file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"]); //\u5217\u6807\u9898\r\n        }\r\n        else {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n        }\r\n    },\r\n    storeSheetParamALL: function() {\r\n        let _this = this;\r\n\r\n        _this.storeSheetParam();\r\n        let index = _this.getSheetIndex(Store.currentSheetIndex);\r\n        Store.luckysheetfile[index][\"data\"] = Store.flowdata;\r\n        Store.luckysheetfile[index][\"config\"] = $.extend(true, {}, Store.config);\r\n    },\r\n    mergeCalculationSheet:{},\r\n    mergeCalculation:function(index){\r\n        let file = Store.luckysheetfile[this.getSheetIndex(index)];\r\n        let config = file.config, data = file.data;\r\n        if(config==null){\r\n            return;\r\n        }\r\n        let mergeConfig = config.merge;\r\n        if(mergeConfig==null || index in this.mergeCalculationSheet || file[\"autoCalculationMerge\"]===false){\r\n            return;\r\n        }\r\n\r\n        this.mergeCalculationSheet[index] = 1;\r\n\r\n        for(let x in mergeConfig){\r\n            let r = parseInt(x.substr(0, x.indexOf('_')));\r\n            let c = parseInt(x.substr(x.indexOf('_') + 1));\r\n            let mcInfo = mergeConfig[x];\r\n            if(data[r][c]==null){\r\n                data[r][c] = {};\r\n            }\r\n\r\n            data[r][c][\"mc\"] = {\r\n                r:r,\r\n                c:c,\r\n                rs:mcInfo.rs,\r\n                cs:mcInfo.cs,\r\n            }\r\n\r\n            for(let ir=r;ir<r+mcInfo.rs;ir++){\r\n                for(let ic=c;ic<c+mcInfo.cs;ic++){\r\n                    if(ir==r && ic==c){\r\n                        continue;\r\n                    }\r\n                    if(data[ir][ic]==null){\r\n                        data[ir][ic] = {};\r\n                    }\r\n                    data[ir][ic][\"mc\"] = {\r\n                        r:r,\r\n                        c:c,\r\n                    }\r\n                }\r\n            }\r\n\r\n        }\r\n    },\r\n    loadOtherFile:function(file){\r\n        let _this = this;\r\n        // let sheetindexset = _this.checkLoadSheetIndex(file);\r\n        // let sheetindex = [];\r\n\r\n        // for(let i = 0; i < sheetindexset.length; i++){\r\n        //     let item = sheetindexset[i];\r\n\r\n        //     if(item == file[\"index\"]){\r\n        //         continue;\r\n        //     }\r\n\r\n        //     sheetindex.push(item);\r\n        // }\r\n\r\n        // for(let i = 0;i<sheetindex.length;i++){\r\n        //     let item = sheetindex[i];\r\n        //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]; \r\n        //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n        //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n        //         otherfile[\"load\"] = \"1\";\r\n        //     }\r\n        // }\r\n\r\n        for(let i = 0;i<Store.luckysheetfile.length;i++){\r\n            let otherfile = Store.luckysheetfile[i];\r\n            if(otherfile.index == file.index){\r\n                continue;\r\n            }\r\n            // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]; \r\n            if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                otherfile[\"load\"] = \"1\";\r\n            }\r\n        }\r\n    },\r\n    changeSheet: function(index, isPivotInitial, isNewSheet, isCopySheet) {\r\n        if(isEditMode()){\r\n            // alert(\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;        \r\n        \r\n        if(index==Store.currentSheetIndex){\r\n            return;\r\n        }\r\n\r\n        if(server.allowUpdate){\r\n            $(\"#luckysheet-cell-main #luckysheet-multipleRange-show\").empty();\r\n            server.multipleIndex = 0;\r\n        }\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(index)]\r\n        // \u94A9\u5B50 sheetCreateAfter\r\n        if (isNewSheet) {\r\n            method.createHookFunction('sheetCreateAfter', { sheet: file }); \r\n        }\r\n        // \u94A9\u5B50 sheetCopyAfter\r\n        if (isCopySheet) {\r\n            method.createHookFunction('sheetCopyAfter', { sheet: file }); \r\n        }\r\n        \r\n        // \u94A9\u5B50\u51FD\u6570\r\n        method.createHookFunction('sheetActivate', index, isPivotInitial, isNewSheet);\r\n\r\n        $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).hide();\r\n        $('#luckysheet-filter-selected-sheet' + index + ', #luckysheet-filter-options-sheet' + index).show();\r\n\r\n        _this.storeSheetParamALL();\r\n        _this.setCurSheet(index);\r\n\r\n  \r\n        if (!!file.isPivotTable) {\r\n            Store.luckysheetcurrentisPivotTable = true;\r\n            if (!isPivotInitial) {\r\n                pivotTable.changePivotTable(index);\r\n            }\r\n        }\r\n        else{\r\n            Store.luckysheetcurrentisPivotTable = false;\r\n            $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n            luckysheetsizeauto(false);\r\n        }\r\n\r\n        let load = file[\"load\"];\r\n        if (load != null) {        \r\n            let data = _this.buildGridData(file);\r\n            file.data = data;\r\n            // _this.loadOtherFile(file);\r\n            \r\n            _this.mergeCalculation(index);\r\n            _this.setSheetParam(true);\r\n            _this.showSheet();\r\n\r\n            setTimeout(function () {\r\n                formula.execFunctionGroup();\r\n                luckysheetrefreshgrid();\r\n                server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n            }, 1);\r\n        }\r\n        else {\r\n            let loadSheetUrl = server.loadSheetUrl;\r\n            if(loadSheetUrl == \"\" || Store.luckysheetcurrentisPivotTable || !!isNewSheet){\r\n                let data = _this.buildGridData(file);\r\n\r\n                file[\"data\"] = data;\r\n                file[\"load\"] = \"1\";\r\n\r\n                _this.loadOtherFile(file);\r\n\r\n                // let sheetindexset = _this.checkLoadSheetIndex(file);\r\n                // let sheetindex = [];\r\n        \r\n                // for(let i = 0; i < sheetindexset.length; i++){\r\n                //     let item = sheetindexset[i];\r\n        \r\n                //     if(item == file[\"index\"]){\r\n                //         continue;\r\n                //     }\r\n        \r\n                //     sheetindex.push(item);\r\n                // }\r\n\r\n                // for(let i = 0;i<sheetindex.length;i++){\r\n                //     let item = sheetindex[i];\r\n                //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]; \r\n                //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                //         otherfile[\"load\"] = \"1\";\r\n                //     }\r\n                // }\r\n\r\n                _this.mergeCalculation(index);\r\n                _this.setSheetParam();\r\n                _this.showSheet();\r\n\r\n                setTimeout(function () {\r\n                    _this.restoreCache();\r\n                    formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                    _this.restoreSheetAll(Store.currentSheetIndex);\r\n                    luckysheetrefreshgrid();\r\n                }, 1);\r\n\r\n                server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n            }\r\n            else{\r\n                $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n\r\n                let sheetindex = _this.checkLoadSheetIndex(file);\r\n                \r\n                $.post(loadSheetUrl, {\"gridKey\" : server.gridKey, \"index\": sheetindex.join(\",\")}, function (d) {\r\n                    let dataset = new Function(\"return \" + d)();\r\n                    file.celldata = dataset[index.toString()];\r\n                    let data = _this.buildGridData(file);\r\n\r\n                    setTimeout(function(){\r\n                        Store.loadingObj.close()\r\n                    }, 500);\r\n\r\n                    for(let item in dataset){\r\n                        if(item == index){\r\n                            continue;\r\n                        }\r\n\r\n                        let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n                        \r\n                        if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                            otherfile.celldata = dataset[item.toString()];\r\n                            otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                            otherfile[\"load\"] = \"1\";\r\n                        }\r\n                    }\r\n\r\n                    file[\"data\"] = data;\r\n                    file[\"load\"] = \"1\";\r\n                    _this.mergeCalculation(index);\r\n                    _this.setSheetParam();\r\n                    _this.showSheet();\r\n                   \r\n                    setTimeout(function () {\r\n                        _this.restoreCache();\r\n                        formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                        _this.restoreSheetAll(Store.currentSheetIndex);\r\n                        luckysheetrefreshgrid();\r\n                    }, 1);\r\n\r\n                    server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n                });\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-cell-main .luckysheet-datavisual-selection-set\").hide();\r\n        $(\"#luckysheet-datavisual-selection-set-\" + index).show();\r\n\r\n        //\u9690\u85CF\u5176\u4ED6sheet\u7684\u56FE\u8868\uFF0C\u663E\u793A\u5F53\u524Dsheet\u7684\u56FE\u8868 chartMix\r\n        renderChartShow(index);\r\n        \r\n        luckysheetFreezen.initialFreezen(index);\r\n        _this.restoreselect();\r\n    },\r\n    checkLoadSheetIndexToDataIndex:{},\r\n    checkLoadSheetIndex: function(file) {\r\n    \tlet calchain = formula.getAllFunctionGroup();//file.calcChain; //index\r\n    \tlet chart = file.chart; //dataSheetIndex\r\n    \tlet pivotTable = file.pivotTable; //pivotDataSheetIndex\r\n\r\n        let ret= [], cache = {};\r\n        \r\n        if(file.index in this.checkLoadSheetIndexToDataIndex){\r\n            return [];\r\n        }\r\n\r\n    \tret.push(file.index);\r\n        cache[file.index.toString()] = 1;\r\n        this.checkLoadSheetIndexToDataIndex[file.index] = 1;\r\n        if(calchain != null){\r\n            let dataIndexList = {};\r\n        \tfor(let i = 0; i < calchain.length; i++){\r\n        \t\tlet f = calchain[i];\r\n                let dataindex = f.index;\r\n                let formulaTxt = getcellFormula(f.r, f.c, dataindex);\r\n\r\n                if(formulaTxt==null){\r\n                    let file = Store.luckysheetfile[this.getSheetIndex(dataindex)];\r\n                    file.data = this.buildGridData(file);\r\n                    formulaTxt = getcellFormula(f.r, f.c, dataindex);\r\n\r\n                    if(formulaTxt==null){\r\n                        continue;\r\n                    }\r\n                }\r\n                \r\n                if(formulaTxt.indexOf(\"!\")==-1){\r\n                    // dataIndexList[dataindex] = 1;\r\n                    formula.addToSheetIndexList(formulaTxt, dataindex);\r\n                }\r\n                else if(formula.formulaContainSheetList!=null && formula.formulaContainSheetList[formulaTxt]!=null){\r\n                    for(let dataSheetIndex in formula.formulaContainSheetList[formulaTxt]){\r\n                        dataIndexList[dataSheetIndex] = 1;\r\n                    }\r\n                }\r\n                else{\r\n                    formula.functionParser(formulaTxt, (str)=>{\r\n                        formula.addToCellList(formulaTxt, str);\r\n                        if(str.indexOf(\"!\")>-1){\r\n                            let name = str.substr(0, str.indexOf('!'));\r\n                            // dataNameList[name] = true;\r\n    \r\n                            let sheet = this.getSheetByName(name);\r\n                            if(sheet!=null){\r\n                                let dataSheetIndex = sheet.index;\r\n                                dataIndexList[dataSheetIndex] = 1;\r\n    \r\n                                formula.addToSheetIndexList(formulaTxt, dataSheetIndex);\r\n                            }\r\n                        }\r\n                    });\r\n\r\n                    if(formula.formulaContainSheetList[formulaTxt]==null){\r\n                        // dataIndexList[dataindex] = 1;\r\n                        formula.addToSheetIndexList(formulaTxt, dataindex);\r\n                    }\r\n                }\r\n                \r\n                if(dataindex == null){\r\n                    continue;\r\n                }\r\n                \r\n        \t\t// if(cache[dataindex.toString()] == null){\r\n        \t\t// \t// ret.push(dataindex);\r\n                //     cache[dataindex.toString()] = 1;\r\n                //     this.checkLoadSheetIndexToDataIndex[dataindex] = 1;\r\n        \t\t// }\r\n            }\r\n            \r\n            for(let index in dataIndexList){\r\n                // let sheet = this.getSheetByName(n);\r\n                // if(sheet==null){\r\n                //     continue;\r\n                // }\r\n\r\n                // if(index == Store.currentSheetIndex){\r\n                //     continue;\r\n                // }\r\n\r\n                let dataindex = index;\r\n\r\n                if(cache[dataindex.toString()] == null){\r\n        \t\t\tret.push(dataindex);\r\n                    cache[dataindex.toString()] = 1;\r\n                    this.checkLoadSheetIndexToDataIndex[dataindex] = 1;\r\n        \t\t}\r\n            }\r\n        }\r\n\r\n        if(chart != null){\r\n            for(let i = 0; i < chart.length; i++){\r\n                let cc = chart[i];\r\n                let dataindex = cc.dataSheetIndex;\r\n\r\n                if(dataindex == null){\r\n                    continue;\r\n                }\r\n\r\n                if(cache[dataindex.toString()] == null){\r\n                    ret.push(dataindex);\r\n                    cache[dataindex.toString()] = 1;\r\n                }\r\n            } \r\n        }\r\n\r\n        if(pivotTable != null){\r\n            let dataindex = pivotTable.pivotDataSheetIndex;\r\n            \r\n    \t\tif(dataindex != null && cache[dataindex.toString()] == null){\r\n    \t\t\tret.push(dataindex);\r\n    \t\t\tcache[dataindex.toString()] = 1;\r\n    \t\t}\r\n        }\r\n\r\n    \treturn ret;\r\n    },\r\n    showSheet: function() {\r\n        // changeSheetContainerSize();\r\n        $(\"#luckysheet-cell-flow_0\").css({ \"width\": Store.ch_width, \"top\": \"-1px\" }); //width\u66F4\u65B0\r\n        $(\"#luckysheet-sheettable_0\").css({ \"width\": Store.ch_width - 1, \"height\": Store.rh_height });\r\n        $(\"#luckysheetrowHeader_0\").css(\"height\", Store.rh_height);\r\n        $(\"#luckysheet-cols-h-cells_0\").css(\"width\", Store.ch_width); //width\u66F4\u65B0\r\n\r\n        $(\"#luckysheet-scrollbar-x div\").width(Store.ch_width);\r\n        $(\"#luckysheet-scrollbar-y div\").height(Store.rh_height + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3);\r\n\r\n        //\u7B49\u5F85\u6EDA\u52A8\u6761dom\u5BBD\u9AD8\u8BA1\u7B97\u5B8C\u6210\u540E \u521D\u59CB\u5316\u8BE5\u8868\u683C\u6EDA\u52A8\u4F4D\u7F6E\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n\r\n        Store.scrollRefreshSwitch = false;\r\n        \r\n        if(file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0){\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"] * Store.zoomRatio);\r\n        }\r\n        else{\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n        }\r\n\r\n        if(file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0){\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"] * Store.zoomRatio);\r\n        }\r\n        else{\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n        }\r\n\r\n        setTimeout(() => {\r\n            Store.scrollRefreshSwitch = true;\r\n        }, 0);\r\n\r\n        zoomNumberDomBind(Store.zoomRatio);\r\n    },\r\n    setCurSheet: function(index) {\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i][\"index\"] == index) {\r\n                Store.luckysheetfile[i].status = 1;\r\n            }\r\n            else {\r\n                Store.luckysheetfile[i].status = 0;\r\n            }\r\n        }\r\n\r\n        Store.currentSheetIndex = index;\r\n    },\r\n    getSheetIndex: function(index) {\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i][\"index\"] == index) {\r\n                return i;\r\n            }\r\n        }\r\n\r\n        return null;\r\n    },\r\n    changeSheetExec: function(index, isPivotInitial, isNewSheet, isCopySheet) {\r\n        \r\n        let $sheet = $(\"#luckysheet-sheets-item\" + index);\r\n\r\n        window.luckysheet_getcelldata_cache = null;\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $sheet.addClass(\"luckysheet-sheets-item-active\").show();\r\n\r\n        cleargridelement();\r\n        this.changeSheet(index, isPivotInitial, isNewSheet, isCopySheet);\r\n        \r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n        if (formula.rangestart) {\r\n            formula.createRangeHightlight();\r\n        }\r\n        \r\n        this.sheetBarShowAndHide(index);\r\n    },\r\n    sheetArrowShowAndHide(){\r\n        const $wrap = $('#luckysheet-sheet-container-c');\r\n        if (!$wrap.length) return;\r\n        var sw = $wrap[0].scrollWidth;\r\n        var w = Math.ceil($wrap.width());\r\n\r\n        if (sw > w) {\r\n            if(luckysheetConfigsetting.showsheetbarConfig.sheet){\r\n                $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"inline-block\");\r\n                $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n            }\r\n            \r\n        }\r\n        else{\r\n            $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"none\");\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        }\r\n    },\r\n    sheetBarShowAndHide(index){\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n\r\n        if(index!=null){\r\n            let $sheet = $(\"#luckysheet-sheets-item\" + index);\r\n            $c.scrollLeft($sheet.offset().left);\r\n        }\r\n\r\n\r\n        let c_width = $c.width(), c_srollwidth = $c[0].scrollWidth, scrollLeft = $c.scrollLeft();\r\n\r\n        if (scrollLeft <= 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        }\r\n        else {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n        }\r\n\r\n        if (c_width + scrollLeft >= c_srollwidth) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").hide();\r\n        }\r\n        else {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").show();\r\n        }\r\n    },\r\n    delChart: function(chart_id, sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            file.chart = [];\r\n        }\r\n        else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == chart_id) {\r\n                    Store.luckysheetfile[index].chart.splice(i, 1);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    },\r\n    saveChart: function(json) {//\u91C7\u7528chartMix store\u5B58\u50A8\uFF0C\u5F03\u7528Store.luckysheetfile\u5B58\u50A8\uFF0C\u9632\u6B62\u91CD\u590D\u5B58\u50A8\r\n        let index = this.getSheetIndex(json.sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            file.chart = [];\r\n            file.chart.push(json);\r\n        }\r\n        else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == json.chart_id) {\r\n                    let old = $.extend(true, {}, file.chart[i]);\r\n                    file.chart[i] = $.extend(true, {}, old, json);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            file.chart.push(json);\r\n        }\r\n    },\r\n    getChart: function(sheetIndex, chart_id) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            return null;\r\n        }\r\n        else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == chart_id) {\r\n                    return file.chart[i];\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    },\r\n    getRangetxt: function(sheetIndex, range, currentIndex) {\r\n        let sheettxt = \"\";\r\n\r\n        if (currentIndex == null) {\r\n            currentIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (sheetIndex != currentIndex) {\r\n            sheettxt = Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name + \"!\";\r\n        }\r\n\r\n        let row0 = range[\"row\"][0], row1 = range[\"row\"][1];\r\n        let column0 = range[\"column\"][0], column1 = range[\"column\"][1];\r\n\r\n        if (row0 == null && row1 == null) {\r\n            return sheettxt + chatatABC(column0) + \":\" + chatatABC(column1);\r\n        }\r\n        else if (column0 == null && column1 == null) {\r\n            return sheettxt + (row0 + 1) + \":\" + (row1 + 1);\r\n        }\r\n        else {\r\n            if (column0 == column1 && row0 == row1) {\r\n                return sheettxt + chatatABC(column0) + (row0 + 1);\r\n            }\r\n            else {\r\n                return sheettxt + chatatABC(column0) + (row0 + 1) + \":\" + chatatABC(column1) + (row1 + 1);\r\n            }\r\n        }\r\n    },\r\n    getSheetName: function(sheetIndex) {\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name;\r\n    },\r\n    getSheetMerge: function() {\r\n        if(Store.config.merge == null){\r\n        \treturn null;\r\n        }\r\n\r\n        return Store.config.merge;\r\n    },\r\n    getSheetData: function(sheetIndex) {\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].data;\r\n    },\r\n    getSheetConfig: function(sheetIndex) {\r\n        let _this = this;\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let config = Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config;\r\n\r\n        if(config == null){\r\n        \tStore.luckysheetfile[_this.getSheetIndex(sheetIndex)].config = {};\r\n        }\r\n\r\n        return Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config;\r\n    },\r\n    restoreFilter: function(sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        // if($('#luckysheet-filter-selected-sheet' + sheetIndex).length > 0 || file.filter_select == null || JSON.stringify(file.filter_select) == \"{}\"){\r\n        //     if(file.config != null && file.config.rowhidden != null){\r\n        //         file.config.rowhidden =  {};\r\n        //         Store.config = file.config;\r\n\r\n        //         jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length,false);\r\n        //     }\r\n\r\n        //     return;\r\n        // }\r\n\r\n        if(getObjType(file.filter_select) == \"string\"){\r\n            file.filter_select = JSON.parse(file.filter_select);\r\n        }\r\n\r\n        if(file.filter_select == null || file.filter_select.row == null || file.filter_select.column == null){\r\n            return;\r\n        }\r\n\r\n        createFilterOptions(file.filter_select);\r\n\r\n        if(getObjType(file.filter) != \"object\"){\r\n            if(file.filter != null && getObjType(file.filter) == \"string\"){ \r\n                file.filter = JSON.parse(file.filter);\r\n            }\r\n        }\r\n\r\n        let rowhidden = {};\r\n        if(file.config != null && file.config.rowhidden != null){\r\n            rowhidden =  file.config.rowhidden;\r\n        }\r\n\r\n        $(\"#luckysheet-filter-options-sheet\" + sheetIndex + \" .luckysheet-filter-options\").each(function(i){\r\n            if(file.filter == null){\r\n                return false;\r\n            }\r\n\r\n            let $top = $(this);\r\n            let item = file.filter[i];\r\n\r\n            if(item == null){\r\n                return true;\r\n            }\r\n\r\n            if(getObjType(item) != \"object\"){\r\n                item = JSON.parse(item);\r\n            }\r\n\r\n            labelFilterOptionState($top, item.optionstate, item.rowhidden, item.caljs, false, item.st_r, item.ed_r, item.cindex, item.st_c, item.ed_c);\r\n\r\n            rowhidden = $.extend(true, rowhidden, item.rowhidden);\r\n        });\r\n\r\n        if(file.config == null){\r\n            file.config = {};\r\n        }\r\n\r\n        file.config[\"rowhidden\"] = rowhidden;\r\n        Store.config = file.config;\r\n\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length,false);\r\n    },\r\n    restorePivot: function(sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (!file.isPivotTable) {\r\n            return;\r\n        }\r\n\r\n        pivotTable.getCellData(sheetIndex);\r\n        pivotTable.initialPivotManage(true);\r\n        pivotTable.refreshPivotTable(false);\r\n    },\r\n    restoreSheetAll: function(sheetIndex) {\r\n        let _this= this;\r\n        _this.restorePivot(sheetIndex);\r\n        _this.restoreFilter(sheetIndex);\r\n        _this.restoreFreezen(sheetIndex);\r\n    },\r\n    restoreFreezen: function(sheetIndex) {\r\n        luckysheetFreezen.initialFreezen(sheetIndex);\r\n    },\r\n    restoreCache: function() {\r\n        let _this = this;\r\n        \r\n        let data = _this.CacheNotLoadControll;\r\n        _this.CacheNotLoadControll = [];\r\n\r\n        if(data.length == 0){\r\n            return;\r\n        }\r\n\r\n        for(let i = 0; i < data.length; i++){\r\n            let item = data[i];\r\n            _this.execCache(item);\r\n        }\r\n    },\r\n    CacheNotLoadControll:[],\r\n    execCache: function(item) {\r\n        let _this = this;\r\n\r\n        let type = item.t;\r\n        let index = item.i;\r\n        let value = item.v;\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(index)];\r\n\r\n        if(type == \"sha\"){\r\n            Store.luckysheetfile.push(value);\r\n        }\r\n        else if(type == \"shc\"){\r\n            let copyjson = $.extend(true, {}, Store.luckysheetfile[_this.getSheetIndex(value.copyindex)]);\r\n            copyjson.index = index;\r\n            Store.luckysheetfile.push(copyjson);\r\n        }\r\n        else if(type == \"shd\"){\r\n            Store.luckysheetfile.splice(value.deleIndex, 1);\r\n        }\r\n        else if(type == \"shr\"){\r\n            for(let pos in value){\r\n                Store.luckysheetfile[_this.getSheetIndex(pos)].order = value[pos];\r\n            }\r\n        }\r\n\r\n        if((file == null || file.load != \"1\") && !(type in {\"sha\":0, \"shc\":0, \"shd\":0, \"shr\":0}) ){\r\n            _this.CacheNotLoadControll.push(item);\r\n            return;\r\n        }\r\n\r\n        if(type == \"v\"){\r\n            let r = item.r, c = item.c, v = item.v;\r\n            let data = _this.getSheetData(index);\r\n            file.data[r][c] = v;\r\n        }\r\n        else if(type == \"fc\"){\r\n            let op = item.op, pos = item.pos;\r\n\r\n            if(getObjType(value) != \"object\"){\r\n                value = new Function(\"return \" + value)();\r\n            }\r\n\r\n            let r = value.r, c = value.c;\r\n\r\n            if(op == \"del\" ){\r\n                formula.delFunctionGroup(r, c, index);\r\n            }\r\n            else {\r\n                formula.insertUpdateFunctionGroup(r, c, index);\r\n            }\r\n        }\r\n        else if(type == \"cg\"){\r\n            let v = value, k = item.k;\r\n            let config1 = _this.getSheetConfig(index);\r\n            \r\n            if(!(k in config1)){\r\n                config1[k] = {};\r\n            }\r\n\r\n            for(let key in v){\r\n                config1[k][key] = v[key];\r\n            }\r\n\r\n            Store.config = config1;\r\n        }\r\n        else if(type == \"f\"){\r\n            let v = value, op = item.op, pos = item.pos;\r\n            let filter = file.filter;\r\n\r\n            if(filter == null){\r\n                filter = {};\r\n            }\r\n\r\n            if(op == \"upOrAdd\"){\r\n                filter[pos] =  v;\r\n            }\r\n            else if(op == \"del\"){\r\n                delete filter[pos];\r\n            }\r\n        }\r\n        else if(type == \"fsc\"){\r\n            file.filter = null;\r\n            file.filter_select = null;\r\n        }\r\n        else if(type == \"fsr\"){\r\n            let v = value;\r\n            file.filter = v.filter;\r\n            file.filter_select = v.filter_select;\r\n        }\r\n        else if(type == \"sh\"){\r\n            let op = item.op, cur = item.cur, v = value;       \r\n            if(op == \"hide\"){\r\n                file.status = 0;\r\n                Store.luckysheetfile[_this.getSheetIndex(cur)].status = 1;\r\n            }\r\n            else if(op == \"show\"){\r\n                for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n                    Store.luckysheetfile[i].status = 0;\r\n                }\r\n                file.status = 1;\r\n            }\r\n        }\r\n        else if(type == \"all\"){\r\n            let k = item.k, s = item.s;\r\n            if(s && getObjType(value) != \"object\"){\r\n                file[k] = JSON.stringify(value);\r\n            }\r\n            else{\r\n                file[k] = value;\r\n            }\r\n        }\r\n        else if(type == \"c\"){\r\n            let op = item.op, cid = item.cid;\r\n\r\n            if(op == \"add\"){\r\n                file.chart.push(value);\r\n            }\r\n            else if(op == \"xy\" || op == \"wh\" || op == \"update\"){\r\n                for(let i = 0; i < file.chart.length; i++){\r\n                    if(file.chart[i].chart_id == cid){\r\n                        for(let item in file.chart[i]){\r\n                            for(let vitem in value){\r\n                                if(item == vitem){\r\n                                    file.chart[i][item] = value[vitem];\r\n                                }\r\n                            }\r\n                        }\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(op == \"del\"){\r\n                for(let i = 0; i < file.chart.length; i++){\r\n                    if(file.chart[i].chart_id == cid){\r\n                        file.chart.splice(i, 1); \r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"drc\"){\r\n            let rc = item.rc, index = value.index, len = value.len;\r\n            let celldata = file.celldata;\r\n\r\n            if(rc == \"r\"){\r\n                for(let i = 0; celldata.length == 0; i++){\r\n                    let cell = celldata[i];\r\n                    if(cell.r >= index && cell.r < index + len){\r\n                        delete celldata[i];\r\n                    }\r\n                    else if(cell.r >= index + len){\r\n                        cell.r -= len;\r\n                    }\r\n                }\r\n\r\n                file.row -= len;\r\n            }\r\n            else{\r\n                for(let i = 0; celldata.length == 0; i++){\r\n                    let cell = celldata[i];\r\n                    if(cell.c >= index && cell.c < index + len){\r\n                        delete celldata[i];\r\n                    }\r\n                    else if(cell.c >= index + len){\r\n                        cell.c -= len;\r\n                    }\r\n                }\r\n\r\n                file.column -= len;\r\n            }\r\n\r\n            let ret = [];\r\n            for(let i = 0; i < celldata.length; i++){\r\n                if(celldata[i] != null){\r\n                    ret.push(celldata[i]);\r\n                }\r\n            }\r\n            file.celldata = ret;\r\n            \r\n            let mtype, mst, med;\r\n            if(rc == \"r\"){\r\n                mtype = \"row\";\r\n            }\r\n            else{\r\n                mtype = \"column\";\r\n            }\r\n            mst = index;\r\n            med = index + len - 1;\r\n\r\n            luckysheetdeletetable(mtype, mst, med, true);\r\n        }\r\n        else if(type==\"arc\"){\r\n            let rc = item.rc, index = value.index, len = value.len;\r\n            let celldata = file.celldata;\r\n\r\n            if(rc == \"r\"){\r\n                for(let i = 0; i < celldata.length; i++){\r\n                    let cell = celldata[i];\r\n                    if(cell.r > index){\r\n                        cell.r += len;\r\n                    }\r\n                }\r\n\r\n                file.row += len;\r\n            }\r\n            else{\r\n                for(let i = 0; i < celldata.length; i++){\r\n                    let cell = celldata[i];\r\n                    if(cell.c > index){\r\n                        cell.c += len;\r\n                    }\r\n                }\r\n\r\n                file.column += len;\r\n            }\r\n\r\n            let mtype;\r\n            if(rc == \"r\"){\r\n                mtype = \"row\";\r\n            }\r\n            else{\r\n                mtype = \"column\";\r\n            }\r\n            \r\n            luckysheetextendtable(mtype, index, len, true);\r\n        }\r\n        else if(type == \"na\"){\r\n            server.saveParam(\"na\", null, value);\r\n        }\r\n        else if(type == \"thumb\"){\r\n            setTimeout(function(){\r\n                _this.imageRequest();\r\n            }, 2000);\r\n        }\r\n    }\r\n}\r\n\r\nexport default sheetmanage;\r\n", "import { replaceHtml, getObjType, chatatABC, ABCatNum, luckysheetfontformat } from '../utils/util';\r\nimport { getSheetIndex, getRangetxt, getluckysheetfile } from '../methods/get';\r\nimport { setluckysheetfile } from '../methods/set';\r\nimport { luckyColor } from '../controllers/constant';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport menuButton from '../controllers/menuButton';\r\nimport server from '../controllers/server';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport { checkProtectionLocked, checkProtectionCellHidden } from '../controllers/protection';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport { seletedHighlistByindex, luckysheet_count_show } from '../controllers/select';\r\nimport { isRealNum, isRealNull, valueIsError, isEditMode } from './validate';\r\nimport { isdatetime, isdatatype } from './datecontroll';\r\nimport { getCellTextSplitArr, getCellTextInfo } from '../global/getRowlen';\r\nimport { getcellvalue, getcellFormula, getInlineStringNoStyle, getOrigincell } from './getdata';\r\nimport { setcellvalue } from './setdata';\r\nimport { genarate, valueShowEs } from './format';\r\nimport editor from './editor';\r\nimport tooltip from './tooltip';\r\nimport { rowLocation, colLocation, colLocationByIndex, mouseposition } from './location';\r\nimport { luckysheetRangeLast } from './cursorPos';\r\nimport { jfrefreshgrid } from './refresh';\r\nimport { isInlineStringCell, convertSpanToShareString } from '../controllers/inlineString';\r\n// import luckysheet_function from '../function/luckysheet_function';\r\n// import functionlist from '../function/functionlist';\r\nimport { luckysheet_compareWith, luckysheet_getarraydata, luckysheet_getcelldata, luckysheet_parseData, luckysheet_getValue, luckysheet_indirect_check, luckysheet_indirect_check_return, luckysheet_offset_check, luckysheet_calcADPMM, luckysheet_getSpecialReference } from '../function/func';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport json from './json';\r\nimport method from './method';\r\n\r\nconst luckysheetformula = {\r\n    error: {\r\n        v: \"#VALUE!\",    //\u9519\u8BEF\u7684\u53C2\u6570\u6216\u8FD0\u7B97\u7B26\r\n        n: \"#NAME?\",     //\u516C\u5F0F\u540D\u79F0\u9519\u8BEF\r\n        na: \"#N/A\",      //\u51FD\u6570\u6216\u516C\u5F0F\u4E2D\u6CA1\u6709\u53EF\u7528\u6570\u503C\r\n        r: \"#REF!\",      //\u5220\u9664\u4E86\u7531\u5176\u4ED6\u516C\u5F0F\u5F15\u7528\u7684\u5355\u5143\u683C\r\n        d: \"#DIV/0!\",    //\u9664\u6570\u662F0\u6216\u7A7A\u5355\u5143\u683C\r\n        nm: \"#NUM!\",     //\u5F53\u516C\u5F0F\u6216\u51FD\u6570\u4E2D\u67D0\u4E2A\u6570\u5B57\u6709\u95EE\u9898\u65F6\r\n        nl: \"#NULL!\",    //\u4EA4\u53C9\u8FD0\u7B97\u7B26\uFF08\u7A7A\u683C\uFF09\u4F7F\u7528\u4E0D\u6B63\u786E\r\n        sp: \"#SPILL!\"    //\u6570\u7EC4\u8303\u56F4\u6709\u5176\u5B83\u503C\r\n    },\r\n    errorInfo: function (err) {\r\n        return err;\r\n    },\r\n    errorParamCheck: function (thisp, data, i) {\r\n        let type, require;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        if (i < thisp.length) {\r\n            type = thisp[i].type;\r\n            require = thisp[i].require;\r\n        }\r\n        else {\r\n            type = thisp[thisp.length - 1].type;\r\n            require = thisp[thisp.length - 1].require;\r\n        }\r\n\r\n        if (require == \"o\" && (data == null || data == \"\")) {\r\n            return [true, locale_formulaMore.tipSuccessText];\r\n        }\r\n\r\n        if (type.indexOf(\"all\") > -1) {\r\n            return [true, locale_formulaMore.tipSuccessText];\r\n        }\r\n        else {\r\n            if (type.indexOf(\"range\") > -1 && (getObjType(data) == \"object\" || getObjType(data) == \"array\")) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"number\") > -1 && (isRealNum(data) || getObjType(data) == \"boolean\")) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"string\") > -1 && getObjType(data) == \"string\") {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"date\") > -1 && isdatetime(data)) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            return [false, locale_formulaMore.tipParamErrorText];\r\n        }\r\n    },\r\n    getPureValueByData: function (data) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let output = [];\r\n\r\n        if (getObjType(data) == \"array\") {\r\n            if (getObjType(data[0]) == \"array\") {\r\n                for (let r = 0; r < data.length; r++) {\r\n                    let row = [];\r\n\r\n                    for (let c = 0; c < data[0].length; c++) {\r\n                        let cell = data[r][c];\r\n\r\n                        if (getObjType(cell) == \"object\") {\r\n                            row.push(cell.v);\r\n                        }\r\n                        else {\r\n                            row.push(cell);\r\n                        }\r\n                    }\r\n\r\n                    output.push(row);\r\n                }\r\n            }\r\n            else {\r\n                for (let i = 0; i < data.length; i++) {\r\n                    let cell = data[i];\r\n\r\n                    if (getObjType(cell) == \"object\") {\r\n                        output.push(cell.v);\r\n                    }\r\n                    else {\r\n                        output.push(cell);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            let cell = data;\r\n\r\n            if (getObjType(cell) == \"object\") {\r\n                output.push(cell.v);\r\n            }\r\n            else {\r\n                output.push(cell);\r\n            }\r\n        }\r\n\r\n        return output;\r\n    },\r\n    //sparklines\u6DFB\u52A0\r\n    readCellDataToOneArray: function (rangeValue) {\r\n        let _this = this;\r\n\r\n        if (rangeValue == null) {\r\n            return [];\r\n        }\r\n\r\n        if (getObjType(rangeValue) != \"object\") {\r\n            return [rangeValue];\r\n        }\r\n\r\n        let dataformat = [];\r\n        let data = [];\r\n\r\n        if (rangeValue != null && rangeValue.data != null) {\r\n            data = rangeValue.data;\r\n        }\r\n        else if (rangeValue != null && !isRealNull(rangeValue.v)) {\r\n            return [rangeValue.v];\r\n        }\r\n        else {\r\n            return [];\r\n        }\r\n\r\n        //\u9002\u914Dexcel\u7684\u52A8\u6001\u6570\u7EC4\u683C\u5F0F\uFF0C{1\uFF0C2\uFF0C3\uFF0C4\uFF0C5}\u6216\u8005{{1\uFF0C2\uFF0C3}\uFF0C{4\uFF0C5\uFF0C6}\uFF0C{7\uFF0C8\uFF0C9}}\r\n        if (getObjType(data) == \"array\") {\r\n            data = _this.getPureValueByData(data);\r\n        }\r\n        else if (getObjType(data) == \"object\") {\r\n            data = data.v;\r\n\r\n            return [data];\r\n        }\r\n        else {\r\n            if (/\\{.*?\\}/.test(data)) {\r\n                data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n            }\r\n\r\n            data = new Function(\"return \" + data)();\r\n        }\r\n\r\n        //\u628A\u4E8C\u7EF4\u6570\u7EC4\u8F6C\u6362\u4E3A\u4E00\u7EF4\u6570\u7EC4\uFF0Csparklines\u8981\u6C42\u6570\u636E\u683C\u5F0F\u4E3A\u4E00\u7EF4\u6570\u7EC4\r\n        //let dataformat = [];\r\n        if (getObjType(data[0]) == \"array\") {\r\n            for (let i = 0; i < data.length; i++) {\r\n                dataformat = dataformat.concat(data[i]);\r\n            }\r\n        }\r\n        else {\r\n            dataformat = data;\r\n        }\r\n\r\n        return dataformat;\r\n    },\r\n    //sparklines\u6DFB\u52A0\r\n    //\u83B7\u5F97\u51FD\u6570\u91CC\u67D0\u4E2A\u53C2\u6570\u7684\u503C\uFF0C\u4F7F\u7528\u6B64\u51FD\u6570\u9700\u8981\u5728\u51FD\u6570\u4E2D\u6267\u884Cluckysheet_getValue\u65B9\u6CD5\r\n    getValueByFuncData: function (value, arg) {\r\n        if (value == null) {\r\n            return null;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        if (getObjType(value) == \"array\") {\r\n            if (arg == \"avg\") {\r\n                return luckysheet_function.AVERAGE.f.apply(luckysheet_function.AVERAGE, value);\r\n            }\r\n            else if (arg == \"sum\") {\r\n                return luckysheet_function.SUM.f.apply(luckysheet_function.SUM, value);\r\n            }\r\n            else {\r\n                if (getObjType(value[0]) == \"object\") {\r\n                    return luckysheet.mask.getValueByFormat(value[0]);\r\n                }\r\n                else {\r\n                    return value[0];\r\n                }\r\n            }\r\n        }\r\n        else if (getObjType(value) == \"object\") {\r\n            return luckysheet.mask.getValueByFormat(value);\r\n        }\r\n        else {\r\n            return value;\r\n        }\r\n    },\r\n    //sparklines\u6DFB\u52A0\r\n    sparklinesColorMap: function (args, len) {\r\n        let _this = this;\r\n        let colorLists = null;\r\n\r\n        if (len == null) {\r\n            len = 5;\r\n        }\r\n\r\n        let index = 0;\r\n\r\n        if (args.length > len) {\r\n            for (let i = len; i < args.length; i++) {\r\n                let colorMap = args[i];\r\n                let colorListArray = _this.readCellDataToOneArray(colorMap);\r\n\r\n                for (let a = 0; a < colorListArray.length; a++) {\r\n                    let ca = colorListArray[a];\r\n\r\n                    if (ca.indexOf(\":\") > -1) {\r\n                        if (!colorLists) {\r\n                            colorLists = {};\r\n                        }\r\n\r\n                        let calist = ca.split(\":\");\r\n\r\n                        if (calist.length == 2) {\r\n                            colorLists[calist[0]] = calist[1];\r\n                        }\r\n                        else if (calist.length > 1) {\r\n                            colorLists[calist[0] + \":\" + calist[1]] = calist[2];\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (!colorLists) {\r\n                            colorLists = [];\r\n                        }\r\n\r\n                        colorLists.push(ca);\r\n                    }\r\n                }\r\n\r\n                index++;\r\n            }\r\n        }\r\n\r\n        return colorLists;\r\n    },\r\n    //sparklines\u6DFB\u52A0\r\n    colorList: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\", \"#dc69aa\", \"#07a2a4\", \"#9a7fd1\", \"#588dd5\", \"#f5994e\", \"#c05050\", \"#59678c\", \"#c9ab00\", \"#7eb00a\", \"#6f5553\", \"#c14089\"],\r\n    classlist: {\r\n        \"province\": {\r\n            11: \"\u5317\u4EAC\",\r\n            12: \"\u5929\u6D25\",\r\n            13: \"\u6CB3\u5317\",\r\n            14: \"\u5C71\u897F\",\r\n            15: \"\u5185\u8499\u53E4\",\r\n            21: \"\u8FBD\u5B81\",\r\n            22: \"\u5409\u6797\",\r\n            23: \"\u9ED1\u9F99\u6C5F\",\r\n            31: \"\u4E0A\u6D77\",\r\n            32: \"\u6C5F\u82CF\",\r\n            33: \"\u6D59\u6C5F\",\r\n            34: \"\u5B89\u5FBD\",\r\n            35: \"\u798F\u5EFA\",\r\n            36: \"\u6C5F\u897F\",\r\n            37: \"\u5C71\u4E1C\",\r\n            41: \"\u6CB3\u5357\",\r\n            42: \"\u6E56\u5317\",\r\n            43: \"\u6E56\u5357\",\r\n            44: \"\u5E7F\u4E1C\",\r\n            45: \"\u5E7F\u897F\",\r\n            46: \"\u6D77\u5357\",\r\n            50: \"\u91CD\u5E86\",\r\n            51: \"\u56DB\u5DDD\",\r\n            52: \"\u8D35\u5DDE\",\r\n            53: \"\u4E91\u5357\",\r\n            54: \"\u897F\u85CF\",\r\n            61: \"\u9655\u897F\",\r\n            62: \"\u7518\u8083\",\r\n            63: \"\u9752\u6D77\",\r\n            64: \"\u5B81\u590F\",\r\n            65: \"\u65B0\u7586\",\r\n            71: \"\u53F0\u6E7E\",\r\n            81: \"\u9999\u6E2F\",\r\n            82: \"\u6FB3\u95E8\",\r\n            91: \"\u56FD\u5916\"\r\n        }\r\n    },\r\n    oldvalue: null,\r\n    dontupdate: function () {\r\n        let _this = this;\r\n        Store.luckysheetCellUpdate.length = 0; //clear array\r\n        $(\"#luckysheet-functionbox-cell, #luckysheet-rich-text-editor\").html(_this.oldvalue);\r\n        _this.cancelNormalSelected();\r\n        if (_this.rangetosheet != Store.currentSheetIndex) {\r\n            sheetmanage.changeSheetExec(_this.rangetosheet);\r\n        }\r\n    },\r\n    xssDeal: function(str) {\r\n        if (typeof str !== 'string') return str;\r\n        return str.replace(/<script>/g, '&lt;script&gt;').replace(/<\\/script>/, '&lt;/script&gt;');\r\n    },\r\n    fucntionboxshow: function(r, c) {\r\n\r\n        if (!checkProtectionCellHidden(r, c, Store.currentSheetIndex)) {\r\n            $(\"#luckysheet-functionbox-cell\").html(\"\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let d = Store.flowdata;\r\n        let value = \"\";\r\n        // && d[r][c].v != null\r\n        if (d[r] != null && d[r][c] != null) {\r\n            let cell = $.extend(true, {}, d[r][c]);\r\n\r\n            if (isInlineStringCell(cell)) {\r\n                value = getInlineStringNoStyle(r, c);\r\n            }\r\n            else if (cell.f != null) {\r\n                value = getcellvalue(r, c, d, \"f\");\r\n            }\r\n            else {\r\n                value = valueShowEs(r, c, d);\r\n            }\r\n        }\r\n        value = this.xssDeal(value);\r\n        _this.oldvalue = value;\r\n        $(\"#luckysheet-functionbox-cell\").html(value);\r\n    },\r\n    //\u83B7\u5F97\u67D0\u4E2A\u5355\u5143\u683C\u6216\u533A\u57DF\u7684\u504F\u79FB\u4E00\u5B9A\u8DDD\u79BB\u540E\u7684\u5355\u5143\u683C( Sheet1!B6:C8 \u683C\u5F0F)\r\n    cellOffset: function (range, rows, cols, height, width) {// \u53C2\u6570\uFF1Arange or cell , rows,cols,height,width\r\n        let startCell = range.startCell;\r\n        let rowl = range.rowl;\r\n        let coll = range.coll;\r\n        let startCellRow = parseInt(startCell.replace(/[^0-9]/g, \"\"));\r\n        let startCellCol = ABCatNum(startCell.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n        let row = [], col = [], offsetRange;\r\n        row[0] = startCellRow + rows;\r\n        col[0] = startCellCol + cols;\r\n\r\n        row[1] = row[0] + height - 1;\r\n        col[1] = col[0] + width - 1;\r\n\r\n        col[0] = chatatABC(col[0]);\r\n        col[1] = chatatABC(col[1]);\r\n\r\n        let cellF = col[0] + row[0];\r\n        let cellL = col[1] + row[1];\r\n\r\n        if (cellF == cellL) {\r\n            offsetRange = range.sheetName + \"!\" + cellF;\r\n        }\r\n        else {\r\n            offsetRange = range.sheetName + \"!\" + cellF + \":\" + cellL;\r\n        }\r\n\r\n        return offsetRange;\r\n    },\r\n    parseDatetoNum: function (date) { //\u51FD\u6570\u4E2D\u83B7\u53D6\u5230\u65F6\u95F4\u683C\u5F0F\u6216\u8005\u6570\u5B57\u5F62\u5F0F\u7EDF\u4E00\u8F6C\u5316\u4E3A\u6570\u5B57\u8FDB\u884C\u8FD0\u7B97\r\n        let _this = this;\r\n\r\n        if (typeof (date) == \"object\" && typeof date.v == \"number\") {\r\n            date = date.v;\r\n        }\r\n        else if (isdatatype(date) == \"num\") {\r\n            date = parseFloat(date);\r\n        }\r\n        else if (isdatatype(date) == \"date\") {\r\n            date = genarate(date)[2];\r\n        }\r\n        else {\r\n            return _this.error.v;\r\n        }\r\n\r\n        return date;\r\n    },\r\n    //\u83B7\u53D6\u4E00\u7EF4\u6570\u7EC4\r\n    getRangeArray: function (range) {\r\n        let rangeNow = [];\r\n        let fmt = \"General\";\r\n\r\n        if (range.length == 1) { //\u4E00\u884C\r\n            for (let c = 0; c < range[0].length; c++) {\r\n                if (range[0][c] != null && range[0][c].v) {\r\n                    rangeNow.push(range[0][c].v);\r\n                    let f = range[0][c].ct.fa;\r\n                    fmt = (fmt == \"General\") ? f : fmt;\r\n                }\r\n                else {\r\n                    //\u82E5\u5355\u5143\u683C\u4E3Anull\u6216\u4E3A\u7A7A\uFF0C\u6B64\u5904\u63A8\u5165null\uFF08\u5F85\u8003\u8651\u662F\u5426\u4F7F\u7528\"null\"\uFF09\r\n                    rangeNow.push(null);\r\n                }\r\n            }\r\n        }\r\n        else if (range[0].length == 1) { //\u4E00\u5217\r\n            for (let r = 0; r < range.length; r++) {\r\n                if (range[r][0] != null && range[r][0].v) {\r\n                    rangeNow.push(range[r][0].v);\r\n                    let f = range[r][0].ct.fa;\r\n                    fmt = (fmt == \"General\") ? f : fmt;\r\n                }\r\n                else {\r\n                    rangeNow.push(null);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            for (let r = 0; r < range.length; r++) {\r\n                for (let c = 0; c < range[r].length; c++) {\r\n                    if (range[r][c] != null && range[r][c].v) {\r\n                        rangeNow.push(range[r][c].v);\r\n                        let f = range[r][c].ct.fa;\r\n                        fmt = (fmt == \"General\") ? f : fmt;\r\n                    }\r\n                    else {\r\n                        rangeNow.push(null);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        range = rangeNow;\r\n\r\n        return [range, fmt];\r\n    },\r\n    //\u83B7\u53D6\u4E8C\u7EF4\u6570\u7EC4\uFF1Aqksheet\u683C\u5F0F[[{v,m,ct}] ==> [1]\r\n    getRangeArrayTwo: function (range) {\r\n        let data = $.extend(true, [], range);\r\n\r\n        if (data.length == 1) { //\u4E00\u884C\r\n            for (let c = 0; c < data[0].length; c++) {\r\n                if (data[0][c] instanceof Object) {\r\n                    if (data[0][c] != null && data[0][c] instanceof Object && !!data[0][c].m) {\r\n                        data[0][c] = data[0][c].m;\r\n                    }\r\n                    else {\r\n                        if (data[0][c] != null && data[0][c] instanceof Object && !!data[0][c].v) {\r\n                            data[0][c] = data[0][c].v;\r\n                        }\r\n                        else {\r\n                            data[0][c] = null;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (data[0].length == 1) { //\u4E00\u5217\r\n            for (let r = 0; r < data.length; r++) {\r\n                if (data[r][0] instanceof Object) {\r\n                    if (data[r][0] != null && data[r][0] instanceof Object && !!data[r][0].m) {\r\n                        data[r][0] = data[r][0].m;\r\n                    }\r\n                    else {\r\n                        if (data[r][0] != null && data[r][0] instanceof Object && !!data[r][0].v) {\r\n                            data[r][0] = data[r][0].v;\r\n                        }\r\n                        else {\r\n                            data[r][0] = null;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            for (let r = 0; r < data.length; r++) {\r\n                for (let c = 0; c < data[r].length; c++) {\r\n                    if (data[r][c] instanceof Object) {\r\n                        if (data[r][c] != null && data[r][c] instanceof Object && !!data[r][c].m) {\r\n                            data[r][c] = data[r][c].m;\r\n                        }\r\n                        else {\r\n                            if (data[r][c] != null && data[r][c] instanceof Object && !!data[r][c].v) {\r\n                                data[r][c] = data[r][c].v;\r\n                            }\r\n                            else {\r\n                                data[r][c] = null;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return data;\r\n    },\r\n    isWildcard: function (a, b) { //\u6B63\u5219\u5339\u914D\u901A\u914D\u7B26: * ? ~* ~?,a\u76EE\u6807\u53C2\u6570\uFF0Cb\u901A\u914D\u7B26\r\n        let _this = this;\r\n\r\n        a = a.toString();\r\n        b = b.toString();\r\n\r\n        if (_this.isCompareOperator(b).flag) {\r\n            b = _this.isCompareOperator(b).num;\r\n        }\r\n\r\n        let str = \"\";\r\n        for (let i = 0; i < b.length; i++) {\r\n            let v = b.charAt(i);\r\n\r\n            if (v == \"*\") {\r\n                str += \".*\";\r\n            }\r\n            else if (v == \"?\") {\r\n                str += \".\";\r\n            }\r\n            else if (v == \"~\") {\r\n                if (b.charAt(i + 1) == \"*\") {\r\n                    str += \"\\\\*\";\r\n                    i++;\r\n                }\r\n                else if (b.charAt(i + 1) == \"?\") {\r\n                    str += \"\\\\?\";\r\n                    i++;\r\n                }\r\n                else {\r\n                    str += \"~\";\r\n                }\r\n            }\r\n            else {\r\n                str += v;\r\n            }\r\n        }\r\n\r\n        let reg = new RegExp(\"^\" + str + \"$\", \"g\");\r\n\r\n        return !!a.match(reg);\r\n    },\r\n    isCompareOperator: function (str) { //\u5224\u65AD\u524D\u4E00\u4E2A\u6216\u8005\u4E24\u4E2A\u5B57\u7B26\u662F\u5426\u662F\u6BD4\u8F83\u8FD0\u7B97\u7B26\r\n        str = str.toString();\r\n        let ope = \"\"; //\u5B58\u653E\u6BD4\u8F83\u8FD0\u7B97\u7B26\r\n        let num = \"\"; //\u622A\u53D6\u6BD4\u8F83\u8FD0\u7B97\u7B26\u4E4B\u540E\u7684\u6570\u5B57\u7528\u4E8E\u5B9E\u9645\u6BD4\u8F83\r\n        let strOne = str.substr(0, 1);\r\n        let strTwo = str.substr(1, 1);\r\n        let flag = false;\r\n        let ret;\r\n\r\n        if (strOne == \">\") {\r\n            if (strTwo == \"=\") {\r\n                ope = str.substr(0, 2);\r\n                num = str.substr(2);\r\n                flag = true;\r\n            }\r\n            else if (strTwo != \"=\") {\r\n                ope = str.substr(0, 1);\r\n                num = str.substr(1);\r\n                flag = true;\r\n            }\r\n        }\r\n        else if (strOne == \"<\") {\r\n            if (strTwo == \"=\" || strTwo == \">\") {\r\n                ope = str.substr(0, 2);\r\n                num = str.substr(2);\r\n                flag = true;\r\n            }\r\n            else if (strTwo != \"=\" && strTwo != \">\") {\r\n                ope = str.substr(0, 1);\r\n                num = str.substr(1);\r\n                flag = true;\r\n            }\r\n        }\r\n        else if (strOne == \"=\" && strTwo != \"=\") {\r\n            ope = str.substr(0, 1);\r\n            num = str.substr(1);\r\n            flag = true;\r\n        }\r\n\r\n        ret = { \"flag\": flag, \"ope\": ope, \"num\": num };\r\n\r\n        return ret;\r\n    },\r\n    acompareb: function (a, b) { //a \u4E0E b\u6BD4\u8F83\uFF0Cb\u53EF\u4E3A\u542B\u6BD4\u8F83\u7B26\uFF0C\u901A\u914D\u7B26\r\n        let _this = this;\r\n        let flag = false;\r\n\r\n        if (isRealNum(b)) {\r\n            flag = luckysheet_compareWith(a, \"==\", b);\r\n        }\r\n        else if (typeof (b) == \"string\") { //\u6761\u4EF6\u8F93\u5165\u5B57\u7B26\u4E32\uFF0C\u5982\uFF1A\">233\"\r\n            if (b.indexOf(\"*\") != -1 || b.indexOf(\"?\") != -1) { // \u6B63\u5219\u5339\u914D\uFF1A\u8F93\u5165\u901A\u914D\u7B26\uFF1A\"\u9ED1*\",\"\u767D?\",\u4EE5\u53CA\"\u767D?\u9ED1*~*\"\r\n                //\u901A\u914D\u7B26\u51FD\u6570\r\n                return _this.isWildcard(a, b);\r\n            }\r\n            else if (_this.isCompareOperator(b).flag) { //\"\u9ED1\u7CD6\"\r\n                let ope = _this.isCompareOperator(b).ope;\r\n                let num = _this.isCompareOperator(b).num;\r\n                flag = luckysheet_compareWith(a, ope, num);\r\n            }\r\n            else {\r\n                flag = luckysheet_compareWith(a, \"==\", b);\r\n            }\r\n        }\r\n\r\n        return flag;\r\n    },\r\n    compareParams: function (fp, sp, sym) {  //\u6BD4\u8F83\u4E24\u4E2A\u5B57\u7B26\u4E32\u6216\u8005\u6570\u5B57\u7684\u5927\u5C0F\uFF0C\u652F\u6301\u6BD4\u8F83\u5BF9\u8C61,\u6682\u4E0D\u652F\u6301\u6570\u7EC4\r\n        let flag = false;\r\n\r\n        //\u5224\u65ADa\u548Cb\u7684\u6570\u636E\u7C7B\u578B\r\n        let classNameA = toString.call(fp),\r\n            classNameB = toString.call(sp);\r\n\r\n        if (sym == \">\" && fp > sp) {\r\n            flag = true;\r\n        }\r\n        else if (sym == \">=\" && fp >= sp) {\r\n            flag = true;\r\n        }\r\n        else if (sym == \"<\" && fp < sp) {\r\n            flag = true;\r\n        }\r\n        else if (sym == \"<=\" && fp <= sp) {\r\n            flag = true;\r\n        }\r\n        else if (sym == \"=\" && fp == sp) {\r\n            flag = true;\r\n        }\r\n        else if (sym == \"<>\" && fp != sp) {\r\n            flag = true;\r\n        }\r\n\r\n        //\u5BF9\u8C61\u7C7B\u578B\u6BD4\u8F83\u76F8\u7B49\r\n        if (classNameA == '[object Object]' && classNameB == '[object Object]') {\r\n            //\u83B7\u53D6a\u548Cb\u7684\u5C5E\u6027\u957F\u5EA6\r\n            let propsA = Object.getOwnPropertyNames(fp),\r\n                propsB = Object.getOwnPropertyNames(sp);\r\n\r\n            if (propsA.length != propsB.length) {\r\n                return false;\r\n            }\r\n\r\n            for (let i = 0; i < propsA.length; i++) {\r\n                let propName = propsA[i];\r\n                //\u5982\u679C\u5BF9\u5E94\u5C5E\u6027\u5BF9\u5E94\u503C\u4E0D\u76F8\u7B49\uFF0C\u5219\u8FD4\u56DEfalse\r\n                if (fp[propName] !== sp[propName]) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        //\u6570\u7EC4\u7C7B\u578B\r\n        if (classNameA == '[object Array]' && classNameB == '[object Array]') {\r\n            if (fp.toString() == sp.toString()) {\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        return flag;\r\n    },\r\n    parseDecimal: function (num) {\r\n        num = parseFloat(num);\r\n        let d = parseInt(num, 10);\r\n\r\n        if (d == 0) {\r\n            return num;\r\n        }\r\n\r\n        num = num % d;\r\n        return num;\r\n    },\r\n    getcellrange: function (txt, formulaIndex) {\r\n        if (txt == null || txt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let sheettxt = \"\",\r\n            rangetxt = \"\",\r\n            sheetIndex = null,\r\n            sheetdata = null;\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n\r\n        if (txt.indexOf(\"!\") > -1) {\r\n            if (txt in this.cellTextToIndexList) {\r\n                return this.cellTextToIndexList[txt];\r\n            }\r\n\r\n            let val = txt.split(\"!\");\r\n            sheettxt = val[0];\r\n            rangetxt = val[1];\r\n\r\n            sheettxt = sheettxt.replace(/\\\\'/g, \"'\").replace(/''/g, \"'\");\r\n            if (sheettxt.substr(0, 1) == \"'\" && sheettxt.substr(sheettxt.length - 1, 1) == \"'\") {\r\n                sheettxt = sheettxt.substring(1, sheettxt.length - 1);\r\n            }\r\n            for (let i in luckysheetfile) {\r\n                if (sheettxt == luckysheetfile[i].name) {\r\n                    sheetIndex = luckysheetfile[i].index;\r\n                    sheetdata = luckysheetfile[i].data;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            let i = formulaIndex;\r\n            if (i == null) {\r\n                i = Store.currentSheetIndex;\r\n            }\r\n            if (txt + \"_\" + i in this.cellTextToIndexList) {\r\n                return this.cellTextToIndexList[txt + \"_\" + i];\r\n            }\r\n            let index = getSheetIndex(i);\r\n            sheettxt = luckysheetfile[index].name;\r\n            sheetIndex = luckysheetfile[index].index;\r\n            sheetdata = Store.flowdata;\r\n            rangetxt = txt;\r\n        }\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            if (!isNaN(row) && !isNaN(col)) {\r\n                let item = {\r\n                    \"row\": [row, row],\r\n                    \"column\": [col, col],\r\n                    \"sheetIndex\": sheetIndex\r\n                };\r\n                this.addToCellIndexList(txt, item);\r\n                return item;\r\n            }\r\n            else {\r\n                return null;\r\n            }\r\n        }\r\n        else {\r\n            rangetxt = rangetxt.split(\":\");\r\n            let row = [], col = [];\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (isNaN(row[0])) {\r\n                row[0] = 0;\r\n            }\r\n            if (isNaN(row[1])) {\r\n                row[1] = sheetdata.length - 1;\r\n            }\r\n            if (row[0] > row[1]) {\r\n                return null;\r\n            }\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (isNaN(col[0])) {\r\n                col[0] = 0;\r\n            }\r\n            if (isNaN(col[1])) {\r\n                col[1] = sheetdata[0].length - 1;\r\n            }\r\n            if (col[0] > col[1]) {\r\n                return null;\r\n            }\r\n\r\n            let item = {\r\n                \"row\": row,\r\n                \"column\": col,\r\n                \"sheetIndex\": sheetIndex\r\n            };\r\n            this.addToCellIndexList(txt, item);\r\n            return item;\r\n        }\r\n    },\r\n    rangeHightlightHTML: '<div id=\"luckysheet-formula-functionrange-highlight-${id}\" rangeindex=\"${id}\"  class=\"luckysheet-selection-highlight luckysheet-formula-functionrange-highlight\"><div data-type=\"top\" class=\"luckysheet-selection-copy-top luckysheet-copy\"></div><div data-type=\"right\" class=\"luckysheet-selection-copy-right luckysheet-copy\"></div><div data-type=\"bottom\" class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div><div data-type=\"left\" class=\"luckysheet-selection-copy-left luckysheet-copy\"></div><div class=\"luckysheet-selection-copy-hc\"></div><div data-type=\"lt\" class=\"luckysheet-selection-highlight-topleft luckysheet-highlight\"></div><div data-type=\"rt\" class=\"luckysheet-selection-highlight-topright luckysheet-highlight\"></div><div data-type=\"lb\" class=\"luckysheet-selection-highlight-bottomleft luckysheet-highlight\"></div><div data-type=\"rb\" class=\"luckysheet-selection-highlight-bottomright luckysheet-highlight\"></div></div>',\r\n    createRangeHightlight: function () {\r\n        let _this = this;\r\n\r\n        let $span = $(\"#luckysheet-rich-text-editor\").find(\"span.luckysheet-formula-functionrange-cell\");\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n\r\n        $span.each(function () {\r\n            let rangeindex = $(this).attr(\"rangeindex\"),\r\n                range = $(this).text();\r\n\r\n            $(\"#luckysheet-formula-functionrange\").append(replaceHtml(_this.rangeHightlightHTML, {\r\n                \"id\": rangeindex\r\n            }));\r\n\r\n            let cellrange = _this.getcellrange(range);\r\n            let rangeid = \"luckysheet-formula-functionrange-highlight-\" + rangeindex;\r\n\r\n            if (cellrange == null) {\r\n\r\n            }\r\n            else if (cellrange.sheetIndex == Store.currentSheetIndex || (cellrange.sheetIndex == -1 && _this.rangetosheet == Store.currentSheetIndex)) {\r\n                $(\"#\" + rangeid).data(\"range\", cellrange)\r\n                    .find(\".luckysheet-copy\")\r\n                    .css({ \"background\": luckyColor[rangeindex] })\r\n                    .end()\r\n                    .find(\".luckysheet-highlight\")\r\n                    .css({ \"background\": luckyColor[rangeindex] })\r\n                    .end()\r\n                    .find(\".luckysheet-selection-copy-hc\")\r\n                    .css({ \"background\": luckyColor[rangeindex] });\r\n\r\n                seletedHighlistByindex(rangeid, cellrange.row[0], cellrange.row[1], cellrange.column[0], cellrange.column[1]);\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").show();\r\n    },\r\n    searchHTML: '<div id=\"luckysheet-formula-search-c\" class=\"luckysheet-formula-search-c\"></div>',\r\n    helpHTML: '<div id=\"luckysheet-formula-help-c\" class=\"luckysheet-formula-help-c\"> <div class=\"luckysheet-formula-help-close\" title=\"${helpClose}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div> <div class=\"luckysheet-formula-help-collapse\" title=\"${helpCollapse}\"><i class=\"fa fa-angle-up\" aria-hidden=\"true\"></i></div> <div class=\"luckysheet-formula-help-title\"><div class=\"luckysheet-formula-help-title-formula\"> <span class=\"luckysheet-arguments-help-function-name\">SUM</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> <span class=\"luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active\" dir=\"auto\">A2:A100</span>, <span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">101</span> </span> <span class=\"luckysheet-arguments-paren\">)</span> </div></div> <div class=\"luckysheet-formula-help-content\"> <div class=\"luckysheet-formula-help-content-example\"> <div class=\"luckysheet-arguments-help-section-title\">${helpExample}</div> <div class=\"luckysheet-arguments-help-formula\"> <span class=\"luckysheet-arguments-help-function-name\">SUM</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> <span class=\"luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active\" dir=\"auto\">A2:A100</span>, <span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">101</span> </span> <span class=\"luckysheet-arguments-paren\">)</span> </div> </div> <div class=\"luckysheet-formula-help-content-detail\"> <div class=\"luckysheet-arguments-help-section\"> <div class=\"luckysheet-arguments-help-section-title luckysheet-arguments-help-parameter-name\">${helpAbstract}</div> <span class=\"luckysheet-arguments-help-parameter-content\">${helpAbstract}</span> </div> </div> <div class=\"luckysheet-formula-help-content-param\"> ${param} </div> </div> <div class=\"luckysheet-formula-help-foot\"></div></div>',\r\n    getrangeseleciton: function () {\r\n        let currSelection = window.getSelection();\r\n        let anchor = $(currSelection.anchorNode);\r\n        let anchorOffset = currSelection.anchorOffset;\r\n\r\n        if (anchor.parent().is(\"span\") && anchorOffset != 0) {\r\n            let txt = $.trim(anchor.text()),\r\n                lasttxt = \"\";\r\n\r\n            if (txt.length == 0 && anchor.parent().prev().length > 0) {\r\n                let ahr = anchor.parent().prev();\r\n                txt = $.trim(ahr.text());\r\n                lasttxt = txt.substr(txt.length - 1, 1);\r\n                return ahr;\r\n            }\r\n            else {\r\n                lasttxt = txt.substr(anchorOffset - 1, 1);\r\n                return anchor.parent();\r\n            }\r\n        }\r\n        else if (anchor.is(\"#luckysheet-rich-text-editor\") || anchor.is(\"#luckysheet-functionbox-cell\")) {\r\n            let txt = $.trim(anchor.find(\"span\").last().text());\r\n\r\n            if (txt.length == 0 && anchor.find(\"span\").length > 1) {\r\n                let ahr = anchor.find(\"span\");\r\n                txt = $.trim(ahr.eq(ahr.length - 2).text());\r\n                return ahr;\r\n            }\r\n            else {\r\n                return anchor.find(\"span\").last();\r\n            }\r\n        }\r\n        else if (anchor.parent().is(\"#luckysheet-rich-text-editor\") || anchor.parent().is(\"#luckysheet-functionbox-cell\") || anchorOffset == 0) {\r\n            if (anchorOffset == 0) {\r\n                anchor = anchor.parent();\r\n            }\r\n\r\n            if (anchor.prev().length > 0) {\r\n                let txt = $.trim(anchor.prev().text());\r\n                let lasttxt = txt.substr(txt.length - 1, 1);\r\n                return anchor.prev();\r\n            }\r\n        }\r\n\r\n        return null;\r\n    },\r\n    searchFunctionPosition: function ($menu, $editor, x, y, isparam) {\r\n        let winH = $(window).height(),\r\n            winW = $(window).width();\r\n        let menuW = $menu.outerWidth(),\r\n            menuH = $menu.outerHeight();\r\n\r\n        if (isparam == null) {\r\n            isparam = false;\r\n        }\r\n\r\n        let left = x;\r\n        if (x + menuW > winW) {\r\n            left = x - menuW + $editor.outerWidth();\r\n        }\r\n        else {\r\n            left = x;\r\n        }\r\n\r\n        let top = y;\r\n        if (y + menuH > winH) {\r\n            top = y - menuH;\r\n        }\r\n        else {\r\n            top = y + $editor.outerHeight();\r\n            if (!isparam) {\r\n                $menu.html($menu.find(\".luckysheet-formula-search-item\").get().reverse());\r\n            }\r\n        }\r\n\r\n        if (top < 0) {\r\n            top = 0;\r\n        }\r\n        if (left < 0) {\r\n            left = 0;\r\n        }\r\n\r\n        $menu.css({\r\n            \"top\": top,\r\n            \"left\": left\r\n        }).show();\r\n    },\r\n    searchFunctionCell: null,\r\n    searchFunction: function ($editer) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n\r\n        let $cell = _this.getrangeseleciton();\r\n        _this.searchFunctionCell = $cell;\r\n\r\n\r\n\r\n        if ($cell == null || $editer == null) {\r\n            return;\r\n        }\r\n        let inputContent = $editer.text();\r\n        let searchtxt = $cell.text().toUpperCase();\r\n        let reg = /^[a-zA-Z]|[a-zA-Z_]+$/;\r\n\r\n        if (!reg.test(searchtxt) || inputContent.substr(0, 1) != \"=\") {\r\n            return;\r\n        }\r\n\r\n        let result = {\r\n            \"f\": [],\r\n            \"s\": [],\r\n            \"t\": []\r\n        },\r\n            result_i = 0;\r\n\r\n        for (let i = 0; i < functionlist.length; i++) {\r\n            let item = functionlist[i],\r\n                n = item.n;\r\n\r\n            if (n == searchtxt) {\r\n                result.f.unshift(item);\r\n                result_i++;\r\n            }\r\n            else if (n.substr(0, searchtxt.length) == searchtxt) {\r\n                result.s.unshift(item);\r\n                result_i++;\r\n            }\r\n            else if (n.indexOf(searchtxt) > -1) {\r\n                result.t.unshift(item);\r\n                result_i++;\r\n            }\r\n\r\n            if (result_i >= 10) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        let list = result.t.concat(result.s.concat(result.f));\r\n        if (list.length <= 0) {\r\n            return;\r\n        }\r\n\r\n        let listHTML = _this.searchFunctionHTML(list);\r\n        $(\"#luckysheet-formula-search-c\").html(listHTML).show();\r\n        $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n        let $c = $editer.parent(),\r\n            offset = $c.offset();\r\n        _this.searchFunctionPosition($(\"#luckysheet-formula-search-c\"), $c, offset.left, offset.top);\r\n    },\r\n    searchFunctionEnter: function ($obj) {\r\n        let _this = this;\r\n\r\n        let functxt = $obj.data(\"func\");\r\n        _this.searchFunctionCell.text(functxt).after('<span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span>');\r\n        _this.setCaretPosition(_this.searchFunctionCell.next().get(0), 0, 1);\r\n        $(\"#luckysheet-formula-search-c\").hide();\r\n        _this.helpFunctionExe(_this.searchFunctionCell.closest(\"div\"), _this.searchFunctionCell.next());\r\n    },\r\n    searchFunctionHTML: function (list) {\r\n        let _this = this;\r\n\r\n        if ($(\"#luckysheet-formula-search-c\").length == 0) {\r\n            $(\"body\").append(_this.searchHTML);\r\n            $(\"#luckysheet-formula-search-c\").on(\"mouseover\", \".luckysheet-formula-search-item\", function () {\r\n                $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n                $(this).addClass(\"luckysheet-formula-search-item-active\");\r\n            }).on(\"mouseout\", \".luckysheet-formula-search-item\", function () {\r\n\r\n            }).on(\"click\", \".luckysheet-formula-search-item\", function () {\r\n                if (_this.searchFunctionCell == null) {\r\n                    return;\r\n                }\r\n                _this.searchFunctionEnter($(this));\r\n            });\r\n        }\r\n\r\n        let itemHTML = '<div data-func=\"${n}\" class=\"luckysheet-formula-search-item ${class}\"><div class=\"luckysheet-formula-search-func\">${n}</div><div class=\"luckysheet-formula-search-detail\">${a}</div></div>';\r\n        let retHTML = \"\";\r\n\r\n        for (let i = 0; i < list.length; i++) {\r\n            let item = list[i];\r\n\r\n            if (i == list.length - 1) {\r\n                retHTML += replaceHtml(itemHTML, {\r\n                    \"class\": \"luckysheet-formula-search-item-active\",\r\n                    \"n\": item.n,\r\n                    \"a\": item.a\r\n                });\r\n            }\r\n            else {\r\n                retHTML += replaceHtml(itemHTML, {\r\n                    \"class\": \"\",\r\n                    \"n\": item.n,\r\n                    \"a\": item.a\r\n                });\r\n            }\r\n        }\r\n\r\n        return retHTML;\r\n    },\r\n    functionlistPosition: {},\r\n    helpFunction: function ($editer, funcname, paramIndex) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n\r\n        let $func = functionlist[_this.functionlistPosition[$.trim(funcname).toUpperCase()]];\r\n        if ($func == null) {\r\n            return;\r\n        }\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-function-name\").html($func.n);\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-parameter-content\").html($func.d);\r\n\r\n        let helpformula = '<span class=\"luckysheet-arguments-help-function-name\">${name}</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> ${param} </span> <span class=\"luckysheet-arguments-paren\">)</span>';\r\n        let helpformulaItem = '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">${param}</span>';\r\n        let helpformulaArg = '<div class=\"luckysheet-arguments-help-section\"><div class=\"luckysheet-arguments-help-section-title\">${param}</div><span class=\"luckysheet-arguments-help-parameter-content\">${content}</span></div>';\r\n\r\n        //\"n\": \"AVERAGE\",\r\n        //\"t\": \"1\",\r\n        //\"d\": \"\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C\uFF0C\u5BF9\u6587\u672C\u5FFD\u7565\u4E0D\u8BA1\u3002\",\r\n        //\"a\": \"\u8FD4\u56DE\u6570\u636E\u96C6\u7684\u7B97\u672F\u5E73\u5747\u503C\",\r\n        //\"p\": [{ \"name\": \"\u6570\u503C1\", \"example\": \"A2:A100\", \"detail\": \"\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u7528\u5230\u7684\u7B2C\u4E00\u4E2A\u6570\u503C\u6216\u8303\u56F4\u3002\", \"require\": \"m\", \"repeat\": \"n\", \"type\": \"rangenumber\" },\r\n        //    { \"name\": \"\u6570\u503C2\", \"example\": \"B2:B100\", \"detail\": \"\u8BA1\u7B97\u5E73\u5747\u503C\u65F6\u7528\u5230\u7684\u5176\u4ED6\u6570\u503C\u6216\u8303\u56F4\u3002\", \"require\": \"o\", \"repeat\": \"y\", \"type\": \"rangenumber\" }\r\n        //]\r\n        let fht = \"\",\r\n            ahf = \"\",\r\n            fhcp = \"\";\r\n\r\n        for (let i = 0; i < $func.p.length; i++) {\r\n            let paramitem = $func.p[i];\r\n            let name = paramitem.name,\r\n                nameli = paramitem.name;\r\n\r\n            if (paramitem.repeat == \"y\") {\r\n                name += \", ...\";\r\n                nameli += '<span class=\"luckysheet-arguments-help-argument-info\">...-' + locale_formulaMore.allowRepeatText + '</span>';\r\n            }\r\n            if (paramitem.require == \"o\") {\r\n                name = \"[\" + name + \"]\";\r\n                nameli += '<span class=\"luckysheet-arguments-help-argument-info\">-[' + locale_formulaMore.allowOptionText + ']</span>';\r\n            }\r\n\r\n            fht += '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">' + name + '</span>, ';\r\n            ahf += '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">' + paramitem.example + '</span>, ';\r\n            fhcp += replaceHtml(helpformulaArg, {\r\n                \"param\": nameli,\r\n                \"content\": paramitem.detail\r\n            });\r\n        }\r\n\r\n        fht = fht.substr(0, fht.length - 2);\r\n        ahf = ahf.substr(0, ahf.length - 2);\r\n\r\n        $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder\").html(fht); //\u4ECB\u7ECD\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder\").html(ahf); //\u793A\u4F8B\r\n        $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content-param\").html(fhcp); //\u53C2\u6570\r\n\r\n        if (paramIndex == null) {\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name\").css(\"font-weight\", \"bold\");\r\n        }\r\n        else {\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name\").css(\"font-weight\", \"normal\");\r\n            let index = paramIndex >= $func.p.length ? $func.p.length - 1 : paramIndex;\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\").removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\").eq(index).addClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\").removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\").eq(index).addClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section\").removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section\").eq(index).addClass(\"luckysheet-arguments-help-parameter-active\");\r\n        }\r\n\r\n        let $c = $editer.parent(),\r\n            offset = $c.offset();\r\n        _this.searchFunctionPosition($(\"#luckysheet-formula-help-c\"), $c, offset.left, offset.top, true);\r\n    },\r\n    helpFunctionExe: function ($editer, currSelection) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        if ($(\"#luckysheet-formula-help-c\").length == 0) {\r\n            $(\"body\").after(replaceHtml(_this.helpHTML, {\r\n                helpClose: locale_formulaMore.helpClose,\r\n                helpCollapse: locale_formulaMore.helpCollapse,\r\n                helpExample: locale_formulaMore.helpExample,\r\n                helpAbstract: locale_formulaMore.helpAbstract,\r\n            }));\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-close\").click(function () {\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n            });\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-collapse\").click(function () {\r\n                let $content = $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content\");\r\n                $content.slideToggle(100, function () {\r\n                    let $c = _this.rangeResizeTo.parent(),\r\n                        offset = $c.offset();\r\n                    _this.searchFunctionPosition($(\"#luckysheet-formula-help-c\"), $c, offset.left, offset.top, true);\r\n                });\r\n\r\n                if ($content.is(\":hidden\")) {\r\n                    $(this).html('<i class=\"fa fa-angle-up\" aria-hidden=\"true\"></i>');\r\n                }\r\n                else {\r\n                    $(this).html('<i class=\"fa fa-angle-down\" aria-hidden=\"true\"></i>');\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < functionlist.length; i++) {\r\n                _this.functionlistPosition[functionlist[i].n] = i;\r\n            }\r\n        }\r\n\r\n        if (!currSelection) {\r\n            return;\r\n        }\r\n\r\n        let $prev = currSelection,\r\n            funcLen = $editer.length,\r\n            $span = $editer.find(\"span\"),\r\n            currentIndex = currSelection.index(),\r\n            i = currentIndex;\r\n\r\n        if ($prev == null) {\r\n            return;\r\n        }\r\n\r\n        let funcName = null, paramindex = null;\r\n\r\n        if ($span.eq(i).is(\".luckysheet-formula-text-func\")) {\r\n            funcName = $span.eq(i).text();\r\n        }\r\n        else {\r\n            let $cur = null, exceptIndex = [-1, -1];\r\n\r\n            while (--i > 0) {\r\n                $cur = $span.eq(i);\r\n\r\n                if ($cur.is(\".luckysheet-formula-text-func\") || $.trim($cur.text()).toUpperCase() in _this.functionlistPosition) {\r\n                    funcName = $cur.text();\r\n                    paramindex = null;\r\n                    let endstate = true;\r\n\r\n                    for (let a = i; a <= currentIndex; a++) {\r\n                        if (!paramindex) {\r\n                            paramindex = 0;\r\n                        }\r\n\r\n                        if (a >= exceptIndex[0] && a <= exceptIndex[1]) {\r\n                            continue;\r\n                        }\r\n\r\n                        $cur = $span.eq(a);\r\n                        if ($cur.is(\".luckysheet-formula-text-rpar\")) {\r\n                            exceptIndex = [i, a];\r\n                            funcName = null;\r\n                            endstate = false;\r\n                            break;\r\n                        }\r\n\r\n                        if ($cur.is(\".luckysheet-formula-text-comma\")) {\r\n                            paramindex++;\r\n                        }\r\n                    }\r\n\r\n                    if (endstate) {\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (funcName == null) {\r\n            return;\r\n        }\r\n\r\n        _this.helpFunction($editer, funcName, paramindex);\r\n    },\r\n    rangeHightlightselected: function ($editer, kcode) {\r\n        let _this = this;\r\n\r\n        let currSelection = _this.getrangeseleciton();\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-hc\").css(\"opacity\", \"0.03\");\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n        _this.helpFunctionExe($editer, currSelection);\r\n\r\n        // console.log(currSelection, $(currSelection).closest(\".luckysheet-formula-functionrange-cell\").length);\r\n        if ($(currSelection).closest(\".luckysheet-formula-functionrange-cell\").length == 0) {\r\n            _this.searchFunction($editer);\r\n            return;\r\n        }\r\n\r\n        let $anchorOffset = $(currSelection).closest(\".luckysheet-formula-functionrange-cell\");\r\n        let rangeindex = $anchorOffset.attr(\"rangeindex\");\r\n        let rangeid = \"luckysheet-formula-functionrange-highlight-\" + rangeindex;\r\n\r\n        $(\"#\" + rangeid).find(\".luckysheet-selection-copy-hc\").css({\r\n            \"opacity\": \"0.13\"\r\n        });\r\n    },\r\n    updatecell: function (r, c, value, isRefresh = true) {\r\n\r\n        let _this = this;\r\n\r\n        let $input = $(\"#luckysheet-rich-text-editor\");\r\n        let inputText = $input.text(), inputHtml = $input.html();\r\n\r\n\r\n        if (_this.rangetosheet != null && _this.rangetosheet != Store.currentSheetIndex) {\r\n            sheetmanage.changeSheetExec(_this.rangetosheet);\r\n        }\r\n\r\n        if (!checkProtectionLocked(r, c, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        //\u6570\u636E\u9A8C\u8BC1 \u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165\r\n        if (dataVerificationCtrl.dataVerification != null) {\r\n            let dvItem = dataVerificationCtrl.dataVerification[r + '_' + c];\r\n\r\n            if (dvItem != null && dvItem.prohibitInput && !dataVerificationCtrl.validateCellData(inputText, dvItem)) {\r\n                let failureText = dataVerificationCtrl.getFailureText(dvItem);\r\n                tooltip.info(failureText, '');\r\n                _this.cancelNormalSelected();\r\n                return;\r\n            }\r\n        }\r\n\r\n        let curv = Store.flowdata[r][c];\r\n\r\n        // Store old value for hook function\r\n        const oldValue = JSON.stringify(curv);\r\n\r\n        let isPrevInline = isInlineStringCell(curv);\r\n        let isCurInline = (inputText.slice(0, 1) != \"=\" && inputHtml.substr(0, 5) == \"<span\");\r\n\r\n        let isCopyVal = false;\r\n        if(!isCurInline && inputText && inputText.length > 0) {\r\n            let splitArr = inputText.replace(/\\r\\n/g, \"_x000D_\").replace(/&#13;&#10;/g, \"_x000D_\").replace(/\\r/g, \"_x000D_\").replace(/\\n/g, \"_x000D_\").split(\"_x000D_\");\r\n            if(splitArr.length > 1) {\r\n                isCopyVal = true;\r\n                isCurInline = true;\r\n                inputText = splitArr.join('\\r\\n');\r\n            }\r\n        }\r\n\r\n        if (!value && !isCurInline && isPrevInline) {\r\n            delete curv.ct.s;\r\n            curv.ct.t = \"g\";\r\n            curv.ct.fa = \"General\";\r\n            value = \"\";\r\n        }\r\n        else if (isCurInline) {\r\n            if (getObjType(curv) != \"object\") {\r\n                curv = {};\r\n            }\r\n            delete curv.f;\r\n            delete curv.v;\r\n            delete curv.m;\r\n\r\n            if (curv.ct == null) {\r\n                curv.ct = {};\r\n                curv.ct.fa = \"General\";\r\n            }\r\n\r\n            curv.ct.t = \"inlineStr\";\r\n            curv.ct.s = convertSpanToShareString($input.find(\"span\"));\r\n            if(isCopyVal) {\r\n                curv.ct.s = [\r\n                    {\r\n                    v: inputText,\r\n                    }\r\n                ];\r\n            }\r\n        }\r\n\r\n        // API, we get value from user\r\n        value = value || $input.text();\r\n\r\n        // Hook function\r\n        if (!method.createHookFunction(\"cellUpdateBefore\", r, c, value, isRefresh)) {\r\n            _this.cancelNormalSelected();\r\n            return;\r\n        }\r\n\r\n        if (!isCurInline) {\r\n            if (isRealNull(value) && !isPrevInline) {\r\n                if (curv == null || (isRealNull(curv.v) && curv.spl == null && curv.f == null)) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                }\r\n            }\r\n            else if (curv != null && curv.qp != 1) {\r\n                if (getObjType(curv) == \"object\" && (value == curv.f || value == curv.v || value == curv.m)) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                }\r\n                else if (value == curv) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n\r\n            }\r\n            else if (getObjType(curv) == \"object\" && curv.ct != null && curv.ct.fa != null && curv.ct.fa != \"@\" && !isRealNull(value)) {\r\n                delete curv.m;//\u66F4\u65B0\u65F6\u95F4m\u5904\u7406 \uFF0C \u4F1A\u5B9E\u9645\u5220\u9664\u5355\u5143\u683C\u6570\u636E\u7684\u53C2\u6570\uFF08flowdata\u65F6\u5DF2\u5220\u9664\uFF09\r\n                if (curv.f != null) { //\u5982\u679C\u539F\u6765\u662F\u516C\u5F0F\uFF0C\u800C\u66F4\u65B0\u7684\u6570\u636E\u4E0D\u662F\u516C\u5F0F\uFF0C\u5219\u628A\u516C\u5F0F\u5220\u9664\r\n                    delete curv.f;\r\n                    delete curv.spl; //\u5220\u9664\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\r\n                }\r\n            }\r\n        }\r\n\r\n        window.luckysheet_getcelldata_cache = null;\r\n\r\n        let isRunExecFunction = true;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let dynamicArrayItem = null;  //\u52A8\u6001\u6570\u7EC4\r\n\r\n        if (getObjType(curv) == \"object\") {\r\n\r\n            if (!isCurInline) {\r\n\r\n                if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n                    let v = _this.execfunction(value, r, c, undefined, true);\r\n                    isRunExecFunction = false;\r\n                    curv = $.extend(true, {}, d[r][c]);\r\n                    curv.v = v[1];\r\n                    curv.f = v[2];\r\n\r\n                    //\u6253\u8FDB\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\uFF0C \u62A5\u9519\u9700\u8981\u5355\u72EC\u5904\u7406\u3002\r\n                    if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                        delete curv.m;\r\n                        delete curv.v;\r\n\r\n                        let curCalv = v[3].data;\r\n\r\n                        if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                            curv.v = curCalv[0];\r\n                        }\r\n                        else {\r\n                            curv.spl = v[3].data;\r\n                        }\r\n                    }\r\n                    else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                        dynamicArrayItem = v[3].data;\r\n                    }\r\n                }\r\n                // from API setCellValue,luckysheet.setCellValue(0,\u00A00, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n                else if (getObjType(value) == \"object\") {\r\n                    let valueFunction = value.f;\r\n\r\n                    if (getObjType(valueFunction) == \"string\" && valueFunction.slice(0, 1) == \"=\" && valueFunction.length > 1) {\r\n                        let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                        isRunExecFunction = false;\r\n                        // get v/m/ct\r\n\r\n                        curv = $.extend(true, {}, d[r][c]);\r\n                        curv.v = v[1];\r\n                        curv.f = v[2];\r\n\r\n                        //\u6253\u8FDB\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\uFF0C \u62A5\u9519\u9700\u8981\u5355\u72EC\u5904\u7406\u3002\r\n                        if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                            delete curv.m;\r\n                            delete curv.v;\r\n\r\n                            let curCalv = v[3].data;\r\n\r\n                            if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                                curv.v = curCalv[0];\r\n                            }\r\n                            else {\r\n                                curv.spl = v[3].data;\r\n                            }\r\n                        }\r\n                        else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                            dynamicArrayItem = v[3].data;\r\n                        }\r\n                    }\r\n                    // from API setCellValue,luckysheet.setCellValue(0,\u00A00, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n                    else {\r\n                        for (let attr in value) {\r\n                            curv[attr] = value[attr];\r\n                        }\r\n                        // let valueFunction = value.f;\r\n\r\n                        // if(getObjType(valueFunction) == \"string\" && valueFunction.slice(0, 1) == \"=\" && valueFunction.length > 1){\r\n                        //     let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                        //     isRunExecFunction = false;\r\n                        //     // get v/m/ct\r\n                        //     curv = d[r][c];\r\n                        //     curv.v = v[1];\r\n                        //     // get f\r\n                        //     curv.f = v[2];\r\n\r\n                        //     // get other cell style attribute\r\n                        //     delete value.v;\r\n                        //     delete value.m;\r\n                        //     delete value.f;\r\n                        //     Object.assign(curv,value);\r\n\r\n                        //     //\u6253\u8FDB\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\uFF0C \u62A5\u9519\u9700\u8981\u5355\u72EC\u5904\u7406\u3002\r\n                        //     if(v.length == 4 && v[3].type == \"sparklines\"){\r\n                        //         delete curv.m;\r\n                        //         delete curv.v;\r\n\r\n                        //         let curCalv = v[3].data;\r\n\r\n                        //         if(getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\"){\r\n                        //             curv.v = curCalv[0];\r\n                        //         }\r\n                        //         else{\r\n                        //             curv.spl = v[3].data;\r\n                        //         }\r\n                        //     }\r\n                        // }\r\n\r\n                    }\r\n\r\n                }\r\n                else {\r\n                    _this.delFunctionGroup(r, c);\r\n                    _this.execFunctionGroup(r, c, value);\r\n                    isRunExecFunction = false;\r\n\r\n                    curv = $.extend(true, {}, d[r][c]);\r\n                    // let gd = _this.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.currentSheetIndex];\r\n                    // if(gd!=null){\r\n                    //     curv.v = gd.v;\r\n                    // }\r\n                    curv.v = value;\r\n\r\n                    delete curv.f;\r\n                    delete curv.spl;\r\n\r\n                    if (curv.qp == 1 && ('' + value).substr(0, 1) != \"'\") {//if quotePrefix is 1, cell is force string, cell clear quotePrefix when it is updated\r\n                        curv.qp = 0;\r\n                        if (curv.ct != null) {\r\n                            curv.ct.fa = \"General\";\r\n                            curv.ct.t = \"n\";\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            value = curv;\r\n        }\r\n        else {\r\n            if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n                let v = _this.execfunction(value, r, c, undefined, true);\r\n                isRunExecFunction = false;\r\n                value = {\r\n                    \"v\": v[1],\r\n                    \"f\": v[2]\r\n                };\r\n\r\n\r\n                //\u6253\u8FDB\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\uFF0C \u62A5\u9519\u9700\u8981\u5355\u72EC\u5904\u7406\u3002\r\n                if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                    let curCalv = v[3].data;\r\n\r\n                    if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                        value.v = curCalv[0];\r\n                    }\r\n                    else {\r\n                        value.spl = v[3].data;\r\n                    }\r\n                }\r\n                else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                    dynamicArrayItem = v[3].data;\r\n                }\r\n            }\r\n            // from API setCellValue,luckysheet.setCellValue(0,\u00A00, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n            else if (getObjType(value) == \"object\") {\r\n                let valueFunction = value.f;\r\n\r\n                if (getObjType(valueFunction) == \"string\" && valueFunction.slice(0, 1) == \"=\" && valueFunction.length > 1) {\r\n                    let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                    isRunExecFunction = false;\r\n                    // value = {\r\n                    //     \"v\": v[1],\r\n                    //     \"f\": v[2]\r\n                    // };\r\n\r\n                    // update attribute v\r\n                    value.v = v[1];\r\n                    value.f = v[2];\r\n\r\n                    //\u6253\u8FDB\u5355\u5143\u683C\u7684sparklines\u7684\u914D\u7F6E\u4E32\uFF0C \u62A5\u9519\u9700\u8981\u5355\u72EC\u5904\u7406\u3002\r\n                    if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                        let curCalv = v[3].data;\r\n\r\n                        if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                            value.v = curCalv[0];\r\n                        }\r\n                        else {\r\n                            value.spl = v[3].data;\r\n                        }\r\n                    }\r\n                    else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                        dynamicArrayItem = v[3].data;\r\n                    }\r\n                }\r\n                else {\r\n                    let v = curv;\r\n                    if (value.v == null) {\r\n                        value.v = v;\r\n                    }\r\n                }\r\n\r\n            }\r\n            else {\r\n                _this.delFunctionGroup(r, c);\r\n                _this.execFunctionGroup(r, c, value);\r\n                isRunExecFunction = false;\r\n            }\r\n        }\r\n\r\n        // value maybe an object\r\n        setcellvalue(r, c, d, value);\r\n        _this.cancelNormalSelected();\r\n\r\n        let RowlChange = false;\r\n        let cfg = $.extend(true, {}, getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)][\"config\"]);\r\n        if (cfg[\"rowlen\"] == null) {\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        if ((d[r][c].tb == \"2\" && d[r][c].v != null) || isInlineStringCell(d[r][c])) {//\u81EA\u52A8\u6362\u884C\r\n            let defaultrowlen = Store.defaultrowlen;\r\n\r\n            let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n            // offlinecanvas.textBaseline = 'top'; //textBaseline\u4EE5top\u8BA1\u7B97\r\n\r\n            // let fontset = luckysheetfontformat(d[r][c]);\r\n            // offlinecanvas.font = fontset;\r\n\r\n            if (cfg[\"customHeight\"] && cfg[\"customHeight\"][r] == 1) {\r\n\r\n            }\r\n            else {\r\n                // let currentRowLen = defaultrowlen;\r\n                // if(cfg[\"rowlen\"][r] != null){\r\n                //     currentRowLen = cfg[\"rowlen\"][r];\r\n                // }\r\n\r\n                let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n\r\n                let textInfo = getCellTextInfo(d[r][c], canvas, {\r\n                    r: r,\r\n                    c: c,\r\n                    cellWidth: cellWidth\r\n                });\r\n\r\n                let currentRowLen = defaultrowlen;\r\n                // console.log(\"rowlen\", textInfo);\r\n                if (textInfo != null) {\r\n                    currentRowLen = textInfo.textHeightAll + 2;\r\n                }\r\n\r\n                // let strValue = getcellvalue(r, c, d).toString();\r\n                // let measureText = offlinecanvas.measureText(strValue);\r\n\r\n                // let textMetrics = measureText.width;\r\n                // let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 4;\r\n                // let oneLineTextHeight = measureText.actualBoundingBoxDescent - measureText.actualBoundingBoxAscent;\r\n\r\n                // if(textMetrics > cellWidth){\r\n                //     let strArr = [];//\u6587\u672C\u622A\u65AD\u6570\u7EC4\r\n                //     strArr = getCellTextSplitArr(strValue, strArr, cellWidth, offlinecanvas);\r\n\r\n                //     let computeRowlen = oneLineTextHeight * strArr.length + 4;\r\n                //     //\u6BD4\u8F83\u8BA1\u7B97\u9AD8\u5EA6\u548C\u5F53\u524D\u9AD8\u5EA6\u53D6\u6700\u5927\u9AD8\u5EA6\r\n                //     if(computeRowlen > currentRowLen){\r\n                //         currentRowLen = computeRowlen;\r\n                //     }\r\n                // }\r\n\r\n                if (currentRowLen > defaultrowlen) {\r\n                    cfg[\"rowlen\"][r] = currentRowLen;\r\n                    RowlChange = true;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        //\u52A8\u6001\u6570\u7EC4\r\n        let dynamicArray = null;\r\n        if (!!dynamicArrayItem) {\r\n            // let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n            dynamicArray = $.extend(true, [], this.insertUpdateDynamicArray(dynamicArrayItem));\r\n            // dynamicArray.push(dynamicArrayItem);\r\n\r\n        }\r\n\r\n        let allParam = {\r\n            \"dynamicArray\": dynamicArray\r\n        }\r\n\r\n        if (RowlChange) {\r\n            allParam = {\r\n                \"cfg\": cfg,\r\n                \"dynamicArray\": dynamicArray,\r\n                \"RowlChange\": RowlChange\r\n            }\r\n        }\r\n\r\n        setTimeout(() => {\r\n            // Hook function\r\n            method.createHookFunction(\"cellUpdated\", r, c, JSON.parse(oldValue), Store.flowdata[r][c], isRefresh);\r\n        }, 0);\r\n\r\n        if (isRefresh) {\r\n            jfrefreshgrid(d, [{ \"row\": [r, r], \"column\": [c, c] }], allParam, isRunExecFunction);\r\n            // Store.luckysheetCellUpdate.length = 0; //clear array\r\n            _this.execFunctionGlobalData = null; //\u9500\u6BC1\r\n        }\r\n        else {\r\n            return {\r\n                data: d,\r\n                allParam: allParam\r\n            };\r\n        }\r\n    },\r\n    cancelNormalSelected: function () {\r\n        let _this = this;\r\n\r\n        _this.canceFunctionrangeSelected();\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-input-box-index\").hide();\r\n        $(\"#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm\").removeClass(\"luckysheet-wa-calculate-active\");\r\n\r\n        _this.rangestart = false;\r\n        _this.rangedrag_column_start = false;\r\n        _this.rangedrag_row_start = false;\r\n    },\r\n    canceFunctionrangeSelected: function () {\r\n        $(\"#luckysheet-formula-functionrange-select\").hide();\r\n        $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n        // $(\"#luckysheet-cols-h-selected, #luckysheet-rows-h-selected\").hide();\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n    },\r\n    iscellformat: function (txt) {\r\n        let re_abc = /[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][123456789]/;\r\n    },\r\n    iscelldata: function (txt) { //\u5224\u65AD\u662F\u5426\u4E3A\u5355\u5143\u683C\u683C\u5F0F\r\n        let val = txt.split(\"!\"),\r\n            rangetxt;\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n        }\r\n        else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let reg_cell = /^(([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+))$/g; //\u589E\u52A0\u6B63\u5219\u5224\u65AD\u5355\u5143\u683C\u4E3A\u5B57\u6BCD+\u6570\u5B57\u7684\u683C\u5F0F\uFF1A\u5982 A1:B3\r\n        let reg_cellRange = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+))))$/g; //\u589E\u52A0\u6B63\u5219\u5224\u65AD\u5355\u5143\u683C\u4E3A\u5B57\u6BCD+\u6570\u5B57\u6216\u5B57\u6BCD\u7684\u683C\u5F0F\uFF1A\u5982 A1:B3\uFF0CA:A\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            if (!isNaN(row) && !isNaN(col) && rangetxt.toString().match(reg_cell)) {\r\n                return true;\r\n            }\r\n            else if (!isNaN(row)) {\r\n                return false;\r\n            }\r\n            else if (!isNaN(col)) {\r\n                return false;\r\n            }\r\n            else {\r\n                return false;\r\n            }\r\n        }\r\n        else {\r\n            reg_cellRange = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+)))|((([0-9]+)|([$][0-9]+s))))$/g;\r\n\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            let row = [], col = [];\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (row[0] > row[1]) {\r\n                return false;\r\n            }\r\n\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (col[0] > col[1]) {\r\n                return false;\r\n            }\r\n\r\n            if (rangetxt[0].toString().match(reg_cellRange) && rangetxt[1].toString().match(reg_cellRange)) {\r\n                return true;\r\n            }\r\n            else {\r\n                return false;\r\n            }\r\n        }\r\n    },\r\n    operator: '==|!=|<>|<=|>=|=|+|-|>|<|/|*|%|&|^',\r\n    operatorjson: null,\r\n    functionCopy: function (txt, mode, step) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (mode == null) {\r\n            mode = \"down\";\r\n        }\r\n\r\n        if (step == null) {\r\n            step = 1;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0\r\n        };\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += str + \"(\";\r\n                }\r\n                else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            }\r\n            else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.functionCopy(str, mode, step) + \")\";\r\n                str = \"\";\r\n            }\r\n            else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    function_str += str + '\"';\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            }\r\n            else if (s == ',' && matchConfig.dquote == 0) {\r\n                function_str += _this.functionCopy(str, mode, step) + ',';\r\n                str = \"\";\r\n            }\r\n            else if (s == '&' && matchConfig.dquote == 0) {\r\n                if (str.length > 0) {\r\n                    function_str += _this.functionCopy(str, mode, step) + \"&\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    function_str += \"&\";\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    }\r\n                    while (p >= 0 && s_pre == \" \")\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionCopy(str, mode, step) + s + s_next;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else if (!(/[^0-9]/.test(s_next)) && s == \"-\" && (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)) {\r\n                    str += s;\r\n                }\r\n                else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionCopy(str, mode, step) + s;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    if (mode == \"down\") {\r\n                        function_str += _this.downparam($.trim(str), step);\r\n                    }\r\n                    else if (mode == \"up\") {\r\n                        function_str += _this.upparam($.trim(str), step);\r\n                    }\r\n                    else if (mode == \"left\") {\r\n                        function_str += _this.leftparam($.trim(str), step);\r\n                    }\r\n                    else if (mode == \"right\") {\r\n                        function_str += _this.rightparam($.trim(str), step);\r\n                    }\r\n                }\r\n                else {\r\n                    function_str += $.trim(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    isfreezonFuc: function (txt) {\r\n        let row = txt.replace(/[^0-9]/g, \"\");\r\n        let col = txt.replace(/[^A-Za-z]/g, \"\");\r\n        let row$ = txt.substr(txt.indexOf(row) - 1, 1);\r\n        let col$ = txt.substr(txt.indexOf(col) - 1, 1);\r\n        let ret = [false, false];\r\n\r\n        if (row$ == \"$\") {\r\n            ret[0] = true;\r\n        }\r\n        if (col$ == \"$\") {\r\n            ret[1] = true;\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    setfreezonFuceExe: function (rangetxt) {\r\n        let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\"));\r\n        let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n        let $row = \"$\",\r\n            $col = \"$\";\r\n\r\n        if (!isNaN(row) && !isNaN(col)) {\r\n            return $col + chatatABC(col) + $row + (row);\r\n        }\r\n        else if (!isNaN(row)) {\r\n            return $row + (row);\r\n        }\r\n        else if (!isNaN(col)) {\r\n            return $col + chatatABC(col);\r\n        }\r\n        else {\r\n            return rangetxt;\r\n        }\r\n    },\r\n    setfreezonFuc: function (event) {\r\n        let _this = this;\r\n\r\n        let obj = _this.getrangeseleciton();\r\n        if (!_this.iscelldata(obj.text())) {\r\n            return;\r\n        }\r\n\r\n        let txt = obj.text(),\r\n            pos = window.getSelection().anchorOffset;\r\n        let val = txt.split(\"!\"),\r\n            rangetxt, prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        }\r\n        else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let newtxt = \"\",\r\n            newpos = \"\";\r\n        let rangetxtIndex = rangetxt.indexOf(\":\");\r\n\r\n        if (rangetxtIndex == -1) {\r\n            newtxt = prefix + _this.setfreezonFuceExe(rangetxt);\r\n            newpos = newtxt.length;\r\n        }\r\n        else {\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            if (pos > rangetxtIndex) {\r\n                let ret = prefix + rangetxt[0] + \":\" + _this.setfreezonFuceExe(rangetxt[1]);\r\n                newtxt = ret;\r\n                newpos = ret.length;\r\n            }\r\n            else {\r\n                let firsttxt = prefix + _this.setfreezonFuceExe(rangetxt[0]);\r\n                let ret = firsttxt + \":\" + rangetxt[1];\r\n                newtxt = ret;\r\n                newpos = firsttxt.length;\r\n            }\r\n        }\r\n\r\n        obj.text(prefix + newtxt);\r\n        _this.setCaretPosition(obj.get(0), 0, newpos);\r\n    },\r\n    updateparam: function (orient, txt, step) {\r\n        let _this = this;\r\n\r\n        let val = txt.split(\"!\"),\r\n            rangetxt, prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        }\r\n        else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\"));\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n            let freezonFuc = _this.isfreezonFuc(rangetxt);\r\n            let $row = freezonFuc[0] ? \"$\" : \"\",\r\n                $col = freezonFuc[1] ? \"$\" : \"\";\r\n\r\n            if (orient == \"u\" && !freezonFuc[0]) {\r\n                row -= step;\r\n            }\r\n            else if (orient == \"r\" && !freezonFuc[1]) {\r\n                col += step;\r\n            }\r\n            else if (orient == \"l\" && !freezonFuc[1]) {\r\n                col -= step;\r\n            }\r\n            else if (orient == \"d\" && !freezonFuc[0]) {\r\n                row += step;\r\n            }\r\n\r\n            if (row[0] < 0 || col[0] < 0) {\r\n                return _this.error.r;\r\n            }\r\n\r\n            if (!isNaN(row) && !isNaN(col)) {\r\n                return prefix + $col + chatatABC(col) + $row + (row);\r\n            }\r\n            else if (!isNaN(row)) {\r\n                return prefix + $row + (row);\r\n            }\r\n            else if (!isNaN(col)) {\r\n                return prefix + $col + chatatABC(col);\r\n            }\r\n            else {\r\n                return txt;\r\n            }\r\n        }\r\n        else {\r\n            rangetxt = rangetxt.split(\":\");\r\n            let row = [],\r\n                col = [];\r\n\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\"));\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\"));\r\n            if (row[0] > row[1]) {\r\n                return txt;\r\n            }\r\n\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (col[0] > col[1]) {\r\n                return txt;\r\n            }\r\n\r\n            let freezonFuc0 = _this.isfreezonFuc(rangetxt[0]);\r\n            let freezonFuc1 = _this.isfreezonFuc(rangetxt[1]);\r\n            let $row0 = freezonFuc0[0] ? \"$\" : \"\",\r\n                $col0 = freezonFuc0[1] ? \"$\" : \"\";\r\n            let $row1 = freezonFuc1[0] ? \"$\" : \"\",\r\n                $col1 = freezonFuc1[1] ? \"$\" : \"\";\r\n\r\n            if (orient == \"u\") {\r\n                if (!freezonFuc0[0]) {\r\n                    row[0] -= step;\r\n                }\r\n\r\n                if (!freezonFuc1[0]) {\r\n                    row[1] -= step;\r\n                }\r\n            }\r\n            else if (orient == \"r\") {\r\n                if (!freezonFuc0[1]) {\r\n                    col[0] += step;\r\n                }\r\n\r\n                if (!freezonFuc1[1]) {\r\n                    col[1] += step;\r\n                }\r\n            }\r\n            else if (orient == \"l\") {\r\n                if (!freezonFuc0[1]) {\r\n                    col[0] -= step;\r\n                }\r\n\r\n                if (!freezonFuc1[1]) {\r\n                    col[1] -= step;\r\n                }\r\n            }\r\n            else if (orient == \"d\") {\r\n                if (!freezonFuc0[0]) {\r\n                    row[0] += step;\r\n                }\r\n\r\n                if (!freezonFuc1[0]) {\r\n                    row[1] += step;\r\n                }\r\n            }\r\n\r\n            if (row[0] < 0 || col[0] < 0) {\r\n                return _this.error.r;\r\n            }\r\n\r\n            if (isNaN(col[0]) && isNaN(col[1])) {\r\n                return prefix + $row0 + (row[0]) + \":\" + $row1 + (row[1]);\r\n            }\r\n            else if (isNaN(row[0]) && isNaN(row[1])) {\r\n                return prefix + $col0 + chatatABC(col[0]) + \":\" + $col1 + chatatABC(col[1]);\r\n            }\r\n            else {\r\n                return prefix + $col0 + chatatABC(col[0]) + $row0 + (row[0]) + \":\" + $col1 + chatatABC(col[1]) + $row1 + (row[1]);\r\n            }\r\n        }\r\n    },\r\n    downparam: function (txt, step) {\r\n        return this.updateparam(\"d\", txt, step);\r\n    },\r\n    upparam: function (txt, step) {\r\n        return this.updateparam(\"u\", txt, step);\r\n    },\r\n    leftparam: function (txt, step) {\r\n        return this.updateparam(\"l\", txt, step);\r\n    },\r\n    rightparam: function (txt, step) {\r\n        return this.updateparam(\"r\", txt, step);\r\n    },\r\n    functionStrChange: function (txt, type, rc, orient, stindex, step) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            \"bracket\": 0, //\u62EC\u53F7\r\n            \"comma\": 0, //\u9017\u53F7\r\n            \"squote\": 0, //\u5355\u5F15\u53F7\r\n            \"dquote\": 0 //\u53CC\u5F15\u53F7\r\n        };\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += str + \"(\";\r\n                }\r\n                else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            }\r\n            else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + \")\";\r\n                str = \"\";\r\n            }\r\n            else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    function_str += str + '\"';\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            }\r\n            else if (s == ',' && matchConfig.dquote == 0) {\r\n                function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + ',';\r\n                str = \"\";\r\n            }\r\n            else if (s == '&' && matchConfig.dquote == 0) {\r\n                if (str.length > 0) {\r\n                    function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + \"&\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    function_str += \"&\";\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    }\r\n                    while (p >= 0 && s_pre == \" \")\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + s + s_next;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else if (!(/[^0-9]/.test(s_next)) && s == \"-\" && (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)) {\r\n                    str += s;\r\n                }\r\n                else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + s;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    function_str += _this.functionStrChange_range($.trim(str), type, rc, orient, stindex, step);\r\n                }\r\n                else {\r\n                    function_str += $.trim(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    functionStrChange_range: function (txt, type, rc, orient, stindex, step) {\r\n        let _this = this;\r\n\r\n        let val = txt.split(\"!\"),\r\n            rangetxt, prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        }\r\n        else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let r1, r2, c1, c2;\r\n        let $row0, $row1, $col0, $col1;\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            r1 = r2 = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            c1 = c2 = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            let freezonFuc = _this.isfreezonFuc(rangetxt);\r\n\r\n            $row0 = $row1 = freezonFuc[0] ? \"$\" : \"\",\r\n                $col0 = $col1 = freezonFuc[1] ? \"$\" : \"\";\r\n        }\r\n        else {\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            r1 = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            r2 = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (r1 > r2) {\r\n                return txt;\r\n            }\r\n\r\n            c1 = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            c2 = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (c1 > c2) {\r\n                return txt;\r\n            }\r\n\r\n            let freezonFuc0 = _this.isfreezonFuc(rangetxt[0]);\r\n            $row0 = freezonFuc0[0] ? \"$\" : \"\";\r\n            $col0 = freezonFuc0[1] ? \"$\" : \"\";\r\n\r\n            let freezonFuc1 = _this.isfreezonFuc(rangetxt[1]);\r\n            $row1 = freezonFuc1[0] ? \"$\" : \"\";\r\n            $col1 = freezonFuc1[1] ? \"$\" : \"\";\r\n        }\r\n\r\n        if (type == \"del\") {\r\n            if (rc == \"row\") {\r\n                if (r1 >= stindex && r2 <= stindex + step - 1) {\r\n                    return _this.error.r;\r\n                }\r\n\r\n                if (r1 > stindex + step - 1) {\r\n                    r1 -= step;\r\n                }\r\n                else if (r1 >= stindex) {\r\n                    r1 = stindex;\r\n                }\r\n\r\n                if (r2 > stindex + step - 1) {\r\n                    r2 -= step;\r\n                }\r\n                else if (r2 >= stindex) {\r\n                    r2 = stindex - 1;\r\n                }\r\n\r\n                if (r1 < 0) {\r\n                    r1 = 0;\r\n                }\r\n\r\n                if (r2 < r1) {\r\n                    r2 = r1;\r\n                }\r\n            }\r\n            else if (rc == \"col\") {\r\n                if (c1 >= stindex && c2 <= stindex + step - 1) {\r\n                    return _this.error.r;\r\n                }\r\n\r\n                if (c1 > stindex + step - 1) {\r\n                    c1 -= step;\r\n                }\r\n                else if (c1 >= stindex) {\r\n                    c1 = stindex;\r\n                }\r\n\r\n                if (c2 > stindex + step - 1) {\r\n                    c2 -= step;\r\n                }\r\n                else if (c2 >= stindex) {\r\n                    c2 = stindex - 1;\r\n                }\r\n\r\n                if (c1 < 0) {\r\n                    c1 = 0;\r\n                }\r\n\r\n                if (c2 < c1) {\r\n                    c2 = c1;\r\n                }\r\n            }\r\n\r\n            if (r1 == r2 && c1 == c2) {\r\n                if (!isNaN(r1) && !isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1);\r\n                }\r\n                else if (!isNaN(r1)) {\r\n                    return prefix + $row0 + (r1 + 1);\r\n                }\r\n                else if (!isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1);\r\n                }\r\n                else {\r\n                    return txt;\r\n                }\r\n            }\r\n            else {\r\n                if (isNaN(c1) && isNaN(c2)) {\r\n                    return prefix + $row0 + (r1 + 1) + \":\" + $row1 + (r2 + 1);\r\n                }\r\n                else if (isNaN(r1) && isNaN(r2)) {\r\n                    return prefix + $col0 + chatatABC(c1) + \":\" + $col1 + chatatABC(c2);\r\n                }\r\n                else {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1) + \":\" + $col1 + chatatABC(c2) + $row1 + (r2 + 1);\r\n                }\r\n            }\r\n        }\r\n        else if (type == \"add\") {\r\n            if (rc == \"row\") {\r\n                if (orient == \"lefttop\") {\r\n                    if (r1 >= stindex) {\r\n                        r1 += step;\r\n                    }\r\n\r\n                    if (r2 >= stindex) {\r\n                        r2 += step;\r\n                    }\r\n                }\r\n                else if (orient == \"rightbottom\") {\r\n                    if (r1 > stindex) {\r\n                        r1 += step;\r\n                    }\r\n\r\n                    if (r2 > stindex) {\r\n                        r2 += step;\r\n                    }\r\n                }\r\n            }\r\n            else if (rc == \"col\") {\r\n                if (orient == \"lefttop\") {\r\n                    if (c1 >= stindex) {\r\n                        c1 += step;\r\n                    }\r\n\r\n                    if (c2 >= stindex) {\r\n                        c2 += step;\r\n                    }\r\n                }\r\n                else if (orient == \"rightbottom\") {\r\n                    if (c1 > stindex) {\r\n                        c1 += step;\r\n                    }\r\n\r\n                    if (c2 > stindex) {\r\n                        c2 += step;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (r1 == r2 && c1 == c2) {\r\n                if (!isNaN(r1) && !isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1);\r\n                }\r\n                else if (!isNaN(r1)) {\r\n                    return prefix + $row0 + (r1 + 1);\r\n                }\r\n                else if (!isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1);\r\n                }\r\n                else {\r\n                    return txt;\r\n                }\r\n            }\r\n            else {\r\n                if (isNaN(c1) && isNaN(c2)) {\r\n                    return prefix + $row0 + (r1 + 1) + \":\" + $row1 + (r2 + 1);\r\n                }\r\n                else if (isNaN(r1) && isNaN(r2)) {\r\n                    return prefix + $col0 + chatatABC(c1) + \":\" + $col1 + chatatABC(c2);\r\n                }\r\n                else {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1) + \":\" + $col1 + chatatABC(c2) + $row1 + (r2 + 1);\r\n                }\r\n            }\r\n        }\r\n    },\r\n    israngeseleciton: function (istooltip) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (istooltip == null) {\r\n            istooltip = false;\r\n        }\r\n\r\n        let currSelection = window.getSelection();\r\n        let anchor = $(currSelection.anchorNode);\r\n        let anchorOffset = currSelection.anchorOffset;\r\n\r\n        if (anchor.parent().is(\"span\") && anchorOffset != 0) {\r\n            let txt = $.trim(anchor.text()),\r\n                lasttxt = \"\";\r\n\r\n            if (txt.length == 0 && anchor.parent().prev().length > 0) {\r\n                let ahr = anchor.parent().prev();\r\n                txt = $.trim(ahr.text());\r\n                lasttxt = txt.substr(txt.length - 1, 1);\r\n                _this.rangeSetValueTo = ahr;\r\n            }\r\n            else {\r\n                lasttxt = txt.substr(anchorOffset - 1, 1);\r\n                _this.rangeSetValueTo = anchor.parent();\r\n            }\r\n\r\n            if ((istooltip && (lasttxt == \"(\" || lasttxt == \",\")) || (!istooltip && (lasttxt == \"(\" || lasttxt == \",\" || lasttxt == \"=\" || lasttxt in _this.operatorjson || lasttxt == \"&\"))) {\r\n                return true;\r\n            }\r\n        }\r\n        else if (anchor.is(\"#luckysheet-rich-text-editor\") || anchor.is(\"#luckysheet-functionbox-cell\")) {\r\n            let txt = $.trim(anchor.find(\"span\").last().text()),\r\n                lasttxt;\r\n\r\n            _this.rangeSetValueTo = anchor.find(\"span\").last();\r\n\r\n            if (txt.length == 0 && anchor.find(\"span\").length > 1) {\r\n                let ahr = anchor.find(\"span\");\r\n                txt = $.trim(ahr.eq(ahr.length - 2).text());\r\n                _this.rangeSetValueTo = ahr;\r\n            }\r\n\r\n            lasttxt = txt.substr(txt.length - 1, 1);\r\n\r\n            if ((istooltip && (lasttxt == \"(\" || lasttxt == \",\")) || (!istooltip && (lasttxt == \"(\" || lasttxt == \",\" || lasttxt == \"=\" || lasttxt in _this.operatorjson || lasttxt == \"&\"))) {\r\n                return true;\r\n            }\r\n        }\r\n        else if (anchor.parent().is(\"#luckysheet-rich-text-editor\") || anchor.parent().is(\"#luckysheet-functionbox-cell\") || anchorOffset == 0) {\r\n            if (anchorOffset == 0) {\r\n                anchor = anchor.parent();\r\n            }\r\n\r\n            if (anchor.prev().length > 0) {\r\n                let txt = $.trim(anchor.prev().text());\r\n                let lasttxt = txt.substr(txt.length - 1, 1);\r\n\r\n                _this.rangeSetValueTo = anchor.prev();\r\n\r\n                if ((istooltip && (lasttxt == \"(\" || lasttxt == \",\")) || (!istooltip && (lasttxt == \"(\" || lasttxt == \",\" || lasttxt == \"=\" || lasttxt in _this.operatorjson || lasttxt == \"&\"))) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        return false;\r\n    },\r\n    rangechangeindex: null,\r\n    rangestart: false,\r\n    rangetosheet: null,\r\n    rangeSetValueTo: null,\r\n    func_selectedrange: {}, //\u51FD\u6570\u9009\u533A\u8303\u56F4\r\n    rangeSetValue: function (selected, obj) {\r\n        let _this = this;\r\n\r\n        let range = \"\", rf = selected[\"row\"][0], cf = selected[\"column\"][0];\r\n        if (Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]) {\r\n            range = getRangetxt(Store.currentSheetIndex, {\r\n                column: [cf, cf],\r\n                row: [rf, rf],\r\n            }, _this.rangetosheet);\r\n        }\r\n        else {\r\n            range = getRangetxt(Store.currentSheetIndex, selected, _this.rangetosheet);\r\n        }\r\n\r\n        let $editor;\r\n\r\n        if (_this.rangestart || _this.rangedrag_column_start || _this.rangedrag_row_start) {\r\n            if ($(\"#luckysheet-search-formula-parm\").is(\":visible\") || $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")) {\r\n                //\u516C\u5F0F\u53C2\u6570\u6846\u9009\u53D6\u8303\u56F4\r\n                $editor = $(\"#luckysheet-rich-text-editor\");\r\n                $(\"#luckysheet-search-formula-parm-select-input\").val(range);\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").eq(_this.data_parm_index).find(\".txt input\").val(range);\r\n\r\n                //\u53C2\u6570\u5BF9\u5E94\u503C\u663E\u793A\r\n                let txtdata = luckysheet_getcelldata(range).data;\r\n                if (txtdata instanceof Array) {\r\n                    //\u53C2\u6570\u4E3A\u591A\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                    let txtArr = [];\r\n\r\n                    for (let i = 0; i < txtdata.length; i++) {\r\n                        for (let j = 0; j < txtdata[i].length; j++) {\r\n                            if (txtdata[i][j] == null) {\r\n                                txtArr.push(null);\r\n                            }\r\n                            else {\r\n                                txtArr.push(txtdata[i][j].v);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(_this.data_parm_index).find(\".val\").text(\" = {\" + txtArr.join(\",\") + \"}\");\r\n                }\r\n                else {\r\n                    //\u53C2\u6570\u4E3A\u5355\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(_this.data_parm_index).find(\".val\").text(\" = {\" + txtdata.v + \"}\");\r\n                }\r\n\r\n                //\u8BA1\u7B97\u7ED3\u679C\u663E\u793A\r\n                let isVal = true; //\u53C2\u6570\u4E0D\u4E3A\u7A7A\r\n                let parmValArr = []; //\u53C2\u6570\u503C\u96C6\u5408\r\n                let lvi = -1; //\u6700\u540E\u4E00\u4E2A\u6709\u503C\u7684\u53C2\u6570\u7D22\u5F15\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").each(function (i, e) {\r\n                    let parmtxt = $(e).find(\".txt input\").val();\r\n                    if (parmtxt == \"\" && $(e).find(\".txt input\").attr(\"data_parm_require\") == \"m\") {\r\n                        isVal = false;\r\n                    }\r\n                    if (parmtxt != \"\") {\r\n                        lvi = i;\r\n                    }\r\n                })\r\n\r\n                //\u5355\u5143\u683C\u663E\u793A\r\n                let functionHtmlTxt;\r\n                if (lvi == -1) {\r\n                    functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"()\";\r\n                }\r\n                else if (lvi == 0) {\r\n                    functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + $(\"#luckysheet-search-formula-parm .parmBox\").eq(0).find(\".txt input\").val() + \")\";\r\n                }\r\n                else {\r\n                    for (let j = 0; j <= lvi; j++) {\r\n                        parmValArr.push($(\"#luckysheet-search-formula-parm .parmBox\").eq(j).find(\".txt input\").val());\r\n                    }\r\n                    functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + parmValArr.join(\",\") + \")\";\r\n                }\r\n\r\n                let function_str = _this.functionHTMLGenerate(functionHtmlTxt);\r\n                $(\"#luckysheet-rich-text-editor\").html(function_str);\r\n                $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n                if (isVal) {\r\n                    //\u516C\u5F0F\u8BA1\u7B97\r\n                    let fp = $.trim(_this.functionParserExe($(\"#luckysheet-rich-text-editor\").text()));\r\n                    let result = new Function(\"return \" + fp)();\r\n                    $(\"#luckysheet-search-formula-parm .result span\").text(result);\r\n                }\r\n            }\r\n            else {\r\n                let currSelection = window.getSelection();\r\n                let anchorOffset = currSelection.anchorNode;\r\n                $editor = $(anchorOffset).closest(\"div\");\r\n\r\n                let $span = $editor.find(\"span[rangeindex='\" + _this.rangechangeindex + \"']\").html(range);\r\n\r\n                _this.setCaretPosition($span.get(0), 0, range.length);\r\n            }\r\n        }\r\n        else {\r\n            let function_str = '<span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"' + _this.functionHTMLIndex + '\" dir=\"auto\" style=\"color:' + luckyColor[_this.functionHTMLIndex] + ';\">' + range + '</span>';\r\n            let $t = $(function_str).insertAfter(_this.rangeSetValueTo);\r\n            _this.rangechangeindex = _this.functionHTMLIndex;\r\n            $editor = $(_this.rangeSetValueTo).closest(\"div\");\r\n\r\n            _this.setCaretPosition($editor.find(\"span[rangeindex='\" + _this.rangechangeindex + \"']\").get(0), 0, range.length);\r\n            _this.functionHTMLIndex++;\r\n        }\r\n\r\n        if ($editor.attr(\"id\") == \"luckysheet-rich-text-editor\") {\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n        }\r\n        else {\r\n            $(\"#luckysheet-rich-text-editor\").html($(\"#luckysheet-functionbox-cell\").html());\r\n        }\r\n    },\r\n    rangedrag: function (event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        let top = 0,\r\n            height = 0,\r\n            rowseleted = [];\r\n\r\n        if (_this.func_selectedrange.top > row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[1]];\r\n        }\r\n        else if (_this.func_selectedrange.top == row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[0]];\r\n        }\r\n        else {\r\n            top = _this.func_selectedrange.top;\r\n            height = row - _this.func_selectedrange.top - 1;\r\n            rowseleted = [_this.func_selectedrange.row[0], row_index];\r\n        }\r\n\r\n        let left = 0,\r\n            width = 0,\r\n            columnseleted = [];\r\n\r\n        if (_this.func_selectedrange.left > col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[1]];\r\n        }\r\n        else if (_this.func_selectedrange.left == col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[0]];\r\n        }\r\n        else {\r\n            left = _this.func_selectedrange.left;\r\n            width = col - _this.func_selectedrange.left - 1;\r\n            columnseleted = [_this.func_selectedrange.column[0], col_index];\r\n        }\r\n\r\n        rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, _this.func_selectedrange, top, height, left, width);\r\n        if (changeparam != null) {\r\n            columnseleted = changeparam[0];\r\n            rowseleted = changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"row\"] = rowseleted;\r\n        _this.func_selectedrange[\"column\"] = columnseleted;\r\n\r\n        _this.func_selectedrange[\"left_move\"] = left;\r\n        _this.func_selectedrange[\"width_move\"] = width;\r\n        _this.func_selectedrange[\"top_move\"] = top;\r\n        _this.func_selectedrange[\"height_move\"] = height;\r\n\r\n        luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n            //if\u516C\u5F0F\u751F\u6210\u5668 \u9009\u62E9\u8303\u56F4\r\n            let range = getRangetxt(Store.currentSheetIndex, { \"row\": rowseleted, \"column\": columnseleted }, Store.currentSheetIndex);\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n        }\r\n        else {\r\n            _this.rangeSetValue({\r\n                \"row\": rowseleted,\r\n                \"column\": columnseleted\r\n            });\r\n        }\r\n\r\n        luckysheetFreezen.scrollFreezen(rowseleted, columnseleted);\r\n    },\r\n    rangedrag_column_start: false,\r\n    rangedrag_row_start: false,\r\n    rangedrag_column: function (event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let visibledatarow = Store.visibledatarow;\r\n        let row_index = visibledatarow.length - 1,\r\n            row = visibledatarow[row_index],\r\n            row_pre = 0;\r\n\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        let left = 0,\r\n            width = 0,\r\n            columnseleted = [];\r\n\r\n        if (_this.func_selectedrange.left > col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[1]];\r\n        }\r\n        else if (_this.func_selectedrange.left == col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[0]];\r\n        }\r\n        else {\r\n            left = _this.func_selectedrange.left;\r\n            width = col - _this.func_selectedrange.left - 1;\r\n            columnseleted = [_this.func_selectedrange.column[0], col_index];\r\n        }\r\n\r\n        //rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        //rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, [0, row_index], _this.func_selectedrange, row_pre, row - row_pre - 1, left, width);\r\n        if (changeparam != null) {\r\n            columnseleted = changeparam[0];\r\n            // rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"column\"] = columnseleted;\r\n        _this.func_selectedrange[\"left_move\"] = left;\r\n        _this.func_selectedrange[\"width_move\"] = width;\r\n\r\n        luckysheet_count_show(left, row_pre, width, row - row_pre - 1, [0, row_index], columnseleted);\r\n\r\n        _this.rangeSetValue({\r\n            \"row\": [null, null],\r\n            \"column\": columnseleted\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1\r\n        }).show();\r\n\r\n        luckysheetFreezen.scrollFreezen([0, row_index], columnseleted);\r\n    },\r\n    rangedrag_row: function (event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n\r\n        let visibledatacolumn = Store.visibledatacolumn;\r\n        let col_index = visibledatacolumn.length - 1,\r\n            col = visibledatacolumn[col_index],\r\n            col_pre = 0;\r\n\r\n        let top = 0,\r\n            height = 0,\r\n            rowseleted = [];\r\n\r\n        if (_this.func_selectedrange.top > row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[1]];\r\n        }\r\n        else if (_this.func_selectedrange.top == row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[0]];\r\n        }\r\n        else {\r\n            top = _this.func_selectedrange.top;\r\n            height = row - _this.func_selectedrange.top - 1;\r\n            rowseleted = [_this.func_selectedrange.row[0], row_index];\r\n        }\r\n\r\n        rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        // columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        // columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain([0, col_index], rowseleted, _this.func_selectedrange, top, height, col_pre, col - col_pre - 1);\r\n        if (changeparam != null) {\r\n            // columnseleted = changeparam[0];\r\n            rowseleted = changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"row\"] = rowseleted;\r\n        _this.func_selectedrange[\"top_move\"] = top;\r\n        _this.func_selectedrange[\"height_move\"] = height;\r\n\r\n        luckysheet_count_show(col_pre, top, col - col_pre - 1, height, rowseleted, [0, col_index]);\r\n\r\n        _this.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": [null, null]\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        luckysheetFreezen.scrollFreezen(rowseleted, [0, col_index]);\r\n    },\r\n    rangedragged: function () { },\r\n    rangeResizeObj: null,\r\n    rangeResize: null,\r\n    rangeResizeIndex: null,\r\n    rangeResizexy: null,\r\n    rangeResizeWinH: null,\r\n    rangeResizeWinW: null,\r\n    rangeResizeTo: null,\r\n    rangeResizeDraging: function (event, luckysheetCurrentChartResizeObj, luckysheetCurrentChartResizeXy, luckysheetCurrentChartResize, luckysheetCurrentChartResizeWinW, luckysheetCurrentChartResizeWinH, ch_width, rh_height) {\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n            scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        if (x < 0 || y < 0) {\r\n            return false;\r\n        }\r\n\r\n        let topchange = row_pre - luckysheetCurrentChartResizeXy[1],\r\n            leftchange = col_pre - luckysheetCurrentChartResizeXy[0];\r\n        let top = luckysheetCurrentChartResizeXy[5],\r\n            height = luckysheetCurrentChartResizeXy[3],\r\n            left = luckysheetCurrentChartResizeXy[4],\r\n            width = luckysheetCurrentChartResizeXy[2];\r\n\r\n        if (luckysheetCurrentChartResize == \"lt\" || luckysheetCurrentChartResize == \"lb\") {\r\n            if (luckysheetCurrentChartResizeXy[0] + luckysheetCurrentChartResizeXy[2] < col_pre) {\r\n                return;\r\n            }\r\n\r\n            left = col_pre;\r\n            width = luckysheetCurrentChartResizeXy[2] - leftchange;\r\n\r\n            if (left > luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[4] - col + col_pre) {\r\n                left = luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[4] - col + col_pre;\r\n                width = luckysheetCurrentChartResizeXy[2] - (luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[4] - col + col_pre - luckysheetCurrentChartResizeXy[0]);\r\n            }\r\n            else if (left <= 0) {\r\n                left = 0;\r\n                width = luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[0];\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"rt\" || luckysheetCurrentChartResize == \"rb\") {\r\n            if (luckysheetCurrentChartResizeXy[6] - luckysheetCurrentChartResizeXy[2] > col) {\r\n                return;\r\n            }\r\n\r\n            width = luckysheetCurrentChartResizeXy[2] + col - luckysheetCurrentChartResizeXy[6];\r\n\r\n            if (width < col - col_pre - 1) {\r\n                width = col - col_pre - 1;\r\n            }\r\n            else if (width >= ch_width - left) {\r\n                width = ch_width - left;\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"lt\" || luckysheetCurrentChartResize == \"rt\") {\r\n            if (luckysheetCurrentChartResizeXy[1] + luckysheetCurrentChartResizeXy[3] < row_pre) {\r\n                return;\r\n            }\r\n\r\n            top = row_pre;\r\n            height = luckysheetCurrentChartResizeXy[3] - topchange;\r\n\r\n            if (top > luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[5] - row + row_pre) {\r\n                top = luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[5] - row + row_pre;\r\n                height = luckysheetCurrentChartResizeXy[3] - (luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[5] - row + row_pre - luckysheetCurrentChartResizeXy[1]);\r\n            }\r\n            else if (top <= 0) {\r\n                top = 0;\r\n                height = luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[1];\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"lb\" || luckysheetCurrentChartResize == \"rb\") {\r\n            if (luckysheetCurrentChartResizeXy[7] - luckysheetCurrentChartResizeXy[3] > row) {\r\n                return;\r\n            }\r\n\r\n            height = luckysheetCurrentChartResizeXy[3] + row - luckysheetCurrentChartResizeXy[7];\r\n\r\n            if (height < row - row_pre - 1) {\r\n                height = row - row_pre - 1;\r\n            }\r\n            else if (height >= rh_height - top) {\r\n                height = rh_height - top;\r\n            }\r\n        }\r\n\r\n        let rangeindex = _this.rangeResizeIndex;\r\n        let selected = {\r\n            \"top\": top,\r\n            \"left\": left,\r\n            \"height\": height,\r\n            \"width\": width\r\n        };\r\n        let range = _this.getSelectedFromRange(selected);\r\n        let rangetxt = getRangetxt(Store.currentSheetIndex, range, _this.rangetosheet);\r\n        let $span = _this.rangeResizeTo.find(\"span[rangeindex='\" + rangeindex + \"']\").html(rangetxt);\r\n        luckysheetRangeLast(_this.rangeResizeTo[0]);\r\n        luckysheetCurrentChartResizeObj.css(selected).data(\"range\", range);\r\n    },\r\n    getSelectedFromRange: function (obj) {\r\n        let row_st = obj.top + 2,\r\n            row_ed = obj.top + obj.height - 2;\r\n        let col_st = obj.left + 2,\r\n            col_ed = obj.left + obj.width - 2;\r\n\r\n        let ret = {\r\n            \"row\": [\r\n                rowLocation(row_st)[2],\r\n                rowLocation(row_ed)[2]\r\n            ],\r\n            \"column\": [\r\n                colLocation(col_st)[2],\r\n                colLocation(col_ed)[2]\r\n            ]\r\n        };\r\n\r\n        return ret;\r\n    },\r\n    rangeResizeDragged: function (event, luckysheetCurrentChartResizeObj, luckysheetCurrentChartResizeXy, luckysheetCurrentChartResize, luckysheetCurrentChartResizeWinW, luckysheetCurrentChartResizeWinH) {\r\n        let _this = this;\r\n\r\n        _this.rangeResize = null;\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + _this.rangeResizeIndex).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.03);\r\n    },\r\n    rangeMovexy: null,\r\n    rangeMove: false,\r\n    rangeMoveObj: null,\r\n    rangeMoveIndex: null,\r\n    rangeMoveRangedata: null,\r\n    rangeMoveDraging: function (event, luckysheet_cell_selected_move_index, luckysheet_select_save, obj, sheetBarHeight, statisticBarHeight) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        let winH = $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n            winW = $(window).width() + scrollLeft;\r\n\r\n        let row_index_original = luckysheet_cell_selected_move_index[0],\r\n            col_index_original = luckysheet_cell_selected_move_index[1];\r\n        let row_s = luckysheet_select_save[\"row\"][0] - row_index_original + rowLocation(y)[2],\r\n            row_e = luckysheet_select_save[\"row\"][1] - row_index_original + rowLocation(y)[2];\r\n        let col_s = luckysheet_select_save[\"column\"][0] - col_index_original + colLocation(x)[2],\r\n            col_e = luckysheet_select_save[\"column\"][1] - col_index_original + colLocation(x)[2];\r\n\r\n        if (row_s < 0 || y < 0) {\r\n            row_s = 0;\r\n            row_e = luckysheet_select_save[\"row\"][1] - luckysheet_select_save[\"row\"][0];\r\n        }\r\n        if (col_s < 0 || x < 0) {\r\n            col_s = 0;\r\n            col_e = luckysheet_select_save[\"column\"][1] - luckysheet_select_save[\"column\"][0];\r\n        }\r\n\r\n        let visibledatarow = Store.visibledatarow;\r\n        if (row_e >= visibledatarow[visibledatarow.length - 1] || y > winH) {\r\n            row_s = visibledatarow.length - 1 - luckysheet_select_save[\"row\"][1] + luckysheet_select_save[\"row\"][0];\r\n            row_e = visibledatarow.length - 1;\r\n        }\r\n        let visibledatacolumn = Store.visibledatacolumn;\r\n        if (col_e >= visibledatacolumn[visibledatacolumn.length - 1] || x > winW) {\r\n            col_s = visibledatacolumn.length - 1 - luckysheet_select_save[\"column\"][1] + luckysheet_select_save[\"column\"][0];\r\n            col_e = visibledatacolumn.length - 1;\r\n        }\r\n\r\n        let col_pre = col_s - 1 == -1 ? 0 : visibledatacolumn[col_s - 1],\r\n            col = visibledatacolumn[col_e];\r\n        let row_pre = row_s - 1 == -1 ? 0 : visibledatarow[row_s - 1],\r\n            row = visibledatarow[row_e];\r\n        let rangeindex = _this.rangeMoveIndex;\r\n        let selected = {\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 2,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 2,\r\n            \"display\": \"block\"\r\n        };\r\n        let range = _this.getSelectedFromRange(selected);\r\n        let rangetxt = getRangetxt(Store.currentSheetIndex, range, _this.rangetosheet);\r\n        let $span = _this.rangeResizeTo.find(\"span[rangeindex='\" + rangeindex + \"']\").html(rangetxt);\r\n        luckysheetRangeLast(_this.rangeResizeTo[0]);\r\n        _this.rangeMoveRangedata = range;\r\n        obj.css(selected);\r\n    },\r\n    rangeMoveDragged: function (obj) {\r\n        let _this = this;\r\n\r\n        _this.rangeMove = false;\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + _this.rangeMoveIndex).data(\"range\", _this.rangeMoveRangedata).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.03);\r\n    },\r\n    functionHTMLIndex: 0,\r\n    functionRangeIndex: null,\r\n    findrangeindex: function (v, vp) {\r\n        let _this = this;\r\n\r\n        let re = /<span.*?>/g;\r\n        let v_a = v.replace(re, \"\"),\r\n            vp_a = vp.replace(re, \"\");\r\n        v_a = v_a.split('</span>');\r\n        vp_a = vp_a.split('</span>');\r\n        v_a.pop();\r\n        vp_a.pop();\r\n\r\n        let pfri = _this.functionRangeIndex;\r\n        let i = 0;\r\n        let spanlen = vp_a.length > v_a.length ? v_a.length : vp_a.length;\r\n\r\n        let vplen = vp_a.length, vlen = v_a.length;\r\n        //\u4E0D\u589E\u52A0\u5143\u7D20\u8F93\u5165\r\n        if (vplen == vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i], n = v_a[i];\r\n\r\n            if (p == null) {\r\n                if (vp_a.length <= i) {\r\n                    pfri = [vp_a.length - 1, vp_a.length - 1];\r\n                }\r\n                else if (v_a.length <= i) {\r\n                    pfri = [v_a.length - 1, v_a.length - 1];\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length == n.length) {\r\n                if (vp_a[i + 1] != null && v_a[i + 1] != null && vp_a[i + 1].length < v_a[i + 1].length) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length > n.length) {\r\n                if (p != null && v_a[i + 1] != null && v_a[i + 1].substr(0, 1) == '\"' && (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length < n.length) {\r\n                if (pfri[1] > n.length) {\r\n                    pfri[1] = n.length;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n        }\r\n        //\u51CF\u5C11\u5143\u7D20\u8F93\u5165\r\n        else if (vplen > vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i], n = v_a[i];\r\n\r\n            if (n == null) {\r\n                if (v_a[i - 1].indexOf(\"{\") > -1) {\r\n                    pfri[0] = pfri[0] - 1;\r\n                    let start = v_a[i - 1].search(\"{\");\r\n                    pfri[1] = pfri[1] + start;\r\n                }\r\n                else {\r\n                    pfri[0] = 0;\r\n                    pfri[1] = 0;\r\n                }\r\n            }\r\n            else if (p.length == n.length) {\r\n                if (v_a[i + 1] != null && (v_a[i + 1].substr(0, 1) == '\"' || v_a[i + 1].substr(0, 1) == '{' || v_a[i + 1].substr(0, 1) == '}')) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n                else if (p != null && p.length > 2 && p.substr(0, 1) == '\"' && p.substr(p.length - 1, 1) == '\"') {\r\n                    //pfri[1] = n.length-1;\r\n                }\r\n                else if (v_a[i] != null && v_a[i] == '\")') {\r\n                    pfri[1] = 1;\r\n                }\r\n                else if (v_a[i] != null && v_a[i] == '\"}') {\r\n                    pfri[1] = 1;\r\n                }\r\n                else if (v_a[i] != null && v_a[i] == '{)') {\r\n                    pfri[1] = 1;\r\n                }\r\n                else {\r\n                    pfri[1] = n.length;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length > n.length) {\r\n                if (v_a[i + 1] != null && (v_a[i + 1].substr(0, 1) == '\"' || v_a[i + 1].substr(0, 1) == '{' || v_a[i + 1].substr(0, 1) == '}')) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length < n.length) {\r\n                return pfri;\r\n            }\r\n\r\n            return pfri;\r\n        }\r\n        //\u589E\u52A0\u5143\u7D20\u8F93\u5165\r\n        else if (vplen < vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i], n = v_a[i];\r\n\r\n            if (p == null) {\r\n                pfri[0] = v_a.length - 1;\r\n\r\n                if (n != null) {\r\n                    pfri[1] = n.length;\r\n                }\r\n                else {\r\n                    pfri[1] = 1;\r\n                }\r\n            }\r\n            else if (p.length == n.length) {\r\n                if (vp_a[i + 1] != null && (vp_a[i + 1].substr(0, 1) == '\"' || vp_a[i + 1].substr(0, 1) == '{' || vp_a[i + 1].substr(0, 1) == '}')) {\r\n                    pfri[1] = n.length;\r\n                }\r\n                else if (v_a[i + 1] != null && v_a[i + 1].substr(0, 1) == '\"' && (v_a[i + 1].substr(0, 1) == '{' || v_a[i + 1].substr(0, 1) == '}')) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n                else if (n != null && n.substr(0, 1) == '\"' && n.substr(n.length - 1, 1) == '\"' && p.substr(0, 1) == '\"' && p.substr(p.length - 1, 1) == ')') {\r\n                    pfri[1] = n.length;\r\n                }\r\n                else if (n != null && n.substr(0, 1) == '{' && n.substr(n.length - 1, 1) == '}' && p.substr(0, 1) == '{' && p.substr(p.length - 1, 1) == ')') {\r\n                    pfri[1] = n.length;\r\n                }\r\n                else {\r\n                    pfri[0] = pfri[0] + vlen - vplen;\r\n                    if (v_a.length > vp_a.length) {\r\n                        pfri[1] = v_a[i + 1].length;\r\n                    }\r\n                    else {\r\n                        pfri[1] = 1;\r\n                    }\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length > n.length) {\r\n                if (p != null && p.substr(0, 1) == '\"') {\r\n                    pfri[1] = n.length;\r\n                }\r\n                else if (v_a[i + 1] != null && /{.*?}/.test(v_a[i + 1])) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = v_a[i + 1].length;\r\n                }\r\n                else if (p != null && v_a[i + 1].substr(0, 1) == '\"' && (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n                else if (p != null && (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)) {\r\n\r\n                }\r\n                else {\r\n                    pfri[0] = pfri[0] + vlen - vplen - 1;\r\n                    pfri[1] = v_a[i - 1].length;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n            else if (p.length < n.length) {\r\n                return pfri;\r\n            }\r\n\r\n            return pfri;\r\n        }\r\n\r\n        return null;\r\n    },\r\n    setCaretPosition: function (textDom, children, pos) {\r\n        try {\r\n            let el = textDom;\r\n            let range = document.createRange();\r\n            let sel = window.getSelection();\r\n            range.setStart(el.childNodes[children], pos);\r\n            range.collapse(true);\r\n            sel.removeAllRanges();\r\n            sel.addRange(range);\r\n            el.focus();\r\n        }\r\n        catch (err) {\r\n            luckysheetRangeLast(this.rangeResizeTo[0]);\r\n        }\r\n    },\r\n    functionRange: function (obj, v, vp) {\r\n        let _this = this;\r\n\r\n        if (window.getSelection) { //ie11 10 9 ff safari\r\n            let currSelection = window.getSelection();\r\n            let fri = _this.findrangeindex(v, vp);\r\n\r\n            if (fri == null) {\r\n                currSelection.selectAllChildren(obj.get(0));\r\n                currSelection.collapseToEnd();\r\n            }\r\n            else {\r\n                _this.setCaretPosition(obj.find(\"span\").get(fri[0]), 0, fri[1]);\r\n            }\r\n        }\r\n        else if (document.selection) { //ie10 9 8 7 6 5\r\n            _this.functionRangeIndex.moveToElementText(obj); //range\u5B9A\u4F4D\u5230obj\r\n            _this.functionRangeIndex.collapse(false); //\u5149\u6807\u79FB\u81F3\u6700\u540E\r\n            _this.functionRangeIndex.select();\r\n        }\r\n    },\r\n    functionInputHanddler: function ($to, $input, kcode) {\r\n        if (isEditMode()) {//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u516C\u5F0F\u680F\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let $copy = $to,\r\n            $editer = $input;\r\n        let value1 = $editer.html(),\r\n            value1txt = $editer.text();\r\n        let xssDeal = this.xssDeal\r\n        setTimeout(function() {\r\n            let value = $editer.text(),\r\n                valuetxt = value;\r\n            value = xssDeal(value);\r\n            if (value.length > 0 && value.substr(0, 1) == \"=\" && (kcode != 229 || value.length == 1)) {\r\n                value = _this.functionHTMLGenerate(value);\r\n                value1 = _this.functionHTMLGenerate(value1txt);\r\n\r\n                if (window.getSelection) { // all browsers, except IE before version 9\r\n                    let currSelection = window.getSelection();\r\n                    if ($(currSelection.anchorNode).is(\"div\")) {\r\n                        let editorlen = $(\"#luckysheet-rich-text-editor span\").length;\r\n                        _this.functionRangeIndex = [editorlen - 1, $(\"#luckysheet-rich-text-editor\").find(\"span\").eq(editorlen - 1).text().length];\r\n                    }\r\n                    else {\r\n                        _this.functionRangeIndex = [$(currSelection.anchorNode).parent().index(), currSelection.anchorOffset];\r\n                    }\r\n                }\r\n                else { // Internet Explorer before version 9\r\n                    let textRange = document.selection.createRange();\r\n                    _this.functionRangeIndex = textRange;\r\n                }\r\n\r\n                $editer.html(value);\r\n                _this.functionRange($editer, value, value1);\r\n                _this.canceFunctionrangeSelected();\r\n\r\n                if (kcode != 46) {//delete\u4E0D\u6267\u884C\u6B64\u51FD\u6570\r\n                    _this.createRangeHightlight();\r\n                }\r\n\r\n                $copy.html(value);\r\n                _this.rangestart = false;\r\n                _this.rangedrag_column_start = false;\r\n                _this.rangedrag_row_start = false;\r\n\r\n                _this.rangeHightlightselected($editer, kcode);\r\n\r\n            }\r\n            else if (value1txt.substr(0, 1) != \"=\") {\r\n                //&& value1.indexOf(\"span\")>-1\r\n                // $editer.html(value1);\r\n\r\n                // let w = window.getSelection();\r\n                // if(w!=null && w.type!=\"None\"){\r\n                //     let range = w.getRangeAt(0);\r\n                //     let c = range.startContainer;\r\n\r\n                //     if(c.id==\"luckysheet-rich-text-editor\" || $(c).closest(\"#luckysheet-rich-text-editor\")){\r\n                //         $functionbox.html(value);\r\n                //     }\r\n                //     else if(c.id==\"luckysheet-functionbox-cell\" || $(c).closest(\"#luckysheet-functionbox-cell\")){\r\n                //         if(value1.indexOf(\"span\")>-1){\r\n\r\n                //         }\r\n                //         else{\r\n                //             $editer.html(value);\r\n                //         }\r\n                //     }\r\n\r\n                // }\r\n                // console.trace();\r\n                // console.log(value, $copy.attr(\"id\"));\r\n\r\n                if ($copy.attr(\"id\") == \"luckysheet-rich-text-editor\") {\r\n                    if ($copy.html().substr(0, 5) == \"<span\") {\r\n\r\n                    }\r\n                    else {\r\n                        $copy.html(value);\r\n                    }\r\n                }\r\n                else {\r\n                    $copy.html(value);\r\n                }\r\n            }\r\n\r\n\r\n        }, 1);\r\n    },\r\n    functionHTMLGenerate: function (txt) {\r\n        let _this = this;\r\n\r\n        if (txt.length == 0 || txt.substr(0, 1) != \"=\") {\r\n            return txt;\r\n        }\r\n\r\n        _this.functionHTMLIndex = 0;\r\n\r\n        return '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>' + _this.functionHTML(txt);\r\n    },\r\n    functionHTML: function (txt) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0,\r\n            \"braces\": 0\r\n        }\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-func\">' + str + '</span><span dir=\"auto\" class=\"luckysheet-formula-text-lpar\">(</span>';\r\n                }\r\n                else {\r\n                    function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-lpar\">(</span>';\r\n                }\r\n\r\n                str = \"\";\r\n            }\r\n            else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-rpar\">)</span>';\r\n                str = \"\";\r\n            }\r\n            else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '{';\r\n                matchConfig.braces += 1;\r\n            }\r\n            else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '}';\r\n                matchConfig.braces -= 1;\r\n            }\r\n            else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    if (str.length > 0) {\r\n                        function_str += str + '\"</span>';\r\n                    }\r\n                    else {\r\n                        function_str += '\"</span>';\r\n                    }\r\n\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-string\">\"';\r\n                    }\r\n                    else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-string\">\"';\r\n                    }\r\n\r\n                    str = \"\";\r\n                }\r\n            }\r\n            //\u4FEE\u6B63\u4F8B\u5982\u8F93\u5165\u516C\u5F0F='1-2'!A1\u65F6\uFF0C\u53EA\u67092'!A1\u662Fluckysheet-formula-functionrange-cell\u8272\uFF0C'1-\u662F\u9ED1\u8272\u7684\u95EE\u9898\u3002\r\n            else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n                matchConfig.squote = matchConfig.squote == 0 ? 1 : 0;\r\n            }\r\n            else if (s == ',' && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                //matchConfig.comma += 1;\r\n                function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-comma\">,</span>';\r\n                str = \"\";\r\n            }\r\n            else if (s == '&' && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0) {\r\n                    function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + '&' + '</span>';\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + '&' + '</span>';\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let s_next = \"\";\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1, s_pre = null;\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    }\r\n                    while (p >= 0 && s_pre == \" \")\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + s_next + '</span>';\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + s_next + '</span>';\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else if (!(/[^0-9]/.test(s_next)) && s == \"-\" && (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)) {\r\n                    str += s;\r\n                }\r\n                else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + '</span>';\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + '</span>';\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                //function_str += str;\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    function_str += '<span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"' + _this.functionHTMLIndex + '\" dir=\"auto\" style=\"color:' + luckyColor[_this.functionHTMLIndex] + ';\">' + str + '</span>';\r\n                    _this.functionHTMLIndex++;\r\n                }\r\n                else if (matchConfig.dquote > 0) {\r\n                    function_str += str + '</span>';\r\n                }\r\n                else if (str.indexOf(\"</span>\") == -1 && str.length > 0) {\r\n                    let regx = /{.*?}/;\r\n\r\n                    if (regx.test($.trim(str))) {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            alltxt += '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' + str.substr(0, arraystart) + '</span>';\r\n                        }\r\n\r\n                        alltxt += '<span dir=\"auto\" style=\"color:#959a05\" class=\"luckysheet-formula-text-array\">' + arraytxt + '</span>';\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            alltxt += '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' + str.substr(arraystart + arraytxt.length, str.length) + '</span>';\r\n                        }\r\n\r\n                        function_str += alltxt;\r\n                    }\r\n                    else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' + str + '</span>';\r\n                    }\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    getfunctionParam: function (txt) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\";\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0,\r\n            \"compare\": 0\r\n        }\r\n\r\n        //bracket 0\u4E3A\u8FD0\u7B97\u7B26\u62EC\u53F7\u30011\u4E3A\u51FD\u6570\u62EC\u53F7\r\n        let fn = null, param = [], bracket = [];\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    fn = str.toUpperCase();\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                }\r\n                else if (bracket.length == 0) {\r\n                    //function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == \")\" && matchConfig.dquote == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    param.push(str);\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == '\"') {\r\n                str += '\"';\r\n\r\n                if (matchConfig.dquote > 0) {\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n                }\r\n            }\r\n            else if (s == ',' && matchConfig.dquote == 0) {\r\n                if (bracket.length <= 1) {\r\n                    param.push(str);\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += \",\";\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1, s_pre = null;\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    }\r\n                    while (p >= 0 && s_pre == \" \")\r\n                }\r\n\r\n                if (!(/[^0-9]/.test(s_next)) && s == \"-\" && (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)) {\r\n                    if (matchConfig.dquote == 0) {\r\n                        str += $.trim(s);\r\n                    }\r\n                    else {\r\n                        str += s;\r\n                    }\r\n                }\r\n                else {\r\n                    function_str = \"\";\r\n                    str = \"\";\r\n                }\r\n            }\r\n            else {\r\n                if (matchConfig.dquote == 0) {\r\n                    str += $.trim(s);\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return { \"fn\": fn, \"param\": param };\r\n    },\r\n    calPostfixExpression: function (cal) {\r\n        if (cal.length == 0) {\r\n            return \"\";\r\n        }\r\n\r\n        let stack = [];\r\n        for (let i = cal.length - 1; i >= 0; i--) {\r\n            let c = cal[i];\r\n            if (c in this.operatorjson) {\r\n                let s2 = stack.pop();\r\n                let s1 = stack.pop();\r\n\r\n                let str = \"luckysheet_compareWith(\" + s1 + \",'\" + c + \"', \" + s2 + \")\";\r\n\r\n                stack.push(str);\r\n            }\r\n            else {\r\n                stack.push(c);\r\n            }\r\n        }\r\n\r\n        if (stack.length > 0) {\r\n            return stack[0];\r\n        }\r\n        else {\r\n            return \"\";\r\n        }\r\n    },\r\n    checkBracketNum: function (fp) {\r\n        let bra_l = fp.match(/\\(/g),\r\n            bra_r = fp.match(/\\)/g),\r\n            bra_tl_txt = fp.match(/(['\"])(?:(?!\\1).)*?\\1/g),\r\n            bra_tr_txt = fp.match(/(['\"])(?:(?!\\1).)*?\\1/g);\r\n\r\n        let bra_l_len = 0, bra_r_len = 0;\r\n        if (bra_l != null) {\r\n            bra_l_len += bra_l.length;\r\n        }\r\n        if (bra_r != null) {\r\n            bra_r_len += bra_r.length;\r\n        }\r\n\r\n        let bra_tl_len = 0, bra_tr_len = 0;\r\n        if (bra_tl_txt != null) {\r\n            for (let i = 0; i < bra_tl_txt.length; i++) {\r\n                let bra_tl = bra_tl_txt[i].match(/\\(/g);\r\n                if (bra_tl != null) {\r\n                    bra_tl_len += bra_tl.length;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (bra_tr_txt != null) {\r\n            for (let i = 0; i < bra_tr_txt.length; i++) {\r\n                let bra_tr = bra_tr_txt[i].match(/\\)/g);\r\n                if (bra_tr != null) {\r\n                    bra_tr_len += bra_tr.length;\r\n                }\r\n            }\r\n        }\r\n\r\n        bra_l_len -= bra_tl_len;\r\n        bra_r_len -= bra_tr_len;\r\n\r\n        if (bra_l_len != bra_r_len) {\r\n            return false;\r\n        }\r\n        else {\r\n            return true;\r\n        }\r\n    },\r\n    operatorPriority: {\r\n        \"^\": 0,\r\n        \"%\": 1,\r\n        \"*\": 1,\r\n        \"/\": 1,\r\n        \"+\": 2,\r\n        \"-\": 2\r\n    },\r\n    functionParserExe: function (txt) {\r\n        let _this = this;\r\n        // let txt1 = txt.toUpperCase();\r\n        // return this.functionParser(txt, function(c){\r\n        //     _this.addToCellList(txt, c);\r\n        // });\r\n        return this.functionParser(txt);\r\n    },\r\n    functionParser: function (txt, cellRangeFunction) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt == null) {\r\n            return \"\";\r\n        }\r\n\r\n        if (txt.substr(0, 2) == \"=+\") {\r\n            txt = txt.substr(2);\r\n        }\r\n        else if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\";\r\n\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0,\r\n            \"compare\": 0,\r\n            \"braces\": 0\r\n        }\r\n\r\n        //=(sum(b1:c10)+10)*5-100\r\n\r\n        //=MAX(B1:C10,10)*5-100\r\n\r\n        // =(sum(max(B1:C10,10)*5-100,((1+1)*2+5)/2,10)+count(B1:C10,10*5-100))*5-100\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100,((1+1)*2+5)/2,10)+COUNT(B1:C10,10*5-100)\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100,((1+1)*2+5)/2,10)\r\n\r\n        //=SUM(10,((1+1)*2+5)/2,10)\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100)\r\n\r\n        //=IFERROR(IF(ROW()-ROW($G$3)=1,$F4+$D4,SUM($D1:INDEX($D$4:$D$9,1,1),$F1:INDEX($F$4:$F$9,1,1))), \"\")\r\n\r\n        //=IFERROR(IF(ROW()-ROW($G$3)=1,$F4+$D4,SUM(INDEX($D$4:$D$9,1,1):$D4,INDEX($F$4:$F$9,1,1):$F4)), \"\")\r\n\r\n        //=SUM(I$4:OFFSET(I10,0,0))\r\n\r\n        //bracket 0\u4E3A\u8FD0\u7B97\u7B26\u62EC\u53F7\u30011\u4E3A\u51FD\u6570\u62EC\u53F7\r\n        let cal1 = [], cal2 = [], bracket = [];\r\n        let firstSQ = -1;\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    str = str.toUpperCase();\r\n                    if (str.indexOf(\":\") > -1) {\r\n                        let funcArray = str.split(\":\");\r\n                        function_str += \"luckysheet_getSpecialReference(true,'\" + $.trim(funcArray[0]).replace(/'/g, \"\\\\'\") + \"', luckysheet_function.\" + funcArray[1] + \".f(#lucky#\";\r\n                    }\r\n                    else {\r\n                        function_str += \"luckysheet_function.\" + str + \".f(\";\r\n                    }\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                }\r\n                else if (bracket.length == 0) {\r\n                    function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    let functionS = _this.functionParser(str, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \")\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '{';\r\n                matchConfig.braces += 1;\r\n            }\r\n            else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '}';\r\n                matchConfig.braces -= 1;\r\n            }\r\n            else if (s == '\"' && matchConfig.squote == 0) {\r\n\r\n                if (matchConfig.dquote > 0) {\r\n                    //\u5982\u679C\u662F\"\"\u4EE3\u8868\u7740\u8F93\u51FA\"\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == '\"') {\r\n                        i++;\r\n                        str += \"\\x7F\";//\u7528\u975E\u6253\u5370\u63A7\u5236\u5B57\u7B26DEL\u66FF\u6362\u4E00\u4E0B\"\"\r\n                    }\r\n                    else {\r\n                        matchConfig.dquote -= 1;\r\n                        str += '\"';\r\n                    }\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            }\r\n            else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n\r\n                if (matchConfig.squote > 0) {\r\n                    if (firstSQ == i - 1)//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                    {\r\n                        return \"\";\r\n                    }\r\n                    //\u5982\u679C\u662F''\u4EE3\u8868\u7740\u8F93\u51FA'\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == \"'\") {\r\n                        i++;\r\n                        str += \"'\";\r\n                    }\r\n                    else {//\u5982\u679C\u4E0B\u4E00\u4E2A\u5B57\u7B26\u4E0D\u662F'\u4EE3\u8868\u5355\u5F15\u53F7\u7ED3\u675F\r\n                        if (funcstack[i - 1] == \"'\") {//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u6700\u540E\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                            return \"\";\r\n                        } else {\r\n                            matchConfig.squote -= 1;\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    matchConfig.squote += 1;\r\n                    firstSQ = i;\r\n                }\r\n            }\r\n            else if (s == ',' && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (bracket.length <= 1) {\r\n                    let functionS = _this.functionParser(str, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \",\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += \",\";\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let s_next = \"\";\r\n                let op = _this.operatorPriority;\r\n\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.functionParser($.trim(str), cellRangeFunction));\r\n                        }\r\n                        else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n\r\n                            while (cal1.length > 0 && stackCeilPri != null) {\r\n                                cal2.unshift(cal1.shift());\r\n                                stackCeilPri = op[cal1[0]];\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s + s_next);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.functionParser($.trim(str), cellRangeFunction));\r\n                        }\r\n                        else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n                            stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n\r\n                            let sPri = op[s];\r\n                            sPri = sPri == null ? 1000 : sPri;\r\n\r\n                            while (cal1.length > 0 && sPri >= stackCeilPri) {\r\n                                cal2.unshift(cal1.shift());\r\n\r\n                                stackCeilPri = op[cal1[0]];\r\n                                stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        str += s;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                if (matchConfig.dquote == 0 && matchConfig.squote == 0) {\r\n                    // str += $.trim(s);\r\n                    str += s; //Do not use $.trim(s). When obtaining the worksheet name that contains spaces, you should keep the spaces\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                let endstr = \"\";\r\n                let str_nb = $.trim(str).replace(/'/g, \"\\\\'\");\r\n                if (_this.iscelldata(str_nb) && str_nb.substr(0, 1) != \":\") {\r\n\r\n                    endstr = \"luckysheet_getcelldata('\" + str_nb + \"')\";\r\n                    if (typeof (cellRangeFunction) == \"function\") {\r\n                        cellRangeFunction(str_nb);\r\n                    }\r\n\r\n                }\r\n                else if (str_nb.substr(0, 1) == \":\") {\r\n                    str_nb = str_nb.substr(1);\r\n                    if (_this.iscelldata(str_nb)) {\r\n                        endstr = \"luckysheet_getSpecialReference(false,\" + function_str + \",'\" + str_nb + \"')\";\r\n                    }\r\n                }\r\n                else {\r\n                    str = $.trim(str);\r\n\r\n                    let regx = /{.*?}/;\r\n                    if (regx.test(str) && str.substr(0, 1) != '\"' && str.substr(str.length - 1, 1) != '\"') {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            endstr += str.substr(0, arraystart);\r\n                        }\r\n\r\n                        endstr += \"luckysheet_getarraydata('\" + arraytxt + \"')\";\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            endstr += str.substr(arraystart + arraytxt.length, str.length);\r\n                        }\r\n                    }\r\n                    else {\r\n                        endstr = str;\r\n                    }\r\n                }\r\n\r\n                if (endstr.length > 0) {\r\n                    cal2.unshift(endstr);\r\n                }\r\n\r\n                if (cal1.length > 0) {\r\n                    if (function_str.length > 0) {\r\n                        cal2.unshift(function_str);\r\n                        function_str = \"\";\r\n                    }\r\n\r\n                    while (cal1.length > 0) {\r\n                        cal2.unshift(cal1.shift());\r\n                    }\r\n                }\r\n\r\n                if (cal2.length > 0) {\r\n                    function_str = _this.calPostfixExpression(cal2);\r\n                }\r\n                else {\r\n                    function_str += endstr;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        // console.log(function_str);\r\n        return function_str;\r\n    },\r\n    insertUpdateDynamicArray: function (dynamicArrayItem) {\r\n        let r = dynamicArrayItem.r, c = dynamicArrayItem.c, index = dynamicArrayItem.index;\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let dynamicArray = file.dynamicArray;\r\n        if (dynamicArray == null) {\r\n            dynamicArray = [];\r\n        }\r\n\r\n        for (let i = 0; i < dynamicArray.length; i++) {\r\n            let calc = dynamicArray[i];\r\n            if (calc.r == r && calc.c == c && calc.index == index) {\r\n                calc.data = dynamicArrayItem.data;\r\n                calc.f = dynamicArrayItem.f;\r\n                return dynamicArray;\r\n            }\r\n        }\r\n\r\n        dynamicArray.push(dynamicArrayItem);\r\n        return dynamicArray\r\n    },\r\n    addFunctionGroup: function (r, c, func, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n        if (file.calcChain == null) {\r\n            file.calcChain = [];\r\n        }\r\n\r\n        let cc = {\r\n            \"r\": r,\r\n            \"c\": c,\r\n            \"index\": index,\r\n            \"func\": func\r\n        };\r\n        file.calcChain.push(cc);\r\n\r\n        server.saveParam(\"fc\", index, JSON.stringify(cc), {\r\n            \"op\": \"add\",\r\n            \"pos\": file.calcChain.length - 1\r\n        });\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    getAllFunctionGroup: function () {\r\n        let luckysheetfile = getluckysheetfile();\r\n        let ret = [];\r\n        for (let i = 0; i < luckysheetfile.length; i++) {\r\n            let file = luckysheetfile[i];\r\n            let calcChain = file.calcChain;\r\n            \r\n            /* \u5907\u6CE8\uFF1A\u518D\u6B21\u52A0\u8F7D\u8868\u683C\u83B7\u53D6\u7684\u6570\u636E\u53EF\u80FD\u662FJSON\u5B57\u7B26\u4E32\u683C\u5F0F(\u9700\u8981\u8FDB\u884C\u53D1\u5E8F\u5217\u5316\u5904\u7406) */\r\n            if(calcChain){\r\n                let tempCalcChain = [];\r\n                calcChain.forEach((item,idx)=>{\r\n                    if(typeof item === \"string\"){\r\n                        tempCalcChain.push(JSON.parse(item));\r\n                    }else{\r\n                        tempCalcChain.push(item);\r\n                    }\r\n                })\r\n                calcChain = file.calcChain = tempCalcChain;\r\n            }\r\n\r\n            let dynamicArray_compute = file.dynamicArray_compute;\r\n            if (calcChain == null) {\r\n                calcChain = [];\r\n            }\r\n\r\n            if (dynamicArray_compute == null) {\r\n                dynamicArray_compute = [];\r\n            }\r\n\r\n            ret = ret.concat(calcChain);\r\n\r\n            for (let i = 0; i < dynamicArray_compute.length; i++) {\r\n                let d = dynamicArray_compute[0];\r\n                ret.push({\r\n                    r: d.r,\r\n                    c: d.c,\r\n                    index: d.index\r\n                });\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getFunctionGroup: function (index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        if (file.calcChain == null) {\r\n            return [];\r\n        }\r\n\r\n        return file.calcChain;\r\n    },\r\n    updateFunctionGroup: function (r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain != null) {\r\n            for (let i = 0; i < calcChain.length; i++) {\r\n                let calc = calcChain[i];\r\n                if (calc.r == r && calc.c == c && calc.index == index) {\r\n                    server.saveParam(\"fc\", index, JSON.stringify(calc), {\r\n                        \"op\": \"update\",\r\n                        \"pos\": i\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    insertUpdateFunctionGroup: function (r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        // let func = getcellFormula(r, c, index);\r\n        // if (func == null || func.length==0) {\r\n        //     this.delFunctionGroup(r, c, index);\r\n        //     return;\r\n        // }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain == null) {\r\n            calcChain = [];\r\n        }\r\n\r\n        for (let i = 0; i < calcChain.length; i++) {\r\n            let calc = calcChain[i];\r\n            if (calc.r == r && calc.c == c && calc.index == index) {\r\n                server.saveParam(\"fc\", index, JSON.stringify(calc), {\r\n                    \"op\": \"update\",\r\n                    \"pos\": i\r\n                });\r\n                return;\r\n            }\r\n        }\r\n\r\n        let cc = {\r\n            \"r\": r,\r\n            \"c\": c,\r\n            \"index\": index\r\n        };\r\n        calcChain.push(cc);\r\n        file.calcChain = calcChain;\r\n\r\n        server.saveParam(\"fc\", index, JSON.stringify(cc), {\r\n            \"op\": \"add\",\r\n            \"pos\": file.calcChain.length - 1\r\n        });\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    isFunctionRangeSave: false,\r\n    isFunctionRangeSimple: function (txt, r, c, index, dynamicArray_compute) {\r\n        if (txt == null || txt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let txtArray = txt.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g);\r\n        if (txtArray.length > 0) {\r\n            for (let i = 0; i < txtArray.length; i++) {\r\n                let t = txtArray[i];\r\n                if (t.length <= 1) {\r\n                    continue;\r\n                }\r\n\r\n                if (t.substr(0, 1) == '\"' && t.substr(t.length - 1, 1) == '\"') {\r\n                    continue;\r\n                }\r\n\r\n                this.isFunctionRangeSaveChange(t, r, c, index, dynamicArray_compute);\r\n            }\r\n        }\r\n    },\r\n    isFunctionRangeSimple1: function (txt, r, c, index, dynamicArray_compute) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += \"luckysheet_function.\" + str.toUpperCase() + \".f(\";\r\n                }\r\n                else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            }\r\n            else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + \")\";\r\n                str = \"\";\r\n            }\r\n            else if (s == ',' && matchConfig.dquote == 0) {\r\n                //matchConfig.comma += 1;\r\n                function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + ',';\r\n                str = \"\";\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + s + s_next;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + s;\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    _this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                    // if (r != null && c != null) {\r\n\r\n                    //     let range = _this.getcellrange($.trim(str));\r\n                    //     let row = range.row,\r\n                    //         col = range.column;\r\n\r\n                    //     if ((r + \"_\" + c) in dynamicArray_compute) {\r\n                    //         let isd_range = false;\r\n\r\n                    //         for (let d_r = row[0]; d_r <= row[1]; d_r++) {\r\n                    //             for (let d_c = col[0]; d_c <= col[1]; d_c++) {\r\n                    //                 if ((d_r + \"_\" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + \"_\" + d_c].r == r && dynamicArray_compute[d_r + \"_\" + d_c].c == c) {\r\n                    //                     isd_range = true;\r\n                    //                 }\r\n                    //             }\r\n                    //         }\r\n\r\n                    //         if (isd_range) {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //         }\r\n                    //         else {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //         }\r\n                    //     }\r\n                    //     else {\r\n                    //         if (r >= row[0] && r <= row[1] && c >= col[0] && c <= col[1]) {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //         }\r\n                    //         else {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //         }\r\n                    //     }\r\n                    // }\r\n                    // else {\r\n                    //     let sheetlen = $.trim(str).split(\"!\");\r\n\r\n                    //     if (sheetlen.length > 1) {\r\n                    //         _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //     }\r\n                    //     else {\r\n                    //         _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //     }\r\n                    // }\r\n                }\r\n                else {\r\n                    //console.log(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        //console.log(function_str);\r\n        return function_str;\r\n    },\r\n    isFunctionRangeSelect: function (txt, r, c, index, dynamicArray_compute) {\r\n        if (txt == null || txt == \"\") {\r\n            return;\r\n        }\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n        if (dynamicArray_compute == null) {\r\n            dynamicArray_compute = {};\r\n        }\r\n        let _this = this;\r\n        let txt1 = txt.toUpperCase();\r\n        let isOffsetFunc = txt1.indexOf(\"INDIRECT(\") > -1 || txt1.indexOf(\"OFFSET(\") > -1 || txt1.indexOf(\"INDEX(\") > -1;\r\n        if (txt in this.formulaContainCellList) {\r\n            let cellList = this.formulaContainCellList[txt];\r\n            if (isOffsetFunc) {\r\n                let isoff = cellList[\"__LuckyisOff__\"];\r\n                if (isoff == true) {\r\n                    for (let cellStr in cellList) {\r\n                        if (cellStr == \"__LuckyisOff__\") {\r\n                            continue;\r\n                        }\r\n                        this.isFunctionRangeSaveChange(cellStr, r, c, index, dynamicArray_compute);\r\n                    }\r\n                }\r\n                else {\r\n                    this.isFunctionRange(txt, r, c, index, dynamicArray_compute, function (str) {\r\n                        _this.addToCellList(txt, str);\r\n                    });\r\n                    cellList[\"__LuckyisOff__\"] = true;\r\n                }\r\n            }\r\n            else {\r\n\r\n                for (let cellStr in cellList) {\r\n                    if (cellStr == \"__LuckyisOff__\") {\r\n                        continue;\r\n                    }\r\n                    this.isFunctionRangeSaveChange(cellStr, r, c, index, dynamicArray_compute);\r\n                }\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n\r\n        if (isOffsetFunc) {\r\n            this.isFunctionRange(txt, r, c, index, dynamicArray_compute);\r\n        }\r\n        else {\r\n            this.isFunctionRangeSimple(txt, r, c, index, dynamicArray_compute);\r\n        }\r\n    },\r\n    isFunctionRange: function (txt, r, c, index, dynamicArray_compute, cellRangeFunction) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            \"bracket\": 0,\r\n            \"comma\": 0,\r\n            \"squote\": 0,\r\n            \"dquote\": 0,\r\n            \"compare\": 0,\r\n            \"braces\": 0\r\n        }\r\n\r\n        // let luckysheetfile = getluckysheetfile();\r\n        // let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        //bracket 0\u4E3A\u8FD0\u7B97\u7B26\u62EC\u53F7\u30011\u4E3A\u51FD\u6570\u62EC\u53F7\r\n        let cal1 = [], cal2 = [], bracket = [];\r\n        let firstSQ = -1;\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    str = str.toUpperCase();\r\n                    if (str.indexOf(\":\") > -1) {\r\n                        let funcArray = str.split(\":\");\r\n                        function_str += \"luckysheet_getSpecialReference(true,'\" + $.trim(funcArray[0]).replace(/'/g, \"\\\\'\") + \"', luckysheet_function.\" + funcArray[1] + \".f(#lucky#\";\r\n                    }\r\n                    else {\r\n                        function_str += \"luckysheet_function.\" + str + \".f(\";\r\n                    }\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                }\r\n                else if (bracket.length == 0) {\r\n                    function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    // function_str += _this.isFunctionRange(str,r,c, index,dynamicArray_compute,cellRangeFunction) + \")\";\r\n                    // str = \"\";\r\n\r\n                    let functionS = _this.isFunctionRange(str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \")\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n            else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '{';\r\n                matchConfig.braces += 1;\r\n            }\r\n            else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += '}';\r\n                matchConfig.braces -= 1;\r\n            }\r\n            else if (s == '\"' && matchConfig.squote == 0) {\r\n\r\n                if (matchConfig.dquote > 0) {\r\n                    //\u5982\u679C\u662F\"\"\u4EE3\u8868\u7740\u8F93\u51FA\"\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == '\"') {\r\n                        i++;\r\n                        str += \"\\x7F\";//\u7528DEL\u66FF\u6362\u4E00\u4E0B\"\"\r\n                    }\r\n                    else {\r\n                        matchConfig.dquote -= 1;\r\n                        str += '\"';\r\n                    }\r\n                }\r\n                else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            }\r\n            else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n\r\n                if (matchConfig.squote > 0) {\r\n                    //if (firstSQ == i - 1)//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                    //{\r\n                    //    \u4EE3\u7801\u5230\u4E86\u6B64\u5904\u5E94\u8BE5\u662F\u516C\u5F0F\u9519\u8BEF\r\n                    //}\r\n                    //\u5982\u679C\u662F''\u4EE3\u8868\u7740\u8F93\u51FA'\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == \"'\") {\r\n                        i++;\r\n                        str += \"'\";\r\n                    }\r\n                    else {//\u5982\u679C\u4E0B\u4E00\u4E2A\u5B57\u7B26\u4E0D\u662F'\u4EE3\u8868\u5355\u5F15\u53F7\u7ED3\u675F\r\n                        //if (funcstack[i - 1] == \"'\") {//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u6700\u540E\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                        //    \u4EE3\u7801\u5230\u4E86\u6B64\u5904\u5E94\u8BE5\u662F\u516C\u5F0F\u9519\u8BEF\r\n                        //} else {\r\n                            matchConfig.squote -= 1;\r\n                        //}\r\n                    }\r\n                }\r\n                else {\r\n                    matchConfig.squote += 1;\r\n                    firstSQ = i;\r\n                }\r\n            }\r\n            else if (s == ',' && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (bracket.length <= 1) {\r\n                    // function_str += _this.isFunctionRange(str, r, c, index,dynamicArray_compute,cellRangeFunction) + \",\";\r\n                    // str = \"\";\r\n\r\n                    let functionS = _this.isFunctionRange(str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \",\";\r\n                    str = \"\";\r\n                }\r\n                else {\r\n                    str += \",\";\r\n                }\r\n            }\r\n            else if (s in _this.operatorjson && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let s_next = \"\";\r\n                let op = _this.operatorPriority;\r\n\r\n                if ((i + 1) < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if ((s + s_next) in _this.operatorjson) {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.isFunctionRange($.trim(str), r, c, index, dynamicArray_compute, cellRangeFunction));\r\n                        }\r\n                        else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n\r\n                            while (cal1.length > 0 && stackCeilPri != null) {\r\n                                cal2.unshift(cal1.shift());\r\n                                stackCeilPri = op[cal1[0]];\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s + s_next);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n                else {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.isFunctionRange($.trim(str), r, c, index, dynamicArray_compute, cellRangeFunction));\r\n                        }\r\n                        else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n                            stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n\r\n                            let sPri = op[s];\r\n                            sPri = sPri == null ? 1000 : sPri;\r\n\r\n                            while (cal1.length > 0 && sPri >= stackCeilPri) {\r\n                                cal2.unshift(cal1.shift());\r\n\r\n                                stackCeilPri = op[cal1[0]];\r\n                                stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    }\r\n                    else {\r\n                        str += s;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                if (matchConfig.dquote == 0 && matchConfig.squote == 0) {\r\n\r\n                    str += $.trim(s);\r\n                }\r\n                else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                let endstr = \"\";\r\n                let str_nb = $.trim(str).replace(/'/g, \"\\\\'\");\r\n                if (_this.iscelldata(str_nb) && str_nb.substr(0, 1) != \":\") {\r\n                    // endstr = \"luckysheet_getcelldata('\" + $.trim(str) + \"')\";\r\n                    endstr = \"luckysheet_getcelldata('\" + str_nb + \"')\";\r\n                    _this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                }\r\n                else if (str_nb.substr(0, 1) == \":\") {\r\n                    str_nb = str_nb.substr(1);\r\n                    if (_this.iscelldata(str_nb)) {\r\n                        endstr = \"luckysheet_getSpecialReference(false,\" + function_str + \",'\" + str_nb + \"')\";\r\n                    }\r\n                }\r\n                else {\r\n                    str = $.trim(str);\r\n\r\n                    let regx = /{.*?}/;\r\n                    if (regx.test(str) && str.substr(0, 1) != '\"' && str.substr(str.length - 1, 1) != '\"') {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            endstr += str.substr(0, arraystart);\r\n                        }\r\n\r\n                        endstr += \"luckysheet_getarraydata('\" + arraytxt + \"')\";\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            endstr += str.substr(arraystart + arraytxt.length, str.length);\r\n                        }\r\n                    }\r\n                    else {\r\n                        endstr = str;\r\n                    }\r\n                }\r\n\r\n                if (endstr.length > 0) {\r\n                    cal2.unshift(endstr);\r\n                }\r\n\r\n                if (cal1.length > 0) {\r\n                    if (function_str.length > 0) {\r\n                        cal2.unshift(function_str);\r\n                        function_str = \"\";\r\n                    }\r\n\r\n                    while (cal1.length > 0) {\r\n                        cal2.unshift(cal1.shift());\r\n                    }\r\n                }\r\n\r\n                if (cal2.length > 0) {\r\n                    function_str = _this.calPostfixExpression(cal2);\r\n                }\r\n                else {\r\n                    function_str += endstr;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        // console.log(function_str);\r\n        _this.checkSpecialFunctionRange(function_str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n        return function_str;\r\n    },\r\n    isFunctionRangeSaveChange: function (str, r, c, index, dynamicArray_compute) {\r\n        let _this = this;\r\n        if (r != null && c != null) {\r\n            let range = _this.getcellrange($.trim(str), index);\r\n            if (range == null) {\r\n                return;\r\n            }\r\n            let row = range.row,\r\n                col = range.column,\r\n                sheetIndex = range.sheetIndex;\r\n\r\n            if ((r + \"_\" + c) in dynamicArray_compute && (index == sheetIndex || index == null)) {\r\n                let isd_range = false;\r\n\r\n                for (let d_r = row[0]; d_r <= row[1]; d_r++) {\r\n                    for (let d_c = col[0]; d_c <= col[1]; d_c++) {\r\n                        if ((d_r + \"_\" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + \"_\" + d_c].r == r && dynamicArray_compute[d_r + \"_\" + d_c].c == c) {\r\n                            isd_range = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isd_range) {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                }\r\n                else {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                }\r\n            }\r\n            else {\r\n                if (r >= row[0] && r <= row[1] && c >= col[0] && c <= col[1] && (index == sheetIndex || index == null)) {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                }\r\n                else {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                }\r\n            }\r\n\r\n        }\r\n        else {\r\n            _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n            // let sheetlen = $.trim(str).split(\"!\");\r\n\r\n            // if (sheetlen.length > 1) {\r\n            //     _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;//if change sheet, it must be true, but this is very slow\r\n            // }\r\n            // else {\r\n            //     _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n            // }\r\n        }\r\n    },\r\n    checkSpecialFunctionRange: function (function_str, r, c, index, dynamicArray_compute, cellRangeFunction) {\r\n\r\n        if (function_str.substr(0, 30) == \"luckysheet_getSpecialReference\" || function_str.substr(0, 20) == \"luckysheet_function.\") {\r\n            if (function_str.substr(0, 20) == \"luckysheet_function.\") {\r\n                let funcName = function_str.split(\".\")[1];\r\n                if (funcName != null) {\r\n                    funcName = funcName.toUpperCase();\r\n                    if (funcName != \"INDIRECT\" && funcName != \"OFFSET\" && funcName != \"INDEX\") {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            try {\r\n                Store.calculateSheetIndex = index;\r\n                let str = new Function(\"return \" + function_str)();\r\n\r\n                if (str instanceof Object && str.startCell != null) {\r\n                    str = str.startCell;\r\n                }\r\n                let str_nb = $.trim(str);\r\n                // console.log(function_str, tempFunc,str, this.iscelldata(str_nb),this.isFunctionRangeSave,r,c);\r\n                if (this.iscelldata(str_nb)) {\r\n                    if (typeof (cellRangeFunction) == \"function\") {\r\n                        cellRangeFunction(str_nb);\r\n                    }\r\n                    // this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                    // console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n                }\r\n            }\r\n            catch {\r\n\r\n            }\r\n        }\r\n\r\n        // if (function_str.substr(0, 20) == \"luckysheet_function.\") {\r\n        //     let funcName = function_str.split(\".\")[1];\r\n        //     if (funcName != null) {\r\n        //         funcName = funcName.toUpperCase();\r\n        //         if (funcName == \"INDIRECT\") {\r\n        //             let tempFunc = \"luckysheet_indirect_check\" + function_str.substr(30, function_str.length);\r\n\r\n        //             //tempFunc = tempFunc.replace(/luckysheet_getcelldata/g, \"luckysheet_indirect_check_return\");\r\n\r\n        //             try {\r\n        //                 Store.calculateSheetIndex = index;\r\n        //                 let str = eval(tempFunc);\r\n\r\n        //                 if(str instanceof Object && str.data!=null){\r\n        //                     str = str.data.v;\r\n        //                 }\r\n        //                 let str_nb = $.trim(str);\r\n        //                 // console.log(function_str, tempFunc,str, this.iscelldata(str_nb),this.isFunctionRangeSave,r,c);\r\n        //                 if (this.iscelldata(str_nb)) {\r\n        //                     if(typeof(cellRangeFunction)==\"function\"){\r\n        //                         cellRangeFunction(str_nb);\r\n        //                     }\r\n        //                     this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n        //                     // console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n        //                 }\r\n        //             }\r\n        //             catch{\r\n\r\n        //             }\r\n\r\n\r\n        //         }\r\n        //         else if (funcName == \"OFFSET\") {\r\n        //             let tempFunc = \"luckysheet_offset_check\" + function_str.substr(28, function_str.length);\r\n\r\n        //             try {\r\n        //                 Store.calculateSheetIndex = index;\r\n        //                 let str = eval(tempFunc);\r\n        //                 if(str instanceof Object && str.data!=null){\r\n        //                     str = str.data.v;\r\n        //                 }\r\n        //                 let str_nb = $.trim(str);\r\n        //                 if (this.iscelldata(str_nb)) {\r\n        //                     if(typeof(cellRangeFunction)==\"function\"){\r\n        //                         cellRangeFunction(str_nb);\r\n        //                     }\r\n        //                     this.isFunctionRangeSaveChange(str, r, c, index,dynamicArray_compute);\r\n        //                     //console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n        //                 }\r\n        //             }\r\n        //             catch{\r\n\r\n        //             }\r\n        //             //let result = eval(function_str);\r\n\r\n        //             //console.log(function_str, result);\r\n        //         }\r\n        //     }\r\n\r\n        // }\r\n    },\r\n    execvertex: {},\r\n    execFunctionGroupData: null,\r\n    execFunctionExist: null,\r\n    formulaContainSheetList: {},\r\n    formulaContainCellList: {},\r\n    cellTextToIndexList: {},\r\n    addToCellList: function (formulaTxt, cellstring) {\r\n        if (formulaTxt == null || formulaTxt.length == 0 || cellstring == null || cellstring.length == 0) {\r\n            return;\r\n        }\r\n        if (this.formulaContainCellList == null) {\r\n            this.formulaContainCellList = {};\r\n        }\r\n\r\n        // formulaTxt = formulaTxt.toUpperCase();\r\n        if (this.formulaContainCellList[formulaTxt] == null) {\r\n            this.formulaContainCellList[formulaTxt] = {};\r\n        }\r\n\r\n        this.formulaContainCellList[formulaTxt][cellstring] = 1;\r\n    },\r\n    addToCellIndexList: function (txt, infoObj) {\r\n        if (txt == null || txt.length == 0 || infoObj == null) {\r\n            return;\r\n        }\r\n        if (this.cellTextToIndexList == null) {\r\n            this.cellTextToIndexList = {};\r\n        }\r\n\r\n        if (txt.indexOf(\"!\") > -1) {\r\n            txt = txt.replace(/\\\\'/g, \"'\").replace(/''/g, \"'\");\r\n            this.cellTextToIndexList[txt] = infoObj;\r\n        }\r\n        else {\r\n            this.cellTextToIndexList[txt + \"_\" + infoObj.sheetIndex] = infoObj;\r\n        }\r\n\r\n        // console.log(this.cellTextToIndexList);\r\n    },\r\n    addToSheetIndexList: function (formulaTxt, sheetIndex, obIndex) {\r\n        if (formulaTxt == null || formulaTxt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        if (sheetIndex == null || sheetIndex.length == 0) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (obIndex == null || obIndex.length == 0) {\r\n            obIndex = \"\";\r\n        }\r\n\r\n        if (this.formulaContainSheetList == null) {\r\n            this.formulaContainSheetList = {};\r\n        }\r\n\r\n        if (this.formulaContainSheetList[formulaTxt] == null) {\r\n            this.formulaContainSheetList[formulaTxt] = {};\r\n        }\r\n\r\n        this.formulaContainSheetList[formulaTxt][sheetIndex] = obIndex;\r\n    },\r\n    execFunctionGlobalData: {},\r\n    execFunctionGroupForce: function (isForce) {\r\n        if (isForce) {\r\n            this.execFunctionGroup(undefined, undefined, undefined, undefined, undefined, true);\r\n        }\r\n        else {\r\n            this.execFunctionGroup();\r\n        }\r\n    },\r\n    execFunctionGroup: function (origin_r, origin_c, value, index, data, isForce = false) {\r\n        let _this = this;\r\n\r\n        if (data == null) {\r\n            data = Store.flowdata;\r\n        }\r\n\r\n        if (!window.luckysheet_compareWith) {\r\n            window.luckysheet_compareWith = luckysheet_compareWith;\r\n            window.luckysheet_getarraydata = luckysheet_getarraydata;\r\n            window.luckysheet_getcelldata = luckysheet_getcelldata;\r\n            window.luckysheet_parseData = luckysheet_parseData;\r\n            window.luckysheet_getValue = luckysheet_getValue;\r\n            window.luckysheet_indirect_check = luckysheet_indirect_check;\r\n            window.luckysheet_indirect_check_return = luckysheet_indirect_check_return;\r\n            window.luckysheet_offset_check = luckysheet_offset_check;\r\n            window.luckysheet_calcADPMM = luckysheet_calcADPMM;\r\n            window.luckysheet_getSpecialReference = luckysheet_getSpecialReference;\r\n        }\r\n\r\n        if (_this.execFunctionGlobalData == null) {\r\n            _this.execFunctionGlobalData = {};\r\n        }\r\n        // let luckysheetfile = getluckysheetfile();\r\n        // let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (value != null) {\r\n            //\u6B64\u5904setcellvalue \u4E2Dthis.execFunctionGroupData\u4F1A\u4FDD\u5B58\u60F3\u8981\u66F4\u65B0\u7684\u503C\uFF0C\u672C\u51FD\u6570\u7ED3\u5C3E\u4E0D\u8981\u8BBE\u4E3Anull,\u4EE5\u5907\u540E\u7EED\u51FD\u6570\u4F7F\u7528\r\n            // setcellvalue(origin_r, origin_c, _this.execFunctionGroupData, value);\r\n            let cellCache = [[{ v: null }]];\r\n            setcellvalue(0, 0, cellCache, value);\r\n            _this.execFunctionGlobalData[origin_r + \"_\" + origin_c + \"_\" + index] = cellCache[0][0];\r\n\r\n        }\r\n\r\n        //{ \"r\": r, \"c\": c, \"index\": index, \"func\": func}\r\n        let calcChains = _this.getAllFunctionGroup(),\r\n            formulaObjects = {};\r\n\r\n        let sheets = getluckysheetfile();\r\n        let sheetData = {};\r\n        for (let i = 0; i < sheets.length; i++) {\r\n            let sheet = sheets[i];\r\n            sheetData[sheet.index] = sheet.data;\r\n        }\r\n\r\n        //\u628A\u4FEE\u6539\u6D89\u53CA\u7684\u5355\u5143\u683C\u5B58\u50A8\u4E3A\u5BF9\u8C61\r\n        let updateValueOjects = {}, updateValueArray = [];\r\n        if (_this.execFunctionExist == null) {\r\n            let key = \"r\" + origin_r + \"c\" + origin_c + \"i\" + index;\r\n            updateValueOjects[key] = 1;\r\n        }\r\n        else {\r\n            for (let x = 0; x < _this.execFunctionExist.length; x++) {\r\n                let cell = _this.execFunctionExist[x];\r\n                let key = \"r\" + cell.r + \"c\" + cell.c + \"i\" + cell.i;\r\n                updateValueOjects[key] = 1;\r\n            }\r\n        }\r\n\r\n        let arrayMatchCache = {};\r\n        let arrayMatch = function (formulaArray, formulaObjects, updateValueOjects, func) {\r\n            for (let a = 0; a < formulaArray.length; a++) {\r\n                let range = formulaArray[a];\r\n                let cacheKey = \"r\" + range.row[0] + \"\" + range.row[1] + \"c\" + range.column[0] + \"\" + range.column[1] + \"index\" + range.sheetIndex;\r\n                if (cacheKey in arrayMatchCache) {\r\n                    let amc = arrayMatchCache[cacheKey];\r\n                    // console.log(amc);\r\n                    amc.forEach((item) => {\r\n                        func(item.key, item.r, item.c, item.sheetIndex);\r\n                    });\r\n                }\r\n                else {\r\n                    let functionArr = [];\r\n                    for (let r = range.row[0]; r <= range.row[1]; r++) {\r\n                        for (let c = range.column[0]; c <= range.column[1]; c++) {\r\n                            let key = \"r\" + r + \"c\" + c + \"i\" + range.sheetIndex;\r\n                            func(key, r, c, range.sheetIndex);\r\n                            if ((formulaObjects && key in formulaObjects) || (updateValueOjects && key in updateValueOjects)) {\r\n                                functionArr.push({\r\n                                    key: key,\r\n                                    r: r,\r\n                                    c: c,\r\n                                    sheetIndex: range.sheetIndex\r\n                                });\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (formulaObjects || updateValueOjects) {\r\n                        arrayMatchCache[cacheKey] = functionArr;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let existsChildFormulaMatch = {}, ii = 0;\r\n\r\n        //\u521B\u5EFA\u516C\u5F0F\u7F13\u5B58\u53CA\u5176\u8303\u56F4\u7684\u7F13\u5B58\r\n        // console.time(\"1\");\r\n        for (let i = 0; i < calcChains.length; i++) {\r\n            let formulaCell = calcChains[i];\r\n            let key = \"r\" + formulaCell.r + \"c\" + formulaCell.c + \"i\" + formulaCell.index;\r\n            let calc_funcStr = getcellFormula(formulaCell.r, formulaCell.c, formulaCell.index);\r\n            if (calc_funcStr == null) {\r\n                continue;\r\n            }\r\n            let txt1 = calc_funcStr.toUpperCase();\r\n            let isOffsetFunc = txt1.indexOf(\"INDIRECT(\") > -1 || txt1.indexOf(\"OFFSET(\") > -1 || txt1.indexOf(\"INDEX(\") > -1;\r\n            let formulaArray = [];\r\n\r\n            if (isOffsetFunc) {\r\n                this.isFunctionRange(calc_funcStr, null, null, formulaCell.index, null, function (str_nb) {\r\n                    let range = _this.getcellrange($.trim(str_nb), formulaCell.index);\r\n                    if (range != null) {\r\n                        formulaArray.push(range);\r\n                    }\r\n                });\r\n            }\r\n            else if (!(calc_funcStr.substr(0, 2) == '=\"' && calc_funcStr.substr(calc_funcStr.length - 1, 1) == '\"')) {\r\n                //let formulaTextArray = calc_funcStr.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g);//\u65E0\u6CD5\u6B63\u786E\u5206\u5272\u5355\u5F15\u53F7\u6216\u53CC\u5F15\u53F7\u4E4B\u95F4\u6709==\u3001!=\u3001-\u7B49\u8FD0\u7B97\u7B26\u7684\u60C5\u51B5\u3002\u5BFC\u81F4\u5982='1-2'!A1\u516C\u5F0F\u4E2D\u8868\u540D1-2\u7684A1\u5355\u5143\u683C\u5185\u5BB9\u66F4\u65B0\u540E\uFF0C\u516C\u5F0F\u7684\u503C\u4E0D\u66F4\u65B0\u7684bug\r\n                //\u89E3\u51B3='1-2'!A1+5\u4F1A\u88ABcalc_funcStr.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g)\u5206\u5272\u6210[\"\",\"'1\",\"2'!A1\",5]\u7684\u9519\u8BEF\u60C5\u51B5\r\n                let point = 0;//\u6307\u9488\r\n                let squote = -1;//\u53CC\u5F15\u53F7\r\n                let dquote = -1;//\u5355\u5F15\u53F7\r\n                let formulaTextArray = [];\r\n                let sq_end_array = [];//\u4FDD\u5B58\u4E86\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u5728formulaTextArray\u7684index\u7D22\u5F15\u3002\r\n                let calc_funcStr_length = calc_funcStr.length;\r\n                for (let i = 0; i < calc_funcStr_length; i++) {\r\n                    let char = calc_funcStr.charAt(i);\r\n                    if (char == \"'\" && dquote == -1) {\r\n                        //\u5982\u679C\u662F\u5355\u5F15\u53F7\u5F00\u59CB\r\n                        if (squote == -1) {\r\n                            if (point != i) {\r\n                                formulaTextArray.push(...calc_funcStr.substring(point, i).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/));\r\n                            }\r\n                            squote = i;\r\n                            point = i;\r\n                        }\r\n                        else//\u5355\u5F15\u53F7\u7ED3\u675F\r\n                        {\r\n                            //if (squote == i - 1)//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                            //{\r\n                            //    ;//\u5230\u6B64\u5904\u8BF4\u660E\u516C\u5F0F\u9519\u8BEF\r\n                            //}\r\n                            //\u5982\u679C\u662F''\u4EE3\u8868\u7740\u8F93\u51FA'\r\n                            if (i < calc_funcStr_length - 1 && calc_funcStr.charAt(i + 1) == \"'\") {\r\n                                i++;\r\n                            }\r\n                            else {//\u5982\u679C\u4E0B\u4E00\u4E2A\u5B57\u7B26\u4E0D\u662F'\u4EE3\u8868\u5355\u5F15\u53F7\u7ED3\u675F\r\n                                //if (calc_funcStr.charAt(i - 1) == \"'\") {//\u914D\u5BF9\u7684\u5355\u5F15\u53F7\u540E\u6700\u540E\u4E00\u4E2A\u5B57\u7B26\u4E0D\u80FD\u662F\u5355\u5F15\u53F7\r\n                                //    ;//\u5230\u6B64\u5904\u8BF4\u660E\u516C\u5F0F\u9519\u8BEF\r\n                                    point = i + 1;\r\n                                    formulaTextArray.push(calc_funcStr.substring(squote, point));\r\n                                    sq_end_array.push(formulaTextArray.length - 1);\r\n                                    squote = -1;\r\n                                //} else {\r\n                                //    point = i + 1;\r\n                                //    formulaTextArray.push(calc_funcStr.substring(squote, point));\r\n                                //    sq_end_array.push(formulaTextArray.length - 1);\r\n                                //    squote = -1;\r\n                                //}\r\n                            }\r\n\r\n                        }\r\n                    }\r\n                    if (char == '\"' && squote == -1) {\r\n                        //\u5982\u679C\u662F\u53CC\u5F15\u53F7\u5F00\u59CB\r\n                        if (dquote == -1) {\r\n                            if (point != i) {\r\n                                formulaTextArray.push(...calc_funcStr.substring(point, i).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/));\r\n                            }\r\n                            dquote = i;\r\n                            point = i;\r\n                        }\r\n                        else {\r\n                            //\u5982\u679C\u662F\"\"\u4EE3\u8868\u7740\u8F93\u51FA\"\r\n                            if (i < calc_funcStr_length - 1 && calc_funcStr.charAt(i + 1) == '\"') {\r\n                                i++;\r\n                            }\r\n                            else {//\u53CC\u5F15\u53F7\u7ED3\u675F\r\n                                point = i + 1;\r\n                                formulaTextArray.push(calc_funcStr.substring(dquote, point));\r\n                                dquote = -1;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                if (point != calc_funcStr_length) {\r\n                    formulaTextArray.push(...calc_funcStr.substring(point, calc_funcStr_length).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/))\r\n                }\r\n                //\u62FC\u63A5\u6240\u6709\u914D\u5BF9\u5355\u5F15\u53F7\u53CA\u4E4B\u540E\u4E00\u4E2A\u5355\u5143\u683C\u5185\u5BB9\uFF0C\u4F8B\u5982[\"'1-2'\",\"!A1\"]\u62FC\u63A5\u4E3A[\"'1-2'!A1\"]\r\n                for (let i = sq_end_array.length - 1; i >= 0; i--) {\r\n                    if (sq_end_array[i] != formulaTextArray.length - 1) {\r\n                        formulaTextArray[sq_end_array[i]] = formulaTextArray[sq_end_array[i]] + formulaTextArray[sq_end_array[i] + 1];\r\n                        formulaTextArray.splice(sq_end_array[i] + 1, 1);\r\n                    }\r\n                }\r\n                //\u81F3\u6B64=SUM('1-2'!A1:A2&\"'1-2'!A2\")\u7531\u539F\u6765\u7684[\"\",\"SUM\",\"'1\",\"2'!A1:A2\",\"\",\"\"'1\",\"2'!A2\"\"]\u66F4\u6B63\u4E3A[\"\",\"SUM\",\"\",\"'1-2'!A1:A2\",\"\",\"\",\"\"'1-2'!A2\"\"]\r\n\r\n                for (let i = 0; i < formulaTextArray.length; i++) {\r\n                    let t = formulaTextArray[i];\r\n                    if (t.length <= 1) {\r\n                        continue;\r\n                    }\r\n\r\n                    if (t.substr(0, 1) == '\"' && t.substr(t.length - 1, 1) == '\"' && !_this.iscelldata(t)) {\r\n                        continue;\r\n                    }\r\n\r\n                    let range = _this.getcellrange($.trim(t), formulaCell.index);\r\n\r\n                    if (range == null) {\r\n                        continue;\r\n                    }\r\n\r\n                    formulaArray.push(range);\r\n                }\r\n            }\r\n\r\n            let item = {\r\n                formulaArray: formulaArray,\r\n                calc_funcStr: calc_funcStr,\r\n                key: key,\r\n                r: formulaCell.r,\r\n                c: formulaCell.c,\r\n                index: formulaCell.index,\r\n                parents: {},\r\n                chidren: {},\r\n                color: \"w\"\r\n            }\r\n\r\n            formulaObjects[key] = item;\r\n\r\n\r\n\r\n            // if(isForce){\r\n            //     updateValueArray.push(item);\r\n            // }\r\n            // else{\r\n            //     arrayMatch(formulaArray, null, function(key){\r\n            //         if(key in updateValueOjects){\r\n            //             updateValueArray.push(item);\r\n            //         }\r\n            //     });\r\n            // }\r\n\r\n        }\r\n\r\n        // console.timeEnd(\"1\");\r\n\r\n        // console.time(\"2\");\r\n        //\u5F62\u6210\u4E00\u4E2A\u516C\u5F0F\u4E4B\u95F4\u5F15\u7528\u7684\u56FE\u7ED3\u6784\r\n        Object.keys(formulaObjects).forEach((key) => {\r\n            let formulaObject = formulaObjects[key];\r\n            arrayMatch(formulaObject.formulaArray, formulaObjects, updateValueOjects, function (childKey) {\r\n                if (childKey in formulaObjects) {\r\n                    let childFormulaObject = formulaObjects[childKey];\r\n                    formulaObject.chidren[childKey] = 1;\r\n                    childFormulaObject.parents[key] = 1;\r\n                }\r\n                // console.log(childKey,formulaObject.formulaArray);\r\n                if (!isForce && childKey in updateValueOjects) {\r\n                    updateValueArray.push(formulaObject);\r\n                }\r\n            });\r\n\r\n            if (isForce) {\r\n                updateValueArray.push(formulaObject);\r\n            }\r\n        });\r\n\r\n        // console.log(formulaObjects)\r\n        // console.timeEnd(\"2\");\r\n\r\n\r\n        // console.time(\"3\");\r\n        let formulaRunList = [];\r\n        //\u8BA1\u7B97\uFF0C\u91C7\u7528\u6DF1\u5EA6\u4F18\u5148\u904D\u5386\u516C\u5F0F\u5F62\u6210\u7684\u56FE\u7ED3\u6784\r\n\r\n        // updateValueArray.forEach((key)=>{\r\n        //     let formulaObject = formulaObjects[key];\r\n\r\n\r\n        // });\r\n\r\n        let stack = updateValueArray, existsFormulaRunList = {};\r\n        while (stack.length > 0) {\r\n            let formulaObject = stack.pop();\r\n\r\n            if (formulaObject == null || formulaObject.key in existsFormulaRunList) {\r\n                continue;\r\n            }\r\n\r\n            if (formulaObject.color == \"b\") {\r\n                formulaRunList.push(formulaObject);\r\n                existsFormulaRunList[formulaObject.key] = 1;\r\n                continue;\r\n            }\r\n\r\n            let cacheStack = [];\r\n            Object.keys(formulaObject.parents).forEach((parentKey) => {\r\n                let parentFormulaObject = formulaObjects[parentKey];\r\n                if (parentFormulaObject != null) {\r\n                    cacheStack.push(parentFormulaObject);\r\n                }\r\n            });\r\n\r\n\r\n            ii++;\r\n\r\n            if (cacheStack.length == 0) {\r\n                formulaRunList.push(formulaObject);\r\n                existsFormulaRunList[formulaObject.key] = 1;\r\n            }\r\n            else {\r\n                formulaObject.color = \"b\";\r\n                stack.push(formulaObject);\r\n                stack = stack.concat(cacheStack);\r\n            }\r\n        }\r\n\r\n        formulaRunList.reverse();\r\n\r\n        // console.log(formulaObjects, ii)\r\n        // console.timeEnd(\"3\");\r\n\r\n        // console.time(\"4\");\r\n        for (let i = 0; i < formulaRunList.length; i++) {\r\n            let formulaCell = formulaRunList[i];\r\n            if (formulaCell.level == Math.max) {\r\n                continue;\r\n            }\r\n\r\n            window.luckysheet_getcelldata_cache = null;\r\n            let calc_funcStr = formulaCell.calc_funcStr;\r\n\r\n            let v = _this.execfunction(calc_funcStr, formulaCell.r, formulaCell.c, formulaCell.index);\r\n\r\n            _this.groupValuesRefreshData.push({\r\n                \"r\": formulaCell.r,\r\n                \"c\": formulaCell.c,\r\n                \"v\": v[1],\r\n                \"f\": v[2],\r\n                \"spe\": v[3],\r\n                \"index\": formulaCell.index\r\n            });\r\n\r\n            // _this.execFunctionGroupData[u.r][u.c] = value;\r\n            _this.execFunctionGlobalData[formulaCell.r + \"_\" + formulaCell.c + \"_\" + formulaCell.index] = {\r\n                v: v[1],\r\n                f: v[2]\r\n            };\r\n        }\r\n        // console.log(formulaRunList);\r\n        // console.timeEnd(\"4\");\r\n\r\n        _this.execFunctionExist = null;\r\n    },\r\n    // When set origin_r and origin_c, that mean just refresh cell value link to [origin_r,origin_c] cell\r\n    execFunctionGroup1: function (origin_r, origin_c, value, index, data, isForce = false) {\r\n        let _this = this;\r\n\r\n        if (data == null) {\r\n            data = Store.flowdata;\r\n        }\r\n\r\n        if (!window.luckysheet_compareWith) {\r\n            window.luckysheet_compareWith = luckysheet_compareWith;\r\n            window.luckysheet_getarraydata = luckysheet_getarraydata;\r\n            window.luckysheet_getcelldata = luckysheet_getcelldata;\r\n            window.luckysheet_parseData = luckysheet_parseData;\r\n            window.luckysheet_getValue = luckysheet_getValue;\r\n            window.luckysheet_indirect_check = luckysheet_indirect_check;\r\n            window.luckysheet_indirect_check_return = luckysheet_indirect_check_return;\r\n            window.luckysheet_offset_check = luckysheet_offset_check;\r\n            window.luckysheet_calcADPMM = luckysheet_calcADPMM;\r\n            window.luckysheet_getSpecialReference = luckysheet_getSpecialReference;\r\n        }\r\n\r\n        if (_this.execFunctionGlobalData == null) {\r\n            _this.execFunctionGlobalData = {};\r\n        }\r\n        let luckysheetfile = getluckysheetfile();\r\n        let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (value != null) {\r\n            //\u6B64\u5904setcellvalue \u4E2Dthis.execFunctionGroupData\u4F1A\u4FDD\u5B58\u60F3\u8981\u66F4\u65B0\u7684\u503C\uFF0C\u672C\u51FD\u6570\u7ED3\u5C3E\u4E0D\u8981\u8BBE\u4E3Anull,\u4EE5\u5907\u540E\u7EED\u51FD\u6570\u4F7F\u7528\r\n            // setcellvalue(origin_r, origin_c, _this.execFunctionGroupData, value);\r\n            let cellCache = [[{ v: null }]];\r\n            setcellvalue(0, 0, cellCache, value);\r\n            _this.execFunctionGlobalData[origin_r + \"_\" + origin_c + \"_\" + index] = cellCache[0][0];\r\n\r\n        }\r\n\r\n\r\n\r\n        //{ \"r\": r, \"c\": c, \"index\": index, \"func\": func}\r\n        let group = _this.getAllFunctionGroup(),\r\n            vertex1 = {},\r\n            stack = [],\r\n            count = 0;\r\n\r\n        _this.execvertex = {};\r\n        if (_this.execFunctionExist == null) {\r\n            for (let i = 0; i < group.length; i++) {\r\n                let item = group[i];\r\n                let file = luckysheetfile[getSheetIndex(item[\"index\"])];\r\n                if (file == null) {\r\n                    continue;\r\n                }\r\n                let cell = file.data[item.r][item.c];\r\n                let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                if (cell != null && cell.f != null && cell.f == calc_funcStr) {\r\n                    if (!(item instanceof Object)) {\r\n                        item = new Function(\"return \" + item)();\r\n                    }\r\n\r\n                    item.color = \"w\";\r\n                    item.parent = null;\r\n                    item.chidren = {};\r\n                    item.times = 0;\r\n\r\n                    vertex1[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                    _this.isFunctionRangeSave = false;\r\n\r\n                    if (isForce) {\r\n                        _this.isFunctionRangeSave = true;\r\n                    }\r\n                    else if (origin_r != null && origin_c != null) {\r\n                        _this.isFunctionRangeSelect(calc_funcStr, origin_r, origin_c, index, dynamicArray_compute);\r\n                    }\r\n                    // else {\r\n                    //     _this.isFunctionRangeSelect(calc_funcStr, undefined, undefined ,dynamicArray_compute);\r\n                    // }\r\n\r\n                    if (_this.isFunctionRangeSave) {\r\n                        stack.push(item);\r\n                        _this.execvertex[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                        count++;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            for (let x = 0; x < _this.execFunctionExist.length; x++) {\r\n                let cell = _this.execFunctionExist[x];\r\n\r\n                if (\"r\" + cell.r + \"c\" + cell.c + \"i\" + cell.i in vertex1) {\r\n                    continue;\r\n                }\r\n\r\n                for (let i = 0; i < group.length; i++) {\r\n                    let item = group[i];\r\n                    let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                    item.color = \"w\";\r\n                    item.parent = null;\r\n                    item.chidren = {};\r\n                    item.times = 0;\r\n\r\n                    vertex1[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                    _this.isFunctionRangeSave = false;\r\n                    if (isForce) {\r\n                        _this.isFunctionRangeSave = true;\r\n                    }\r\n                    else {\r\n                        _this.isFunctionRangeSelect(calc_funcStr, cell.r, cell.c, cell.i, dynamicArray_compute);\r\n                    }\r\n\r\n                    if (_this.isFunctionRangeSave) {\r\n                        stack.push(item);\r\n                        _this.execvertex[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                        count++;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        // console.time(\"1\");\r\n        // console.log(group.length);\r\n        // let iii = 0, ii=0;\r\n        //\u5148\u8FDB\u5148\u51FA\u6CD5\uFF0C\u6784\u5EFA\u9006\u5411\u6267\u884C\u7ED3\u6784\u6811\r\n        while (stack.length > 0) {\r\n            let u = stack.shift();\r\n            let excludeList = {};\r\n            _this.getChildrenVertex(u, vertex1, excludeList);\r\n            // ii++;\r\n            // console.log(JSON.stringify(excludeList));\r\n            for (let name in vertex1) {\r\n                let item = vertex1[name];\r\n                if (item == null) {\r\n                    continue;\r\n                }\r\n\r\n                let ukey = \"r\" + u.r + \"c\" + u.c + \"i\" + u.index;\r\n\r\n                // if ((u.r == item.r && u.c == item.c && u.index == item.index) ) {\r\n                //     continue;\r\n                // }\r\n\r\n                if (name in excludeList) {\r\n                    continue;\r\n                }\r\n\r\n                _this.isFunctionRangeSave = false;\r\n\r\n\r\n\r\n                let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                _this.isFunctionRangeSelect(calc_funcStr, u.r, u.c, u.index, dynamicArray_compute);\r\n\r\n                // iii++;\r\n\r\n                if (_this.isFunctionRangeSave) {\r\n                    if (!(name in _this.execvertex)) {\r\n                        // console.log(JSON.stringify(item), JSON.stringify(u), _this.isFunctionRangeSave);\r\n\r\n                        stack.push(item);\r\n                        _this.execvertex[name] = item;\r\n                    }\r\n\r\n                    count++;\r\n                    _this.execvertex[name].chidren[ukey] = 1;\r\n                }\r\n            }\r\n        }\r\n        // console.log(iii, ii);\r\n        // console.timeEnd(\"1\");\r\n\r\n        // console.time(\"2\");\r\n        _this.groupValuesRefreshData = [];\r\n        let i = 0;\r\n\r\n        while (i < count) {\r\n            for (let name in _this.execvertex) {\r\n                let u = _this.execvertex[name];\r\n\r\n                if (u.color == \"w\") {\r\n                    _this.functionDFS(u);\r\n                }\r\n                else if (u.color == \"b\") {\r\n                    i++;\r\n                }\r\n            }\r\n        }\r\n        // console.timeEnd(\"2\");\r\n\r\n        _this.execFunctionExist = null;\r\n    },\r\n    //\u9012\u5F52\u5F97\u5230\u5F15\u7528\u8282\u70B9\r\n    getChildrenVertex: function (u, vertex1, obj) {\r\n        let ukey = \"r\" + u.r + \"c\" + u.c + \"i\" + u.index;\r\n        obj[ukey] = 1;\r\n        if (u.chidren != null) {\r\n            for (let key in u.chidren) {\r\n                if (vertex1[key] && !(key in obj)) {\r\n                    this.getChildrenVertex(vertex1[key], vertex1, obj);\r\n                }\r\n            }\r\n        }\r\n    },\r\n    //\u6DF1\u5EA6\u4F18\u5148\u7B97\u6CD5\uFF0C\u5904\u7406\u591A\u7EA7\u8C03\u7528\u51FD\u6570\r\n    functionDFS: function (u) {\r\n        let _this = this;\r\n        u.color = \"g\";\r\n        u.times += 1;\r\n        for (let chd in u.chidren) {\r\n            let v = _this.execvertex[chd];\r\n            if (v.color == \"w\") {\r\n                v.parent = \"r\" + u.r.toString() + \"c\" + u.c.toString() + \"i\" + u.index;\r\n                _this.functionDFS(v);\r\n            }\r\n        }\r\n\r\n        u.color = \"b\";\r\n        window.luckysheet_getcelldata_cache = null;\r\n        let calc_funcStr = getcellFormula(u.r, u.c, u.index);\r\n\r\n        let v = _this.execfunction(calc_funcStr, u.r, u.c, u.index);\r\n\r\n        // let value = _this.execFunctionGroupData[u.r][u.c];\r\n        // if(value == null){\r\n        //     value = {};\r\n        // }\r\n\r\n        // value.v = v[1];\r\n        // value.f = v[2];\r\n\r\n        // let cell = getOrigincell(u.r,u.c,u.index);\r\n\r\n        // let spl;\r\n        // if(v[3]!=null){\r\n        //     if(v[3].type==\"sparklines\"){\r\n        //         window.luckysheetCurrentRow = u.r;\r\n        //         window.luckysheetCurrentColumn = u.c;\r\n        //         window.luckysheetCurrentIndex = u.index;\r\n        //         window.luckysheetCurrentFunction = calc_funcStr;\r\n\r\n        //         let fp = $.trim(_this.functionParserExe(calc_funcStr));\r\n        //         let sparklines = eval(fp);\r\n        //         spl = sparklines;\r\n        //     }\r\n        // }\r\n\r\n        _this.groupValuesRefreshData.push({\r\n            \"r\": u.r,\r\n            \"c\": u.c,\r\n            \"v\": v[1],\r\n            \"f\": v[2],\r\n            \"spe\": v[3],\r\n            \"index\": u.index\r\n        });\r\n\r\n        // _this.execFunctionGroupData[u.r][u.c] = value;\r\n        _this.execFunctionGlobalData[u.r + \"_\" + u.c + \"_\" + u.index] = {\r\n            v: v[1],\r\n            f: v[2]\r\n        };\r\n    },\r\n    groupValuesRefreshData: [],\r\n    groupValuesRefresh: function () {\r\n        let _this = this;\r\n        let luckysheetfile = getluckysheetfile();\r\n        if (_this.groupValuesRefreshData.length > 0) {\r\n            for (let i = 0; i < _this.groupValuesRefreshData.length; i++) {\r\n                let item = _this.groupValuesRefreshData[i];\r\n\r\n                // if(item.i != Store.currentSheetIndex){\r\n                //     continue;\r\n                // }\r\n\r\n                let file = luckysheetfile[getSheetIndex(item.index)];\r\n                let data = file.data;\r\n                if (data == null) {\r\n                    continue;\r\n                }\r\n\r\n                let updateValue = {};\r\n                if (item.spe != null) {\r\n                    if (item.spe.type == \"sparklines\") {\r\n                        updateValue.spl = item.spe.data;\r\n                    }\r\n                    else if (item.spe.type == \"dynamicArrayItem\") {\r\n                        file.dynamicArray = _this.insertUpdateDynamicArray(item.spe.data);\r\n                    }\r\n                }\r\n                updateValue.v = item.v;\r\n                updateValue.f = item.f;\r\n                setcellvalue(item.r, item.c, data, updateValue);\r\n                server.saveParam(\"v\", item.index, item.v, {\r\n                    \"r\": item.r,\r\n                    \"c\": item.c\r\n                });\r\n            }\r\n\r\n            editor.webWorkerFlowDataCache(Store.flowdata);//worker\u5B58\u6570\u636E\r\n            _this.groupValuesRefreshData = [];\r\n        }\r\n    },\r\n    delFunctionGroup: function (r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain != null) {\r\n            for (let i = 0; i < calcChain.length; i++) {\r\n                let calc = calcChain[i];\r\n                if (calc.r == r && calc.c == c && calc.index == index) {\r\n                    calcChain.splice(i, 1);\r\n                    server.saveParam(\"fc\", index, null, {\r\n                        \"op\": \"del\",\r\n                        \"pos\": i\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        let dynamicArray = file.dynamicArray;\r\n        if (dynamicArray != null) {\r\n            for (let i = 0; i < dynamicArray.length; i++) {\r\n                let calc = dynamicArray[i];\r\n                if (calc.r == r && calc.c == c && (calc.index == null || calc.index == index)) {\r\n                    dynamicArray.splice(i, 1);\r\n                    server.saveParam(\"ac\", index, null, {\r\n                        \"op\": \"del\",\r\n                        \"pos\": i\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    execfunction: function (txt, r, c, index, isrefresh, notInsertFunc) {\r\n        let _this = this;\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        // console.log(txt,r,c)\r\n        if (txt.indexOf(_this.error.r) > -1) {\r\n            return [false, _this.error.r, txt];\r\n        }\r\n\r\n        if (!_this.checkBracketNum(txt)) {\r\n            txt += \")\";\r\n        }\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        Store.calculateSheetIndex = index;\r\n\r\n        let fp = $.trim(_this.functionParserExe(txt));\r\n        //console.log(fp)\r\n        if ((fp.substr(0, 20) == \"luckysheet_function.\" || fp.substr(0, 22) == \"luckysheet_compareWith\")) {\r\n            _this.functionHTMLIndex = 0;\r\n        }\r\n\r\n        if (!_this.testFunction(txt, fp) || fp == \"\") {\r\n            tooltip.info(\"\", locale_formulaMore.execfunctionError);\r\n            return [false, _this.error.n, txt];\r\n        }\r\n\r\n\r\n\r\n        let result = null;\r\n        window.luckysheetCurrentRow = r;\r\n        window.luckysheetCurrentColumn = c;\r\n        window.luckysheetCurrentIndex = index;\r\n        window.luckysheetCurrentFunction = txt;\r\n\r\n        let sparklines = null;\r\n\r\n        try {\r\n            if (fp.indexOf(\"luckysheet_getcelldata\") > -1) {\r\n                let funcg = fp.split(\"luckysheet_getcelldata('\");\r\n\r\n                for (let i = 1; i < funcg.length; i++) {\r\n                    let funcgStr = funcg[i].split(\"')\")[0];\r\n                    let funcgRange = _this.getcellrange(funcgStr);\r\n\r\n                    if (funcgRange.row[0] < 0 || funcgRange.column[0] < 0) {\r\n                        return [true, _this.error.r, txt];\r\n                    }\r\n\r\n                    if (funcgRange.sheetIndex == Store.calculateSheetIndex && r >= funcgRange.row[0] && r <= funcgRange.row[1] && c >= funcgRange.column[0] && c <= funcgRange.column[1]) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_formulaMore.execfunctionSelfError);\r\n                        }\r\n                        else {\r\n                            tooltip.info(\"\", locale_formulaMore.execfunctionSelfErrorResult);\r\n\r\n                        }\r\n\r\n                        return [false, 0, txt];\r\n                    }\r\n                }\r\n            }\r\n\r\n            result = new Function(\"return \" + fp)();\r\n            if (typeof (result) == \"string\") {//\u628A\u4E4B\u524D\u7684\u975E\u6253\u5370\u63A7\u5236\u5B57\u7B26DEL\u66FF\u6362\u56DE\u4E00\u4E2A\u53CC\u5F15\u53F7\u3002\r\n                result = result.replace(/\\x7F/g, '\"');\r\n            }\r\n\r\n            //\u52A0\u5165sparklines\u7684\u53C2\u6570\u9879\u76EE\r\n            if (fp.indexOf(\"SPLINES\") > -1) {\r\n                sparklines = result;\r\n                result = \"\";\r\n            }\r\n        }\r\n        catch (e) {\r\n            let err = e;\r\n            //err\u9519\u8BEF\u63D0\u793A\u5904\u7406\r\n            console.log(e, fp);\r\n            err = _this.errorInfo(err);\r\n            result = [_this.error.n, err];\r\n        }\r\n\r\n        //\u516C\u5F0F\u7ED3\u679C\u662F\u5BF9\u8C61\uFF0C\u5219\u8868\u793A\u53EA\u662F\u9009\u533A\u3002\u5982\u679C\u662F\u5355\u4E2A\u5355\u5143\u683C\uFF0C\u5219\u8FD4\u56DE\u5176\u503C\uFF1B\u5982\u679C\u662F\u591A\u4E2A\u5355\u5143\u683C\uFF0C\u5219\u8FD4\u56DE #VALUE!\u3002\r\n        if (getObjType(result) == \"object\" && result.startCell != null) {\r\n            if (getObjType(result.data) == \"array\") {\r\n                result = _this.error.v;\r\n            }\r\n            else {\r\n                if (getObjType(result.data) == \"object\" && !isRealNull(result.data.v)) {\r\n                    result = result.data.v;\r\n                }\r\n                else if (!isRealNull(result.data)) {\r\n                    //\u53EA\u6709data\u957F\u6216\u5BBD\u5927\u4E8E1\u624D\u53EF\u80FD\u662F\u9009\u533A\r\n                    if (result.cell > 1 || result.rowl > 1) {\r\n                        result = result.data;\r\n                    }\r\n                    else//\u5426\u5219\u5C31\u662F\u5355\u4E2A\u4E0D\u4E3Anull\u7684\u6CA1\u6709\u503Cv\u7684\u5355\u5143\u683C\r\n                    {\r\n                        result = 0;\r\n                    }\r\n                }\r\n                else {\r\n                    result = 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        //\u516C\u5F0F\u7ED3\u679C\u662F\u6570\u7EC4\uFF0C\u5206\u9519\u8BEF\u503C \u548C \u52A8\u6001\u6570\u7EC4 \u4E24\u79CD\u60C5\u51B5\r\n        let dynamicArrayItem = null;\r\n\r\n        if (getObjType(result) == \"array\") {\r\n            let isErr = false;\r\n\r\n            if (getObjType(result[0]) != \"array\" && result.length == 2) {\r\n                isErr = valueIsError(result[0]);\r\n            }\r\n\r\n            if (!isErr) {\r\n                if (getObjType(result[0]) == \"array\" && result.length == 1 && result[0].length == 1) {\r\n                    result = result[0][0];\r\n                }\r\n                else {\r\n                    dynamicArrayItem = { \"r\": r, \"c\": c, \"f\": txt, \"index\": index, \"data\": result };\r\n                    result = \"\";\r\n                }\r\n            }\r\n            else {\r\n                result = result[0];\r\n            }\r\n        }\r\n\r\n        window.luckysheetCurrentRow = null;\r\n        window.luckysheetCurrentColumn = null;\r\n        window.luckysheetCurrentIndex = null;\r\n        window.luckysheetCurrentFunction = null;\r\n\r\n        if (r != null && c != null) {\r\n            if (isrefresh) {\r\n                _this.execFunctionGroup(r, c, result, index);\r\n            }\r\n\r\n            if (!notInsertFunc) {\r\n                _this.insertUpdateFunctionGroup(r, c, index);\r\n            }\r\n        }\r\n\r\n        if (!!sparklines) {\r\n            return [true, result, txt, { type: \"sparklines\", data: sparklines }];\r\n        }\r\n\r\n        if (!!dynamicArrayItem) {\r\n            return [true, result, txt, { type: \"dynamicArrayItem\", data: dynamicArrayItem }];\r\n        }\r\n\r\n        // console.log(result, txt);\r\n\r\n        return [true, result, txt];\r\n    },\r\n    testFunction: function (txt, fp) {\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            return true;\r\n        }\r\n        else {\r\n            return false;\r\n        }\r\n    },\r\n    //\u4F9Bfunction/functionImplementation.js\u7684EVALUATE\u51FD\u6570\u8C03\u7528\u3002\r\n    execstringformula: function (txt, r, c, index) {\r\n        let _this = this;\r\n        return this.execfunction(txt, r, c, index);\r\n    },\r\n    functionResizeData: {},\r\n    functionResizeStatus: false,\r\n    functionResizeTimeout: null,\r\n    data_parm_index: 0  //\u9009\u62E9\u516C\u5F0F\u540E\u53C2\u6570\u7D22\u5F15\u6807\u8BB0\r\n}\r\n\r\nexport default luckysheetformula;\r\n", "import sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport pivotTable from './pivotTable';\r\nimport conditionformat from './conditionformat';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport {zoomRefreshView,zoomNumberDomBind} from './zoom';\r\nimport { createFilter, createFilterOptions, labelFilterOptionState } from './filter';\r\nimport formula from '../global/formula';\r\nimport json from '../global/json';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgridall, \r\n    jfrefreshrange, \r\n    jfrefreshgrid_rhcw, \r\n    jfrefreshgrid_adRC,\r\n    jfrefreshgrid_deleteCell,\r\n    jfrefreshgrid_pastcut,\r\n    luckysheetrefreshgrid \r\n} from '../global/refresh';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\nimport { selectHightlightShow } from './select';\r\nimport method from '../global/method';\r\n\r\nfunction formulaHistoryHanddler(ctr, type=\"redo\"){\r\n    if(ctr==null){\r\n        return;\r\n    }\r\n\r\n    let data = ctr.data;\r\n    if(type==\"undo\"){\r\n        data = ctr.curdata;\r\n    }\r\n    for(let s = 0; s < ctr.range.length; s++){\r\n        let st_r = ctr.range[s].row[0];\r\n        let ed_r = ctr.range[s].row[1];\r\n        let st_c = ctr.range[s].column[0];\r\n        let ed_c = ctr.range[s].column[1];\r\n\r\n        for(let r = st_r;r < ed_r + 1; r++){\r\n            for(let c = st_c; c < ed_c +1; c++){\r\n                if(r > data.length - 1){\r\n                    break;\r\n                }\r\n                // formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": ctr.sheetIndex });\r\n                if(data[r][c] == null || data[r][c].f==null || data[r][c].f==\"\"){\r\n                    formula.delFunctionGroup(r,c,ctr.sheetIndex);\r\n                }\r\n                else if(data[r][c] != null && data[r][c].f!=null && data[r][c].f.length>0){\r\n                    formula.insertUpdateFunctionGroup(r,c,ctr.sheetIndex);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nconst controlHistory = {\r\n    redo: function (e) {\r\n        if (Store.jfredo.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let ctr = Store.jfredo.pop();\r\n        Store.jfundo.push(ctr);\r\n        Store.clearjfundo = false;\r\n        \r\n        if (sheetmanage.hasSheet(ctr.sheetIndex) && Store.currentSheetIndex != ctr.sheetIndex) {\r\n            sheetmanage.changeSheetExec(ctr.sheetIndex);\r\n        }\r\n\r\n        // formula.execFunctionExist = [];\r\n\r\n        if (ctr.type == \"datachange\") {\r\n            //\u5982\u679C\u6709\u5355\u5143\u683C\u4E3Anull,\u5219\u5BF9\u5E94\u516C\u5F0F\u5E94\u8BE5\u5220\u9664\r\n            formulaHistoryHanddler(ctr);\r\n            \r\n            let allParam = {\r\n                \"cfg\": ctr.config,\r\n                \"RowlChange\": ctr.RowlChange,\r\n                \"cdformat\": ctr.cdformat,\r\n                \"dataVerification\": ctr.dataVerification,\r\n                \"dynamicArray\": ctr.dynamicArray\r\n            }\r\n           // jfrefreshgrid(ctr.data, ctr.range, allParam);\r\n\r\n            /* \u26A0\uFE0F  \u8FD9\u4E2A\uD83C\uDF36\uFE0F  dataRange\u8868\u793A\u7684\u624D\u662F\u6570\u636E\u66F4\u65B0\u7684\u4F4D\u7F6E */\r\n            jfrefreshgrid(ctr.data, ctr.dataRange, allParam);\r\n\r\n            // formula.execFunctionGroup(null, null, null, null, ctr.data);//\u53D6\u4E4B\u524D\u7684\u6570\u636E\r\n        }\r\n        else if (ctr.type == \"pasteCut\") {\r\n            let s = {\r\n                \"sheetIndex\": ctr.source[\"sheetIndex\"],\r\n                \"data\": ctr.source[\"curData\"],\r\n                \"curData\": ctr.source[\"data\"],\r\n                \"config\": ctr.source[\"curConfig\"],\r\n                \"curConfig\": ctr.source[\"config\"],\r\n                \"cdformat\": ctr.source[\"curCdformat\"],\r\n                \"curCdformat\": ctr.source[\"cdformat\"],\r\n                \"dataVerification\": ctr.source[\"curDataVerification\"],\r\n                \"curDataVerification\": ctr.source[\"dataVerification\"],\r\n                \"range\": ctr.source[\"range\"]\r\n            }\r\n            let t = {\r\n                \"sheetIndex\": ctr.target[\"sheetIndex\"],\r\n                \"data\": ctr.target[\"curData\"],\r\n                \"curData\": ctr.target[\"data\"],\r\n                \"config\": ctr.target[\"curConfig\"],\r\n                \"curConfig\": ctr.target[\"config\"],\r\n                \"cdformat\": ctr.target[\"curCdformat\"],\r\n                \"curCdformat\": ctr.target[\"cdformat\"],\r\n                \"dataVerification\": ctr.target[\"curDataVerification\"],\r\n                \"curDataVerification\": ctr.target[\"dataVerification\"],\r\n                \"range\": ctr.target[\"range\"]\r\n            }\r\n            jfrefreshgrid_pastcut(s, t, ctr.RowlChange);\r\n        }\r\n        else if (ctr.type == \"rangechange\") {\r\n            //\u5982\u679C\u6709\u5355\u5143\u683C\u4E3Anull,\u5219\u5BF9\u5E94\u516C\u5F0F\u5E94\u8BE5\u5220\u9664\r\n            formulaHistoryHanddler(ctr);\r\n            \r\n            jfrefreshrange(ctr.data, ctr.range, ctr.cdformat);\r\n            // formula.execFunctionGroup(null, null, null, null, ctr.data);//\u53D6\u4E4B\u524D\u7684\u6570\u636E\r\n        }\r\n        else if (ctr.type == \"resize\") {\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            if(ctr.ctrlType == \"resizeR\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"rowlen\"], { \"k\": \"rowlen\" });\r\n            }\r\n            else if(ctr.ctrlType == \"resizeC\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"columnlen\"], { \"k\": \"columnlen\" });\r\n            }\r\n\r\n            let images = $.extend(true, {}, ctr.images);\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].images = images;\r\n            server.saveParam(\"all\", ctr.sheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"cellRowChange\") {\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, ctr.ctrlType, ctr.ctrlValue, ctr.cdformat);\r\n        }\r\n        else if (ctr.type == \"extend\") {\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, \"dele\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"dele\") {\r\n            let ctrlValue1 = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue1.restore = true;\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, \"extend\", ctrlValue1);\r\n        }\r\n        else if (ctr.type == \"addRC\") { //\u589E\u52A0\u884C\u5217\u64A4\u9500\u64CD\u4F5C\r\n            let ctrlValue = $.extend(true, {}, ctr.ctrlValue);\r\n            if(ctrlValue.direction == \"rightbottom\"){\r\n                ctrlValue.index = ctrlValue.index + 1;\r\n            }\r\n\r\n            jfrefreshgrid_adRC(\r\n                ctr.data, \r\n                ctr.config, \r\n                \"delRC\", \r\n                ctrlValue, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf, \r\n                ctr.af, \r\n                ctr.freezen,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"delRC\") { //\u5220\u9664\u884C\u5217\u64A4\u9500\u64CD\u4F5C\r\n            let ctrlValue = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue.restore = true;\r\n            ctrlValue.direction = \"lefttop\";\r\n\r\n            jfrefreshgrid_adRC(\r\n                ctr.data, \r\n                ctr.config, \r\n                \"addRC\", \r\n                ctrlValue, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf, \r\n                ctr.af, \r\n                ctr.freezen,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"deleteCell\") { //\u5220\u9664\u5355\u5143\u683C\u64A4\u9500\u64CD\u4F5C\r\n            jfrefreshgrid_deleteCell(\r\n                ctr.data, \r\n                ctr.config, \r\n                ctr.ctrl, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"showHidRows\") { // \u9690\u85CF\u3001\u663E\u793A\u884C \u64A4\u9500\u64CD\u4F5C\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"showHidCols\") { // \u9690\u85CF\u3001\u663E\u793A\u5217 \u64A4\u9500\u64CD\u4F5C\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"datachangeAll\") {\r\n            formula.execFunctionGroup();\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, null, ctr.range, \"datachangeAll\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter_clear\") {\r\n            createFilterOptions(ctr.filter_save);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function(i){\r\n                let $top = $(this);\r\n                let item = ctr.optiongroups[i];\r\n                labelFilterOptionState($top, item.optionstate, item.rowhidden, item.caljs, false, item.st_r, item.ed_r, item.cindex, item.st_c, item.ed_c);\r\n            });\r\n\r\n            server.saveParam(\"fsr\", Store.currentSheetIndex, { \"filter\": ctr.optiongroups, \"filter_select\": ctr.filter_save });\r\n\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            if(Store.config[\"rowhidden\"] == null){\r\n                Store.config[\"rowhidden\"] = {};\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter\") {\r\n            let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(ctr[\"optionsindex\"]);\r\n            let st_r = $top.data(\"str\"), \r\n                ed_r = $top.data(\"edr\"), \r\n                cindex = $top.data(\"cindex\"), \r\n                st_c = $top.data(\"stc\"), \r\n                ed_c = $top.data(\"edc\");\r\n\r\n            labelFilterOptionState($top, json.hasKey(ctr.rowhidenPre), ctr.rowhidenPre, ctr.caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            if(Store.config[\"rowhidden\"] == null){\r\n                Store.config[\"rowhidden\"] = {};\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n            \r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"filtershow\") {\r\n            $('#luckysheet-filter-selected-sheet' + ctr.sheetIndex + ', #luckysheet-filter-options-sheet' + ctr.sheetIndex).remove();\r\n            \r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", ctr.sheetIndex, null, { \"k\": \"filter_select\" });\r\n            }\r\n        }\r\n        else if(ctr.type == \"pivotTable_change\"){\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].pivotTable = ctr.pivotTable;\r\n\r\n            pivotTable.getCellData(ctr.sheetIndex);\r\n            pivotTable.initialPivotManage(true);\r\n\r\n            pivotTable.refreshPivotTable();\r\n        }\r\n        else if (ctr.type == \"addSheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n            sheetmanage.changeSheetExec(ctr.currentSheetIndex);\r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"copySheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n            sheetmanage.changeSheetExec(ctr.copyindex);\r\n        }\r\n        else if (ctr.type == \"deleteSheet\") {\r\n            let isDupName = false;\r\n\r\n            for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n                if(Store.luckysheetfile[i].name == ctr.name){\r\n                    isDupName = true;\r\n                }\r\n            }\r\n\r\n            if(!isDupName){\r\n                sheetmanage.createSheetbydata(ctr, \"isrenew\");\r\n                $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n                $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n            }\r\n        }\r\n        else if (ctr.type == \"sheetName\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].name = ctr.oldtxt;\r\n            $(\"#luckysheet-sheets-item\" + ctr.sheetIndex).find(\".luckysheet-sheets-item-name\").html(ctr.oldtxt);\r\n\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.oldtxt, { \"k\": \"name\" });\r\n        }\r\n        else if (ctr.type == \"sheetColor\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].color = ctr.oldcolor;\r\n            \r\n            let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + ctr.sheetIndex);\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n\r\n            if(ctr.oldcolor != null){\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ctr.oldcolor + ';\"></div>');\r\n            }\r\n\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.oldcolor, { \"k\": \"color\" });\r\n        }\r\n        else if (ctr.type == \"mergeChange\") {\r\n            let allParam = {\r\n                \"cfg\": ctr.config,\r\n            }\r\n\r\n            jfrefreshgrid(ctr.data, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"updateDataVerification\"){\r\n            dataVerificationCtrl.ref(ctr.currentDataVerification, ctr.historyDataVerification, ctr.sheetIndex);\r\n        }\r\n        else if (ctr.type == \"updateDataVerificationOfCheckbox\"){\r\n            dataVerificationCtrl.refOfCheckbox(ctr.currentDataVerification, ctr.historyDataVerification, ctr.sheetIndex, ctr.data, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateHyperlink\"){\r\n            hyperlinkCtrl.ref(ctr.currentHyperlink, ctr.historyHyperlink, ctr.sheetIndex, ctr.data, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateCF\"){\r\n            let historyRules = ctr[\"data\"][\"historyRules\"];\r\n\r\n            for(let i = 0; i < historyRules.length; i++){\r\n                //\u6761\u4EF6\u89C4\u5219\r\n                let sheetIndex = historyRules[i][\"sheetIndex\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = historyRules[i][\"luckysheet_conditionformat_save\"];\r\n            \r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", sheetIndex, historyRules[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n\r\n            //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n            conditionformat.ref();\r\n        }\r\n        else if (ctr.type == \"updateAF\"){\r\n            let historyRules = ctr[\"data\"][\"historyRules\"];\r\n\r\n            let index = getSheetIndex(ctr[\"sheetIndex\"]);\r\n\r\n            Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = $.extend(true, [], historyRules);\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"borderChange\"){\r\n            if(ctr.config[\"borderInfo\"] == null){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, [], { \"k\": \"borderInfo\" });\r\n            }\r\n            else{\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n            }\r\n\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"postil\"){\r\n            luckysheetPostil.ref(ctr.data, ctr.rc);\r\n\r\n            for(let i = 0; i < ctr.rc.length; i++){\r\n                let r = ctr.rc[i].split(\"_\")[0];\r\n                let c = ctr.rc[i].split(\"_\")[1];\r\n\r\n                if(ctr.data[r][c] != null && ctr.data[r][c].ps != null){\r\n                    luckysheetPostil.buildPs(r, c, ctr.data[r][c].ps);\r\n                }\r\n                else{\r\n                    luckysheetPostil.buildPs(r, c, null);\r\n                }\r\n            }\r\n        }\r\n        else if (ctr.type == \"imageCtrl\"){\r\n            imageCtrl.images = $.extend(true, {}, ctr.images);\r\n            imageCtrl.allImagesShow();\r\n            imageCtrl.ref();\r\n        }\r\n        else if (ctr.type==\"zoomChange\"){\r\n            Store.zoomRatio = ctr.zoomRatio;\r\n            server.saveParam(\"all\", ctr.currentSheetIndex, ctr.zoomRatio, { \"k\": \"zoomRatio\" });\r\n            zoomNumberDomBind();\r\n            zoomRefreshView();\r\n        }\r\n        \r\n        cleargridelement(e);\r\n        if (ctr.range) {\r\n            Store.luckysheet_select_save = ctr.range;\r\n            selectHightlightShow();\r\n        }\r\n        Store.clearjfundo = true;\r\n\r\n        // \u64A4\u9500\u7684\u65F6\u5019curdata \u8DDF data \u6570\u636E\u8981\u8C03\u6362\u4E00\u4E0B\r\n        let newCtr = {...ctr, ...{data: ctr.curdata, curdata: ctr.data}}\r\n        // \u94A9\u5B50\u51FD\u6570\r\n        method.createHookFunction('updated', newCtr)\r\n        \r\n    },\r\n    undo: function () {\r\n        if (Store.jfundo.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let ctr = Store.jfundo.pop();\r\n        Store.jfredo.push(ctr);\r\n        Store.clearjfundo = false;\r\n\r\n        if (sheetmanage.hasSheet(ctr.sheetIndex) && Store.currentSheetIndex != ctr.sheetIndex) {\r\n            sheetmanage.changeSheetExec(ctr.sheetIndex);\r\n        }\r\n\r\n        if (ctr.type == \"datachange\") {\r\n            formula.execFunctionGroup();\r\n\r\n            let allParam = {\r\n                \"cfg\": ctr.curConfig,\r\n                \"RowlChange\": ctr.RowlChange,\r\n                \"cdformat\": ctr.curCdformat,\r\n                \"dataVerification\": ctr.curDataVerification,\r\n                \"dynamicArray\": ctr.curDynamicArray\r\n            }\r\n\r\n            formulaHistoryHanddler(ctr, \"undo\");\r\n\r\n            jfrefreshgrid(ctr.curdata, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"pasteCut\") {\r\n            jfrefreshgrid_pastcut(ctr.source, ctr.target, ctr.RowlChange);\r\n        }\r\n        else if (ctr.type == \"rangechange\") {\r\n            // formula.execFunctionGroup();\r\n            formulaHistoryHanddler(ctr, \"undo\");\r\n            jfrefreshrange(ctr.curdata, ctr.range, ctr.curCdformat);\r\n        }\r\n        else if (ctr.type == \"resize\") {\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            if(ctr.ctrlType == \"resizeR\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"rowlen\"], { \"k\": \"rowlen\" });\r\n            }\r\n            else if(ctr.ctrlType == \"resizeC\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"columnlen\"], { \"k\": \"columnlen\" });\r\n            }\r\n\r\n            let images = $.extend(true, {}, ctr.curImages);\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].images = images;\r\n            server.saveParam(\"all\", ctr.sheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"cellRowChange\") {\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue, ctr.curCdformat);\r\n        }\r\n        else if (ctr.type == \"extend\") {\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"dele\") {\r\n            let ctrlValue1 = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue1.restore = true;\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"addRC\") { //\u589E\u52A0\u884C\u5217\u91CD\u505A\u64CD\u4F5C\r\n            jfrefreshgrid_adRC(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                \"addRC\", \r\n                ctr.ctrlValue, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf, \r\n                ctr.curAf, \r\n                ctr.curFreezen,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"delRC\") { //\u5220\u9664\u884C\u5217\u91CD\u505A\u64CD\u4F5C\r\n            jfrefreshgrid_adRC(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                \"delRC\", \r\n                ctr.ctrlValue, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf, \r\n                ctr.curAf, \r\n                ctr.curFreezen,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"deleteCell\") { //\u5220\u9664\u5355\u5143\u683C\u91CD\u505A\u64CD\u4F5C\r\n            jfrefreshgrid_deleteCell(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                ctr.ctrl, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"showHidRows\") { // \u9690\u85CF\u3001\u663E\u793A\u884C \u91CD\u505A\u64CD\u4F5C\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"showHidCols\") { // \u9690\u85CF\u3001\u663E\u793A\u5217 \u91CD\u505A\u64CD\u4F5C\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"datachangeAll\") {\r\n            formula.execFunctionGroup();\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, null, ctr.currange, \"datachangeAll\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter_clear\") {\r\n            server.saveParam(\"fsc\", Store.currentSheetIndex, null);\r\n            \r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, {}, { \"k\": \"rowhidden\" });\r\n\r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n            \r\n\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(\"\u65E0\");\r\n\r\n            $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter\") {\r\n            let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(ctr[\"optionsindex\"]);\r\n            let st_r = $top.data(\"str\"), \r\n                ed_r = $top.data(\"edr\"), \r\n                cindex = $top.data(\"cindex\"), \r\n                st_c = $top.data(\"stc\"), \r\n                ed_c = $top.data(\"edc\");\r\n\r\n            labelFilterOptionState($top, json.hasKey(ctr.rowhidden), ctr.rowhidden, ctr.caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"filtershow\") {\r\n            Store.luckysheet_select_save = [ctr.filter_save];\r\n            Store.filterchage = false;\r\n            createFilter();\r\n            Store.filterchage = true;\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.filter_save, { \"k\": \"filter_select\" });\r\n        }\r\n        else if (ctr.type == \"pivotTable_change\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].pivotTable = ctr.pivotTablecur;\r\n            pivotTable.getCellData(ctr.sheetIndex);\r\n            pivotTable.initialPivotManage(true);\r\n            pivotTable.refreshPivotTable();\r\n        }\r\n        else if (ctr.type == \"addSheet\") {\r\n            sheetmanage.createSheetbydata(ctr.sheetconfig);\r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"copySheet\") {\r\n            sheetmanage.copySheet(ctr.copyindex);\r\n        }\r\n        else if (ctr.type == \"deleteSheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n\r\n            if (ctr.order == 0) {\r\n                sheetmanage.changeSheetExec(Store.luckysheetfile[0].index);\r\n            }\r\n            else {\r\n                sheetmanage.changeSheetExec(Store.luckysheetfile[ctr.order - 1].index);\r\n            }\r\n            \r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"sheetName\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].name = ctr.txt;\r\n            $(\"#luckysheet-sheets-item\" + ctr.sheetIndex).find(\".luckysheet-sheets-item-name\").html(ctr.txt);\r\n            \r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.txt, { \"k\": \"name\" });\r\n        }\r\n        else if (ctr.type == \"sheetColor\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].color = ctr.color;\r\n\r\n            let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + ctr.sheetIndex);\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n            \r\n            if(ctr.color != null){\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ctr.color + ';\"></div>');\r\n            }\r\n            \r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.color, { \"k\": \"color\" });\r\n        }\r\n        else if (ctr.type == \"mergeChange\") {\r\n            let allParam = {\r\n                \"cfg\": ctr.curConfig,\r\n            }\r\n\r\n            jfrefreshgrid(ctr.curData, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"updateDataVerification\"){\r\n            dataVerificationCtrl.ref(ctr.historyDataVerification, ctr.currentDataVerification, ctr.sheetIndex);\r\n        }\r\n        else if (ctr.type == \"updateDataVerificationOfCheckbox\"){\r\n            dataVerificationCtrl.refOfCheckbox(ctr.historyDataVerification, ctr.currentDataVerification, ctr.sheetIndex, ctr.curData, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateHyperlink\") {\r\n            hyperlinkCtrl.ref(ctr.historyHyperlink, ctr.currentHyperlink, ctr.sheetIndex, ctr.curData, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateCF\"){\r\n            let currentRules = ctr[\"data\"][\"currentRules\"];\r\n\r\n            for(let i = 0; i < currentRules.length; i++){\r\n                //\u6761\u4EF6\u89C4\u5219\r\n                let sheetIndex = currentRules[i][\"sheetIndex\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = currentRules[i][\"luckysheet_conditionformat_save\"];\r\n                \r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", sheetIndex, currentRules[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n\r\n            //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n            conditionformat.ref();\r\n        }\r\n        else if (ctr.type == \"updateAF\"){\r\n            let currentRules = ctr[\"data\"][\"currentRules\"];\r\n\r\n            let index = getSheetIndex(ctr[\"sheetIndex\"]);\r\n\r\n            Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = $.extend(true, [], currentRules);\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"borderChange\"){\r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"postil\"){\r\n            luckysheetPostil.ref(ctr.curdata, ctr.rc);\r\n\r\n            for(let i = 0; i < ctr.rc.length; i++){\r\n                let r = ctr.rc[i].split(\"_\")[0];\r\n                let c = ctr.rc[i].split(\"_\")[1];\r\n\r\n                if(ctr.curdata[r][c] != null && ctr.curdata[r][c].ps != null){\r\n                    luckysheetPostil.buildPs(r, c, ctr.curdata[r][c].ps);\r\n                }\r\n                else{\r\n                    luckysheetPostil.buildPs(r, c, null);\r\n                }\r\n            }\r\n        }\r\n        else if (ctr.type == \"imageCtrl\"){\r\n            imageCtrl.images = $.extend(true, {}, ctr.curImages);\r\n            imageCtrl.allImagesShow();\r\n            imageCtrl.ref();\r\n        }\r\n        else if (ctr.type==\"zoomChange\"){\r\n            Store.zoomRatio = ctr.curZoomRatio;\r\n            server.saveParam(\"all\", ctr.currentSheetIndex, ctr.curZoomRatio, { \"k\": \"zoomRatio\" });\r\n            zoomNumberDomBind();\r\n            zoomRefreshView();\r\n        }\r\n\r\n        if (ctr.range) {\r\n            Store.luckysheet_select_save = ctr.range;\r\n            selectHightlightShow();\r\n        }\r\n        Store.clearjfundo = true;\r\n\r\n    }\r\n};\r\n\r\nexport default controlHistory;", "export const HOOKS = [\n    \"onChange\",\n    \"onClose\",\n    \"onDayCreate\",\n    \"onDestroy\",\n    \"onKeyDown\",\n    \"onMonthChange\",\n    \"onOpen\",\n    \"onParseConfig\",\n    \"onReady\",\n    \"onValueUpdate\",\n    \"onYearChange\",\n    \"onPreCalendarPosition\",\n];\nexport const defaults = {\n    _disable: [],\n    allowInput: false,\n    allowInvalidPreload: false,\n    altFormat: \"F j, Y\",\n    altInput: false,\n    altInputClass: \"form-control input\",\n    animate: typeof window === \"object\" &&\n        window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n    ariaDateFormat: \"F j, Y\",\n    autoFillDefaultTime: true,\n    clickOpens: true,\n    closeOnSelect: true,\n    conjunction: \", \",\n    dateFormat: \"Y-m-d\",\n    defaultHour: 12,\n    defaultMinute: 0,\n    defaultSeconds: 0,\n    disable: [],\n    disableMobile: false,\n    enableSeconds: false,\n    enableTime: false,\n    errorHandler: (err) => typeof console !== \"undefined\" && console.warn(err),\n    getWeek: (givenDate) => {\n        const date = new Date(givenDate.getTime());\n        date.setHours(0, 0, 0, 0);\n        date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\n        var week1 = new Date(date.getFullYear(), 0, 4);\n        return (1 +\n            Math.round(((date.getTime() - week1.getTime()) / 86400000 -\n                3 +\n                ((week1.getDay() + 6) % 7)) /\n                7));\n    },\n    hourIncrement: 1,\n    ignoredFocusElements: [],\n    inline: false,\n    locale: \"default\",\n    minuteIncrement: 5,\n    mode: \"single\",\n    monthSelectorType: \"dropdown\",\n    nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n    noCalendar: false,\n    now: new Date(),\n    onChange: [],\n    onClose: [],\n    onDayCreate: [],\n    onDestroy: [],\n    onKeyDown: [],\n    onMonthChange: [],\n    onOpen: [],\n    onParseConfig: [],\n    onReady: [],\n    onValueUpdate: [],\n    onYearChange: [],\n    onPreCalendarPosition: [],\n    plugins: [],\n    position: \"auto\",\n    positionElement: undefined,\n    prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n    shorthandCurrentMonth: false,\n    showMonths: 1,\n    static: false,\n    time_24hr: false,\n    weekNumbers: false,\n    wrap: false,\n};\n", "export const english = {\n    weekdays: {\n        shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n        longhand: [\n            \"Sunday\",\n            \"Monday\",\n            \"Tuesday\",\n            \"Wednesday\",\n            \"Thursday\",\n            \"Friday\",\n            \"Saturday\",\n        ],\n    },\n    months: {\n        shorthand: [\n            \"Jan\",\n            \"Feb\",\n            \"Mar\",\n            \"Apr\",\n            \"May\",\n            \"Jun\",\n            \"Jul\",\n            \"Aug\",\n            \"Sep\",\n            \"Oct\",\n            \"Nov\",\n            \"Dec\",\n        ],\n        longhand: [\n            \"January\",\n            \"February\",\n            \"March\",\n            \"April\",\n            \"May\",\n            \"June\",\n            \"July\",\n            \"August\",\n            \"September\",\n            \"October\",\n            \"November\",\n            \"December\",\n        ],\n    },\n    daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n    firstDayOfWeek: 0,\n    ordinal: (nth) => {\n        const s = nth % 100;\n        if (s > 3 && s < 21)\n            return \"th\";\n        switch (s % 10) {\n            case 1:\n                return \"st\";\n            case 2:\n                return \"nd\";\n            case 3:\n                return \"rd\";\n            default:\n                return \"th\";\n        }\n    },\n    rangeSeparator: \" to \",\n    weekAbbreviation: \"Wk\",\n    scrollTitle: \"Scroll to increment\",\n    toggleTitle: \"Click to toggle\",\n    amPM: [\"AM\", \"PM\"],\n    yearAriaLabel: \"Year\",\n    monthAriaLabel: \"Month\",\n    hourAriaLabel: \"Hour\",\n    minuteAriaLabel: \"Minute\",\n    time_24hr: false,\n};\nexport default english;\n", "export const pad = (number, length = 2) => `000${number}`.slice(length * -1);\nexport const int = (bool) => (bool === true ? 1 : 0);\nexport function debounce(fn, wait) {\n    let t;\n    return function () {\n        clearTimeout(t);\n        t = setTimeout(() => fn.apply(this, arguments), wait);\n    };\n}\nexport const arrayify = (obj) => obj instanceof Array ? obj : [obj];\n", "export function toggleClass(elem, className, bool) {\n    if (bool === true)\n        return elem.classList.add(className);\n    elem.classList.remove(className);\n}\nexport function createElement(tag, className, content) {\n    const e = window.document.createElement(tag);\n    className = className || \"\";\n    content = content || \"\";\n    e.className = className;\n    if (content !== undefined)\n        e.textContent = content;\n    return e;\n}\nexport function clearNode(node) {\n    while (node.firstChild)\n        node.removeChild(node.firstChild);\n}\nexport function findParent(node, condition) {\n    if (condition(node))\n        return node;\n    else if (node.parentNode)\n        return findParent(node.parentNode, condition);\n    return undefined;\n}\nexport function createNumberInput(inputClassName, opts) {\n    const wrapper = createElement(\"div\", \"numInputWrapper\"), numInput = createElement(\"input\", \"numInput \" + inputClassName), arrowUp = createElement(\"span\", \"arrowUp\"), arrowDown = createElement(\"span\", \"arrowDown\");\n    if (navigator.userAgent.indexOf(\"MSIE 9.0\") === -1) {\n        numInput.type = \"number\";\n    }\n    else {\n        numInput.type = \"text\";\n        numInput.pattern = \"\\\\d*\";\n    }\n    if (opts !== undefined)\n        for (const key in opts)\n            numInput.setAttribute(key, opts[key]);\n    wrapper.appendChild(numInput);\n    wrapper.appendChild(arrowUp);\n    wrapper.appendChild(arrowDown);\n    return wrapper;\n}\nexport function getEventTarget(event) {\n    try {\n        if (typeof event.composedPath === \"function\") {\n            const path = event.composedPath();\n            return path[0];\n        }\n        return event.target;\n    }\n    catch (error) {\n        return event.target;\n    }\n}\n", "import { int, pad } from \"../utils\";\nconst doNothing = () => undefined;\nexport const monthToStr = (monthNumber, shorthand, locale) => locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber];\nexport const revFormat = {\n    D: doNothing,\n    F: function (dateObj, monthName, locale) {\n        dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n    },\n    G: (dateObj, hour) => {\n        dateObj.setHours(parseFloat(hour));\n    },\n    H: (dateObj, hour) => {\n        dateObj.setHours(parseFloat(hour));\n    },\n    J: (dateObj, day) => {\n        dateObj.setDate(parseFloat(day));\n    },\n    K: (dateObj, amPM, locale) => {\n        dateObj.setHours((dateObj.getHours() % 12) +\n            12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n    },\n    M: function (dateObj, shortMonth, locale) {\n        dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n    },\n    S: (dateObj, seconds) => {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    U: (_, unixSeconds) => new Date(parseFloat(unixSeconds) * 1000),\n    W: function (dateObj, weekNum, locale) {\n        const weekNumber = parseInt(weekNum);\n        const date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n        date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);\n        return date;\n    },\n    Y: (dateObj, year) => {\n        dateObj.setFullYear(parseFloat(year));\n    },\n    Z: (_, ISODate) => new Date(ISODate),\n    d: (dateObj, day) => {\n        dateObj.setDate(parseFloat(day));\n    },\n    h: (dateObj, hour) => {\n        dateObj.setHours(parseFloat(hour));\n    },\n    i: (dateObj, minutes) => {\n        dateObj.setMinutes(parseFloat(minutes));\n    },\n    j: (dateObj, day) => {\n        dateObj.setDate(parseFloat(day));\n    },\n    l: doNothing,\n    m: (dateObj, month) => {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    n: (dateObj, month) => {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    s: (dateObj, seconds) => {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    u: (_, unixMillSeconds) => new Date(parseFloat(unixMillSeconds)),\n    w: doNothing,\n    y: (dateObj, year) => {\n        dateObj.setFullYear(2000 + parseFloat(year));\n    },\n};\nexport const tokenRegex = {\n    D: \"(\\\\w+)\",\n    F: \"(\\\\w+)\",\n    G: \"(\\\\d\\\\d|\\\\d)\",\n    H: \"(\\\\d\\\\d|\\\\d)\",\n    J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n    K: \"\",\n    M: \"(\\\\w+)\",\n    S: \"(\\\\d\\\\d|\\\\d)\",\n    U: \"(.+)\",\n    W: \"(\\\\d\\\\d|\\\\d)\",\n    Y: \"(\\\\d{4})\",\n    Z: \"(.+)\",\n    d: \"(\\\\d\\\\d|\\\\d)\",\n    h: \"(\\\\d\\\\d|\\\\d)\",\n    i: \"(\\\\d\\\\d|\\\\d)\",\n    j: \"(\\\\d\\\\d|\\\\d)\",\n    l: \"(\\\\w+)\",\n    m: \"(\\\\d\\\\d|\\\\d)\",\n    n: \"(\\\\d\\\\d|\\\\d)\",\n    s: \"(\\\\d\\\\d|\\\\d)\",\n    u: \"(.+)\",\n    w: \"(\\\\d\\\\d|\\\\d)\",\n    y: \"(\\\\d{2})\",\n};\nexport const formats = {\n    Z: (date) => date.toISOString(),\n    D: function (date, locale, options) {\n        return locale.weekdays.shorthand[formats.w(date, locale, options)];\n    },\n    F: function (date, locale, options) {\n        return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n    },\n    G: function (date, locale, options) {\n        return pad(formats.h(date, locale, options));\n    },\n    H: (date) => pad(date.getHours()),\n    J: function (date, locale) {\n        return locale.ordinal !== undefined\n            ? date.getDate() + locale.ordinal(date.getDate())\n            : date.getDate();\n    },\n    K: (date, locale) => locale.amPM[int(date.getHours() > 11)],\n    M: function (date, locale) {\n        return monthToStr(date.getMonth(), true, locale);\n    },\n    S: (date) => pad(date.getSeconds()),\n    U: (date) => date.getTime() / 1000,\n    W: function (date, _, options) {\n        return options.getWeek(date);\n    },\n    Y: (date) => pad(date.getFullYear(), 4),\n    d: (date) => pad(date.getDate()),\n    h: (date) => (date.getHours() % 12 ? date.getHours() % 12 : 12),\n    i: (date) => pad(date.getMinutes()),\n    j: (date) => date.getDate(),\n    l: function (date, locale) {\n        return locale.weekdays.longhand[date.getDay()];\n    },\n    m: (date) => pad(date.getMonth() + 1),\n    n: (date) => date.getMonth() + 1,\n    s: (date) => date.getSeconds(),\n    u: (date) => date.getTime(),\n    w: (date) => date.getDay(),\n    y: (date) => String(date.getFullYear()).substring(2),\n};\n", "import { tokenRegex, revFormat, formats, } from \"./formatting\";\nimport { defaults } from \"../types/options\";\nimport { english } from \"../l10n/default\";\nexport const createDateFormatter = ({ config = defaults, l10n = english, isMobile = false, }) => (dateObj, frmt, overrideLocale) => {\n    const locale = overrideLocale || l10n;\n    if (config.formatDate !== undefined && !isMobile) {\n        return config.formatDate(dateObj, frmt, locale);\n    }\n    return frmt\n        .split(\"\")\n        .map((c, i, arr) => formats[c] && arr[i - 1] !== \"\\\\\"\n        ? formats[c](dateObj, locale, config)\n        : c !== \"\\\\\"\n            ? c\n            : \"\")\n        .join(\"\");\n};\nexport const createDateParser = ({ config = defaults, l10n = english }) => (date, givenFormat, timeless, customLocale) => {\n    if (date !== 0 && !date)\n        return undefined;\n    const locale = customLocale || l10n;\n    let parsedDate;\n    const dateOrig = date;\n    if (date instanceof Date)\n        parsedDate = new Date(date.getTime());\n    else if (typeof date !== \"string\" &&\n        date.toFixed !== undefined)\n        parsedDate = new Date(date);\n    else if (typeof date === \"string\") {\n        const format = givenFormat || (config || defaults).dateFormat;\n        const datestr = String(date).trim();\n        if (datestr === \"today\") {\n            parsedDate = new Date();\n            timeless = true;\n        }\n        else if (/Z$/.test(datestr) ||\n            /GMT$/.test(datestr))\n            parsedDate = new Date(date);\n        else if (config && config.parseDate)\n            parsedDate = config.parseDate(date, format);\n        else {\n            parsedDate =\n                !config || !config.noCalendar\n                    ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)\n                    : new Date(new Date().setHours(0, 0, 0, 0));\n            let matched, ops = [];\n            for (let i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n                const token = format[i];\n                const isBackSlash = token === \"\\\\\";\n                const escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n                if (tokenRegex[token] && !escaped) {\n                    regexStr += tokenRegex[token];\n                    const match = new RegExp(regexStr).exec(date);\n                    if (match && (matched = true)) {\n                        ops[token !== \"Y\" ? \"push\" : \"unshift\"]({\n                            fn: revFormat[token],\n                            val: match[++matchIndex],\n                        });\n                    }\n                }\n                else if (!isBackSlash)\n                    regexStr += \".\";\n                ops.forEach(({ fn, val }) => (parsedDate = fn(parsedDate, val, locale) || parsedDate));\n            }\n            parsedDate = matched ? parsedDate : undefined;\n        }\n    }\n    if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n        config.errorHandler(new Error(`Invalid date provided: ${dateOrig}`));\n        return undefined;\n    }\n    if (timeless === true)\n        parsedDate.setHours(0, 0, 0, 0);\n    return parsedDate;\n};\nexport function compareDates(date1, date2, timeless = true) {\n    if (timeless !== false) {\n        return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -\n            new Date(date2.getTime()).setHours(0, 0, 0, 0));\n    }\n    return date1.getTime() - date2.getTime();\n}\nexport function compareTimes(date1, date2) {\n    return (3600 * (date1.getHours() - date2.getHours()) +\n        60 * (date1.getMinutes() - date2.getMinutes()) +\n        date1.getSeconds() -\n        date2.getSeconds());\n}\nexport const isBetween = (ts, ts1, ts2) => {\n    return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n};\nexport const duration = {\n    DAY: 86400000,\n};\nexport function getDefaultHours(config) {\n    let hours = config.defaultHour;\n    let minutes = config.defaultMinute;\n    let seconds = config.defaultSeconds;\n    if (config.minDate !== undefined) {\n        const minHour = config.minDate.getHours();\n        const minMinutes = config.minDate.getMinutes();\n        const minSeconds = config.minDate.getSeconds();\n        if (hours < minHour) {\n            hours = minHour;\n        }\n        if (hours === minHour && minutes < minMinutes) {\n            minutes = minMinutes;\n        }\n        if (hours === minHour && minutes === minMinutes && seconds < minSeconds)\n            seconds = config.minDate.getSeconds();\n    }\n    if (config.maxDate !== undefined) {\n        const maxHr = config.maxDate.getHours();\n        const maxMinutes = config.maxDate.getMinutes();\n        hours = Math.min(hours, maxHr);\n        if (hours === maxHr)\n            minutes = Math.min(maxMinutes, minutes);\n        if (hours === maxHr && minutes === maxMinutes)\n            seconds = config.maxDate.getSeconds();\n    }\n    return { hours, minutes, seconds };\n}\n", "\"use strict\";\nif (typeof Object.assign !== \"function\") {\n    Object.assign = function (target, ...args) {\n        if (!target) {\n            throw TypeError(\"Cannot convert undefined or null to object\");\n        }\n        for (const source of args) {\n            if (source) {\n                Object.keys(source).forEach((key) => (target[key] = source[key]));\n            }\n        }\n        return target;\n    };\n}\n", "import { defaults as defaultOptions, HOOKS, } from \"./types/options\";\nimport English from \"./l10n/default\";\nimport { arrayify, debounce, int, pad } from \"./utils\";\nimport { clearNode, createElement, createNumberInput, findParent, toggleClass, getEventTarget, } from \"./utils/dom\";\nimport { compareDates, createDateParser, createDateFormatter, duration, isBetween, getDefaultHours, } from \"./utils/dates\";\nimport { tokenRegex, monthToStr } from \"./utils/formatting\";\nimport \"./utils/polyfills\";\nconst DEBOUNCED_CHANGE_MS = 300;\nfunction FlatpickrInstance(element, instanceConfig) {\n    const self = {\n        config: Object.assign(Object.assign({}, defaultOptions), flatpickr.defaultConfig),\n        l10n: English,\n    };\n    self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    self._handlers = [];\n    self.pluginElements = [];\n    self.loadedPlugins = [];\n    self._bind = bind;\n    self._setHoursFromDate = setHoursFromDate;\n    self._positionCalendar = positionCalendar;\n    self.changeMonth = changeMonth;\n    self.changeYear = changeYear;\n    self.clear = clear;\n    self.close = close;\n    self._createElement = createElement;\n    self.destroy = destroy;\n    self.isEnabled = isEnabled;\n    self.jumpToDate = jumpToDate;\n    self.open = open;\n    self.redraw = redraw;\n    self.set = set;\n    self.setDate = setDate;\n    self.toggle = toggle;\n    function setupHelperFunctions() {\n        self.utils = {\n            getDaysInMonth(month = self.currentMonth, yr = self.currentYear) {\n                if (month === 1 && ((yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0))\n                    return 29;\n                return self.l10n.daysInMonth[month];\n            },\n        };\n    }\n    function init() {\n        self.element = self.input = element;\n        self.isOpen = false;\n        parseConfig();\n        setupLocale();\n        setupInputs();\n        setupDates();\n        setupHelperFunctions();\n        if (!self.isMobile)\n            build();\n        bindEvents();\n        if (self.selectedDates.length || self.config.noCalendar) {\n            if (self.config.enableTime) {\n                setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj : undefined);\n            }\n            updateValue(false);\n        }\n        setCalendarWidth();\n        const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n        if (!self.isMobile && isSafari) {\n            positionCalendar();\n        }\n        triggerEvent(\"onReady\");\n    }\n    function bindToInstance(fn) {\n        return fn.bind(self);\n    }\n    function setCalendarWidth() {\n        const config = self.config;\n        if (config.weekNumbers === false && config.showMonths === 1) {\n            return;\n        }\n        else if (config.noCalendar !== true) {\n            window.requestAnimationFrame(function () {\n                if (self.calendarContainer !== undefined) {\n                    self.calendarContainer.style.visibility = \"hidden\";\n                    self.calendarContainer.style.display = \"block\";\n                }\n                if (self.daysContainer !== undefined) {\n                    const daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n                    self.daysContainer.style.width = daysWidth + \"px\";\n                    self.calendarContainer.style.width =\n                        daysWidth +\n                            (self.weekWrapper !== undefined\n                                ? self.weekWrapper.offsetWidth\n                                : 0) +\n                            \"px\";\n                    self.calendarContainer.style.removeProperty(\"visibility\");\n                    self.calendarContainer.style.removeProperty(\"display\");\n                }\n            });\n        }\n    }\n    function updateTime(e) {\n        if (self.selectedDates.length === 0) {\n            const defaultDate = self.config.minDate === undefined ||\n                compareDates(new Date(), self.config.minDate) >= 0\n                ? new Date()\n                : new Date(self.config.minDate.getTime());\n            const defaults = getDefaultHours(self.config);\n            defaultDate.setHours(defaults.hours, defaults.minutes, defaults.seconds, defaultDate.getMilliseconds());\n            self.selectedDates = [defaultDate];\n            self.latestSelectedDateObj = defaultDate;\n        }\n        if (e !== undefined && e.type !== \"blur\") {\n            timeWrapper(e);\n        }\n        const prevValue = self._input.value;\n        setHoursFromInputs();\n        updateValue();\n        if (self._input.value !== prevValue) {\n            self._debouncedChange();\n        }\n    }\n    function ampm2military(hour, amPM) {\n        return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);\n    }\n    function military2ampm(hour) {\n        switch (hour % 24) {\n            case 0:\n            case 12:\n                return 12;\n            default:\n                return hour % 12;\n        }\n    }\n    function setHoursFromInputs() {\n        if (self.hourElement === undefined || self.minuteElement === undefined)\n            return;\n        let hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined\n            ? (parseInt(self.secondElement.value, 10) || 0) % 60\n            : 0;\n        if (self.amPM !== undefined) {\n            hours = ampm2military(hours, self.amPM.textContent);\n        }\n        const limitMinHours = self.config.minTime !== undefined ||\n            (self.config.minDate &&\n                self.minDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===\n                    0);\n        const limitMaxHours = self.config.maxTime !== undefined ||\n            (self.config.maxDate &&\n                self.maxDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===\n                    0);\n        if (limitMaxHours) {\n            const maxTime = self.config.maxTime !== undefined\n                ? self.config.maxTime\n                : self.config.maxDate;\n            hours = Math.min(hours, maxTime.getHours());\n            if (hours === maxTime.getHours())\n                minutes = Math.min(minutes, maxTime.getMinutes());\n            if (minutes === maxTime.getMinutes())\n                seconds = Math.min(seconds, maxTime.getSeconds());\n        }\n        if (limitMinHours) {\n            const minTime = self.config.minTime !== undefined\n                ? self.config.minTime\n                : self.config.minDate;\n            hours = Math.max(hours, minTime.getHours());\n            if (hours === minTime.getHours() && minutes < minTime.getMinutes())\n                minutes = minTime.getMinutes();\n            if (minutes === minTime.getMinutes())\n                seconds = Math.max(seconds, minTime.getSeconds());\n        }\n        setHours(hours, minutes, seconds);\n    }\n    function setHoursFromDate(dateObj) {\n        const date = dateObj || self.latestSelectedDateObj;\n        if (date) {\n            setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n        }\n    }\n    function setHours(hours, minutes, seconds) {\n        if (self.latestSelectedDateObj !== undefined) {\n            self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n        }\n        if (!self.hourElement || !self.minuteElement || self.isMobile)\n            return;\n        self.hourElement.value = pad(!self.config.time_24hr\n            ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)\n            : hours);\n        self.minuteElement.value = pad(minutes);\n        if (self.amPM !== undefined)\n            self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n        if (self.secondElement !== undefined)\n            self.secondElement.value = pad(seconds);\n    }\n    function onYearInput(event) {\n        const eventTarget = getEventTarget(event);\n        const year = parseInt(eventTarget.value) + (event.delta || 0);\n        if (year / 1000 > 1 ||\n            (event.key === \"Enter\" && !/[^\\d]/.test(year.toString()))) {\n            changeYear(year);\n        }\n    }\n    function bind(element, event, handler, options) {\n        if (event instanceof Array)\n            return event.forEach((ev) => bind(element, ev, handler, options));\n        if (element instanceof Array)\n            return element.forEach((el) => bind(el, event, handler, options));\n        element.addEventListener(event, handler, options);\n        self._handlers.push({\n            remove: () => element.removeEventListener(event, handler),\n        });\n    }\n    function triggerChange() {\n        triggerEvent(\"onChange\");\n    }\n    function bindEvents() {\n        if (self.config.wrap) {\n            [\"open\", \"close\", \"toggle\", \"clear\"].forEach((evt) => {\n                Array.prototype.forEach.call(self.element.querySelectorAll(`[data-${evt}]`), (el) => bind(el, \"click\", self[evt]));\n            });\n        }\n        if (self.isMobile) {\n            setupMobile();\n            return;\n        }\n        const debouncedResize = debounce(onResize, 50);\n        self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n        if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))\n            bind(self.daysContainer, \"mouseover\", (e) => {\n                if (self.config.mode === \"range\")\n                    onMouseOver(getEventTarget(e));\n            });\n        bind(window.document.body, \"keydown\", onKeyDown);\n        if (!self.config.inline && !self.config.static)\n            bind(window, \"resize\", debouncedResize);\n        if (window.ontouchstart !== undefined)\n            bind(window.document, \"touchstart\", documentClick);\n        else\n            bind(window.document, \"mousedown\", documentClick);\n        bind(window.document, \"focus\", documentClick, { capture: true });\n        if (self.config.clickOpens === true) {\n            bind(self._input, \"focus\", self.open);\n            bind(self._input, \"click\", self.open);\n        }\n        if (self.daysContainer !== undefined) {\n            bind(self.monthNav, \"click\", onMonthNavClick);\n            bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n            bind(self.daysContainer, \"click\", selectDate);\n        }\n        if (self.timeContainer !== undefined &&\n            self.minuteElement !== undefined &&\n            self.hourElement !== undefined) {\n            const selText = (e) => getEventTarget(e).select();\n            bind(self.timeContainer, [\"increment\"], updateTime);\n            bind(self.timeContainer, \"blur\", updateTime, { capture: true });\n            bind(self.timeContainer, \"click\", timeIncrement);\n            bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n            if (self.secondElement !== undefined)\n                bind(self.secondElement, \"focus\", () => self.secondElement && self.secondElement.select());\n            if (self.amPM !== undefined) {\n                bind(self.amPM, \"click\", (e) => {\n                    updateTime(e);\n                    triggerChange();\n                });\n            }\n        }\n        if (self.config.allowInput) {\n            bind(self._input, \"blur\", onBlur);\n        }\n    }\n    function jumpToDate(jumpDate, triggerChange) {\n        const jumpTo = jumpDate !== undefined\n            ? self.parseDate(jumpDate)\n            : self.latestSelectedDateObj ||\n                (self.config.minDate && self.config.minDate > self.now\n                    ? self.config.minDate\n                    : self.config.maxDate && self.config.maxDate < self.now\n                        ? self.config.maxDate\n                        : self.now);\n        const oldYear = self.currentYear;\n        const oldMonth = self.currentMonth;\n        try {\n            if (jumpTo !== undefined) {\n                self.currentYear = jumpTo.getFullYear();\n                self.currentMonth = jumpTo.getMonth();\n            }\n        }\n        catch (e) {\n            e.message = \"Invalid date supplied: \" + jumpTo;\n            self.config.errorHandler(e);\n        }\n        if (triggerChange && self.currentYear !== oldYear) {\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        if (triggerChange &&\n            (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {\n            triggerEvent(\"onMonthChange\");\n        }\n        self.redraw();\n    }\n    function timeIncrement(e) {\n        const eventTarget = getEventTarget(e);\n        if (~eventTarget.className.indexOf(\"arrow\"))\n            incrementNumInput(e, eventTarget.classList.contains(\"arrowUp\") ? 1 : -1);\n    }\n    function incrementNumInput(e, delta, inputElem) {\n        const target = e && getEventTarget(e);\n        const input = inputElem ||\n            (target && target.parentNode && target.parentNode.firstChild);\n        const event = createEvent(\"increment\");\n        event.delta = delta;\n        input && input.dispatchEvent(event);\n    }\n    function build() {\n        const fragment = window.document.createDocumentFragment();\n        self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n        self.calendarContainer.tabIndex = -1;\n        if (!self.config.noCalendar) {\n            fragment.appendChild(buildMonthNav());\n            self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n            if (self.config.weekNumbers) {\n                const { weekWrapper, weekNumbers } = buildWeeks();\n                self.innerContainer.appendChild(weekWrapper);\n                self.weekNumbers = weekNumbers;\n                self.weekWrapper = weekWrapper;\n            }\n            self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n            self.rContainer.appendChild(buildWeekdays());\n            if (!self.daysContainer) {\n                self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n                self.daysContainer.tabIndex = -1;\n            }\n            buildDays();\n            self.rContainer.appendChild(self.daysContainer);\n            self.innerContainer.appendChild(self.rContainer);\n            fragment.appendChild(self.innerContainer);\n        }\n        if (self.config.enableTime) {\n            fragment.appendChild(buildTime());\n        }\n        toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n        toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n        toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n        self.calendarContainer.appendChild(fragment);\n        const customAppend = self.config.appendTo !== undefined &&\n            self.config.appendTo.nodeType !== undefined;\n        if (self.config.inline || self.config.static) {\n            self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n            if (self.config.inline) {\n                if (!customAppend && self.element.parentNode)\n                    self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);\n                else if (self.config.appendTo !== undefined)\n                    self.config.appendTo.appendChild(self.calendarContainer);\n            }\n            if (self.config.static) {\n                const wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n                if (self.element.parentNode)\n                    self.element.parentNode.insertBefore(wrapper, self.element);\n                wrapper.appendChild(self.element);\n                if (self.altInput)\n                    wrapper.appendChild(self.altInput);\n                wrapper.appendChild(self.calendarContainer);\n            }\n        }\n        if (!self.config.static && !self.config.inline)\n            (self.config.appendTo !== undefined\n                ? self.config.appendTo\n                : window.document.body).appendChild(self.calendarContainer);\n    }\n    function createDay(className, date, dayNumber, i) {\n        const dateIsEnabled = isEnabled(date, true), dayElement = createElement(\"span\", \"flatpickr-day \" + className, date.getDate().toString());\n        dayElement.dateObj = date;\n        dayElement.$i = i;\n        dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n        if (className.indexOf(\"hidden\") === -1 &&\n            compareDates(date, self.now) === 0) {\n            self.todayDateElem = dayElement;\n            dayElement.classList.add(\"today\");\n            dayElement.setAttribute(\"aria-current\", \"date\");\n        }\n        if (dateIsEnabled) {\n            dayElement.tabIndex = -1;\n            if (isDateSelected(date)) {\n                dayElement.classList.add(\"selected\");\n                self.selectedDateElem = dayElement;\n                if (self.config.mode === \"range\") {\n                    toggleClass(dayElement, \"startRange\", self.selectedDates[0] &&\n                        compareDates(date, self.selectedDates[0], true) === 0);\n                    toggleClass(dayElement, \"endRange\", self.selectedDates[1] &&\n                        compareDates(date, self.selectedDates[1], true) === 0);\n                    if (className === \"nextMonthDay\")\n                        dayElement.classList.add(\"inRange\");\n                }\n            }\n        }\n        else {\n            dayElement.classList.add(\"flatpickr-disabled\");\n        }\n        if (self.config.mode === \"range\") {\n            if (isDateInRange(date) && !isDateSelected(date))\n                dayElement.classList.add(\"inRange\");\n        }\n        if (self.weekNumbers &&\n            self.config.showMonths === 1 &&\n            className !== \"prevMonthDay\" &&\n            dayNumber % 7 === 1) {\n            self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n        }\n        triggerEvent(\"onDayCreate\", dayElement);\n        return dayElement;\n    }\n    function focusOnDayElem(targetNode) {\n        targetNode.focus();\n        if (self.config.mode === \"range\")\n            onMouseOver(targetNode);\n    }\n    function getFirstAvailableDay(delta) {\n        const startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n        const endMonth = delta > 0 ? self.config.showMonths : -1;\n        for (let m = startMonth; m != endMonth; m += delta) {\n            const month = self.daysContainer.children[m];\n            const startIndex = delta > 0 ? 0 : month.children.length - 1;\n            const endIndex = delta > 0 ? month.children.length : -1;\n            for (let i = startIndex; i != endIndex; i += delta) {\n                const c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj))\n                    return c;\n            }\n        }\n        return undefined;\n    }\n    function getNextAvailableDay(current, delta) {\n        const givenMonth = current.className.indexOf(\"Month\") === -1\n            ? current.dateObj.getMonth()\n            : self.currentMonth;\n        const endMonth = delta > 0 ? self.config.showMonths : -1;\n        const loopDelta = delta > 0 ? 1 : -1;\n        for (let m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n            const month = self.daysContainer.children[m];\n            const startIndex = givenMonth - self.currentMonth === m\n                ? current.$i + delta\n                : delta < 0\n                    ? month.children.length - 1\n                    : 0;\n            const numMonthDays = month.children.length;\n            for (let i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n                const c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 &&\n                    isEnabled(c.dateObj) &&\n                    Math.abs(current.$i - i) >= Math.abs(delta))\n                    return focusOnDayElem(c);\n            }\n        }\n        self.changeMonth(loopDelta);\n        focusOnDay(getFirstAvailableDay(loopDelta), 0);\n        return undefined;\n    }\n    function focusOnDay(current, offset) {\n        const dayFocused = isInView(document.activeElement || document.body);\n        const startElem = current !== undefined\n            ? current\n            : dayFocused\n                ? document.activeElement\n                : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)\n                    ? self.selectedDateElem\n                    : self.todayDateElem !== undefined && isInView(self.todayDateElem)\n                        ? self.todayDateElem\n                        : getFirstAvailableDay(offset > 0 ? 1 : -1);\n        if (startElem === undefined) {\n            self._input.focus();\n        }\n        else if (!dayFocused) {\n            focusOnDayElem(startElem);\n        }\n        else {\n            getNextAvailableDay(startElem, offset);\n        }\n    }\n    function buildMonthDays(year, month) {\n        const firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n        const prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12, year);\n        const daysInMonth = self.utils.getDaysInMonth(month, year), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\", nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n        let dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;\n        for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n        }\n        for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(\"\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n        }\n        for (let dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&\n            (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n            days.appendChild(createDay(nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n        }\n        const dayContainer = createElement(\"div\", \"dayContainer\");\n        dayContainer.appendChild(days);\n        return dayContainer;\n    }\n    function buildDays() {\n        if (self.daysContainer === undefined) {\n            return;\n        }\n        clearNode(self.daysContainer);\n        if (self.weekNumbers)\n            clearNode(self.weekNumbers);\n        const frag = document.createDocumentFragment();\n        for (let i = 0; i < self.config.showMonths; i++) {\n            const d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n        }\n        self.daysContainer.appendChild(frag);\n        self.days = self.daysContainer.firstChild;\n        if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n            onMouseOver();\n        }\n    }\n    function buildMonthSwitch() {\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType !== \"dropdown\")\n            return;\n        const shouldBuildMonth = function (month) {\n            if (self.config.minDate !== undefined &&\n                self.currentYear === self.config.minDate.getFullYear() &&\n                month < self.config.minDate.getMonth()) {\n                return false;\n            }\n            return !(self.config.maxDate !== undefined &&\n                self.currentYear === self.config.maxDate.getFullYear() &&\n                month > self.config.maxDate.getMonth());\n        };\n        self.monthsDropdownContainer.tabIndex = -1;\n        self.monthsDropdownContainer.innerHTML = \"\";\n        for (let i = 0; i < 12; i++) {\n            if (!shouldBuildMonth(i))\n                continue;\n            const month = createElement(\"option\", \"flatpickr-monthDropdown-month\");\n            month.value = new Date(self.currentYear, i).getMonth().toString();\n            month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);\n            month.tabIndex = -1;\n            if (self.currentMonth === i) {\n                month.selected = true;\n            }\n            self.monthsDropdownContainer.appendChild(month);\n        }\n    }\n    function buildMonth() {\n        const container = createElement(\"div\", \"flatpickr-month\");\n        const monthNavFragment = window.document.createDocumentFragment();\n        let monthElement;\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType === \"static\") {\n            monthElement = createElement(\"span\", \"cur-month\");\n        }\n        else {\n            self.monthsDropdownContainer = createElement(\"select\", \"flatpickr-monthDropdown-months\");\n            self.monthsDropdownContainer.setAttribute(\"aria-label\", self.l10n.monthAriaLabel);\n            bind(self.monthsDropdownContainer, \"change\", (e) => {\n                const target = getEventTarget(e);\n                const selectedMonth = parseInt(target.value, 10);\n                self.changeMonth(selectedMonth - self.currentMonth);\n                triggerEvent(\"onMonthChange\");\n            });\n            buildMonthSwitch();\n            monthElement = self.monthsDropdownContainer;\n        }\n        const yearInput = createNumberInput(\"cur-year\", { tabindex: \"-1\" });\n        const yearElement = yearInput.getElementsByTagName(\"input\")[0];\n        yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n        if (self.config.minDate) {\n            yearElement.setAttribute(\"min\", self.config.minDate.getFullYear().toString());\n        }\n        if (self.config.maxDate) {\n            yearElement.setAttribute(\"max\", self.config.maxDate.getFullYear().toString());\n            yearElement.disabled =\n                !!self.config.minDate &&\n                    self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n        }\n        const currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n        currentMonth.appendChild(monthElement);\n        currentMonth.appendChild(yearInput);\n        monthNavFragment.appendChild(currentMonth);\n        container.appendChild(monthNavFragment);\n        return {\n            container,\n            yearElement,\n            monthElement,\n        };\n    }\n    function buildMonths() {\n        clearNode(self.monthNav);\n        self.monthNav.appendChild(self.prevMonthNav);\n        if (self.config.showMonths) {\n            self.yearElements = [];\n            self.monthElements = [];\n        }\n        for (let m = self.config.showMonths; m--;) {\n            const month = buildMonth();\n            self.yearElements.push(month.yearElement);\n            self.monthElements.push(month.monthElement);\n            self.monthNav.appendChild(month.container);\n        }\n        self.monthNav.appendChild(self.nextMonthNav);\n    }\n    function buildMonthNav() {\n        self.monthNav = createElement(\"div\", \"flatpickr-months\");\n        self.yearElements = [];\n        self.monthElements = [];\n        self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n        self.prevMonthNav.innerHTML = self.config.prevArrow;\n        self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n        self.nextMonthNav.innerHTML = self.config.nextArrow;\n        buildMonths();\n        Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n            get: () => self.__hidePrevMonthArrow,\n            set(bool) {\n                if (self.__hidePrevMonthArrow !== bool) {\n                    toggleClass(self.prevMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hidePrevMonthArrow = bool;\n                }\n            },\n        });\n        Object.defineProperty(self, \"_hideNextMonthArrow\", {\n            get: () => self.__hideNextMonthArrow,\n            set(bool) {\n                if (self.__hideNextMonthArrow !== bool) {\n                    toggleClass(self.nextMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hideNextMonthArrow = bool;\n                }\n            },\n        });\n        self.currentYearElement = self.yearElements[0];\n        updateNavigationCurrentMonth();\n        return self.monthNav;\n    }\n    function buildTime() {\n        self.calendarContainer.classList.add(\"hasTime\");\n        if (self.config.noCalendar)\n            self.calendarContainer.classList.add(\"noCalendar\");\n        const defaults = getDefaultHours(self.config);\n        self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n        self.timeContainer.tabIndex = -1;\n        const separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n        const hourInput = createNumberInput(\"flatpickr-hour\", {\n            \"aria-label\": self.l10n.hourAriaLabel,\n        });\n        self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n        const minuteInput = createNumberInput(\"flatpickr-minute\", {\n            \"aria-label\": self.l10n.minuteAriaLabel,\n        });\n        self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n        self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n        self.hourElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getHours()\n            : self.config.time_24hr\n                ? defaults.hours\n                : military2ampm(defaults.hours));\n        self.minuteElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getMinutes()\n            : defaults.minutes);\n        self.hourElement.setAttribute(\"step\", self.config.hourIncrement.toString());\n        self.minuteElement.setAttribute(\"step\", self.config.minuteIncrement.toString());\n        self.hourElement.setAttribute(\"min\", self.config.time_24hr ? \"0\" : \"1\");\n        self.hourElement.setAttribute(\"max\", self.config.time_24hr ? \"23\" : \"12\");\n        self.hourElement.setAttribute(\"maxlength\", \"2\");\n        self.minuteElement.setAttribute(\"min\", \"0\");\n        self.minuteElement.setAttribute(\"max\", \"59\");\n        self.minuteElement.setAttribute(\"maxlength\", \"2\");\n        self.timeContainer.appendChild(hourInput);\n        self.timeContainer.appendChild(separator);\n        self.timeContainer.appendChild(minuteInput);\n        if (self.config.time_24hr)\n            self.timeContainer.classList.add(\"time24hr\");\n        if (self.config.enableSeconds) {\n            self.timeContainer.classList.add(\"hasSeconds\");\n            const secondInput = createNumberInput(\"flatpickr-second\");\n            self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n            self.secondElement.value = pad(self.latestSelectedDateObj\n                ? self.latestSelectedDateObj.getSeconds()\n                : defaults.seconds);\n            self.secondElement.setAttribute(\"step\", self.minuteElement.getAttribute(\"step\"));\n            self.secondElement.setAttribute(\"min\", \"0\");\n            self.secondElement.setAttribute(\"max\", \"59\");\n            self.secondElement.setAttribute(\"maxlength\", \"2\");\n            self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n            self.timeContainer.appendChild(secondInput);\n        }\n        if (!self.config.time_24hr) {\n            self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj\n                ? self.hourElement.value\n                : self.config.defaultHour) > 11)]);\n            self.amPM.title = self.l10n.toggleTitle;\n            self.amPM.tabIndex = -1;\n            self.timeContainer.appendChild(self.amPM);\n        }\n        return self.timeContainer;\n    }\n    function buildWeekdays() {\n        if (!self.weekdayContainer)\n            self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");\n        else\n            clearNode(self.weekdayContainer);\n        for (let i = self.config.showMonths; i--;) {\n            const container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n            self.weekdayContainer.appendChild(container);\n        }\n        updateWeekdays();\n        return self.weekdayContainer;\n    }\n    function updateWeekdays() {\n        if (!self.weekdayContainer) {\n            return;\n        }\n        const firstDayOfWeek = self.l10n.firstDayOfWeek;\n        let weekdays = [...self.l10n.weekdays.shorthand];\n        if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n            weekdays = [\n                ...weekdays.splice(firstDayOfWeek, weekdays.length),\n                ...weekdays.splice(0, firstDayOfWeek),\n            ];\n        }\n        for (let i = self.config.showMonths; i--;) {\n            self.weekdayContainer.children[i].innerHTML = `\n      <span class='flatpickr-weekday'>\n        ${weekdays.join(\"</span><span class='flatpickr-weekday'>\")}\n      </span>\n      `;\n        }\n    }\n    function buildWeeks() {\n        self.calendarContainer.classList.add(\"hasWeeks\");\n        const weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n        weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n        const weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n        weekWrapper.appendChild(weekNumbers);\n        return {\n            weekWrapper,\n            weekNumbers,\n        };\n    }\n    function changeMonth(value, isOffset = true) {\n        const delta = isOffset ? value : value - self.currentMonth;\n        if ((delta < 0 && self._hidePrevMonthArrow === true) ||\n            (delta > 0 && self._hideNextMonthArrow === true))\n            return;\n        self.currentMonth += delta;\n        if (self.currentMonth < 0 || self.currentMonth > 11) {\n            self.currentYear += self.currentMonth > 11 ? 1 : -1;\n            self.currentMonth = (self.currentMonth + 12) % 12;\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        buildDays();\n        triggerEvent(\"onMonthChange\");\n        updateNavigationCurrentMonth();\n    }\n    function clear(triggerChangeEvent = true, toInitial = true) {\n        self.input.value = \"\";\n        if (self.altInput !== undefined)\n            self.altInput.value = \"\";\n        if (self.mobileInput !== undefined)\n            self.mobileInput.value = \"\";\n        self.selectedDates = [];\n        self.latestSelectedDateObj = undefined;\n        if (toInitial === true) {\n            self.currentYear = self._initialDate.getFullYear();\n            self.currentMonth = self._initialDate.getMonth();\n        }\n        if (self.config.enableTime === true) {\n            const { hours, minutes, seconds } = getDefaultHours(self.config);\n            setHours(hours, minutes, seconds);\n        }\n        self.redraw();\n        if (triggerChangeEvent)\n            triggerEvent(\"onChange\");\n    }\n    function close() {\n        self.isOpen = false;\n        if (!self.isMobile) {\n            if (self.calendarContainer !== undefined) {\n                self.calendarContainer.classList.remove(\"open\");\n            }\n            if (self._input !== undefined) {\n                self._input.classList.remove(\"active\");\n            }\n        }\n        triggerEvent(\"onClose\");\n    }\n    function destroy() {\n        if (self.config !== undefined)\n            triggerEvent(\"onDestroy\");\n        for (let i = self._handlers.length; i--;) {\n            self._handlers[i].remove();\n        }\n        self._handlers = [];\n        if (self.mobileInput) {\n            if (self.mobileInput.parentNode)\n                self.mobileInput.parentNode.removeChild(self.mobileInput);\n            self.mobileInput = undefined;\n        }\n        else if (self.calendarContainer && self.calendarContainer.parentNode) {\n            if (self.config.static && self.calendarContainer.parentNode) {\n                const wrapper = self.calendarContainer.parentNode;\n                wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n                if (wrapper.parentNode) {\n                    while (wrapper.firstChild)\n                        wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n                    wrapper.parentNode.removeChild(wrapper);\n                }\n            }\n            else\n                self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n        }\n        if (self.altInput) {\n            self.input.type = \"text\";\n            if (self.altInput.parentNode)\n                self.altInput.parentNode.removeChild(self.altInput);\n            delete self.altInput;\n        }\n        if (self.input) {\n            self.input.type = self.input._type;\n            self.input.classList.remove(\"flatpickr-input\");\n            self.input.removeAttribute(\"readonly\");\n        }\n        [\n            \"_showTimeInput\",\n            \"latestSelectedDateObj\",\n            \"_hideNextMonthArrow\",\n            \"_hidePrevMonthArrow\",\n            \"__hideNextMonthArrow\",\n            \"__hidePrevMonthArrow\",\n            \"isMobile\",\n            \"isOpen\",\n            \"selectedDateElem\",\n            \"minDateHasTime\",\n            \"maxDateHasTime\",\n            \"days\",\n            \"daysContainer\",\n            \"_input\",\n            \"_positionElement\",\n            \"innerContainer\",\n            \"rContainer\",\n            \"monthNav\",\n            \"todayDateElem\",\n            \"calendarContainer\",\n            \"weekdayContainer\",\n            \"prevMonthNav\",\n            \"nextMonthNav\",\n            \"monthsDropdownContainer\",\n            \"currentMonthElement\",\n            \"currentYearElement\",\n            \"navigationCurrentMonth\",\n            \"selectedDateElem\",\n            \"config\",\n        ].forEach((k) => {\n            try {\n                delete self[k];\n            }\n            catch (_) { }\n        });\n    }\n    function isCalendarElem(elem) {\n        if (self.config.appendTo && self.config.appendTo.contains(elem))\n            return true;\n        return self.calendarContainer.contains(elem);\n    }\n    function documentClick(e) {\n        if (self.isOpen && !self.config.inline) {\n            const eventTarget = getEventTarget(e);\n            const isCalendarElement = isCalendarElem(eventTarget);\n            const isInput = eventTarget === self.input ||\n                eventTarget === self.altInput ||\n                self.element.contains(eventTarget) ||\n                (e.path &&\n                    e.path.indexOf &&\n                    (~e.path.indexOf(self.input) ||\n                        ~e.path.indexOf(self.altInput)));\n            const lostFocus = e.type === \"blur\"\n                ? isInput &&\n                    e.relatedTarget &&\n                    !isCalendarElem(e.relatedTarget)\n                : !isInput &&\n                    !isCalendarElement &&\n                    !isCalendarElem(e.relatedTarget);\n            const isIgnored = !self.config.ignoredFocusElements.some((elem) => elem.contains(eventTarget));\n            if (lostFocus && isIgnored) {\n                if (self.timeContainer !== undefined &&\n                    self.minuteElement !== undefined &&\n                    self.hourElement !== undefined &&\n                    self.input.value !== \"\" &&\n                    self.input.value !== undefined) {\n                    updateTime();\n                }\n                self.close();\n                if (self.config &&\n                    self.config.mode === \"range\" &&\n                    self.selectedDates.length === 1) {\n                    self.clear(false);\n                    self.redraw();\n                }\n            }\n        }\n    }\n    function changeYear(newYear) {\n        if (!newYear ||\n            (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||\n            (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))\n            return;\n        const newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;\n        self.currentYear = newYearNum || self.currentYear;\n        if (self.config.maxDate &&\n            self.currentYear === self.config.maxDate.getFullYear()) {\n            self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n        }\n        else if (self.config.minDate &&\n            self.currentYear === self.config.minDate.getFullYear()) {\n            self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n        }\n        if (isNewYear) {\n            self.redraw();\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n    }\n    function isEnabled(date, timeless = true) {\n        var _a;\n        const dateToCheck = self.parseDate(date, undefined, timeless);\n        if ((self.config.minDate &&\n            dateToCheck &&\n            compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||\n            (self.config.maxDate &&\n                dateToCheck &&\n                compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))\n            return false;\n        if (!self.config.enable && self.config.disable.length === 0)\n            return true;\n        if (dateToCheck === undefined)\n            return false;\n        const bool = !!self.config.enable, array = (_a = self.config.enable) !== null && _a !== void 0 ? _a : self.config.disable;\n        for (let i = 0, d; i < array.length; i++) {\n            d = array[i];\n            if (typeof d === \"function\" &&\n                d(dateToCheck))\n                return bool;\n            else if (d instanceof Date &&\n                dateToCheck !== undefined &&\n                d.getTime() === dateToCheck.getTime())\n                return bool;\n            else if (typeof d === \"string\") {\n                const parsed = self.parseDate(d, undefined, true);\n                return parsed && parsed.getTime() === dateToCheck.getTime()\n                    ? bool\n                    : !bool;\n            }\n            else if (typeof d === \"object\" &&\n                dateToCheck !== undefined &&\n                d.from &&\n                d.to &&\n                dateToCheck.getTime() >= d.from.getTime() &&\n                dateToCheck.getTime() <= d.to.getTime())\n                return bool;\n        }\n        return !bool;\n    }\n    function isInView(elem) {\n        if (self.daysContainer !== undefined)\n            return (elem.className.indexOf(\"hidden\") === -1 &&\n                elem.className.indexOf(\"flatpickr-disabled\") === -1 &&\n                self.daysContainer.contains(elem));\n        return false;\n    }\n    function onBlur(e) {\n        const isInput = e.target === self._input;\n        if (isInput &&\n            (self.selectedDates.length > 0 || self._input.value.length > 0) &&\n            !(e.relatedTarget && isCalendarElem(e.relatedTarget))) {\n            self.setDate(self._input.value, true, e.target === self.altInput\n                ? self.config.altFormat\n                : self.config.dateFormat);\n        }\n    }\n    function onKeyDown(e) {\n        const eventTarget = getEventTarget(e);\n        const isInput = self.config.wrap\n            ? element.contains(eventTarget)\n            : eventTarget === self._input;\n        const allowInput = self.config.allowInput;\n        const allowKeydown = self.isOpen && (!allowInput || !isInput);\n        const allowInlineKeydown = self.config.inline && isInput && !allowInput;\n        if (e.keyCode === 13 && isInput) {\n            if (allowInput) {\n                self.setDate(self._input.value, true, eventTarget === self.altInput\n                    ? self.config.altFormat\n                    : self.config.dateFormat);\n                return eventTarget.blur();\n            }\n            else {\n                self.open();\n            }\n        }\n        else if (isCalendarElem(eventTarget) ||\n            allowKeydown ||\n            allowInlineKeydown) {\n            const isTimeObj = !!self.timeContainer &&\n                self.timeContainer.contains(eventTarget);\n            switch (e.keyCode) {\n                case 13:\n                    if (isTimeObj) {\n                        e.preventDefault();\n                        updateTime();\n                        focusAndClose();\n                    }\n                    else\n                        selectDate(e);\n                    break;\n                case 27:\n                    e.preventDefault();\n                    focusAndClose();\n                    break;\n                case 8:\n                case 46:\n                    if (isInput && !self.config.allowInput) {\n                        e.preventDefault();\n                        self.clear();\n                    }\n                    break;\n                case 37:\n                case 39:\n                    if (!isTimeObj && !isInput) {\n                        e.preventDefault();\n                        if (self.daysContainer !== undefined &&\n                            (allowInput === false ||\n                                (document.activeElement && isInView(document.activeElement)))) {\n                            const delta = e.keyCode === 39 ? 1 : -1;\n                            if (!e.ctrlKey)\n                                focusOnDay(undefined, delta);\n                            else {\n                                e.stopPropagation();\n                                changeMonth(delta);\n                                focusOnDay(getFirstAvailableDay(1), 0);\n                            }\n                        }\n                    }\n                    else if (self.hourElement)\n                        self.hourElement.focus();\n                    break;\n                case 38:\n                case 40:\n                    e.preventDefault();\n                    const delta = e.keyCode === 40 ? 1 : -1;\n                    if ((self.daysContainer &&\n                        eventTarget.$i !== undefined) ||\n                        eventTarget === self.input ||\n                        eventTarget === self.altInput) {\n                        if (e.ctrlKey) {\n                            e.stopPropagation();\n                            changeYear(self.currentYear - delta);\n                            focusOnDay(getFirstAvailableDay(1), 0);\n                        }\n                        else if (!isTimeObj)\n                            focusOnDay(undefined, delta * 7);\n                    }\n                    else if (eventTarget === self.currentYearElement) {\n                        changeYear(self.currentYear - delta);\n                    }\n                    else if (self.config.enableTime) {\n                        if (!isTimeObj && self.hourElement)\n                            self.hourElement.focus();\n                        updateTime(e);\n                        self._debouncedChange();\n                    }\n                    break;\n                case 9:\n                    if (isTimeObj) {\n                        const elems = [\n                            self.hourElement,\n                            self.minuteElement,\n                            self.secondElement,\n                            self.amPM,\n                        ]\n                            .concat(self.pluginElements)\n                            .filter((x) => x);\n                        const i = elems.indexOf(eventTarget);\n                        if (i !== -1) {\n                            const target = elems[i + (e.shiftKey ? -1 : 1)];\n                            e.preventDefault();\n                            (target || self._input).focus();\n                        }\n                    }\n                    else if (!self.config.noCalendar &&\n                        self.daysContainer &&\n                        self.daysContainer.contains(eventTarget) &&\n                        e.shiftKey) {\n                        e.preventDefault();\n                        self._input.focus();\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            switch (e.key) {\n                case self.l10n.amPM[0].charAt(0):\n                case self.l10n.amPM[0].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[0];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n                case self.l10n.amPM[1].charAt(0):\n                case self.l10n.amPM[1].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[1];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n            }\n        }\n        if (isInput || isCalendarElem(eventTarget)) {\n            triggerEvent(\"onKeyDown\", e);\n        }\n    }\n    function onMouseOver(elem) {\n        if (self.selectedDates.length !== 1 ||\n            (elem &&\n                (!elem.classList.contains(\"flatpickr-day\") ||\n                    elem.classList.contains(\"flatpickr-disabled\"))))\n            return;\n        const hoverDate = elem\n            ? elem.dateObj.getTime()\n            : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());\n        let containsDisabled = false;\n        let minRange = 0, maxRange = 0;\n        for (let t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {\n            if (!isEnabled(new Date(t), true)) {\n                containsDisabled =\n                    containsDisabled || (t > rangeStartDate && t < rangeEndDate);\n                if (t < initialDate && (!minRange || t > minRange))\n                    minRange = t;\n                else if (t > initialDate && (!maxRange || t < maxRange))\n                    maxRange = t;\n            }\n        }\n        for (let m = 0; m < self.config.showMonths; m++) {\n            const month = self.daysContainer.children[m];\n            for (let i = 0, l = month.children.length; i < l; i++) {\n                const dayElem = month.children[i], date = dayElem.dateObj;\n                const timestamp = date.getTime();\n                const outOfRange = (minRange > 0 && timestamp < minRange) ||\n                    (maxRange > 0 && timestamp > maxRange);\n                if (outOfRange) {\n                    dayElem.classList.add(\"notAllowed\");\n                    [\"inRange\", \"startRange\", \"endRange\"].forEach((c) => {\n                        dayElem.classList.remove(c);\n                    });\n                    continue;\n                }\n                else if (containsDisabled && !outOfRange)\n                    continue;\n                [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach((c) => {\n                    dayElem.classList.remove(c);\n                });\n                if (elem !== undefined) {\n                    elem.classList.add(hoverDate <= self.selectedDates[0].getTime()\n                        ? \"startRange\"\n                        : \"endRange\");\n                    if (initialDate < hoverDate && timestamp === initialDate)\n                        dayElem.classList.add(\"startRange\");\n                    else if (initialDate > hoverDate && timestamp === initialDate)\n                        dayElem.classList.add(\"endRange\");\n                    if (timestamp >= minRange &&\n                        (maxRange === 0 || timestamp <= maxRange) &&\n                        isBetween(timestamp, initialDate, hoverDate))\n                        dayElem.classList.add(\"inRange\");\n                }\n            }\n        }\n    }\n    function onResize() {\n        if (self.isOpen && !self.config.static && !self.config.inline)\n            positionCalendar();\n    }\n    function open(e, positionElement = self._positionElement) {\n        if (self.isMobile === true) {\n            if (e) {\n                e.preventDefault();\n                const eventTarget = getEventTarget(e);\n                if (eventTarget) {\n                    eventTarget.blur();\n                }\n            }\n            if (self.mobileInput !== undefined) {\n                self.mobileInput.focus();\n                self.mobileInput.click();\n            }\n            triggerEvent(\"onOpen\");\n            return;\n        }\n        else if (self._input.disabled || self.config.inline) {\n            return;\n        }\n        const wasOpen = self.isOpen;\n        self.isOpen = true;\n        if (!wasOpen) {\n            self.calendarContainer.classList.add(\"open\");\n            self._input.classList.add(\"active\");\n            triggerEvent(\"onOpen\");\n            positionCalendar(positionElement);\n        }\n        if (self.config.enableTime === true && self.config.noCalendar === true) {\n            if (self.config.allowInput === false &&\n                (e === undefined ||\n                    !self.timeContainer.contains(e.relatedTarget))) {\n                setTimeout(() => self.hourElement.select(), 50);\n            }\n        }\n    }\n    function minMaxDateSetter(type) {\n        return (date) => {\n            const dateObj = (self.config[`_${type}Date`] = self.parseDate(date, self.config.dateFormat));\n            const inverseDateObj = self.config[`_${type === \"min\" ? \"max\" : \"min\"}Date`];\n            if (dateObj !== undefined) {\n                self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] =\n                    dateObj.getHours() > 0 ||\n                        dateObj.getMinutes() > 0 ||\n                        dateObj.getSeconds() > 0;\n            }\n            if (self.selectedDates) {\n                self.selectedDates = self.selectedDates.filter((d) => isEnabled(d));\n                if (!self.selectedDates.length && type === \"min\")\n                    setHoursFromDate(dateObj);\n                updateValue();\n            }\n            if (self.daysContainer) {\n                redraw();\n                if (dateObj !== undefined)\n                    self.currentYearElement[type] = dateObj.getFullYear().toString();\n                else\n                    self.currentYearElement.removeAttribute(type);\n                self.currentYearElement.disabled =\n                    !!inverseDateObj &&\n                        dateObj !== undefined &&\n                        inverseDateObj.getFullYear() === dateObj.getFullYear();\n            }\n        };\n    }\n    function parseConfig() {\n        const boolOpts = [\n            \"wrap\",\n            \"weekNumbers\",\n            \"allowInput\",\n            \"allowInvalidPreload\",\n            \"clickOpens\",\n            \"time_24hr\",\n            \"enableTime\",\n            \"noCalendar\",\n            \"altInput\",\n            \"shorthandCurrentMonth\",\n            \"inline\",\n            \"static\",\n            \"enableSeconds\",\n            \"disableMobile\",\n        ];\n        const userConfig = Object.assign(Object.assign({}, JSON.parse(JSON.stringify(element.dataset || {}))), instanceConfig);\n        const formats = {};\n        self.config.parseDate = userConfig.parseDate;\n        self.config.formatDate = userConfig.formatDate;\n        Object.defineProperty(self.config, \"enable\", {\n            get: () => self.config._enable,\n            set: (dates) => {\n                self.config._enable = parseDateRules(dates);\n            },\n        });\n        Object.defineProperty(self.config, \"disable\", {\n            get: () => self.config._disable,\n            set: (dates) => {\n                self.config._disable = parseDateRules(dates);\n            },\n        });\n        const timeMode = userConfig.mode === \"time\";\n        if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n            const defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaultOptions.dateFormat;\n            formats.dateFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\")\n                    : defaultDateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n        }\n        if (userConfig.altInput &&\n            (userConfig.enableTime || timeMode) &&\n            !userConfig.altFormat) {\n            const defaultAltFormat = flatpickr.defaultConfig.altFormat || defaultOptions.altFormat;\n            formats.altFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\")\n                    : defaultAltFormat + ` h:i${userConfig.enableSeconds ? \":S\" : \"\"} K`;\n        }\n        Object.defineProperty(self.config, \"minDate\", {\n            get: () => self.config._minDate,\n            set: minMaxDateSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxDate\", {\n            get: () => self.config._maxDate,\n            set: minMaxDateSetter(\"max\"),\n        });\n        const minMaxTimeSetter = (type) => (val) => {\n            self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i:S\");\n        };\n        Object.defineProperty(self.config, \"minTime\", {\n            get: () => self.config._minTime,\n            set: minMaxTimeSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxTime\", {\n            get: () => self.config._maxTime,\n            set: minMaxTimeSetter(\"max\"),\n        });\n        if (userConfig.mode === \"time\") {\n            self.config.noCalendar = true;\n            self.config.enableTime = true;\n        }\n        Object.assign(self.config, formats, userConfig);\n        for (let i = 0; i < boolOpts.length; i++)\n            self.config[boolOpts[i]] =\n                self.config[boolOpts[i]] === true ||\n                    self.config[boolOpts[i]] === \"true\";\n        HOOKS.filter((hook) => self.config[hook] !== undefined).forEach((hook) => {\n            self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n        });\n        self.isMobile =\n            !self.config.disableMobile &&\n                !self.config.inline &&\n                self.config.mode === \"single\" &&\n                !self.config.disable.length &&\n                !self.config.enable &&\n                !self.config.weekNumbers &&\n                /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n        for (let i = 0; i < self.config.plugins.length; i++) {\n            const pluginConf = self.config.plugins[i](self) || {};\n            for (const key in pluginConf) {\n                if (HOOKS.indexOf(key) > -1) {\n                    self.config[key] = arrayify(pluginConf[key])\n                        .map(bindToInstance)\n                        .concat(self.config[key]);\n                }\n                else if (typeof userConfig[key] === \"undefined\")\n                    self.config[key] = pluginConf[key];\n            }\n        }\n        if (!userConfig.altInputClass) {\n            self.config.altInputClass =\n                getInputElem().className + \" \" + self.config.altInputClass;\n        }\n        triggerEvent(\"onParseConfig\");\n    }\n    function getInputElem() {\n        return self.config.wrap\n            ? element.querySelector(\"[data-input]\")\n            : element;\n    }\n    function setupLocale() {\n        if (typeof self.config.locale !== \"object\" &&\n            typeof flatpickr.l10ns[self.config.locale] === \"undefined\")\n            self.config.errorHandler(new Error(`flatpickr: invalid locale ${self.config.locale}`));\n        self.l10n = Object.assign(Object.assign({}, flatpickr.l10ns.default), (typeof self.config.locale === \"object\"\n            ? self.config.locale\n            : self.config.locale !== \"default\"\n                ? flatpickr.l10ns[self.config.locale]\n                : undefined));\n        tokenRegex.K = `(${self.l10n.amPM[0]}|${self.l10n.amPM[1]}|${self.l10n.amPM[0].toLowerCase()}|${self.l10n.amPM[1].toLowerCase()})`;\n        const userConfig = Object.assign(Object.assign({}, instanceConfig), JSON.parse(JSON.stringify(element.dataset || {})));\n        if (userConfig.time_24hr === undefined &&\n            flatpickr.defaultConfig.time_24hr === undefined) {\n            self.config.time_24hr = self.l10n.time_24hr;\n        }\n        self.formatDate = createDateFormatter(self);\n        self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    }\n    function positionCalendar(customPositionElement) {\n        if (typeof self.config.position === \"function\") {\n            return void self.config.position(self, customPositionElement);\n        }\n        if (self.calendarContainer === undefined)\n            return;\n        triggerEvent(\"onPreCalendarPosition\");\n        const positionElement = customPositionElement || self._positionElement;\n        const calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, ((acc, child) => acc + child.offsetHeight), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(\" \"), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === \"above\" ||\n            (configPosVertical !== \"below\" &&\n                distanceFromBottom < calendarHeight &&\n                inputBounds.top > calendarHeight);\n        const top = window.pageYOffset +\n            inputBounds.top +\n            (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n        toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n        toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n        if (self.config.inline)\n            return;\n        let left = window.pageXOffset + inputBounds.left;\n        let isCenter = false;\n        let isRight = false;\n        if (configPosHorizontal === \"center\") {\n            left -= (calendarWidth - inputBounds.width) / 2;\n            isCenter = true;\n        }\n        else if (configPosHorizontal === \"right\") {\n            left -= calendarWidth - inputBounds.width;\n            isRight = true;\n        }\n        toggleClass(self.calendarContainer, \"arrowLeft\", !isCenter && !isRight);\n        toggleClass(self.calendarContainer, \"arrowCenter\", isCenter);\n        toggleClass(self.calendarContainer, \"arrowRight\", isRight);\n        const right = window.document.body.offsetWidth -\n            (window.pageXOffset + inputBounds.right);\n        const rightMost = left + calendarWidth > window.document.body.offsetWidth;\n        const centerMost = right + calendarWidth > window.document.body.offsetWidth;\n        toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n        if (self.config.static)\n            return;\n        self.calendarContainer.style.top = `${top}px`;\n        if (!rightMost) {\n            self.calendarContainer.style.left = `${left}px`;\n            self.calendarContainer.style.right = \"auto\";\n        }\n        else if (!centerMost) {\n            self.calendarContainer.style.left = \"auto\";\n            self.calendarContainer.style.right = `${right}px`;\n        }\n        else {\n            const doc = getDocumentStyleSheet();\n            if (doc === undefined)\n                return;\n            const bodyWidth = window.document.body.offsetWidth;\n            const centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);\n            const centerBefore = \".flatpickr-calendar.centerMost:before\";\n            const centerAfter = \".flatpickr-calendar.centerMost:after\";\n            const centerIndex = doc.cssRules.length;\n            const centerStyle = `{left:${inputBounds.left}px;right:auto;}`;\n            toggleClass(self.calendarContainer, \"rightMost\", false);\n            toggleClass(self.calendarContainer, \"centerMost\", true);\n            doc.insertRule(`${centerBefore},${centerAfter}${centerStyle}`, centerIndex);\n            self.calendarContainer.style.left = `${centerLeft}px`;\n            self.calendarContainer.style.right = \"auto\";\n        }\n    }\n    function getDocumentStyleSheet() {\n        let editableSheet = null;\n        for (let i = 0; i < document.styleSheets.length; i++) {\n            const sheet = document.styleSheets[i];\n            try {\n                sheet.cssRules;\n            }\n            catch (err) {\n                continue;\n            }\n            editableSheet = sheet;\n            break;\n        }\n        return editableSheet != null ? editableSheet : createStyleSheet();\n    }\n    function createStyleSheet() {\n        const style = document.createElement(\"style\");\n        document.head.appendChild(style);\n        return style.sheet;\n    }\n    function redraw() {\n        if (self.config.noCalendar || self.isMobile)\n            return;\n        buildMonthSwitch();\n        updateNavigationCurrentMonth();\n        buildDays();\n    }\n    function focusAndClose() {\n        self._input.focus();\n        if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n            navigator.msMaxTouchPoints !== undefined) {\n            setTimeout(self.close, 0);\n        }\n        else {\n            self.close();\n        }\n    }\n    function selectDate(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        const isSelectable = (day) => day.classList &&\n            day.classList.contains(\"flatpickr-day\") &&\n            !day.classList.contains(\"flatpickr-disabled\") &&\n            !day.classList.contains(\"notAllowed\");\n        const t = findParent(getEventTarget(e), isSelectable);\n        if (t === undefined)\n            return;\n        const target = t;\n        const selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));\n        const shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||\n            selectedDate.getMonth() >\n                self.currentMonth + self.config.showMonths - 1) &&\n            self.config.mode !== \"range\";\n        self.selectedDateElem = target;\n        if (self.config.mode === \"single\")\n            self.selectedDates = [selectedDate];\n        else if (self.config.mode === \"multiple\") {\n            const selectedIndex = isDateSelected(selectedDate);\n            if (selectedIndex)\n                self.selectedDates.splice(parseInt(selectedIndex), 1);\n            else\n                self.selectedDates.push(selectedDate);\n        }\n        else if (self.config.mode === \"range\") {\n            if (self.selectedDates.length === 2) {\n                self.clear(false, false);\n            }\n            self.latestSelectedDateObj = selectedDate;\n            self.selectedDates.push(selectedDate);\n            if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)\n                self.selectedDates.sort((a, b) => a.getTime() - b.getTime());\n        }\n        setHoursFromInputs();\n        if (shouldChangeMonth) {\n            const isNewYear = self.currentYear !== selectedDate.getFullYear();\n            self.currentYear = selectedDate.getFullYear();\n            self.currentMonth = selectedDate.getMonth();\n            if (isNewYear) {\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n            triggerEvent(\"onMonthChange\");\n        }\n        updateNavigationCurrentMonth();\n        buildDays();\n        updateValue();\n        if (!shouldChangeMonth &&\n            self.config.mode !== \"range\" &&\n            self.config.showMonths === 1)\n            focusOnDayElem(target);\n        else if (self.selectedDateElem !== undefined &&\n            self.hourElement === undefined) {\n            self.selectedDateElem && self.selectedDateElem.focus();\n        }\n        if (self.hourElement !== undefined)\n            self.hourElement !== undefined && self.hourElement.focus();\n        if (self.config.closeOnSelect) {\n            const single = self.config.mode === \"single\" && !self.config.enableTime;\n            const range = self.config.mode === \"range\" &&\n                self.selectedDates.length === 2 &&\n                !self.config.enableTime;\n            if (single || range) {\n                focusAndClose();\n            }\n        }\n        triggerChange();\n    }\n    const CALLBACKS = {\n        locale: [setupLocale, updateWeekdays],\n        showMonths: [buildMonths, setCalendarWidth, buildWeekdays],\n        minDate: [jumpToDate],\n        maxDate: [jumpToDate],\n        clickOpens: [\n            () => {\n                if (self.config.clickOpens === true) {\n                    bind(self._input, \"focus\", self.open);\n                    bind(self._input, \"click\", self.open);\n                }\n                else {\n                    self._input.removeEventListener(\"focus\", self.open);\n                    self._input.removeEventListener(\"click\", self.open);\n                }\n            },\n        ],\n    };\n    function set(option, value) {\n        if (option !== null && typeof option === \"object\") {\n            Object.assign(self.config, option);\n            for (const key in option) {\n                if (CALLBACKS[key] !== undefined)\n                    CALLBACKS[key].forEach((x) => x());\n            }\n        }\n        else {\n            self.config[option] = value;\n            if (CALLBACKS[option] !== undefined)\n                CALLBACKS[option].forEach((x) => x());\n            else if (HOOKS.indexOf(option) > -1)\n                self.config[option] = arrayify(value);\n        }\n        self.redraw();\n        updateValue(true);\n    }\n    function setSelectedDate(inputDate, format) {\n        let dates = [];\n        if (inputDate instanceof Array)\n            dates = inputDate.map((d) => self.parseDate(d, format));\n        else if (inputDate instanceof Date || typeof inputDate === \"number\")\n            dates = [self.parseDate(inputDate, format)];\n        else if (typeof inputDate === \"string\") {\n            switch (self.config.mode) {\n                case \"single\":\n                case \"time\":\n                    dates = [self.parseDate(inputDate, format)];\n                    break;\n                case \"multiple\":\n                    dates = inputDate\n                        .split(self.config.conjunction)\n                        .map((date) => self.parseDate(date, format));\n                    break;\n                case \"range\":\n                    dates = inputDate\n                        .split(self.l10n.rangeSeparator)\n                        .map((date) => self.parseDate(date, format));\n                    break;\n                default:\n                    break;\n            }\n        }\n        else\n            self.config.errorHandler(new Error(`Invalid date supplied: ${JSON.stringify(inputDate)}`));\n        self.selectedDates = (self.config.allowInvalidPreload\n            ? dates\n            : dates.filter((d) => d instanceof Date && isEnabled(d, false)));\n        if (self.config.mode === \"range\")\n            self.selectedDates.sort((a, b) => a.getTime() - b.getTime());\n    }\n    function setDate(date, triggerChange = false, format = self.config.dateFormat) {\n        if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))\n            return self.clear(triggerChange);\n        setSelectedDate(date, format);\n        self.latestSelectedDateObj =\n            self.selectedDates[self.selectedDates.length - 1];\n        self.redraw();\n        jumpToDate(undefined, triggerChange);\n        setHoursFromDate();\n        if (self.selectedDates.length === 0) {\n            self.clear(false);\n        }\n        updateValue(triggerChange);\n        if (triggerChange)\n            triggerEvent(\"onChange\");\n    }\n    function parseDateRules(arr) {\n        return arr\n            .slice()\n            .map((rule) => {\n            if (typeof rule === \"string\" ||\n                typeof rule === \"number\" ||\n                rule instanceof Date) {\n                return self.parseDate(rule, undefined, true);\n            }\n            else if (rule &&\n                typeof rule === \"object\" &&\n                rule.from &&\n                rule.to)\n                return {\n                    from: self.parseDate(rule.from, undefined),\n                    to: self.parseDate(rule.to, undefined),\n                };\n            return rule;\n        })\n            .filter((x) => x);\n    }\n    function setupDates() {\n        self.selectedDates = [];\n        self.now = self.parseDate(self.config.now) || new Date();\n        const preloadedDate = self.config.defaultDate ||\n            ((self.input.nodeName === \"INPUT\" ||\n                self.input.nodeName === \"TEXTAREA\") &&\n                self.input.placeholder &&\n                self.input.value === self.input.placeholder\n                ? null\n                : self.input.value);\n        if (preloadedDate)\n            setSelectedDate(preloadedDate, self.config.dateFormat);\n        self._initialDate =\n            self.selectedDates.length > 0\n                ? self.selectedDates[0]\n                : self.config.minDate &&\n                    self.config.minDate.getTime() > self.now.getTime()\n                    ? self.config.minDate\n                    : self.config.maxDate &&\n                        self.config.maxDate.getTime() < self.now.getTime()\n                        ? self.config.maxDate\n                        : self.now;\n        self.currentYear = self._initialDate.getFullYear();\n        self.currentMonth = self._initialDate.getMonth();\n        if (self.selectedDates.length > 0)\n            self.latestSelectedDateObj = self.selectedDates[0];\n        if (self.config.minTime !== undefined)\n            self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n        if (self.config.maxTime !== undefined)\n            self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n        self.minDateHasTime =\n            !!self.config.minDate &&\n                (self.config.minDate.getHours() > 0 ||\n                    self.config.minDate.getMinutes() > 0 ||\n                    self.config.minDate.getSeconds() > 0);\n        self.maxDateHasTime =\n            !!self.config.maxDate &&\n                (self.config.maxDate.getHours() > 0 ||\n                    self.config.maxDate.getMinutes() > 0 ||\n                    self.config.maxDate.getSeconds() > 0);\n    }\n    function setupInputs() {\n        self.input = getInputElem();\n        if (!self.input) {\n            self.config.errorHandler(new Error(\"Invalid input element specified\"));\n            return;\n        }\n        self.input._type = self.input.type;\n        self.input.type = \"text\";\n        self.input.classList.add(\"flatpickr-input\");\n        self._input = self.input;\n        if (self.config.altInput) {\n            self.altInput = createElement(self.input.nodeName, self.config.altInputClass);\n            self._input = self.altInput;\n            self.altInput.placeholder = self.input.placeholder;\n            self.altInput.disabled = self.input.disabled;\n            self.altInput.required = self.input.required;\n            self.altInput.tabIndex = self.input.tabIndex;\n            self.altInput.type = \"text\";\n            self.input.setAttribute(\"type\", \"hidden\");\n            if (!self.config.static && self.input.parentNode)\n                self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n        }\n        if (!self.config.allowInput)\n            self._input.setAttribute(\"readonly\", \"readonly\");\n        self._positionElement = self.config.positionElement || self._input;\n    }\n    function setupMobile() {\n        const inputType = self.config.enableTime\n            ? self.config.noCalendar\n                ? \"time\"\n                : \"datetime-local\"\n            : \"date\";\n        self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n        self.mobileInput.tabIndex = 1;\n        self.mobileInput.type = inputType;\n        self.mobileInput.disabled = self.input.disabled;\n        self.mobileInput.required = self.input.required;\n        self.mobileInput.placeholder = self.input.placeholder;\n        self.mobileFormatStr =\n            inputType === \"datetime-local\"\n                ? \"Y-m-d\\\\TH:i:S\"\n                : inputType === \"date\"\n                    ? \"Y-m-d\"\n                    : \"H:i:S\";\n        if (self.selectedDates.length > 0) {\n            self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n        }\n        if (self.config.minDate)\n            self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n        if (self.config.maxDate)\n            self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n        if (self.input.getAttribute(\"step\"))\n            self.mobileInput.step = String(self.input.getAttribute(\"step\"));\n        self.input.type = \"hidden\";\n        if (self.altInput !== undefined)\n            self.altInput.type = \"hidden\";\n        try {\n            if (self.input.parentNode)\n                self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n        }\n        catch (_a) { }\n        bind(self.mobileInput, \"change\", (e) => {\n            self.setDate(getEventTarget(e).value, false, self.mobileFormatStr);\n            triggerEvent(\"onChange\");\n            triggerEvent(\"onClose\");\n        });\n    }\n    function toggle(e) {\n        if (self.isOpen === true)\n            return self.close();\n        self.open(e);\n    }\n    function triggerEvent(event, data) {\n        if (self.config === undefined)\n            return;\n        const hooks = self.config[event];\n        if (hooks !== undefined && hooks.length > 0) {\n            for (let i = 0; hooks[i] && i < hooks.length; i++)\n                hooks[i](self.selectedDates, self.input.value, self, data);\n        }\n        if (event === \"onChange\") {\n            self.input.dispatchEvent(createEvent(\"change\"));\n            self.input.dispatchEvent(createEvent(\"input\"));\n        }\n    }\n    function createEvent(name) {\n        const e = document.createEvent(\"Event\");\n        e.initEvent(name, true, true);\n        return e;\n    }\n    function isDateSelected(date) {\n        for (let i = 0; i < self.selectedDates.length; i++) {\n            if (compareDates(self.selectedDates[i], date) === 0)\n                return \"\" + i;\n        }\n        return false;\n    }\n    function isDateInRange(date) {\n        if (self.config.mode !== \"range\" || self.selectedDates.length < 2)\n            return false;\n        return (compareDates(date, self.selectedDates[0]) >= 0 &&\n            compareDates(date, self.selectedDates[1]) <= 0);\n    }\n    function updateNavigationCurrentMonth() {\n        if (self.config.noCalendar || self.isMobile || !self.monthNav)\n            return;\n        self.yearElements.forEach((yearElement, i) => {\n            const d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            if (self.config.showMonths > 1 ||\n                self.config.monthSelectorType === \"static\") {\n                self.monthElements[i].textContent =\n                    monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n            }\n            else {\n                self.monthsDropdownContainer.value = d.getMonth().toString();\n            }\n            yearElement.value = d.getFullYear().toString();\n        });\n        self._hidePrevMonthArrow =\n            self.config.minDate !== undefined &&\n                (self.currentYear === self.config.minDate.getFullYear()\n                    ? self.currentMonth <= self.config.minDate.getMonth()\n                    : self.currentYear < self.config.minDate.getFullYear());\n        self._hideNextMonthArrow =\n            self.config.maxDate !== undefined &&\n                (self.currentYear === self.config.maxDate.getFullYear()\n                    ? self.currentMonth + 1 > self.config.maxDate.getMonth()\n                    : self.currentYear > self.config.maxDate.getFullYear());\n    }\n    function getDateStr(format) {\n        return self.selectedDates\n            .map((dObj) => self.formatDate(dObj, format))\n            .filter((d, i, arr) => self.config.mode !== \"range\" ||\n            self.config.enableTime ||\n            arr.indexOf(d) === i)\n            .join(self.config.mode !== \"range\"\n            ? self.config.conjunction\n            : self.l10n.rangeSeparator);\n    }\n    function updateValue(triggerChange = true) {\n        if (self.mobileInput !== undefined && self.mobileFormatStr) {\n            self.mobileInput.value =\n                self.latestSelectedDateObj !== undefined\n                    ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)\n                    : \"\";\n        }\n        self.input.value = getDateStr(self.config.dateFormat);\n        if (self.altInput !== undefined) {\n            self.altInput.value = getDateStr(self.config.altFormat);\n        }\n        if (triggerChange !== false)\n            triggerEvent(\"onValueUpdate\");\n    }\n    function onMonthNavClick(e) {\n        const eventTarget = getEventTarget(e);\n        const isPrevMonth = self.prevMonthNav.contains(eventTarget);\n        const isNextMonth = self.nextMonthNav.contains(eventTarget);\n        if (isPrevMonth || isNextMonth) {\n            changeMonth(isPrevMonth ? -1 : 1);\n        }\n        else if (self.yearElements.indexOf(eventTarget) >= 0) {\n            eventTarget.select();\n        }\n        else if (eventTarget.classList.contains(\"arrowUp\")) {\n            self.changeYear(self.currentYear + 1);\n        }\n        else if (eventTarget.classList.contains(\"arrowDown\")) {\n            self.changeYear(self.currentYear - 1);\n        }\n    }\n    function timeWrapper(e) {\n        e.preventDefault();\n        const isKeyDown = e.type === \"keydown\", eventTarget = getEventTarget(e), input = eventTarget;\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            self.amPM.textContent =\n                self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n        }\n        const min = parseFloat(input.getAttribute(\"min\")), max = parseFloat(input.getAttribute(\"max\")), step = parseFloat(input.getAttribute(\"step\")), curValue = parseInt(input.value, 10), delta = e.delta ||\n            (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);\n        let newValue = curValue + step * delta;\n        if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n            const isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;\n            if (newValue < min) {\n                newValue =\n                    max +\n                        newValue +\n                        int(!isHourElem) +\n                        (int(isHourElem) && int(!self.amPM));\n                if (isMinuteElem)\n                    incrementNumInput(undefined, -1, self.hourElement);\n            }\n            else if (newValue > max) {\n                newValue =\n                    input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n                if (isMinuteElem)\n                    incrementNumInput(undefined, 1, self.hourElement);\n            }\n            if (self.amPM &&\n                isHourElem &&\n                (step === 1\n                    ? newValue + curValue === 23\n                    : Math.abs(newValue - curValue) > step)) {\n                self.amPM.textContent =\n                    self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n            }\n            input.value = pad(newValue);\n        }\n    }\n    init();\n    return self;\n}\nfunction _flatpickr(nodeList, config) {\n    const nodes = Array.prototype.slice\n        .call(nodeList)\n        .filter((x) => x instanceof HTMLElement);\n    const instances = [];\n    for (let i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n        try {\n            if (node.getAttribute(\"data-fp-omit\") !== null)\n                continue;\n            if (node._flatpickr !== undefined) {\n                node._flatpickr.destroy();\n                node._flatpickr = undefined;\n            }\n            node._flatpickr = FlatpickrInstance(node, config || {});\n            instances.push(node._flatpickr);\n        }\n        catch (e) {\n            console.error(e);\n        }\n    }\n    return instances.length === 1 ? instances[0] : instances;\n}\nif (typeof HTMLElement !== \"undefined\" &&\n    typeof HTMLCollection !== \"undefined\" &&\n    typeof NodeList !== \"undefined\") {\n    HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n    HTMLElement.prototype.flatpickr = function (config) {\n        return _flatpickr([this], config);\n    };\n}\nvar flatpickr = function (selector, config) {\n    if (typeof selector === \"string\") {\n        return _flatpickr(window.document.querySelectorAll(selector), config);\n    }\n    else if (selector instanceof Node) {\n        return _flatpickr([selector], config);\n    }\n    else {\n        return _flatpickr(selector, config);\n    }\n};\nflatpickr.defaultConfig = {};\nflatpickr.l10ns = {\n    en: Object.assign({}, English),\n    default: Object.assign({}, English),\n};\nflatpickr.localize = (l10n) => {\n    flatpickr.l10ns.default = Object.assign(Object.assign({}, flatpickr.l10ns.default), l10n);\n};\nflatpickr.setDefaults = (config) => {\n    flatpickr.defaultConfig = Object.assign(Object.assign({}, flatpickr.defaultConfig), config);\n};\nflatpickr.parseDate = createDateParser({});\nflatpickr.formatDate = createDateFormatter({});\nflatpickr.compareDates = compareDates;\nif (typeof jQuery !== \"undefined\" && typeof jQuery.fn !== \"undefined\") {\n    jQuery.fn.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n}\nDate.prototype.fp_incr = function (days) {\n    return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n};\nif (typeof window !== \"undefined\") {\n    window.flatpickr = flatpickr;\n}\nexport default flatpickr;\n", "import menuButton from './menuButton';\r\nimport formula from '../global/formula';\r\nimport Store from '../store';\r\nimport flatpickr from 'flatpickr'\r\nimport dayjs from \"dayjs\";\r\nimport { update, datenum_local } from '../global/format';\r\nimport { setCellValue, setCellFormat } from '../global/api';\r\n\r\nconst fitFormat = (formatStr) => {\r\n    let dateFormat = formatStr.replace(/y/g, 'Y');\r\n    dateFormat = dateFormat.replace(/d/g, 'D');\r\n    dateFormat = dateFormat.replace(/h/g, 'H');\r\n\r\n    dateFormat = dateFormat.replace(/\u4E0A\u5348\\/\u4E0B\u5348/g, 'A');\r\n    dateFormat = dateFormat.replace(/\u4E0A\u5348/g, 'A');\r\n    dateFormat = dateFormat.replace(/\u4E0B\u5348/g, 'A');\r\n\r\n    dateFormat = dateFormat.replace(/AM\\/PM/g, 'A');\r\n    dateFormat = dateFormat.replace(/AM/g, 'A');\r\n    dateFormat = dateFormat.replace(/PM/g, 'A');\r\n    dateFormat = dateFormat.replace(/\\\"/g, '');\r\n\r\n    if (dateFormat.includes('A')) {\r\n        dateFormat = dateFormat.replace(/H/g, 'h');\r\n    }\r\n    return dateFormat\r\n}\r\n\r\nconst cellDatePickerCtrl = {\r\n    cellFocus: function (r, c, cell) {\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        let type = cell.ct.fa || 'YYYY-MM-DD';\r\n        let defaultDate = update('yyyy-MM-dd hh:mm:ss', cell.v);\r\n        let dateFormat = fitFormat(type);\r\n        let enableTime = false;\r\n        let noCalendar = false;\r\n        let enableSeconds = false;\r\n        let time_24hr = true;\r\n        let hasChineseTime = false;\r\n\r\n\r\n        if (!!margeset) {\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n\r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        $(\".cell-date-picker\").show().css({\r\n            width: col - col_pre + 1,\r\n            height: row - row_pre + 1,\r\n            left: col_pre,\r\n            top: row_pre\r\n        })\r\n\r\n        if (/[\u4E0A\u5348\u4E0B\u5348]/.test(type)) {\r\n            hasChineseTime = true\r\n        }\r\n        if (/[Hhms]/.test(dateFormat)) {\r\n            enableTime = true;\r\n        }\r\n        if (!/[YMD]/.test(dateFormat)) {\r\n            noCalendar = true;\r\n        }\r\n        if (/s/.test(dateFormat)) {\r\n            enableSeconds = true;\r\n        }\r\n        if (/A/.test(dateFormat)) {\r\n            time_24hr = false;\r\n        }\r\n\r\n        const fp = flatpickr('#luckysheet-input-box', {\r\n            allowInput: false,\r\n            noCalendar,\r\n            enableSeconds,\r\n            enableTime,\r\n            dateFormat,\r\n            time_24hr,\r\n            defaultDate,\r\n            onClose() {\r\n                setTimeout(() => {\r\n                    fp.destroy()\r\n                }, 0);\r\n            },\r\n            parseDate: (datestr, format) => {\r\n                return dayjs(datestr).toDate();\r\n            },\r\n            formatDate: (date, format, locale) => {\r\n                if (hasChineseTime) {\r\n                    return dayjs(date).format(format).replace('AM', '\u4E0A\u5348').replace('PM', '\u4E0B\u5348')\r\n                }\r\n                return dayjs(date).format(format);\r\n            },\r\n            onChange: function (selectedDates, dateStr) {\r\n                let currentVal = datenum_local(new Date(selectedDates))\r\n                $(\"#luckysheet-rich-text-editor\").html(dateStr);\r\n                setCellValue(r, c, currentVal, { isRefresh: false })\r\n                setCellFormat(r, c, 'ct', cell.ct)\r\n                if (!enableTime) {\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                }\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheet-input-box\").click();\r\n    },\r\n}\r\n\r\nexport default cellDatePickerCtrl;\r\n", "import pivotTable from './pivotTable';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport alternateformat from './alternateformat';\r\nimport cellDatePickerCtrl from './cellDatePickerCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport {checkProtectionLocked,checkProtectionCellHidden}  from './protection';\r\nimport { chatatABC } from '../utils/util';\r\nimport { isEditMode } from '../global/validate';\r\nimport { getcellvalue,getInlineStringStyle } from '../global/getdata';\r\nimport { valueShowEs } from '../global/format';\r\nimport formula from '../global/formula';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport {isInlineStringCell} from './inlineString';\r\nimport Store from '../store';\r\nimport server from './server';\r\nimport method from '../global/method';\r\n\r\nexport function luckysheetupdateCell(row_index1, col_index1, d, cover, isnotfocus) {\r\n    if(!checkProtectionLocked(row_index1, col_index1, Store.currentSheetIndex)){\r\n        $(\"#luckysheet-functionbox-cell\").blur();\r\n        return;\r\n    }\r\n\r\n    if(isEditMode() || Store.allowEdit===false){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u5355\u5143\u683C\u7F16\u8F91\r\n        return;\r\n    }\r\n\r\n    // \u94A9\u5B50\u51FD\u6570\r\n    if(!method.createHookFunction('cellEditBefore',Store.luckysheet_select_save)){return;}\r\n\r\n    // \u7F16\u8F91\u5355\u5143\u683C\u65F6\u53D1\u9001\u6307\u4EE4\u5230\u540E\u53F0\uFF0C\u901A\u77E5\u5176\u4ED6\u5355\u5143\u683C\u66F4\u65B0\u4E3A\u201C\u6B63\u5728\u8F93\u5165\u201D\u72B6\u6001\r\n    server.saveParam(\"mv\", Store.currentSheetIndex,  {op:\"enterEdit\",range:Store.luckysheet_select_save});\r\n\r\n    //\u6570\u636E\u9A8C\u8BC1\r\n    if(dataVerificationCtrl.dataVerification != null && dataVerificationCtrl.dataVerification[row_index1 + '_' + col_index1] != null){\r\n        let dataVerificationItem = dataVerificationCtrl.dataVerification[row_index1 + '_' + col_index1];\r\n        if(dataVerificationItem.type == 'dropdown'){\r\n            dataVerificationCtrl.dropdownListShow();\r\n        }\r\n        else if(dataVerificationItem.type == 'checkbox'){\r\n            return;\r\n        }\r\n    }\r\n\r\n    let size = getColumnAndRowSize(row_index1, col_index1, d);\r\n    let row = size.row, \r\n        row_pre = size.row_pre, \r\n        col = size.col, \r\n        col_pre = size.col_pre, \r\n        row_index = size.row_index, \r\n        col_index = size.col_index;\r\n\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n    }\r\n\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    if (pivotTable.isPivotRange(row_index, col_index)) {\r\n        return;\r\n    }\r\n\r\n    let left = col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2;\r\n    if(luckysheetFreezen.freezenverticaldata != null && col_index1 <= luckysheetFreezen.freezenverticaldata[1]){\r\n        left = col_pre + container_offset.left + Store.rowHeaderWidth - 2;\r\n    }\r\n\r\n    let top = row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2;\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && row_index1 <= luckysheetFreezen.freezenhorizontaldata[1]){\r\n        top = row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - 2;\r\n    }\r\n\r\n    let input_postition = {\r\n        \"min-width\": col - col_pre+ 1- 8, \r\n        \"min-height\": row - row_pre + 1- 4,  \r\n        \r\n        \"max-width\": winW + scrollLeft - col_pre - 20 - Store.rowHeaderWidth, \r\n        \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n        \"left\": left, \r\n        \"top\": top, \r\n    }\r\n\r\n    let inputContentScale = {\r\n        \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n        \"transform-origin\":\"left top\",\r\n        \"width\":(100 / Store.zoomRatio) + \"%\",\r\n        \"height\":(100 / Store.zoomRatio) + \"%\",\r\n    }\r\n\r\n    Store.luckysheetCellUpdate = [row_index, col_index];\r\n    if (!isnotfocus) {\r\n        $(\"#luckysheet-rich-text-editor\").focus().select();\r\n    }\r\n\r\n    $(\"#luckysheet-input-box\").removeAttr(\"style\").css({ \r\n        \"background-color\": \"rgb(255, 255, 255)\", \r\n        \"padding\": \"0px 2px\", \r\n        \"font-size\": \"13px\", \r\n        \"right\": \"auto\", \r\n        \"overflow-y\": \"auto\",\r\n        \"box-sizing\": \"initial\",\r\n        \"display\":\"flex\",\r\n    });\r\n\r\n    if(luckysheetFreezen.freezenverticaldata != null || luckysheetFreezen.freezenhorizontaldata != null){\r\n        $(\"#luckysheet-input-box\").css(\"z-index\", 10002);\r\n    }\r\n    \r\n    $(\"#luckysheet-input-box-index\").html(chatatABC(col_index) + (row_index + 1)).hide();\r\n    $(\"#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm\").addClass(\"luckysheet-wa-calculate-active\");\r\n    \r\n    let value = \"\", isCenter=false;\r\n    \r\n    if (d[row_index] != null && d[row_index][col_index] != null) {\r\n        let cell = d[row_index][col_index];\r\n        let htValue = cell[\"ht\"];\r\n        let leftOrigin = \"left\", topOrigin = \"top\";\r\n        if(htValue == \"0\"){//0 center, 1 left, 2 right\r\n            input_postition = { \r\n                \"min-width\": col - col_pre + 1- 8, \r\n                \"min-height\": row - row_pre + 1- 4, \r\n                // \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n                // \"transform-origin\":\"center top\",\r\n                \"max-width\": winW*2/3, \r\n                \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n                \"left\": col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2, \r\n                \"top\":  row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2, \r\n            }\r\n\r\n            if(Store.zoomRatio<1){\r\n                leftOrigin = \"center\";\r\n            }\r\n\r\n            isCenter = true;\r\n        }\r\n        else if(htValue == \"2\"){\r\n            input_postition = { \r\n                \"min-width\": col - col_pre+ 1- 8, \r\n                \"min-height\": row - row_pre + 1- 4, \r\n                // \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n                // \"transform-origin\":\"right top\",\r\n                \"max-width\": col + container_offset.left - scrollLeft  - 8, \r\n                \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n                \"right\": winW - (container_offset.left + (Store.rowHeaderWidth-1) - scrollLeft) - col, \r\n                \"top\":  row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2, \r\n            }\r\n\r\n            if(Store.zoomRatio<1){\r\n                leftOrigin = \"right\";\r\n            }\r\n        }\r\n\r\n        if(cell[\"vt\"]==\"0\"){\r\n            topOrigin = \"center\";\r\n        }\r\n        else if(cell[\"vt\"]==\"2\"){\r\n            topOrigin = \"bottom\";\r\n        }\r\n\r\n        inputContentScale[\"transform-origin\"] = leftOrigin +\" \" + topOrigin;\r\n\r\n        \r\n        if (!cover) {\r\n            if(isInlineStringCell(cell)){\r\n                value = getInlineStringStyle(row_index, col_index, d);\r\n            }\r\n            else if(cell.f!=null){\r\n                value = getcellvalue(row_index, col_index, d, \"f\");\r\n            }\r\n            else{\r\n                value = valueShowEs(row_index, col_index, d);\r\n                if(cell.qp==\"1\"){\r\n                    value = value ? (\"\" + value) : value;\r\n                }\r\n            }\r\n        }\r\n        \r\n        let style = menuButton.getStyleByCell(d, row_index, col_index);\r\n        style = $(\"#luckysheet-input-box\").get(0).style.cssText + style;\r\n\r\n        $(\"#luckysheet-input-box\").get(0).style.cssText = style;\r\n        if($(\"#luckysheet-input-box\").get(0).style.backgroundColor == \"rgba(0, 0, 0, 0)\"){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = \"rgb(255,255,255)\";\r\n        }\r\n    }\r\n    else{\r\n        //\u4EA4\u66FF\u989C\u8272\r\n        let af_compute = alternateformat.getComputeMap();\r\n        var checksAF = alternateformat.checksAF(row_index, col_index, af_compute);\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F\r\n        var cf_compute = conditionformat.getComputeMap();\r\n        var checksCF = conditionformat.checksCF(row_index, col_index, cf_compute);\r\n\r\n        if(checksCF != null && checksCF[\"cellColor\"] != null){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = checksCF[\"cellColor\"];\r\n        }\r\n        else if(checksAF != null){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = checksAF[1];\r\n        }\r\n    }\r\n\r\n    if(input_postition[\"min-height\"] > input_postition[\"max-height\"]){\r\n        input_postition[\"min-height\"] = input_postition[\"max-height\"];\r\n    }\r\n\r\n    if(input_postition[\"min-width\"] > input_postition[\"max-width\"]){\r\n        input_postition[\"min-width\"] = input_postition[\"max-width\"];\r\n    }\r\n   \r\n    // if((value == null || value.toString() == \"\") && !cover){\r\n    //     value = \"<br/>\";\r\n    // }\r\n    value = formula.xssDeal(value);\r\n    if(!checkProtectionCellHidden(row_index, col_index, Store.currentSheetIndex) && value.length>0 && value.substr(0, 63)=='<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>'){\r\n        $(\"#luckysheet-rich-text-editor\").html(\"\");\r\n    }\r\n    else{\r\n        $(\"#luckysheet-rich-text-editor\").html(value);\r\n        if (!isnotfocus) {\r\n            luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n        }\r\n    }\r\n\r\n    if(isCenter){\r\n        let width = $(\"#luckysheet-input-box\").width();\r\n        if(width> input_postition[\"max-width\"]){\r\n            width = input_postition[\"max-width\"];\r\n        }\r\n\r\n        if(width< input_postition[\"min-width\"]){\r\n            width = input_postition[\"min-width\"];\r\n        }\r\n\r\n        let newLeft = input_postition[\"left\"] - width/2 + (col - col_pre)/2;\r\n        if(newLeft<2){\r\n            newLeft = 2;\r\n        }\r\n\r\n        input_postition[\"left\"] = newLeft-2;\r\n    }\r\n\r\n    $(\"#luckysheet-input-box\").css(input_postition);\r\n    $(\"#luckysheet-rich-text-editor\").css(inputContentScale);\r\n\r\n    //\u65E5\u671F\r\n    if(d[row_index1][col_index1] && d[row_index1][col_index1].ct && d[row_index1][col_index1].ct.t == 'd'){\r\n        cellDatePickerCtrl.cellFocus(row_index1, col_index1, d[row_index1][col_index1]);\r\n    }\r\n\r\n    formula.rangetosheet = Store.currentSheetIndex;\r\n    formula.createRangeHightlight();\r\n    formula.rangeResizeTo = $(\"#luckysheet-rich-text-editor\");\r\n    cleargridelement();\r\n}\r\n\r\nexport function setCenterInputPosition(row_index, col_index, d){\r\n    if(row_index==null ||col_index==null){\r\n        return;\r\n    }\r\n    let cell = d[row_index][col_index];\r\n    if(cell==null){\r\n        return;\r\n    }\r\n    let htValue = cell[\"ht\"];\r\n    if(cell!=null && htValue != \"0\"){//0 center, 1 left, 2 right\r\n        return;\r\n    }\r\n\r\n    let size = getColumnAndRowSize(row_index, col_index, d);\r\n    let row = size.row, row_pre = size.row_pre, col = size.col, col_pre = size.col_pre;\r\n\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    let input_postition = { \r\n        \"min-width\": col - col_pre + 1 - 8, \r\n        \"max-width\": winW*2/3, \r\n        \"left\": col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2, \r\n    }\r\n\r\n    let width = $(\"#luckysheet-input-box\").width();\r\n    if(width> input_postition[\"max-width\"]){\r\n        width = input_postition[\"max-width\"];\r\n    }\r\n\r\n    if(width< input_postition[\"min-width\"]){\r\n        width = input_postition[\"min-width\"];\r\n    }\r\n\r\n    let newLeft = input_postition[\"left\"] - width/2 + (col - col_pre)/2;\r\n    if(newLeft<2){\r\n        newLeft = 2;\r\n    }\r\n\r\n    input_postition[\"left\"] = newLeft-2;\r\n\r\n    $(\"#luckysheet-input-box\").css(input_postition);\r\n}\r\n\r\nexport function getColumnAndRowSize(row_index, col_index, d){\r\n    let row = Store.visibledatarow[row_index], \r\n        row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n    let col = Store.visibledatacolumn[col_index], \r\n        col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n    if(d == null){\r\n        d = Store.flowdata;\r\n    }\r\n\r\n    let margeset = menuButton.mergeborer(d, row_index, col_index);\r\n    if(!!margeset){\r\n        row = margeset.row[1];\r\n        row_pre = margeset.row[0];\r\n        row_index = margeset.row[2];\r\n        col = margeset.column[1];\r\n        col_pre = margeset.column[0];\r\n        col_index = margeset.column[2];\r\n    }    \r\n\r\n    return {\r\n        row: row,\r\n        row_pre: row_pre,\r\n        row_index: row_index,\r\n        col: col,\r\n        col_pre: col_pre,\r\n        col_index: col_index\r\n    }\r\n}\r\n", "import Store from \"../store\";\r\nimport { replaceHtml, getObjType, chatatABC, luckysheetactiveCell } from \"../utils/util\";\r\nimport { getSheetIndex, getluckysheet_select_save, getluckysheetfile } from \"../methods/get\";\r\nimport locale from \"../locale/locale\";\r\nimport method from './method';\r\nimport formula from './formula';\r\nimport func_methods from \"./func_methods\";\r\nimport tooltip from \"./tooltip\";\r\nimport json from \"./json\";\r\nimport editor from \"./editor\";\r\nimport luckysheetformula from './formula';\r\nimport cleargridelement from './cleargridelement';\r\nimport { genarate, update } from './format';\r\nimport { setAccuracy,setcellvalue } from \"./setdata\";\r\nimport { orderbydata } from \"./sort\";\r\nimport { rowlenByRange } from \"./getRowlen\";\r\nimport { getdatabyselection, getcellvalue } from \"./getdata\";\r\nimport { luckysheetrefreshgrid, jfrefreshgrid, jfrefreshgrid_rhcw } from \"./refresh\";\r\nimport { luckysheetDeleteCell, luckysheetextendtable, luckysheetdeletetable } from \"./extend\";\r\nimport { isRealNull, valueIsError, isRealNum, isEditMode, hasPartMC } from \"./validate\";\r\nimport { isdatetime, diff } from \"./datecontroll\";\r\nimport { getBorderInfoCompute } from './border';\r\nimport { luckysheetDrawMain } from './draw';\r\nimport pivotTable from '../controllers/pivotTable';\r\nimport server from \"../controllers/server\";\r\nimport menuButton from '../controllers/menuButton';\r\nimport selection from \"../controllers/selection\";\r\nimport luckysheetConfigsetting from \"../controllers/luckysheetConfigsetting\";\r\nimport luckysheetFreezen from \"../controllers/freezen\";\r\nimport luckysheetsizeauto from '../controllers/resize';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport conditionformat from '../controllers/conditionformat';\r\nimport { luckysheet_searcharray } from \"../controllers/sheetSearch\";\r\nimport { selectHightlightShow, selectIsOverlap } from '../controllers/select';\r\nimport { sheetHTML, luckysheetdefaultstyle } from '../controllers/constant';\r\nimport { createFilterOptions } from '../controllers/filter';\r\nimport controlHistory from '../controllers/controlHistory';\r\nimport { zoomRefreshView, zoomNumberDomBind } from '../controllers/zoom';\r\nimport dataVerificationCtrl from \"../controllers/dataVerificationCtrl\";\r\nimport imageCtrl from '../controllers/imageCtrl';\r\nimport dayjs from \"dayjs\";\r\nimport {getRangetxt } from '../methods/get';\r\nimport {luckysheetupdateCell} from '../controllers/updateCell';\r\nconst IDCardReg = /^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i;\r\n\r\n/**\r\n * \u83B7\u53D6\u5355\u5143\u683C\u7684\u503C\r\n * @param {Number} row \u5355\u5143\u683C\u6240\u5728\u884C\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u884C\r\n * @param {Number} column \u5355\u5143\u683C\u6240\u5728\u5217\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {String} options.type \u5355\u5143\u683C\u7684\u503C\u7C7B\u578B\uFF0C\u53EF\u4EE5\u8BBE\u7F6E\u4E3A\u539F\u59CB\u503C\"v\"\u6216\u8005\u663E\u793A\u503C\"m\"\uFF1B\u9ED8\u8BA4\u503C\u4E3A'v',\u8868\u793A\u83B7\u53D6\u5355\u5143\u683C\u7684\u5B9E\u9645\u503C\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getCellValue(row, column, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row or column cannot be null or undefined.', '')\r\n    }\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        type = 'v',\r\n        order = curSheetOrder\r\n    } = { ...options };\r\n    let targetSheetData = Store.luckysheetfile[order].data;\r\n    let cellData = targetSheetData[row][column];\r\n    let return_v;\r\n\r\n    if(getObjType(cellData) == \"object\"){\r\n        return_v = cellData[type];\r\n\r\n        if (type == \"f\" && return_v != null) {\r\n            return_v = formula.functionHTMLGenerate(return_v);\r\n        }\r\n        else if(type == \"f\") {\r\n            return_v = cellData[\"v\"];\r\n        }\r\n        else if(cellData && cellData.ct && cellData.ct.fa == 'yyyy-MM-dd') {\r\n            return_v = cellData.m;\r\n        }\r\n    }\r\n\r\n    if(return_v == undefined){\r\n        return_v = null;\r\n    }\r\n\r\n    return return_v;\r\n}\r\n\r\n/**\r\n * \u8BBE\u7F6E\u5355\u5143\u683C\u7684\u503C\r\n *\r\n * \u5173\u952E\u70B9\uFF1A\u5982\u679C\u8BBE\u7F6E\u4E86\u516C\u5F0F\uFF0C\u5219\u9700\u8981\u66F4\u65B0\u516C\u5F0F\u94FEinsertUpdateFunctionGroup\uFF0C\u5982\u679C\u8BBE\u7F6E\u4E86\u4E0D\u662F\u516C\u5F0F\uFF0C\u5224\u65AD\u4E4B\u524D\u662F\u516C\u5F0F\uFF0C\u5219\u9700\u8981\u6E05\u9664\u516C\u5F0FdelFunctionGroup\r\n *\r\n * @param {Number} row \u5355\u5143\u683C\u6240\u5728\u884C\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u884C\r\n * @param {Number} column \u5355\u5143\u683C\u6240\u5728\u5217\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u5217\r\n * @param {Object | String | Number} value \u8981\u8BBE\u7F6E\u7684\u503C\uFF1B\u53EF\u4EE5\u4E3A\u5B57\u7B26\u4E32\u6216\u6570\u5B57\uFF0C\u6216\u4E3A\u7B26\u5408Luckysheet\u5355\u5143\u683C\u683C\u5F0F\u7684\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Boolean} options.isRefresh \u662F\u5426\u5237\u65B0\u754C\u9762\uFF1B\u9ED8\u8BA4\u4E3A`true`\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setCellValue(row, column, value, options = {}) {\r\n\r\n    let curv = Store.flowdata[row][column];\r\n\r\n    // Store old value for hook function\r\n    const oldValue = JSON.stringify(curv);\r\n\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('The row or column parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        isRefresh = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    /* cell\u66F4\u65B0\u524D\u89E6\u53D1  */\r\n    if (!method.createHookFunction(\"cellUpdateBefore\", row, column, value, isRefresh)) {\r\n        /* \u5982\u679CcellUpdateBefore\u51FD\u6570\u8FD4\u56DEfalse \u5219\u4E0D\u6267\u884C\u540E\u7EED\u7684\u66F4\u65B0 */\r\n        return;\r\n    }\r\n\r\n    let data = file.data;\r\n    if(isRefresh) {\r\n      data = $.extend(true, [], file.data);\r\n    }\r\n    if(data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    // luckysheetformula.updatecell(row, column, value);\r\n    let formatList = {\r\n        //ct:1, //celltype,Cell value format: text, time, etc.\r\n        bg: 1,//background,#fff000\r\n        ff: 1,//fontfamily,\r\n        fc: 1,//fontcolor\r\n        bl: 1,//Bold\r\n        it: 1,//italic\r\n        fs: 1,//font size\r\n        cl: 1,//Cancelline, 0 Regular, 1 Cancelline\r\n        un: 1,//underline, 0 Regular, 1 underlines, fonts\r\n        vt: 1,//Vertical alignment, 0 middle, 1 up, 2 down\r\n        ht: 1,//Horizontal alignment,0 center, 1 left, 2 right\r\n        mc: 1, //Merge Cells\r\n        tr: 1, //Text rotation,0: 0\u30011: 45 \u30012: -45\u30013 Vertical text\u30014: 90 \u30015: -90\r\n        tb: 1, //Text wrap,0 truncation, 1 overflow, 2 word wrap\r\n        //v: 1, //Original value\r\n        //m: 1, //Display value\r\n        rt:1, //text rotation angle 0-180 alignment\r\n        //f: 1, //formula\r\n        qp:1 //quotePrefix, show number as string\r\n    }\r\n\r\n    if(value == null || value.toString().length == 0){\r\n        formula.delFunctionGroup(row, column);\r\n        setcellvalue(row, column, data, value);\r\n    }\r\n    else if(value instanceof Object){\r\n        let curv = {};\r\n        if(isRealNull(data[row][column])){\r\n            data[row][column] = {};\r\n        }\r\n        let cell = data[row][column];\r\n        if(value.f!=null && value.v==null){\r\n            curv.f = value.f;\r\n            if(value.ct!=null){\r\n                curv.ct = value.ct;\r\n            }\r\n            data = luckysheetformula.updatecell(row, column, curv, false).data;//update formula value\r\n        }\r\n        else{\r\n            if(value.ct!=null){\r\n                curv.ct = value.ct;\r\n            }\r\n            if(value.f!=null){\r\n                curv.f = value.f;\r\n            }\r\n            if(value.v!=null){\r\n                curv.v = value.v;\r\n            }\r\n            else {\r\n                curv.v = cell.v;\r\n            }\r\n            if(value.m!=null){\r\n                curv.m = value.m;\r\n            }\r\n            formula.delFunctionGroup(row, column);\r\n            setcellvalue(row, column, data, curv);//update text value\r\n        }\r\n        for(let attr in value){\r\n            let v = value[attr];\r\n            if(attr in formatList){\r\n                menuButton.updateFormatCell(data, attr, v, row, row, column, column);//change range format\r\n            }\r\n            else {\r\n                cell[attr] = v;\r\n            }\r\n        }\r\n        data[row][column] = cell;\r\n    }\r\n    else{\r\n        if(value.toString().substr(0,1)==\"=\" || value.toString().substr(0,5)==\"<span\"){\r\n            data = luckysheetformula.updatecell(row, column, value, false).data;//update formula value or convert inline string html to object\r\n        }\r\n        else{\r\n            formula.delFunctionGroup(row, column);\r\n            setcellvalue(row, column, data, value);\r\n        }\r\n    }\r\n\r\n    /* cell\u66F4\u65B0\u540E\u89E6\u53D1  */\r\n    setTimeout(() => {\r\n        // Hook function\r\n        method.createHookFunction(\"cellUpdated\", row, column, JSON.parse(oldValue), Store.flowdata[row][column], isRefresh);\r\n    }, 0);\r\n\r\n    if(file.index == Store.currentSheetIndex && isRefresh){\r\n        jfrefreshgrid(data, [{ \"row\": [row, row], \"column\": [column, column] }]);//update data, meanwhile refresh canvas and store data to history\r\n    }\r\n    else{\r\n        file.data = data;//only update data\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(data);\r\n    }\r\n}\r\n\r\n/**\r\n * \u6E05\u9664\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u7684\u5185\u5BB9\uFF0C\u8FD4\u56DE\u6E05\u9664\u6389\u7684\u6570\u636E\uFF0C\u4E0D\u540C\u4E8E\u5220\u9664\u5355\u5143\u683C\u7684\u529F\u80FD\uFF0C\u4E0D\u9700\u8981\u8BBE\u5B9A\u5355\u5143\u683C\u79FB\u52A8\u60C5\u51B5\r\n * @param {Number} row \u5355\u5143\u683C\u6240\u5728\u884C\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u884C\r\n * @param {Number} column \u5355\u5143\u683C\u6240\u5728\u5217\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\n export function clearCell(row, column, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row and column cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let targetSheetData = $.extend(true, [], Store.luckysheetfile[order].data);\r\n    let cell = targetSheetData[row][column];\r\n\r\n    if(getObjType(cell) == \"object\"){\r\n        delete cell[\"m\"];\r\n        delete cell[\"v\"];\r\n        if (cell.hasOwnProperty('fc')) {\r\n            delete cell[\"fc\"]\r\n        }\r\n        if (cell.hasOwnProperty('bg')) {\r\n            delete cell[\"bg\"]\r\n        }\r\n        if (cell.hasOwnProperty('link')) {\r\n            delete cell[\"link\"]\r\n        }\r\n        if (cell.hasOwnProperty('codeName')) {\r\n            delete cell[\"codeName\"]\r\n        }\r\n        if (cell.hasOwnProperty('originalData')) {\r\n            delete cell[\"originalData\"]\r\n        }\r\n        if (cell.hasOwnProperty('mc')) {\r\n            delete cell['mc'];\r\n        }\r\n        if(cell[\"f\"] != null){\r\n            delete cell[\"f\"];\r\n            formula.delFunctionGroup(row, column, order);\r\n            delete cell[\"spl\"];\r\n        }\r\n    }\r\n    else{\r\n        cell = null;\r\n    }\r\n\r\n    // \u82E5\u64CD\u4F5C\u4E3A\u5F53\u524Dsheet\u9875\uFF0C\u5219\u5237\u65B0\u5F53\u524Dsheet\u9875\r\n    if (order === curSheetOrder) {\r\n        jfrefreshgrid(targetSheetData, [{\r\n            row: [row, row],\r\n            column: [column, column]\r\n        }])\r\n    }\r\n    else{\r\n        Store.luckysheetfile[order].data = targetSheetData;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(cell)\r\n    }\r\n}\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\uFF0C\u8FD4\u56DE\u5220\u9664\u6389\u7684\u6570\u636E\uFF0C\u540C\u65F6\uFF0C\u6307\u5B9A\u662F\u53F3\u4FA7\u5355\u5143\u683C\u5DE6\u79FB\u8FD8\u662F\u4E0B\u65B9\u5355\u5143\u683C\u4E0A\u79FB\r\n * @param {String} move \u5220\u9664\u540E\uFF0C\u53F3\u4FA7\u8FD8\u662F\u4E0B\u65B9\u7684\u5355\u5143\u683C\u79FB\u52A8\u3002\u53EF\u9009\u503C\u4E3A 'left'\u3001'up'\r\n * @param {Number} row \u5355\u5143\u683C\u6240\u5728\u884C\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u884C\r\n * @param {Number} column \u5355\u5143\u683C\u6240\u5728\u5217\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteCell(move, row, column, options = {}) {\r\n    let moveTypes = ['left', 'up'];\r\n    if (!move || moveTypes.indexOf(move) < 0) {\r\n        return tooltip.info('Arguments move cannot be null or undefined and its value must be \\'left\\' or \\'up\\'', '')\r\n    }\r\n\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row and column cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let moveType = 'move' + move.replace(move[0], move[0].toUpperCase()); // left-moveLeft;  up-moveUp\r\n\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetDeleteCell(moveType, row, row, column, column, sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * \u8BBE\u7F6E\u67D0\u4E2A\u5355\u5143\u683C\u7684\u5C5E\u6027\uFF0C\u5982\u679C\u8981\u8BBE\u7F6E\u5355\u5143\u683C\u7684\u503C\u6216\u8005\u540C\u65F6\u8BBE\u7F6E\u591A\u4E2A\u5355\u5143\u683C\u5C5E\u6027\uFF0C\u63A8\u8350\u4F7F\u7528setCellValue\r\n * @param {Number} row \u5355\u5143\u683C\u6240\u5728\u884C\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u884C\r\n * @param {Number} column \u5355\u5143\u683C\u6240\u5728\u5217\u6570\uFF1B\u4ECE0\u5F00\u59CB\u7684\u6574\u6570\uFF0C0\u8868\u793A\u7B2C\u4E00\u5217\r\n * @param {String} attr\r\n * @param {Number | String | Object} value \u5177\u4F53\u7684\u8BBE\u7F6E\u503C\uFF0C\u4E00\u4E2A\u5C5E\u6027\u4F1A\u5BF9\u5E94\u591A\u4E2A\u503C\uFF0C\u53C2\u8003 \u5355\u5143\u683C\u5C5E\u6027\u8868\u7684\u503C\u793A\u4F8B\uFF0C\u7279\u6B8A\u60C5\u51B5\uFF1A\u5982\u679C\u5C5E\u6027\u7C7B\u578Battr\u662F\u5355\u5143\u683C\u683C\u5F0Fct\uFF0C\u5219\u8BBE\u7F6E\u503Cvalue\u5E94\u63D0\u4F9Bct.fa\uFF0C\u6BD4\u5982\u8BBE\u7F6EA1\u5355\u5143\u683C\u7684\u683C\u5F0F\u4E3A\u767E\u5206\u6BD4\u683C\u5F0F\uFF1Aluckysheet.setCellFormat(0, 0, \"ct\", \"0.00%\")\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570, callback\u53C2\u6570\u4E3A\u6539\u53D8\u540E\u7684cell\u5BF9\u8C61\r\n */\r\nexport function setCellFormat(row, column, attr, value, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row or column cannot be null or undefined.', '')\r\n    }\r\n\r\n    if (!attr) {\r\n        return tooltip.info('Arguments attr cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let targetSheetData = $.extend(true, [], file.data);\r\n    if(targetSheetData.length == 0){\r\n        targetSheetData = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let cellData = targetSheetData[row][column] || {};\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    // \u7279\u6B8A\u683C\u5F0F\r\n    if (attr == 'ct' && (!value || !value.hasOwnProperty('fa') || !value.hasOwnProperty('t'))) {\r\n        return new TypeError('While set attribute \\'ct\\' to cell, the value must have property \\'fa\\' and \\'t\\'')\r\n    }\r\n\r\n    if (attr == 'bd') {\r\n        if(cfg[\"borderInfo\"] == null){\r\n            cfg[\"borderInfo\"] = [];\r\n        }\r\n\r\n        let borderInfo = {\r\n            rangeType: \"range\",\r\n            borderType: \"border-all\",\r\n            color: \"#000\",\r\n            style: \"1\",\r\n            range: [{\r\n                column: [column, column],\r\n                row: [row, row]\r\n            }],\r\n            ...value,\r\n        }\r\n\r\n        cfg[\"borderInfo\"].push(borderInfo);\r\n    } else {\r\n        cellData[attr] = value;\r\n    }\r\n\r\n    targetSheetData[row][column] = cellData;\r\n\r\n    // refresh\r\n    if(file.index == Store.currentSheetIndex){\r\n        file.config = cfg;\r\n        Store.config = cfg;\r\n        jfrefreshgrid(targetSheetData, [{ \"row\": [row, row], \"column\": [column, column] }]);\r\n    }\r\n    else {\r\n        file.config = cfg;\r\n        file.data = targetSheetData;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(cellData);\r\n    }\r\n}\r\n\r\n/**\r\n * \u67E5\u627E\u4E00\u4E2A\u5DE5\u4F5C\u8868\u4E2D\u7684\u6307\u5B9A\u5185\u5BB9\uFF0C\u8FD4\u56DE\u67E5\u627E\u5230\u7684\u5185\u5BB9\u7EC4\u6210\u7684\u5355\u5143\u683C\u4E00\u4F4D\u6570\u7EC4\uFF0C\u6570\u636E\u683C\u5F0F\u540Ccelldata\r\n * @param {String} content \u8981\u67E5\u627E\u7684\u5185\u5BB9 \u53EF\u4EE5\u4E3A\u6B63\u5219\u8868\u8FBE\u5F0F\uFF08\u4E0D\u5305\u542B\u524D\u540E'/')\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Boolean} options.isRegularExpression \u662F\u5426\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false. \u6CE8\u610F\uFF1A\u6B63\u5219\u4E2D\u7684\u89C4\u5219\u9700\u8981\u8F6C\u4E49\uFF0C\u5982\\S\u9700\u8981\u5199\u6210 \\\\S\r\n * @param {Boolean} options.isWholeWord \u662F\u5426\u6574\u8BCD\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false\r\n * @param {Boolean} options.isCaseSensitive \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {String} options.type \u5355\u5143\u683C\u5C5E\u6027\uFF1B\u9ED8\u8BA4\u503C\u4E3Am\r\n */\r\nexport function find(content, options = {}) {\r\n    if (!content && content != 0) {\r\n        return tooltip.info('Search content cannot be null or empty', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        isRegularExpression = false,\r\n        isWholeWord = false,\r\n        isCaseSensitive = false,\r\n        order = curSheetOrder,\r\n        type = \"m\"\r\n    } = { ...options };\r\n    let targetSheetData = Store.luckysheetfile[order].data;\r\n\r\n    let result = [];\r\n    for (let i = 0; i < targetSheetData.length; i++) {\r\n        const rowArr = targetSheetData[i];\r\n\r\n        for (let j = 0; j < rowArr.length; j++) {\r\n            const cell = rowArr[j];\r\n\r\n            if (!cell) {\r\n                continue;\r\n            }\r\n\r\n            // \u6DFB\u52A0cell\u7684row, column\u5C5E\u6027\r\n            // replace\u65B9\u6CD5\u4E2D\u7684setCellValue\u4E2D\u9700\u8981\u4F7F\u7528\u8BE5\u5C5E\u6027\r\n            cell.row = i;\r\n            cell.column = j;\r\n\r\n            if (isWholeWord) {\r\n                if (isCaseSensitive) {\r\n                    if (content.toString() == cell[type]) {\r\n                        result.push(cell)\r\n                    }\r\n                } else {\r\n                    if (cell[type] && content.toString().toLowerCase() == cell[type].toLowerCase()) {\r\n                        result.push(cell)\r\n                    }\r\n                }\r\n            } else if (isRegularExpression) {\r\n                let reg;\r\n                if (isCaseSensitive) {\r\n                    reg = new RegExp(func_methods.getRegExpStr(content), 'g')\r\n                } else {\r\n                    reg = new RegExp(func_methods.getRegExpStr(content), 'ig')\r\n                }\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell)\r\n                }\r\n            } else if (isCaseSensitive) {\r\n                let reg = new RegExp(func_methods.getRegExpStr(content), 'g');\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell);\r\n                }\r\n            } else {\r\n                let reg = new RegExp(func_methods.getRegExpStr(content), 'ig');\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * \u67E5\u627E\u4E00\u4E2A\u5DE5\u4F5C\u8868\u4E2D\u7684\u6307\u5B9A\u5185\u5BB9\u5E76\u66FF\u6362\u6210\u65B0\u7684\u5185\u5BB9\uFF0C\u8FD4\u56DE\u66FF\u6362\u540E\u7684\u5185\u5BB9\u7EC4\u6210\u7684\u5355\u5143\u683C\u4E00\u4F4D\u6570\u7EC4\uFF0C\u6570\u636E\u683C\u5F0F\u540Ccelldata\u3002\r\n * @param {String} content \u8981\u67E5\u627E\u7684\u5185\u5BB9\r\n * @param {String} replaceContent \u8981\u66FF\u6362\u7684\u5185\u5BB9\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Boolean} options.isRegularExpression \u662F\u5426\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false\r\n * @param {Boolean} options.isWholeWord \u662F\u5426\u6574\u8BCD\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false\r\n * @param {Boolean} options.isCaseSensitive \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\uFF1B\u9ED8\u8BA4\u4E3A false\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570, callback\u53C2\u6570\u4E3A\u66FF\u6362\u540E\u7684cell\u96C6\u5408\r\n */\r\nexport function replace(content, replaceContent, options = {}) {\r\n    let matchCells = find(content, options)\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n    let sheetData = $.extend(true, [], file.data);\r\n\r\n    matchCells.forEach(cell => {\r\n        cell.m = replaceContent;\r\n        setCellValue(cell.row, cell.column, replaceContent, {order: order, isRefresh: false});\r\n    })\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    file.data.length = 0;\r\n    file.data.push(...sheetData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, undefined, undefined, true, false);\r\n    }\r\n\r\n    luckysheetrefreshgrid();\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success(matchCells)\r\n    }\r\n    return matchCells;\r\n}\r\n\r\n\r\n/**\r\n * \u624B\u52A8\u89E6\u53D1\u9000\u51FA\u7F16\u8F91\u6A21\u5F0F\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function exitEditMode(options = {}){\r\n    if(parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0){\r\n\r\n\r\n        if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n            formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n        }\r\n        else {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n            Store.luckysheet_select_save = [{\r\n                \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]],\r\n                \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]],\r\n                \"row_focus\": Store.luckysheetCellUpdate[0],\r\n                \"column_focus\": Store.luckysheetCellUpdate[1]\r\n            }];\r\n        }\r\n\r\n        //\u82E5\u6709\u53C2\u6570\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //\u82E5\u6709\u53C2\u6570\u9009\u53D6\u8303\u56F4\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n    }\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u624B\u52A8\u89E6\u53D1\u8FDB\u5165\u7F16\u8F91\u6A21\u5F0F\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function enterEditMode(options = {}){\r\n\r\n    if($(\"#luckysheet-conditionformat-dialog\").is(\":visible\")){\r\n        return;\r\n    }\r\n    else if ($(\"#luckysheet-cell-selected\").is(\":visible\")) {\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n    }\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u51BB\u7ED3\u9996\u884C\r\n * \u82E5\u8BBE\u7F6E\u51BB\u7ED3\u7684sheet\u4E0D\u662F\u5F53\u524Dsheet\u9875\uFF0C\u53EA\u8BBE\u7F6E\u53C2\u6570\u4E0D\u6E32\u67D3\r\n * @param {Number | String} order \u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function frozenFirstRow(order) {\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenRow\", order);\r\n\r\n    // \u51BB\u7ED3\u4E3A\u5F53\u524Dsheet\u9875\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n        if(row_st == -1){\r\n            row_st = 0;\r\n        }\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st],\r\n            row_st + 1,\r\n            scrollTop,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n            top\r\n        ];\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u9996\u5217\r\n * \u82E5\u8BBE\u7F6E\u51BB\u7ED3\u7684sheet\u4E0D\u662F\u5F53\u524Dsheet\u9875\uFF0C\u53EA\u8BBE\u7F6E\u53C2\u6570\u4E0D\u6E32\u67D3\r\n * @param {Number | String} order \u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function frozenFirstColumn(order) {\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenColumn\", order);\r\n\r\n    // \u51BB\u7ED3\u4E3A\u5F53\u524Dsheet\u9875\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n        if(col_st == -1){\r\n            col_st = 0;\r\n        }\r\n\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st],\r\n            col_st + 1,\r\n            scrollLeft,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n            left\r\n        ];\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u884C\u9009\u533A\r\n * @param {Object} range \u884C\u9009\u533A\u8303\u56F4\u7684focus\u5355\u5143\u683C\u7684\u884C\u5217\u503C\u6784\u6210\u7684\u5BF9\u8C61\uFF1B\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\r\n * @param {Number | String} order \u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function frozenRowRange(range, order) {\r\n    const locale_frozen = locale().freezen;\r\n\r\n    if (!range || (!range.hasOwnProperty('row_focus') && !formula.iscelldata(range))) {\r\n        if(isEditMode()){\r\n            alert(locale_frozen.noSeletionError);\r\n        } else{\r\n            tooltip.info(locale_frozen.noSeletionError, \"\");\r\n        }\r\n        return\r\n    }\r\n\r\n    if (typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n        range = {\r\n            row_focus: range.row[0],\r\n            column_focus: range.column[0]\r\n        }\r\n    }\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenRowRange\", order, range);\r\n\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n        let row_focus = range.row_focus;\r\n        if(row_focus > row_st){\r\n            row_st = row_focus;\r\n        }\r\n        if(row_st == -1){\r\n            row_st = 0;\r\n        }\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st],\r\n            row_st + 1,\r\n            scrollTop,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n            top\r\n        ];\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u5217\u9009\u533A\r\n * @param {Object} range \u5217\u9009\u533A\u8303\u56F4\u7684focus\u5355\u5143\u683C\u7684\u884C\u5217\u503C\u6784\u6210\u7684\u5BF9\u8C61\uFF1B\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\r\n * @param {Number | String} order \u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function frozenColumnRange(range, order) {\r\n    const locale_frozen = locale().freezen;\r\n    let isStringRange = typeof range === 'string' && formula.iscelldata(range);\r\n\r\n    if (!range || (!range.hasOwnProperty('column_focus') && !isStringRange)) {\r\n        if(isEditMode()){\r\n            alert(locale_frozen.noSeletionError);\r\n        } else{\r\n            tooltip.info(locale_frozen.noSeletionError, \"\");\r\n        }\r\n        return\r\n    }\r\n\r\n    if (isStringRange) {\r\n        range = formula.getcellrange(range)\r\n        range = {\r\n            row_focus: range.row[0],\r\n            column_focus: range.column[0]\r\n        }\r\n    }\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenColumnRange\", order, range);\r\n\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n        let column_focus = range.column_focus;\r\n        if(column_focus > col_st){\r\n            col_st = column_focus;\r\n        }\r\n        if(col_st == -1){\r\n            col_st = 0;\r\n        }\r\n\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st],\r\n            col_st + 1,\r\n            scrollLeft,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n            left\r\n        ];\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * \u53D6\u6D88\u51BB\u7ED3\r\n * @param {Number | String} order\r\n */\r\nexport function cancelFrozen(order) {\r\n    luckysheetFreezen.saveFrozen(\"freezenCancel\", order);\r\n\r\n    // \u53D6\u6D88\u5F53\u524Dsheet\u51BB\u7ED3\u65F6\uFF0C\u5237\u65B0canvas\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n        }\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n        }\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u884C\u64CD\u4F5C\u3002\u7279\u522B\u6CE8\u610F\uFF0C\u53EA\u6709\u5728isRange\u8BBE\u7F6E\u4E3Atrue\u7684\u65F6\u5019\uFF0C\u624D\u9700\u8981\u8BBE\u7F6Esetting\u4E2D\u7684range\uFF0C\u4E14\u4E0E\u4E00\u822C\u7684range\u683C\u5F0F\u4E0D\u540C\u3002\r\n * @param {Boolean} isRange \u662F\u5426\u51BB\u7ED3\u884C\u5230\u9009\u533A true-\u51BB\u7ED3\u884C\u5230\u9009\u533A  false-\u51BB\u7ED3\u9996\u884C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object} options.range isRange\u4E3Atrue\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u5F00\u542F\u51BB\u7ED3\u7684\u5355\u5143\u683C\u4F4D\u7F6E\uFF0C\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\uFF0C\u610F\u4E3A\u5F53\u524D\u6FC0\u6D3B\u7684\u5355\u5143\u683C\u7684\u884C\u6570\u548C\u5217\u6570\uFF1B\u9ED8\u8BA4\u4ECE\u5F53\u524D\u9009\u533A\u6700\u540E\u7684\u4E00\u4E2A\u9009\u533A\u4E2D\u53D6\u5F97\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setHorizontalFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    // \u82E5\u5DF2\u5B58\u5728\u51BB\u7ED3\uFF0C\u53D6\u6D88\u4E4B\u524D\u7684\u51BB\u7ED3\u6548\u679C\r\n    cancelFrozen(order);\r\n\r\n    if (!isRange) {\r\n        frozenFirstRow(order)\r\n    } else { // \u9009\u533A\u884C\u51BB\u7ED3\r\n        frozenRowRange(range, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u5217\u64CD\u4F5C\u3002\u7279\u522B\u6CE8\u610F\uFF0C\u53EA\u6709\u5728isRange\u8BBE\u7F6E\u4E3Atrue\u7684\u65F6\u5019\uFF0C\u624D\u9700\u8981\u8BBE\u7F6Esetting\u4E2D\u7684range\uFF0C\u4E14\u4E0E\u4E00\u822C\u7684range\u683C\u5F0F\u4E0D\u540C\u3002\r\n * @param {Boolean} isRange \u662F\u5426\u51BB\u7ED3\u5217\u5230\u9009\u533A true-\u51BB\u7ED3\u5217\u5230\u9009\u533A  false-\u51BB\u7ED3\u9996\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object} options.range isRange\u4E3Atrue\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u5F00\u542F\u51BB\u7ED3\u7684\u5355\u5143\u683C\u4F4D\u7F6E\uFF0C\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\uFF0C\u610F\u4E3A\u5F53\u524D\u6FC0\u6D3B\u7684\u5355\u5143\u683C\u7684\u884C\u6570\u548C\u5217\u6570\uFF1B\u9ED8\u8BA4\u4ECE\u5F53\u524D\u9009\u533A\u6700\u540E\u7684\u4E00\u4E2A\u9009\u533A\u4E2D\u53D6\u5F97\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setVerticalFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    // \u82E5\u5DF2\u5B58\u5728\u51BB\u7ED3\uFF0C\u53D6\u6D88\u4E4B\u524D\u7684\u51BB\u7ED3\u6548\u679C\r\n    cancelFrozen(order);\r\n\r\n    if (!isRange) {\r\n        frozenFirstColumn(order);\r\n    } else {\r\n        frozenColumnRange(range, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * \u51BB\u7ED3\u884C\u5217\u64CD\u4F5C\u3002\u7279\u522B\u6CE8\u610F\uFF0C\u53EA\u6709\u5728isRange\u8BBE\u7F6E\u4E3Atrue\u7684\u65F6\u5019\uFF0C\u624D\u9700\u8981\u8BBE\u7F6Esetting\u4E2D\u7684range\uFF0C\u4E14\u4E0E\u4E00\u822C\u7684range\u683C\u5F0F\u4E0D\u540C\u3002\r\n * @param {Boolean} isRange \u662F\u5426\u51BB\u7ED3\u884C\u5217\u5230\u9009\u533A true-\u51BB\u7ED3\u884C\u5217\u5230\u9009\u533A  false-\u51BB\u7ED3\u9996\u884C\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object} options.range isRange\u4E3Atrue\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u5F00\u542F\u51BB\u7ED3\u7684\u5355\u5143\u683C\u4F4D\u7F6E\uFF0C\u683C\u5F0F\u4E3A{ row_focus:0, column_focus:0 }\uFF0C\u610F\u4E3A\u5F53\u524D\u6FC0\u6D3B\u7684\u5355\u5143\u683C\u7684\u884C\u6570\u548C\u5217\u6570\uFF1B\u9ED8\u8BA4\u4ECE\u5F53\u524D\u9009\u533A\u6700\u540E\u7684\u4E00\u4E2A\u9009\u533A\u4E2D\u53D6\u5F97\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setBothFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    let isCurrentSheet = !order || order == getSheetIndex(Store.currentSheetIndex);\r\n    const locale_frozen = locale().freezen;\r\n\r\n    // \u82E5\u5DF2\u5B58\u5728\u51BB\u7ED3\uFF0C\u53D6\u6D88\u4E4B\u524D\u7684\u51BB\u7ED3\u6548\u679C\r\n    cancelFrozen(order);\r\n\r\n    // \u51BB\u7ED3\u9996\u884C\u5217\r\n    if (!isRange) {\r\n        // store frozen\r\n        luckysheetFreezen.saveFrozen(\"freezenRC\", order)\r\n\r\n        if (isCurrentSheet) {\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                scrollTop,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                scrollLeft,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n    } else {   // \u51BB\u7ED3\u884C\u5217\u5230\u9009\u533A\r\n        // store frozen\r\n        luckysheetFreezen.saveFrozen(\"freezenRCRange\", order, range)\r\n\r\n        let isStringRange = typeof range === 'string' && formula.iscelldata(range);\r\n        if (isCurrentSheet) {\r\n            if ((!range || !(range.hasOwnProperty('column_focus') && range.hasOwnProperty('row_focus'))) && !isStringRange) {\r\n                if(isEditMode()){\r\n                    alert(locale_frozen.noSeletionError);\r\n                } else{\r\n                    tooltip.info(locale_frozen.noSeletionError, \"\");\r\n                }\r\n                return\r\n            }\r\n\r\n            if (isStringRange) {\r\n                range = formula.getcellrange(range)\r\n                range = {\r\n                    row_focus: range.row[0],\r\n                    column_focus: range.column[0]\r\n                }\r\n            }\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = range.row_focus;\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                scrollTop,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = range.column_focus;\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                scrollLeft,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * \u5728\u7B2Cindex\u884C\u6216\u5217\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u884C\u6216\u5217\r\n * @param {String} type \u63D2\u5165\u884C\u6216\u5217 row-\u884C  column-\u5217\r\n * @param {Number} index \u5728\u7B2C\u51E0\u884C\u63D2\u5165\u7A7A\u767D\u884C\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u884C\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertRowOrColumn(type, index = 0, options = {}) {\r\n    if(!isRealNum(index)){\r\n        return tooltip.info('The index parameter is invalid.', '');\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        number = 1,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let _locale = locale();\r\n    let locale_info = _locale.info;\r\n    if (!isRealNum(number)) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumber);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumber, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    number = parseInt(number);\r\n    if (number < 1 || number > 100) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumberLimit);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    // \u9ED8\u8BA4\u5728\u884C\u4E0A\u65B9\u589E\u52A0\u884C\uFF0C\u5217\u5DE6\u4FA7\u589E\u52A0\u5217\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetextendtable(type, index, number, \"lefttop\", sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n/**\r\n * \u5728\u7B2Cindex\u884C\u6216\u5217\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u884C\u6216\u5217\r\n * @param {String} type \u63D2\u5165\u884C\u6216\u5217 row-\u884C  column-\u5217\r\n * @param {Number} index \u5728\u7B2C\u51E0\u884C\u63D2\u5165\u7A7A\u767D\u884C\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u884C\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertRowBottomOrColumnRight(type, index = 0, options = {}) {\r\n    if(!isRealNum(index)){\r\n        return tooltip.info('The index parameter is invalid.', '');\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        number = 1,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let _locale = locale();\r\n    let locale_info = _locale.info;\r\n    if (!isRealNum(number)) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumber);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumber, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    number = parseInt(number);\r\n    if (number < 1 || number > 100) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumberLimit);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    // \u9ED8\u8BA4\u5728\u884C\u4E0A\u65B9\u589E\u52A0\u884C\uFF0C\u5217\u5DE6\u4FA7\u589E\u52A0\u5217\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetextendtable(type, index, number, \"rightbottom\", sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n/**\r\n * \u5728\u7B2Crow\u884C\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u884C\u7A7A\u767D\u884C\r\n * @param {Number} row \u5728\u7B2C\u51E0\u884C\u63D2\u5165\u7A7A\u767D\u884C\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u884C\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertRow(row = 0, options = {}) {\r\n    insertRowOrColumn('row', row, options)\r\n}\r\n/**\r\n * \u5728\u7B2Crow\u884C\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u884C\u7A7A\u767D\u884C\r\n * @param {Number} row \u5728\u7B2C\u51E0\u884C\u63D2\u5165\u7A7A\u767D\u884C\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u884C\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertRowBottom(row = 0, options = {}) {\r\n    insertRowBottomOrColumnRight('row', row, options)\r\n}\r\n/**\r\n * \u5728\u7B2Ccolumn\u5217\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u5217\u7A7A\u767D\u5217\r\n * @param {Number} column \u5728\u7B2C\u51E0\u5217\u63D2\u5165\u7A7A\u767D\u5217\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u5217\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertColumn(column = 0, options = {}) {\r\n    insertRowOrColumn('column', column, options)\r\n}\r\n/**\r\n * \u5728\u7B2Ccolumn\u5217\u7684\u4F4D\u7F6E\uFF0C\u63D2\u5165number\u5217\u7A7A\u767D\u5217\r\n * @param {Number} column \u5728\u7B2C\u51E0\u5217\u63D2\u5165\u7A7A\u767D\u5217\uFF0C\u4ECE0\u5F00\u59CB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.number \u63D2\u5165\u7684\u7A7A\u767D\u5217\u6570\uFF1B\u9ED8\u8BA4\u4E3A 1\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertColumnRight(column = 0, options = {}) {\r\n    insertRowBottomOrColumnRight('column', column, options)\r\n}\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u7684\u884C\u6216\u5217\u3002\u5220\u9664\u884C\u5217\u4E4B\u540E\uFF0C\u884C\u5217\u7684\u5E8F\u53F7\u5E76\u4E0D\u4F1A\u53D8\u5316\uFF0C\u4E0B\u9762\u7684\u884C\uFF08\u53F3\u4FA7\u7684\u5217\uFF09\u4F1A\u8865\u5145\u5230\u4E0A\uFF08\u5DE6\uFF09\u9762\uFF0C\u6CE8\u610F\u89C2\u5BDF\u6570\u636E\u662F\u5426\u88AB\u6B63\u786E\u5220\u9664\u5373\u53EF\u3002\r\n * @param {String} type \u5220\u9664\u884C\u6216\u5217 row-\u884C  column-\u5217\r\n * @param {Number} startIndex \u8981\u5220\u9664\u7684\u8D77\u59CB\u884C\u6216\u5217\r\n * @param {Number} endIndex \u8981\u5220\u9664\u7684\u7ED3\u675F\u884C\u6216\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n    luckysheetdeletetable(type, startIndex, endIndex, sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u7684\u884C\u3002\r\n * @param {Number} rowStart \u8981\u5220\u9664\u7684\u8D77\u59CB\u884C\r\n * @param {Number} rowEnd \u8981\u5220\u9664\u7684\u7ED3\u675F\u884C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteRow(rowStart, rowEnd, options = {}) {\r\n    deleteRowOrColumn('row', rowStart, rowEnd, options)\r\n}\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u7684\u5217\u3002\r\n * @param {Number} columnStart \u8981\u5220\u9664\u7684\u8D77\u59CB\u5217\r\n * @param {Number} columnEnd \u8981\u5220\u9664\u7684\u7ED3\u675F\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteColumn(columnStart, columnEnd, options = {}) {\r\n    deleteRowOrColumn('column', columnStart, columnEnd, options)\r\n}\r\n\r\n/**\r\n * \u9690\u85CF\u884C\u6216\u5217\r\n * @param {String} type \u9690\u85CF\u884C\u6216\u5217  row-\u9690\u85CF\u884C  column-\u9690\u85CF\u5217\r\n * @param {Number} startIndex \u8D77\u59CB\u884C\u6216\u5217\r\n * @param {Number} endIndex \u7ED3\u675F\u884C\u6216\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function hideRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        saveParam = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let cfgKey = type === 'row' ? 'rowhidden': 'colhidden';\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[cfgKey] == null) {\r\n        cfg[cfgKey] = {};\r\n    }\r\n\r\n    for (let i = startIndex; i <= endIndex; i++) {\r\n        cfg[cfgKey][i] = 0;\r\n    }\r\n\r\n    //\u4FDD\u5B58\u64A4\u9500\r\n    if(Store.clearjfundo){\r\n        let redo = {};\r\n        redo[\"type\"] = type === 'row' ? 'showHidRows' : 'showHidCols';\r\n        redo[\"sheetIndex\"] = file.index;\r\n        redo[\"config\"] = $.extend(true, {}, file.config);\r\n        redo[\"curconfig\"] = cfg;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    Store.luckysheetfile[order].config = cfg;\r\n\r\n    if (saveParam) {\r\n        server.saveParam(\"cg\", file.index, cfg[cfgKey], { \"k\": cfgKey });\r\n    }\r\n\r\n    // \u82E5\u64CD\u4F5Csheet\u4E3A\u5F53\u524Dsheet\u9875\uFF0C\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0\r\n    if (order == curSheetOrder) {\r\n        //config\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u663E\u793A\u9690\u85CF\u7684\u884C\u6216\u5217\r\n * @param {String} type \u663E\u793A\u884C\u6216\u5217  row-\u663E\u793A\u884C  column-\u663E\u793A\u5217\r\n * @param {Number} startIndex \u8D77\u59CB\u884C\u6216\u5217\r\n * @param {Number} endIndex \u7ED3\u675F\u884C\u6216\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function showRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        saveParam = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let cfgKey = type === 'row' ? 'rowhidden': 'colhidden';\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[cfgKey] == null) {\r\n        return;\r\n    }\r\n\r\n    for (let i = startIndex; i <= endIndex; i++) {\r\n        delete cfg[cfgKey][i];\r\n    }\r\n\r\n    //\u4FDD\u5B58\u64A4\u9500\r\n    if(Store.clearjfundo){\r\n        let redo = {};\r\n        redo[\"type\"] = type === 'row' ? 'showHidRows' : 'showHidCols';\r\n        redo[\"sheetIndex\"] = file.index;\r\n        redo[\"config\"] = $.extend(true, {}, file.config);\r\n        redo[\"curconfig\"] = cfg;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    //config\r\n    Store.luckysheetfile[order].config = Store.config;\r\n\r\n    if (saveParam) {\r\n        server.saveParam(\"cg\", file.index, cfg[cfgKey], { \"k\": cfgKey });\r\n    }\r\n\r\n    // \u82E5\u64CD\u4F5Csheet\u4E3A\u5F53\u524Dsheet\u9875\uFF0C\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0\r\n    if (order === curSheetOrder) {\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u9690\u85CF\u884C\r\n * @param {Number} startIndex \u8D77\u59CB\u884C\r\n * @param {Number} endIndex \u7ED3\u675F\u884C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function hideRow(startIndex, endIndex, options = {}) {\r\n    hideRowOrColumn('row', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * \u663E\u793A\u884C\r\n * @param {Number} startIndex \u8D77\u59CB\u884C\r\n * @param {Number} endIndex \u7ED3\u675F\u884C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function showRow(startIndex, endIndex, options = {}) {\r\n    showRowOrColumn('row', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * \u9690\u85CF\u5217\r\n * @param {Number} startIndex \u8D77\u59CB\u5217\r\n * @param {Number} endIndex \u7ED3\u675F\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function hideColumn(startIndex, endIndex, options = {}) {\r\n    hideRowOrColumn('column', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * \u663E\u793A\u5217\r\n * @param {Number} startIndex \u8D77\u59CB\u5217\r\n * @param {Number} endIndex \u7ED3\u675F\u5217\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function showColumn(startIndex, endIndex, options = {}) {\r\n    showRowOrColumn('column', startIndex, endIndex, options);\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u884C\u7684\u9AD8\u5EA6\u3002\u4F18\u5148\u7EA7\u6700\u9AD8\uFF0C\u9AD8\u4E8E\u9ED8\u8BA4\u884C\u9AD8\u548C\u7528\u6237\u81EA\u5B9A\u4E49\u884C\u9AD8\u3002\r\n * @param {Object} rowInfo \u884C\u6570\u548C\u9AD8\u5EA6\u5BF9\u5E94\u5173\u7CFB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRowHeight(rowInfo, options = {}) {\r\n    if(getObjType(rowInfo) != 'object'){\r\n        return tooltip.info(\"The rowInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg['rowlen'] == null){\r\n        cfg['rowlen'] = {};\r\n    }\r\n\r\n    for(let r in rowInfo){\r\n        if(parseInt(r) >= 0){\r\n            let len = rowInfo[r];\r\n\r\n            if (len === 'auto') {\r\n                cfg['rowlen'][parseInt(r)] = len\r\n            } else {\r\n                if(Number(len) >= 0){\r\n                    cfg['rowlen'][parseInt(r)] = Number(len);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    server.saveParam(\"cg\", file.index, cfg[\"rowlen\"], { \"k\": \"rowlen\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u5217\u7684\u5BBD\u5EA6\r\n * @param {Object} columnInfo \u884C\u6570\u548C\u9AD8\u5EA6\u5BF9\u5E94\u5173\u7CFB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setColumnWidth(columnInfo, options = {}) {\r\n    if(getObjType(columnInfo) != 'object'){\r\n        return tooltip.info(\"The columnInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg['columnlen'] == null){\r\n        cfg['columnlen'] = {};\r\n    }\r\n\r\n    for(let c in columnInfo){\r\n        if(parseInt(c) >= 0){\r\n            let len = columnInfo[c];\r\n\r\n            if (len === 'auto') {\r\n                cfg['columnlen'][parseInt(c)] = len\r\n            } else {\r\n                if(Number(len) >= 0){\r\n                    cfg['columnlen'][parseInt(c)] = Number(len);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    server.saveParam(\"cg\", file.index, cfg[\"columnlen\"], { \"k\": \"columnlen\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u83B7\u53D6\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u884C\u7684\u9AD8\u5EA6\uFF0C\u5F97\u5230\u884C\u53F7\u548C\u9AD8\u5EA6\u5BF9\u5E94\u5173\u7CFB\u7684\u5BF9\u8C61\r\n * @param {Array} rowInfo \u884C\u53F7\u4E0B\u6807\u7EC4\u6210\u7684\u6570\u7EC4\uFF1B\u884C\u53F7\u4E0B\u6807\u4ECE0\u5F00\u59CB\uFF1B\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function getRowHeight(rowInfo, options = {}) {\r\n    if(getObjType(rowInfo) != 'array' || rowInfo.length == 0){\r\n        return tooltip.info(\"The rowInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let rowlen = cfg[\"rowlen\"] || {};\r\n\r\n    let rowlenObj = {};\r\n\r\n    rowInfo.forEach((item) => {\r\n        if(parseInt(item) >= 0){\r\n            let size = rowlen[parseInt(item)] || Store.defaultrowlen;\r\n            rowlenObj[parseInt(item)] = size;\r\n        }\r\n    })\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return rowlenObj;\r\n}\r\n\r\n\r\n/**\r\n * \u83B7\u53D6\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5217\u7684\u5BBD\u5EA6\uFF0C\u5F97\u5230\u5217\u53F7\u548C\u5BBD\u5EA6\u5BF9\u5E94\u5173\u7CFB\u7684\u5BF9\u8C61\r\n * @param {Array} columnInfo \u884C\u53F7\u4E0B\u6807\u7EC4\u6210\u7684\u6570\u7EC4\uFF1B\u884C\u53F7\u4E0B\u6807\u4ECE0\u5F00\u59CB\uFF1B\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function getColumnWidth(columnInfo, options = {}) {\r\n    if(getObjType(columnInfo) != 'array' || columnInfo.length == 0){\r\n        return tooltip.info(\"The columnInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let columnlen = cfg[\"columnlen\"] || {};\r\n\r\n    let columnlenObj = {};\r\n\r\n    columnInfo.forEach((item) => {\r\n        if(parseInt(item) >= 0){\r\n            let size = columnlen[parseInt(item)] || Store.defaultcollen;\r\n            columnlenObj[parseInt(item)] = size;\r\n        }\r\n    })\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return columnlenObj;\r\n}\r\n\r\n\r\n/**\r\n * \u83B7\u53D6\u5DE5\u4F5C\u8868\u7684\u9ED8\u8BA4\u884C\u9AD8\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function getDefaultRowHeight(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return Store.luckysheetfile[order].defaultRowHeight;\r\n}\r\n\r\n\r\n/**\r\n * \u83B7\u53D6\u5DE5\u4F5C\u8868\u7684\u9ED8\u8BA4\u5217\u5BBD\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function getDefaultColWidth(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return Store.luckysheetfile[order].defaultColWidth;\r\n}\r\n\r\n\r\n/**\r\n * \u8FD4\u56DE\u5F53\u524D\u9009\u533A\u5BF9\u8C61\u7684\u6570\u7EC4\uFF0C\u53EF\u80FD\u5B58\u5728\u591A\u4E2A\u9009\u533A\u3002\r\n * \u6BCF\u4E2A\u9009\u533A\u7684\u683C\u5F0F\u4E3Arow/column\u4FE1\u606F\u7EC4\u6210\u7684\u5BF9\u8C61{row:[0,1],column:[0,1]}\r\n * @returns {Array}\r\n */\r\nexport function getRange() {\r\n    let rangeArr = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n\r\n    let result = [];\r\n\r\n    for (let i = 0; i < rangeArr.length; i++) {\r\n        let rangeItem = rangeArr[i];\r\n        let temp = {\r\n            row: rangeItem.row,\r\n            column: rangeItem.column\r\n        }\r\n        result.push(temp)\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * \u8FD4\u56DE\u8868\u793A\u6307\u5B9A\u533A\u57DF\u5185\u6240\u6709\u5355\u5143\u683C\u4F4D\u7F6E\u7684\u6570\u7EC4\uFF0C\u533A\u522BgetRange\u65B9\u6CD5\uFF0C\u8BE5\u65B9\u6CD5\u4EE5cell\u5355\u5143\u683C(\u800C\u975E\u67D0\u5757\u8FDE\u7EED\u7684\u533A\u57DF)\u4E3A\u5355\u4F4D\u6765\u7EC4\u7EC7\u9009\u533A\u7684\u6570\u636E\r\n * @param   {Array}   range \u53EF\u9009\u53C2\u6570\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u4E2D\u533A\u57DF\r\n * @returns {Array}   \u5BF9\u8C61\u6570\u7EC4\r\n */\r\nexport function getRangeWithFlatten(range){\r\n    range = range ||  getRange();\r\n\r\n    let result = [];\r\n\r\n    range.forEach(ele=>{\r\n        // \u8FD9\u4E2Adata\u53EF\u80FD\u662F\u4E2A\u8303\u56F4\u6216\u8005\u662F\u5355\u4E2Acell\r\n        let rs = ele.row;\r\n        let cs = ele.column;\r\n        for(let r = rs[0]; r <= rs[1]; r++){\r\n            for(let c = cs[0]; c <= cs[1]; c++){\r\n                // r c \u5F53\u524D\u7684r\u548C\u5F53\u524D\u7684c\r\n                result.push({r,c});\r\n            }\r\n        }\r\n    })\r\n    return result;\r\n}\r\n\r\n/**\r\n * \u8FD4\u56DE\u8868\u793A\u6307\u5B9A\u533A\u57DF\u5185\u6240\u6709\u5355\u5143\u683C\u5185\u5BB9\u7684\u5BF9\u8C61\u6570\u7EC4\r\n * @param   {Array}   range \u53EF\u9009\u53C2\u6570\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u4E2D\u533A\u57DF\u6241\u5E73\u5316\u540E\u7684\u5BF9\u8C61\uFF0C\u7ED3\u6784\u5F62\u5982[{r:0,c:0},{r:0,c:1}...]\r\n * @returns {Array}   \u5BF9\u8C61\u6570\u7EC4\r\n */\r\nexport function getRangeValuesWithFlatte(range){\r\n    range = range || getRangeWithFlatten();\r\n\r\n    let values = [];\r\n\r\n    // \u83B7\u53D6\u5230\u7684\u8FD9\u4E2A\u6570\u636E\u4E0D\u662F\u6700\u65B0\u7684\u6570\u636E\r\n    range.forEach(item=> {\r\n        values.push(Store.flowdata[item.r][item.c]);\r\n    });\r\n    return values;\r\n}\r\n\r\n\r\n/**\r\n * \u8FD4\u56DE\u5BF9\u5E94\u5F53\u524D\u9009\u533A\u7684\u5750\u6807\u5B57\u7B26\u4E32\u6570\u7EC4\uFF0C\u53EF\u80FD\u5B58\u5728\u591A\u4E2A\u9009\u533A\u3002\r\n * \u6BCF\u4E2A\u9009\u533A\u53EF\u80FD\u662F\u5355\u4E2A\u5355\u5143\u683C(\u5982 A1)\u6216\u591A\u4E2A\u5355\u5143\u683C\u7EC4\u6210\u7684\u77E9\u5F62\u533A\u57DF(\u5982 D9:E12)\r\n * @returns {Array}\r\n */\r\nexport function getRangeAxis() {\r\n    let result = [];\r\n    let rangeArr = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let sheetIndex = Store.currentSheetIndex;\r\n\r\n    rangeArr.forEach(ele=>{\r\n        let axisText = getRangetxt(sheetIndex, {column:ele.column,row:ele.row});\r\n        result.push(axisText);\r\n    })\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * \u8FD4\u56DE\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u8303\u56F4\u7684\u5355\u5143\u683C\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\uFF0C\u6BCF\u4E2A\u5355\u5143\u683C\u4E3A\u4E00\u4E2A\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getRangeValue(options = {}) {\r\n    let curOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if (!range || typeof range === 'object') {\r\n        return getdatabyselection(range, file.index);\r\n    } else if (typeof range === 'string') {\r\n        if (formula.iscelldata(range)) {\r\n            return getdatabyselection(formula.getcellrange(range), file.index)\r\n        } else {\r\n            tooltip.info('The range is invalid, please check range parameter.', '')\r\n        }\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u590D\u5236\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\uFF0C\u8FD4\u56DE\u5305\u542B`<table>`html\u683C\u5F0F\u7684\u6570\u636E\uFF0C\u53EF\u7528\u4E8E\u7C98\u8D34\u5230excel\u4E2D\u4FDD\u6301\u5355\u5143\u683C\u6837\u5F0F\u3002\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u9009\u533A\u8303\u56F4\r\n * @param {order} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\r\n */\r\nexport function getRangeHtml(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if (cfg[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if (has_PartMC) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (has_PartMC) {\r\n            return tooltip.info(\"Cannot perform this operation on partially merged cells\", \"\");\r\n        }\r\n    }\r\n\r\n    //\u591A\u91CD\u9009\u533A \u6709\u6761\u4EF6\u683C\u5F0F\u65F6 \u63D0\u793A\r\n    let cdformat = $.extend(true, [], file.luckysheet_conditionformat_save);\r\n    if (range.length > 1 && cdformat.length > 0) {\r\n        let hasCF = false;\r\n        let cf_compute = conditionformat.getComputeMap(file.index);\r\n\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            for (let r = r1; r <= r2; r++) {\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (conditionformat.checksCF(r, c, cf_compute) != null) {\r\n                        hasCF = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (hasCF) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (hasCF) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (hasCF) {\r\n            return tooltip.info(\"Cannot perform this operation on multiple selection areas, please select a single area\", \"\");\r\n        }\r\n    }\r\n\r\n    //\u591A\u91CD\u9009\u533A \u884C\u4E0D\u4E00\u6837\u4E14\u5217\u4E0D\u4E00\u6837\u65F6 \u63D0\u793A\r\n    if (range.length > 1) {\r\n        let isSameRow = true,\r\n            str_r = range[0].row[0],\r\n            end_r = range[0].row[1];\r\n        let isSameCol = true,\r\n            str_c = range[0].column[0],\r\n            end_c = range[0].column[1];\r\n\r\n        for (let s = 1; s < range.length; s++) {\r\n            if (range[s].row[0] != str_r || range[s].row[1] != end_r) {\r\n                isSameRow = false;\r\n            }\r\n\r\n            if (range[s].column[0] != str_c || range[s].column[1] != end_c) {\r\n                isSameCol = false;\r\n            }\r\n        }\r\n\r\n        if ((!isSameRow && !isSameCol) || selectIsOverlap(range)) {\r\n            return tooltip.info(\"Cannot perform this operation on multiple selection areas, please select a single area\", \"\");\r\n        }\r\n    }\r\n\r\n    let rowIndexArr = [], colIndexArr = [];\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            if(!rowIndexArr.includes(r)){\r\n                rowIndexArr.push(r);\r\n            }\r\n\r\n            for(let c = c1; c <= c2; c++){\r\n                if (cfg[\"colhidden\"] != null && cfg[\"colhidden\"][c] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if(!colIndexArr.includes(c)){\r\n                    colIndexArr.push(c);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let borderInfoCompute;\r\n    if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){ //\u8FB9\u6846\r\n        borderInfoCompute = getBorderInfoCompute(file.index);\r\n    }\r\n\r\n    let d = file.data;\r\n    if(d == null || d.length == 0){\r\n        d = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let cpdata = \"\";\r\n    let colgroup = \"\";\r\n\r\n    rowIndexArr = rowIndexArr.sort((a, b) => a - b);\r\n    colIndexArr = colIndexArr.sort((a, b) => a - b);\r\n\r\n    for (let i = 0; i < rowIndexArr.length; i++) {\r\n        let r = rowIndexArr[i];\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        cpdata += '<tr>';\r\n\r\n        for (let j = 0; j < colIndexArr.length; j++) {\r\n            let c = colIndexArr[j];\r\n\r\n            if (cfg[\"colhidden\"] != null && cfg[\"colhidden\"][c] != null) {\r\n                continue;\r\n            }\r\n\r\n            let column = '<td ${span} style=\"${style}\">';\r\n\r\n            if (d[r] != null && d[r][c] != null) {\r\n                let style = \"\", span = \"\";\r\n\r\n                if(r == rowIndexArr[0]){\r\n                    if(cfg[\"columnlen\"] == null || cfg[\"columnlen\"][c.toString()] == null){\r\n                        colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                    }\r\n                    else {\r\n                        colgroup += '<colgroup width=\"'+ cfg[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                    }\r\n                }\r\n\r\n                if(c == colIndexArr[0]){\r\n                    if(cfg[\"rowlen\"] == null || cfg[\"rowlen\"][r.toString()] == null){\r\n                        style += 'height:19px;';\r\n                    }\r\n                    else {\r\n                        style += 'height:'+ cfg[\"rowlen\"][r.toString()] + 'px;';\r\n                    }\r\n                }\r\n\r\n                let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n                let c_value;\r\n                if(d[r][c].ct != null && d[r][c].ct.fa != null && d[r][c].ct.fa.match(reg)){\r\n                    c_value = getcellvalue(r, c, d);\r\n                }\r\n                else{\r\n                    c_value = getcellvalue(r, c, d, \"m\");\r\n                }\r\n\r\n                style += menuButton.getStyleByCell(d, r, c);\r\n\r\n                if(getObjType(d[r][c]) == \"object\" && (\"mc\" in d[r][c])){\r\n                    if(\"rs\" in d[r][c][\"mc\"]){\r\n                        span = 'rowspan=\"'+ d[r][c][\"mc\"].rs +'\" colspan=\"'+ d[r][c][\"mc\"].cs +'\"';\r\n\r\n                        //\u8FB9\u6846\r\n                        if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                            let bl_obj = { \"color\": {}, \"style\": {} },\r\n                                br_obj = { \"color\": {}, \"style\": {} },\r\n                                bt_obj = { \"color\": {}, \"style\": {} },\r\n                                bb_obj = { \"color\": {}, \"style\": {} };\r\n\r\n                            for(let bd_r = r; bd_r < (r + d[r][c][\"mc\"].rs); bd_r++){\r\n                                for(let bd_c = c; bd_c < (c + d[r][c][\"mc\"].cs); bd_c++){\r\n                                    if(bd_r == r && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].t){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].t.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].t.color;\r\n\r\n                                        if(bt_obj[\"style\"][linetype] == null){\r\n                                            bt_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bt_obj[\"style\"][linetype] = bt_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bt_obj[\"color\"][bcolor] == null){\r\n                                            bt_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bt_obj[\"color\"][bcolor] = bt_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_r == (r + d[r][c][\"mc\"].rs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].b){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].b.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].b.color;\r\n\r\n                                        if(bb_obj[\"style\"][linetype] == null){\r\n                                            bb_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bb_obj[\"style\"][linetype] = bb_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bb_obj[\"color\"][bcolor] == null){\r\n                                            bb_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bb_obj[\"color\"][bcolor] = bb_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_c == c && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].l){\r\n                                        let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].l.color;\r\n\r\n                                        if(bl_obj[\"style\"][linetype] == null){\r\n                                            bl_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bl_obj[\"style\"][linetype] = bl_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bl_obj[\"color\"][bcolor] == null){\r\n                                            bl_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bl_obj[\"color\"][bcolor] = bl_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_c == (c + d[r][c][\"mc\"].cs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].r){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].r.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].r.color;\r\n\r\n                                        if(br_obj[\"style\"][linetype] == null){\r\n                                            br_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            br_obj[\"style\"][linetype] = br_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(br_obj[\"color\"][bcolor] == null){\r\n                                            br_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            br_obj[\"color\"][bcolor] = br_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            let rowlen = d[r][c][\"mc\"].rs, collen = d[r][c][\"mc\"].cs;\r\n\r\n                            if(JSON.stringify(bl_obj).length > 23){\r\n                                let bl_color = null, bl_style = null;\r\n\r\n                                for(let x in bl_obj.color){\r\n                                    if(bl_obj.color[x] >= (rowlen / 2)){\r\n                                        bl_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bl_obj.style){\r\n                                    if(bl_obj.style[x] >= (rowlen / 2)){\r\n                                        bl_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bl_color != null && bl_style != null){\r\n                                    style += \"border-left:\" + selection.getHtmlBorderStyle(bl_style, bl_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(br_obj).length > 23){\r\n                                let br_color = null, br_style = null;\r\n\r\n                                for(let x in br_obj.color){\r\n                                    if(br_obj.color[x] >= (rowlen / 2)){\r\n                                        br_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in br_obj.style){\r\n                                    if(br_obj.style[x] >= (rowlen / 2)){\r\n                                        br_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(br_color != null && br_style != null){\r\n                                    style += \"border-right:\" + selection.getHtmlBorderStyle(br_style, br_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(bt_obj).length > 23){\r\n                                let bt_color = null, bt_style = null;\r\n\r\n                                for(let x in bt_obj.color){\r\n                                    if(bt_obj.color[x] >= (collen / 2)){\r\n                                        bt_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bt_obj.style){\r\n                                    if(bt_obj.style[x] >= (collen / 2)){\r\n                                        bt_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bt_color != null && bt_style != null){\r\n                                    style += \"border-top:\" + selection.getHtmlBorderStyle(bt_style, bt_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(bb_obj).length > 23){\r\n                                let bb_color = null, bb_style = null;\r\n\r\n                                for(let x in bb_obj.color){\r\n                                    if(bb_obj.color[x] >= (collen / 2)){\r\n                                        bb_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bb_obj.style){\r\n                                    if(bb_obj.style[x] >= (collen / 2)){\r\n                                        bb_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bb_color != null && bb_style != null){\r\n                                    style += \"border-bottom:\" + selection.getHtmlBorderStyle(bb_style, bb_color);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        continue;\r\n                    }\r\n                }\r\n                else{\r\n                    //\u8FB9\u6846\r\n                    if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                        //\u5DE6\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].l){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                            style += \"border-left:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u53F3\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].r){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                            style += \"border-right:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u4E0B\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].b){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                            style += \"border-bottom:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //\u4E0A\u8FB9\u6846\r\n                        if(borderInfoCompute[r + \"_\" + c].t){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                            style += \"border-top:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                column = replaceHtml(column, {\"style\": style, \"span\": span});\r\n\r\n                if(c_value == null){\r\n                    c_value = getcellvalue(r, c, d);\r\n                }\r\n\r\n                if(c_value == null){\r\n                    c_value = \" \";\r\n                }\r\n\r\n                column += c_value;\r\n            }\r\n            else {\r\n                let style = \"\";\r\n\r\n                //\u8FB9\u6846\r\n                if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                    //\u5DE6\u8FB9\u6846\r\n                    if(borderInfoCompute[r + \"_\" + c].l){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                        style += \"border-left:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //\u53F3\u8FB9\u6846\r\n                    if(borderInfoCompute[r + \"_\" + c].r){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                        style += \"border-right:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //\u4E0B\u8FB9\u6846\r\n                    if(borderInfoCompute[r + \"_\" + c].b){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                        style += \"border-bottom:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //\u4E0A\u8FB9\u6846\r\n                    if(borderInfoCompute[r + \"_\" + c].t){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                        style += \"border-top:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n                }\r\n\r\n                column += \"\";\r\n\r\n                if(r == rowIndexArr[0]){\r\n                    if(cfg[\"columnlen\"] == null || cfg[\"columnlen\"][c.toString()] == null){\r\n                        colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                    }\r\n                    else {\r\n                        colgroup += '<colgroup width=\"'+ cfg[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                    }\r\n                }\r\n\r\n                if(c == colIndexArr[0]){\r\n                    if(cfg[\"rowlen\"] == null || cfg[\"rowlen\"][r.toString()] == null){\r\n                        style += 'height:19px;';\r\n                    }\r\n                    else {\r\n                        style += 'height:'+ cfg[\"rowlen\"][r.toString()] + 'px;';\r\n                    }\r\n                }\r\n\r\n                column = replaceHtml(column, {\"style\": style, \"span\": \"\"});\r\n                column += \" \";\r\n            }\r\n\r\n            column += '</td>';\r\n            cpdata += column;\r\n        }\r\n\r\n        cpdata += \"</tr>\";\r\n    }\r\n\r\n    cpdata = '<table data-type=\"luckysheet_copy_action_table\">' + colgroup + cpdata + '</table>';\r\n\r\n    return cpdata;\r\n}\r\n\r\n\r\n/**\r\n * \u590D\u5236\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\uFF0C\u8FD4\u56DE\u4E00\u7EF4\u3001\u4E8C\u7EF4\u6216\u8005\u81EA\u5B9A\u4E49\u884C\u5217\u6570\u7684\u4E8C\u7EF4\u6570\u7EC4\u7684\u6570\u636E\u3002\u53EA\u6709\u5728dimensional\u8BBE\u7F6E\u4E3Acustom\u7684\u65F6\u5019\uFF0C\u624D\u9700\u8981\u8BBE\u7F6Esetting\u4E2D\u7684row\u548Ccolumn\r\n * @param {String} dimensional \u6570\u7EC4\u7EF4\u5EA6\u3002\u53EF\u9009\u503C\u4E3A\uFF1AoneDimensional-\u4E00\u7EF4\u6570\u7EC4\uFF1BtwoDimensional-\u4E8C\u7EF4\u6570\u7EC4\uFF1B custom-\u81EA\u5B9A\u4E49\u884C\u5217\u6570\u7684\u4E8C\u7EF4\u6570\u7EC4\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.row dimensional\u4E3Acustom\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u591A\u7EF4\u6570\u7EC4\u7684\u884C\u6570\r\n * @param {Number} options.column dimensional\u4E3Acustom\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u591A\u7EF4\u6570\u7EC4\u7684\u5217\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getRangeArray(dimensional, options = {}) {\r\n    let dimensionalValues = ['oneDimensional', 'twoDimensional'];\r\n\r\n    if(!dimensionalValues.includes(dimensional)){\r\n        return tooltip.info(\"The dimensional parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1];\r\n    let c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info(\"Cannot perform this operation on partially merged cells\", \"\");\r\n        }\r\n    }\r\n\r\n    let data = file.data;\r\n    if(data == null || data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let dataArr = [];\r\n\r\n    if(dimensional == 'oneDimensional'){//\u4E00\u7EF4\u6570\u7EC4\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell == null || cell.v == null){\r\n                    dataArr.push(null);\r\n                }\r\n                else{\r\n                    dataArr.push(cell.v);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if(dimensional == 'twoDimensional'){\r\n        for(let r = r1; r <= r2; r++){\r\n            let row = [];\r\n\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell == null || cell.v == null){\r\n                    row.push(null);\r\n                }\r\n                else{\r\n                    row.push(cell.v);\r\n                }\r\n            }\r\n\r\n            dataArr.push(row);\r\n        }\r\n    }\r\n\r\n    return dataArr;\r\n}\r\n\r\n/**\r\n * \u590D\u5236\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\uFF0C\u8FD4\u56DEjson\u683C\u5F0F\u7684\u6570\u636E\r\n * @param {Boolean} isFirstRowTitle \u662F\u5426\u9996\u884C\u4E3A\u6807\u9898\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getRangeJson(isFirstRowTitle, options = {}) {\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale_drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale_drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, file.index);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n    if (isFirstRowTitle) {\r\n        if (getdata.length === 1) {\r\n            let obj = {};\r\n            for (let i = 0; i < getdata[0].length; i++) {\r\n                obj[getcellvalue(0, i, getdata)] = \"\";\r\n            }\r\n            arr.push(obj);\r\n        } else {\r\n            for (let r = 1; r < getdata.length; r++) {\r\n                let obj = {};\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    if(getcellvalue(0, c, getdata) == undefined){\r\n                        obj[\"\"] = getcellvalue(r, c, getdata);\r\n                    }else{\r\n                        obj[getcellvalue(0, c, getdata)] = getcellvalue(r, c, getdata);\r\n                    }\r\n                }\r\n                arr.push(obj);\r\n            }\r\n        }\r\n    } else {\r\n        let st = range[\"column\"][0];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let obj = {};\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                obj[chatatABC(c + st)] = getcellvalue(r, c, getdata);\r\n            }\r\n            arr.push(obj);\r\n        }\r\n    }\r\n    // selection.copybyformat(new Event('click'), JSON.stringify(arr));\r\n    return arr;\r\n}\r\n\r\n/**\r\n *\r\n * @param {String} type \u5BF9\u89D2\u7EBF\u8FD8\u662F\u5BF9\u89D2\u7EBF\u504F\u79FB \"normal\"-\u5BF9\u89D2\u7EBF  \"anti\"-\u53CD\u5BF9\u89D2\u7EBF\r\n\"offset\"-\u5BF9\u89D2\u7EBF\u504F\u79FB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.column type\u4E3Aoffset\u7684\u65F6\u5019\u8BBE\u7F6E\uFF0C\u5BF9\u89D2\u504F\u79FB\u7684\u5217\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getRangeDiagonal(type, options = {}) {\r\n    let typeValues = ['normal', 'anti', 'offset'];\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'normal\\', \\'anti\\', \\'offset\\']', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        column = 1,\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale().drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale().drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range[0].row[0],\r\n        r2 = range[0].row[1],\r\n        c1 = range[0].column[0],\r\n        c2 = range[0].column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, order);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n\r\n    let clen = getdata[0].length;\r\n    switch (type) {\r\n        case 'normal':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][r]);\r\n            }\r\n            break;\r\n        case 'anti':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][clen - r - 1]);\r\n            }\r\n            break;\r\n        case 'offset':\r\n            if(column.toString() == \"NaN\"){\r\n                if(isEditMode()){\r\n                    alert(locale().drag.inputCorrect);\r\n                } else{\r\n                    tooltip.info(locale().drag.inputCorrect, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            if(column < 0){\r\n                if(isEditMode()){\r\n                    alert(locale().drag.offsetColumnLessZero);\r\n                } else{\r\n                    tooltip.info(locale().drag.offsetColumnLessZero, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r + column >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][r + column]);\r\n            }\r\n            break;\r\n    }\r\n    selection.copybyformat(new Event(), JSON.stringify(arr));\r\n}\r\n\r\n/**\r\n * \u590D\u5236\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\uFF0C\u8FD4\u56DE\u5E03\u5C14\u503C\u7684\u6570\u636E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function getRangeBoolean(options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale().drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale().drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range[0].row[0],\r\n        r2 = range[0].row[1],\r\n        c1 = range[0].column[0],\r\n        c2 = range[0].column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, order);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n    for (let r = 0; r < getdata.length; r++) {\r\n        let a = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let bool = false;\r\n\r\n            let v;\r\n            if(getObjType(getdata[r][c]) == \"object\"){\r\n                v = getdata[r][c].v;\r\n            } else{\r\n                v = getdata[r][c];\r\n            }\r\n\r\n            if (v == null || v == \"\") {\r\n                bool = false;\r\n            } else {\r\n                v = parseInt(v);\r\n                if (v == null || v > 0) {\r\n                    bool = true;\r\n                } else {\r\n                    bool = false;\r\n                }\r\n            }\r\n            a.push(bool);\r\n        }\r\n        arr.push(a);\r\n    }\r\n\r\n    selection.copybyformat(event, JSON.stringify(arr));\r\n}\r\n\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u9009\u4E2D\u4E00\u4E2A\u6216\u591A\u4E2A\u9009\u533A\u4E3A\u9009\u4E2D\u72B6\u6001\u5E76\u9009\u62E9\u662F\u5426\u9AD8\u4EAE\uFF0C\u652F\u6301\u591A\u79CD\u683C\u5F0F\u8BBE\u7F6E\u3002\r\n * @param {Array | Object | String} range \u9009\u533A\u8303\u56F4\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Boolean} options.show \u662F\u5426\u663E\u793A\u9AD8\u4EAE\u9009\u4E2D\u6548\u679C\uFF1B\u9ED8\u8BA4\u503C\u4E3A `true`\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeShow(range, options = {}) {\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) == 'array'){\r\n        for(let i = 0; i < range.length; i++){\r\n            if(getObjType(range[i]) === 'string'){\r\n                if(!formula.iscelldata(range[i])){\r\n                    return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n                }\r\n                let cellrange = formula.getcellrange(range[i]);\r\n                range[i] = {\r\n                    \"row\": cellrange.row,\r\n                    \"column\": cellrange.column\r\n                }\r\n            }\r\n            else if(getObjType(range) == 'object'){\r\n                if(range.row == null || range.column == null){\r\n                    return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n                }\r\n                range = {\r\n                    \"row\": range.row,\r\n                    \"column\": range.column\r\n                };\r\n            }\r\n        }\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        show = true,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let changeparam = menuButton.mergeMoveMain(range[i].column, range[i].row, range[i]);\r\n        if(changeparam) {\r\n            range[i] = {\r\n                \"row\": changeparam[1],\r\n                \"column\": changeparam[0]\r\n            }\r\n        }\r\n    }\r\n\r\n    file.luckysheet_select_save = range;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.luckysheet_select_save = range;\r\n        selectHightlightShow();\r\n\r\n        if(!show){\r\n            $(\"#luckysheet-cell-selected-boxs\").hide();\r\n            $(\"#luckysheet-cell-selected-focus\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n            $(\"#luckysheet-rows-h-selected\").empty();\r\n            $(\"#luckysheet-cols-h-selected\").empty();\r\n        }\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u5C06\u4E00\u4E2A\u5355\u5143\u683C\u6570\u7EC4\u6570\u636E\u8D4B\u503C\u5230\u6307\u5B9A\u7684\u533A\u57DF\uFF0C\u6570\u636E\u683C\u5F0F\u540CgetRangeValue\u65B9\u6CD5\u53D6\u5230\u7684\u6570\u636E\u3002\r\n * @param {Array[Array]} data \u8981\u8D4B\u503C\u7684\u5355\u5143\u683C\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\uFF0C\u6BCF\u4E2A\u5355\u5143\u683C\u7684\u503C\uFF0C\u53EF\u4EE5\u4E3A\u5B57\u7B26\u4E32\u6216\u6570\u5B57\uFF0C\u6216\u4E3A\u7B26\u5408Luckysheet\u683C\u5F0F\u7684\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Boolean} options.isRefresh \u662F\u5426\u5237\u65B0\u754C\u9762\uFF1B\u9ED8\u8BA4\u4E3Atrue\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeValue(data, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let {\r\n        range = curRange,\r\n        isRefresh = true,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if (data == null) {\r\n        return tooltip.info('The data which will be set to range cannot be null.', '')\r\n    }\r\n\r\n    if (range instanceof Array) {\r\n        return tooltip.info('setRangeValue only supports a single selection.', '')\r\n    }\r\n\r\n    if (typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let rowCount = range.row[1] - range.row[0] + 1,\r\n        columnCount = range.column[1] - range.column[0] + 1;\r\n\r\n    if (data.length !== rowCount || data[0].length !== columnCount) {\r\n        return tooltip.info('The data to be set does not match the selection.', '')\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n    let sheetData = $.extend(true, [], file.data);\r\n\r\n    for (let i = 0; i < rowCount; i++) {\r\n        for (let j = 0; j < columnCount; j++) {\r\n            let row = range.row[0] + i,\r\n                column = range.column[0] + j;\r\n            setCellValue(row, column, data[i][j], {order: order, isRefresh: false})\r\n        }\r\n    }\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    file.data.length = 0;\r\n    file.data.push(...sheetData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, [{\r\n            row: range.row,\r\n            column: range.column,\r\n        }], undefined, true, false);\r\n    }\r\n\r\n    if(isRefresh) {\r\n        luckysheetrefreshgrid();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u8303\u56F4\u7684\u5355\u5143\u683C\u683C\u5F0F\uFF0C\u4E00\u822C\u7528\u4F5C\u5904\u7406\u683C\u5F0F\uFF0C\u8D4B\u503C\u64CD\u4F5C\u63A8\u8350\u4F7F\u7528setRangeValue\u65B9\u6CD5\r\n * @param {String} attr \u8981\u8D4B\u503C\u7684\u5355\u5143\u683C\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\uFF0C\u6BCF\u4E2A\u5355\u5143\u683C\u7684\u503C\uFF0C\u53EF\u4EE5\u4E3A\u5B57\u7B26\u4E32\u6216\u6570\u5B57\uFF0C\u6216\u4E3A\u7B26\u5408Luckysheet\u683C\u5F0F\u7684\u5BF9\u8C61\r\n * @param {Number | String | Object} value \u5177\u4F53\u7684\u8BBE\u7F6E\u503C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u8BBE\u7F6E\u53C2\u6570\u7684\u76EE\u6807\u9009\u533A\u8303\u56F4\uFF0C\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n */\r\nexport function setSingleRangeFormat(attr, value, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n    } = {...options}\r\n\r\n    if (!attr) {\r\n        tooltip.info('Arguments attr cannot be null or undefined.', '')\r\n        return 'error';\r\n    }\r\n\r\n    if (range instanceof Array) {\r\n        tooltip.info('setRangeValue only supports a single selection.', '')\r\n        return 'error';\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            tooltip.info(\"The range parameter is invalid.\", \"\");\r\n            return 'error';\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        return 'error';\r\n    }\r\n\r\n    for (let r = range.row[0]; r <= range.row[1]; r++) {\r\n        for (let c = range.column[0]; c <= range.column[1]; c++) {\r\n            console.log('r',r);\r\n            console.log('c',c);\r\n            setCellValue(r, c, {[attr]: value}, {\r\n                order: order,\r\n                isRefresh: false,\r\n              })\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u8303\u56F4\u7684\u5355\u5143\u683C\u683C\u5F0F\uFF0C\u4E00\u822C\u7528\u4F5C\u5904\u7406\u683C\u5F0F\u3002\u652F\u6301\u591A\u9009\u533A\u8BBE\u7F6E\r\n * @param {String} attr \u8981\u8D4B\u503C\u7684\u5355\u5143\u683C\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\uFF0C\u6BCF\u4E2A\u5355\u5143\u683C\u7684\u503C\uFF0C\u53EF\u4EE5\u4E3A\u5B57\u7B26\u4E32\u6216\u6570\u5B57\uFF0C\u6216\u4E3A\u7B26\u5408Luckysheet\u683C\u5F0F\u7684\u5BF9\u8C61\r\n * @param {Number | String | Object} value \u5177\u4F53\u7684\u8BBE\u7F6E\u503C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u8BBE\u7F6E\u53C2\u6570\u7684\u76EE\u6807\u9009\u533A\u8303\u56F4\uFF0C\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\n export function setRangeFormat(attr, value, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    let result = []\r\n\r\n    for (let i = 0; i < range.length; i++) {\r\n        result.push(setSingleRangeFormat(attr, value, { range: range[i], order: order }));\r\n    }\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    if(result.some(i => i === 'error')) {\r\n        file.data.length = 0;\r\n        file.data.push(...fileData);\r\n        return false;\r\n    }\r\n\r\n    file.data.length = 0;\r\n    file.data.push(...fileData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, undefined, undefined, true, false);\r\n    }\r\n\r\n    luckysheetrefreshgrid();\r\n\r\n    if (success && typeof success === 'function') {\r\n    }\r\n}\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u5F00\u542F\u6216\u5173\u95ED\u7B5B\u9009\u529F\u80FD\r\n * @param {String} type \u6253\u5F00\u8FD8\u662F\u5173\u95ED\u7B5B\u9009\u529F\u80FD  open-\u6253\u5F00\u7B5B\u9009\u529F\u80FD\uFF0C\u8FD4\u56DE\u5F53\u524D\u7B5B\u9009\u7684\u8303\u56F4\u5BF9\u8C61\uFF1Bclose-\u5173\u95ED\u7B5B\u9009\u529F\u80FD\uFF0C\u8FD4\u56DE\u5173\u95ED\u524D\u7B5B\u9009\u7684\u8303\u56F4\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Object} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeFilter(type, options = {}) {\r\n    let typeValues = ['open', 'close'];\r\n\r\n    if(!typeValues.includes(type)){\r\n        return tooltip.info(\"The type parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    if(type == 'open'){\r\n        file.filter_select = range;\r\n\r\n        if(file.index == Store.currentSheetIndex){\r\n            createFilterOptions(range, file.filter);\r\n        }\r\n\r\n        return {\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        };\r\n    }\r\n    else if(type == 'close'){\r\n        let luckysheet_filter_save = $.extend(true, {}, file.filter_select);\r\n\r\n        file.filter_select = null;\r\n\r\n        $(\"#luckysheet-filter-selected-sheet\" + file.index).remove();\r\n        $(\"#luckysheet-filter-options-sheet\" + file.index).remove();\r\n\r\n        return {\r\n            \"row\": luckysheet_filter_save.row,\r\n            \"column\": luckysheet_filter_save.column\r\n        };\r\n    }\r\n}\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u8BBE\u5B9A\u5408\u5E76\u5355\u5143\u683C\r\n * @param {String} type \u5408\u5E76\u7C7B\u578B all-\u5168\u90E8\u5408\u5E76  horizontal-\u6C34\u5E73\u5408\u5E76  vertical-\u5782\u76F4\u5408\u5E76\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Object} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeMerge(type, options = {}) {\r\n    let typeValues = ['all', 'horizontal', 'vertical'];\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'all\\', \\'horizontal\\', \\'vertical\\']', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        data = $.extend(true, [], file.data);\r\n\r\n    if(data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(!range.hasOwnProperty(\"row\") || !range.hasOwnProperty(\"column\")){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }]\r\n    }\r\n\r\n    //\u4E0D\u80FD\u5408\u5E76\u91CD\u53E0\u533A\u57DF\r\n    if(selectIsOverlap(range)){\r\n        return tooltip.info('Cannot merge overlapping range', '');\r\n    }\r\n\r\n    //\u9009\u533A\u662F\u5426\u542B\u6709 \u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = false;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if(has_PartMC){\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n        }\r\n    }else {\r\n        cfg.merge = {}\r\n    }\r\n\r\n    //\u9009\u533A\u662F\u5426\u542B\u6709 \u5408\u5E76\u7684\u5355\u5143\u683C\r\n    let isHasMc = false;\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let r1 = range[i].row[0],\r\n            r2 = range[i].row[1];\r\n        let c1 = range[i].column[0],\r\n            c2 = range[i].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    isHasMc = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(isHasMc){\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if(isHasMc){//\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF08\u9009\u533A\u90FD\u6267\u884C \u53D6\u6D88\u5408\u5E76\uFF09\r\n        cancelRangeMerge({\r\n            range: range,\r\n            order: order\r\n        })\r\n    }\r\n    else{\r\n        for(let i = 0; i < range.length; i++){\r\n            let r1 = range[i].row[0],\r\n                r2 = range[i].row[1];\r\n            let c1 = range[i].column[0],\r\n                c2 = range[i].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                continue;\r\n            }\r\n\r\n            if(type == \"all\"){\r\n                let fv = {}, isfirst = false;\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r1, \"c\": c1 } };\r\n                    }\r\n                }\r\n\r\n                data[r1][c1] = fv;\r\n                data[r1][c1].mc = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                cfg[\"merge\"][r1 + \"_\" + c1] = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n            }\r\n            else if(type == \"vertical\"){\r\n                for(let c = c1; c <= c2; c++){\r\n                    let fv = {}, isfirst = false;\r\n\r\n                    for(let r = r1; r <= r2; r++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r1, \"c\": c } };\r\n                    }\r\n\r\n                    data[r1][c] = fv;\r\n                    data[r1][c].mc = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n\r\n                    cfg[\"merge\"][r1 + \"_\" + c] = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n                }\r\n            }\r\n            else if(type == \"horizontal\"){\r\n                for(let r = r1; r <= r2; r++){\r\n                    let fv = {}, isfirst = false;\r\n\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r, \"c\": c1 } };\r\n                    }\r\n\r\n                    data[r][c1] = fv;\r\n                    data[r][c1].mc = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                    cfg[\"merge\"][r + \"_\" + c1] = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n                }\r\n            }\r\n        }\r\n\r\n        if(order == curSheetOrder){\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push({\r\n                    \"type\": \"mergeChange\",\r\n                    \"sheetIndex\": file.index,\r\n                    \"data\": $.extend(true, [], file.data),\r\n                    \"curData\": data,\r\n                    \"range\": range,\r\n                    \"config\": $.extend(true, {}, file.config),\r\n                    \"curConfig\": cfg\r\n                });\r\n            }\r\n\r\n            Store.clearjfundo = false;\r\n            jfrefreshgrid(data, range, {\"cfg\": cfg});\r\n            Store.clearjfundo = true;\r\n        }\r\n        else{\r\n            file.data = data;\r\n            file.config = cfg;\r\n        }\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u53D6\u6D88\u5408\u5E76\u5355\u5143\u683C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Object} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function cancelRangeMerge(options = {}) {\r\n    let curRange = Store.luckysheet_select_save,\r\n        curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        data = $.extend(true, [], file.data);\r\n\r\n    if(data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(!range.hasOwnProperty(\"row\") || !range.hasOwnProperty(\"column\")){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }]\r\n    }\r\n\r\n    //\u4E0D\u80FD\u5408\u5E76\u91CD\u53E0\u533A\u57DF\r\n    if(selectIsOverlap(range)){\r\n        return tooltip.info('Cannot merge overlapping range', '');\r\n    }\r\n\r\n    //\u9009\u533A\u662F\u5426\u542B\u6709 \u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = false;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if(has_PartMC){\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n        }\r\n    }\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let r1 = range[i].row[0],\r\n            r2 = range[i].row[1];\r\n        let c1 = range[i].column[0],\r\n            c2 = range[i].column[1];\r\n\r\n        if(r1 == r2 && c1 == c2){\r\n            continue;\r\n        }\r\n\r\n        let fv = {};\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell != null && cell.mc != null){\r\n                    let mc_r = cell.mc.r, mc_c = cell.mc.c;\r\n\r\n                    if(\"rs\" in cell.mc){\r\n                        delete cell.mc;\r\n                        delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                        fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                    }\r\n                    else{\r\n                        // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                        let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                        delete cell_clone.v;\r\n                        delete cell_clone.m;\r\n                        delete cell_clone.ct;\r\n                        delete cell_clone.f;\r\n                        delete cell_clone.spl;\r\n\r\n                        data[r][c] = cell_clone;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(order == curSheetOrder){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push({\r\n                \"type\": \"mergeChange\",\r\n                \"sheetIndex\": file.index,\r\n                \"data\": $.extend(true, [], file.data),\r\n                \"curData\": data,\r\n                \"range\": range,\r\n                \"config\": $.extend(true, {}, file.config),\r\n                \"curConfig\": cfg\r\n            });\r\n        }\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(data, range, {\"cfg\": cfg});\r\n        Store.clearjfundo = true;\r\n    }\r\n    else{\r\n        file.data = data;\r\n        file.config = cfg;\r\n    }\r\n}\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u5F00\u542F\u6392\u5E8F\u529F\u80FD\uFF0C\u8FD4\u56DE\u9009\u5B9A\u8303\u56F4\u6392\u5E8F\u540E\u7684\u6570\u636E\u3002\r\n * @param {String} type \u6392\u5E8F\u7C7B\u578B asc-\u5347\u5E8F desc-\u964D\u5E8F\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeSort(type, options = {}) {\r\n    let typeValues = ['asc', 'desc']\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'asc\\', \\'desc\\'', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        fileData = $.extend(true, [], file.data);\r\n\r\n    if(fileData.length == 0){\r\n        fileData = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().sort.noRangeError, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    let hasMc = false; //Whether the sort selection has merged cells\r\n    let data = [];\r\n    for(let r = r1; r <= r2; r++){\r\n        let data_row = [];\r\n        for(let c = c1; c <= c2; c++){\r\n            if(fileData[r][c] != null && fileData[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n            data_row.push(fileData[r][c]);\r\n        }\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        tooltip.info(locale().sort.mergeError, \"\");\r\n        return;\r\n    }\r\n\r\n    data = orderbydata([].concat(data), 0, type === 'asc');\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            fileData[r][c] = data[r - r1][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(cfg[\"rowlen\"] != null){\r\n        cfg = rowlenByRange(fileData, r1, r2, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid(fileData, [{ \"row\": [r1, r2], \"column\": [c1, c2] }], allParam);\r\n    }\r\n    else{\r\n        file.data = fileData;\r\n        file.config = cfg;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u5F00\u542F\u591A\u5217\u81EA\u5B9A\u4E49\u6392\u5E8F\u529F\u80FD\uFF0C\u8FD4\u56DE\u9009\u5B9A\u8303\u56F4\u6392\u5E8F\u540E\u7684\u6570\u636E\u3002\r\n * @param {Boolean} hasTitle \u6570\u636E\u662F\u5426\u5177\u6709\u6807\u9898\u884C\r\n * @param {Array} sort \u5217\u8BBE\u7F6E\uFF0C\u8BBE\u7F6E\u9700\u8981\u6392\u5E8F\u7684\u5217\u7D22\u5F15\u548C\u6392\u5E8F\u65B9\u5F0F\uFF0C\u683C\u5F0F\u5982\uFF1A[{ i:0,sort:'asc' },{ i:1,sort:'des' }]\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeSortMulti(hasTitle, sort, options = {}) {\r\n    if (!sort || !(sort instanceof Array)) {\r\n        return tooltip.info('The sort parameter is invalid.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        fileData = $.extend(true, [], file.data);\r\n\r\n    if(fileData.length == 0){\r\n        fileData = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().sort.noRangeError, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    let str;\r\n    if(hasTitle){\r\n        str = r1 + 1;\r\n    } else{\r\n        str = r1;\r\n    }\r\n\r\n    let hasMc = false; //Whether the sort selection has merged cells\r\n    let data = [];\r\n    for(let r = str; r <= r2; r++){\r\n        let data_row = [];\r\n        for(let c = c1; c <= c2; c++){\r\n            if(fileData[r][c] != null && fileData[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n            data_row.push(fileData[r][c]);\r\n        }\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        tooltip.info(locale().sort.mergeError, \"\");\r\n        return;\r\n    }\r\n\r\n    sort.forEach(sortItem => {\r\n        let i = sortItem.i;\r\n        i -= c1;\r\n        data = orderbydata([].concat(data), i, sortItem.sort === 'asc');\r\n    })\r\n\r\n    for(let r = str; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            fileData[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(cfg[\"rowlen\"] != null){\r\n        cfg = rowlenByRange(fileData, str, r2, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    if (file.index === Store.currentSheetIndex) {\r\n        jfrefreshgrid(fileData, [{ \"row\": [str, r2], \"column\": [c1, c2] }], allParam);\r\n    }\r\n    else{\r\n        file.data = fileData;\r\n        file.config = cfg;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n *  \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u5F00\u542F\u6761\u4EF6\u683C\u5F0F\uFF0C\u6839\u636E\u8BBE\u7F6E\u7684\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u7A81\u51FA\u663E\u793A\u90E8\u5206\u5355\u5143\u683C\uFF0C\u8FD4\u56DE\u5F00\u542F\u6761\u4EF6\u683C\u5F0F\u540E\u7684\u6570\u636E\u3002\r\n * @param {String} conditionName \u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u7C7B\u578B\r\n * @param {Object} conditionValue \u53EF\u4EE5\u8BBE\u7F6E\u6761\u4EF6\u5355\u5143\u683C\u6216\u8005\u6761\u4EF6\u503C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object} options.format \u989C\u8272\u8BBE\u7F6E\r\n * @param {Array | Object | String} options.cellrange \u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeConditionalFormatDefault(conditionName, conditionValue, options = {}) {\r\n    let conditionNameValues = [\r\n        'greaterThan',\r\n        'lessThan',\r\n        'betweenness',\r\n        'equal',\r\n        'textContains',\r\n        'occurrenceDate',\r\n        'duplicateValue',\r\n        'top10',\r\n        'top10%',\r\n        'last10',\r\n        'last10%',\r\n        'AboveAverage',\r\n        'SubAverage'\r\n    ];\r\n\r\n    if(!conditionName || !conditionNameValues.includes(conditionName)){\r\n        return tooltip.info('The conditionName parameter is invalid.', '');\r\n    }\r\n\r\n    if(getObjType(conditionValue) != 'array' || conditionValue.length == 0){\r\n        return tooltip.info('The conditionValue parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        format = {\r\n            \"textColor\": \"#000000\",\r\n            \"cellColor\": \"#ff0000\"\r\n        },\r\n        cellrange = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    cellrange = JSON.parse(JSON.stringify(cellrange));\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let data = file.data;\r\n\r\n    if(data == null || data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    if(file == null){\r\n        return tooltip.info('Incorrect worksheet index', '');\r\n    }\r\n\r\n    const conditionformat_Text = locale().conditionformat;\r\n\r\n    let conditionRange = [], conditionValue2 = [];\r\n\r\n    if(conditionName == 'betweenness'){\r\n        let v1 = conditionValue[0];\r\n        let v2 = conditionValue[1];\r\n\r\n        //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n        let rangeArr1 = conditionformat.getRangeByTxt(v1);\r\n        if(rangeArr1.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr1.length == 1){\r\n            let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n            let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v1 = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                conditionValue2.push(v1);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr1.length == 0){\r\n            if(isNaN(v1) || v1 == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v1);\r\n            }\r\n        }\r\n\r\n        let rangeArr2 = conditionformat.getRangeByTxt(v2);\r\n        if(rangeArr2.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr2.length == 1){\r\n            let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n            let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v2 = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                conditionValue2.push(v2);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr2.length == 0){\r\n            if(isNaN(v2) || v2 == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v2);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'equal'){\r\n        let v = conditionValue[0];\r\n\r\n        //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n        let rangeArr = conditionformat.getRangeByTxt(v);\r\n        if(rangeArr.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr.length == 1){\r\n            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                conditionValue2.push(v);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr.length == 0){\r\n            if(isNaN(v) || v == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'textContains'){\r\n        let v = conditionValue[0];\r\n\r\n        //\u6761\u4EF6\u503C\u662F\u5426\u662F\u9009\u533A\r\n        let rangeArr = conditionformat.getRangeByTxt(v);\r\n        if(rangeArr.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr.length == 1){\r\n            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                conditionValue2.push(v);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr.length == 0){\r\n            if(v == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'occurrenceDate'){\r\n        let v1 = conditionValue[0];\r\n        let v2 = conditionValue[1];\r\n\r\n        if(!isdatetime(v1) || !isdatetime(v2)){\r\n            return tooltip.info('The conditionValue parameter is invalid.', '');\r\n        }\r\n\r\n        let v;\r\n        if(diff(v1, v2) > 0){\r\n            v = dayjs(v2).format(\"YYYY/MM/DD\") + \"-\" + dayjs(v1).format(\"YYYY/MM/DD\");\r\n        }\r\n        else{\r\n            v = dayjs(v1).format(\"YYYY/MM/DD\") + \"-\" + dayjs(v2).format(\"YYYY/MM/DD\");\r\n        }\r\n\r\n        conditionValue2.push(v);\r\n    }\r\n    else if(conditionName == 'duplicateValue'){\r\n        let v = conditionValue[0];\r\n\r\n        if(v != '0' || v != '1'){\r\n            return tooltip.info('The conditionValue parameter is invalid.', '');\r\n        }\r\n\r\n        conditionValue2.push(v);\r\n    }\r\n    else if(conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%'){\r\n        let v = conditionValue[0];\r\n\r\n        if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n            conditionformat.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n            return;\r\n        }\r\n\r\n        conditionValue2.push(parseInt(v));\r\n    }\r\n    else if(conditionName == 'AboveAverage' || conditionName == 'SubAverage'){\r\n        conditionValue2.push(conditionName);\r\n    }\r\n\r\n    if(!format.hasOwnProperty(\"textColor\") || !format.hasOwnProperty(\"cellColor\")){\r\n        return tooltip.info('The format parameter is invalid.', '');\r\n    }\r\n\r\n    if(getObjType(cellrange) == 'string'){\r\n        cellrange = conditionformat.getRangeByTxt(cellrange);\r\n    }\r\n    else if(getObjType(cellrange) == 'object'){\r\n        cellrange = [cellrange];\r\n    }\r\n\r\n    if(getObjType(cellrange) != 'array'){\r\n        return tooltip.info('The cellrange parameter is invalid.', '');\r\n    }\r\n\r\n    let rule = {\r\n        \"type\": \"default\",\r\n        \"cellrange\": cellrange,\r\n        \"format\": format,\r\n        \"conditionName\": conditionName,\r\n        \"conditionRange\": conditionRange,\r\n        \"conditionValue\": conditionValue2\r\n    };\r\n\r\n    //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n    let ruleArr = file[\"luckysheet_conditionformat_save\"] || [];\r\n    ruleArr.push(rule);\r\n    file[\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //\u53D1\u9001\u7ED9\u540E\u53F0\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u7D22\u5F15\u7684\u5DE5\u4F5C\u8868\uFF0C\u9009\u5B9A\u7684\u8303\u56F4\u5F00\u542F\u6761\u4EF6\u683C\u5F0F\uFF0C\u8FD4\u56DE\u5F00\u542F\u6761\u4EF6\u683C\u5F0F\u540E\u7684\u6570\u636E\u3002\r\n * @param {String} type \u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u7C7B\u578B\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | String} options.format \u989C\u8272\u8BBE\u7F6E\r\n * @param {Array | Object | String} options.cellrange \u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setRangeConditionalFormat(type, options = {}) {\r\n    let typeValues = [\r\n        'dataBar',\r\n        'colorGradation',\r\n        'icons'\r\n    ];\r\n\r\n    if(!type || !typeValues.includes(type)){\r\n        return tooltip.info('The type parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        format,\r\n        cellrange = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    cellrange = JSON.parse(JSON.stringify(cellrange));\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info('Incorrect worksheet index', '');\r\n    }\r\n\r\n    if(type == 'dataBar'){\r\n        if(format == null){\r\n            format = [\"#638ec6\", \"#ffffff\"];\r\n        }\r\n\r\n        if(getObjType(format) != 'array' || format.length < 1 || format.length > 2){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n    }\r\n    else if(type == 'colorGradation'){\r\n        if(format == null){\r\n            format = [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"];\r\n        }\r\n\r\n        if(getObjType(format) != 'array' || format.length < 2 || format.length > 3){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n    }\r\n    else if(type == 'icons'){\r\n        if(format == null){\r\n            format = \"threeWayArrowMultiColor\";\r\n        }\r\n\r\n        let formatValues = [\r\n            'threeWayArrowMultiColor',\r\n            'threeTriangles',\r\n            'fourWayArrowMultiColor',\r\n            'fiveWayArrowMultiColor',\r\n            'threeWayArrowGrayColor',\r\n            'fourWayArrowGrayColor',\r\n            'fiveWayArrowGrayColor',\r\n            'threeColorTrafficLightRimless',\r\n            'threeSigns',\r\n            'greenRedBlackGradient',\r\n            'threeColorTrafficLightBordered',\r\n            'fourColorTrafficLight',\r\n            'threeSymbolsCircled',\r\n            'tricolorFlag',\r\n            'threeSymbolsnoCircle',\r\n            'threeStars',\r\n            'fiveQuadrantDiagram',\r\n            'fiveBoxes',\r\n            'grade4',\r\n            'grade5'\r\n        ];\r\n\r\n        if(getObjType(format) != 'string' || !formatValues.includes(format)){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n\r\n        switch (format) {\r\n            case 'threeWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 0\r\n                };\r\n                break;\r\n            case 'threeTriangles':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 1\r\n                };\r\n                break;\r\n            case 'fourWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 2\r\n                };\r\n                break;\r\n            case 'fiveWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 3\r\n                };\r\n                break;\r\n            case 'threeWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 0\r\n                };\r\n                break;\r\n            case 'fourWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 1\r\n                };\r\n                break;\r\n            case 'fiveWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 2\r\n                };\r\n                break;\r\n            case 'threeColorTrafficLightRimless':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 4\r\n                };\r\n                break;\r\n            case 'threeSigns':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 5\r\n                };\r\n                break;\r\n            case 'greenRedBlackGradient':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 6\r\n                };\r\n                break;\r\n            case 'threeColorTrafficLightBordered':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 4\r\n                };\r\n                break;\r\n            case 'fourColorTrafficLight':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 5\r\n                };\r\n                break;\r\n            case 'threeSymbolsCircled':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 7\r\n                };\r\n                break;\r\n            case 'tricolorFlag':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 8\r\n                };\r\n                break;\r\n            case 'threeSymbolsnoCircle':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 7\r\n                };\r\n                break;\r\n            case 'threeStars':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 9\r\n                };\r\n                break;\r\n            case 'fiveQuadrantDiagram':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 10\r\n                };\r\n                break;\r\n            case 'fiveBoxes':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 11\r\n                };\r\n                break;\r\n            case 'grade4':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 9\r\n                };\r\n                break;\r\n            case 'grade5':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 10\r\n                };\r\n                break;\r\n        }\r\n    }\r\n\r\n    if(getObjType(cellrange) == 'string'){\r\n        cellrange = conditionformat.getRangeByTxt(cellrange);\r\n    }\r\n    else if(getObjType(cellrange) == 'object'){\r\n        cellrange = [cellrange];\r\n    }\r\n\r\n    if(getObjType(cellrange) != 'array'){\r\n        return tooltip.info('The cellrange parameter is invalid.', '');\r\n    }\r\n\r\n    let rule = {\r\n        \"type\": type,\r\n        \"cellrange\": cellrange,\r\n        \"format\": format\r\n    };\r\n\r\n    //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n    let ruleArr = file[\"luckysheet_conditionformat_save\"] || [];\r\n    ruleArr.push(rule);\r\n    file[\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //\u53D1\u9001\u7ED9\u540E\u53F0\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u4E3A\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\uFF0C\u5220\u9664\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\uFF0C\u8FD4\u56DE\u88AB\u5220\u9664\u7684\u6761\u4EF6\u683C\u5F0F\u89C4\u5219\r\n * @param {Number} itemIndex \u6761\u4EF6\u683C\u5F0F\u89C4\u5219\u7D22\u5F15\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteRangeConditionalFormat(itemIndex, options = {}) {\r\n    if(!isRealNum(itemIndex)){\r\n        return tooltip.info('The itemIndex parameter is invalid.', '');\r\n    }\r\n\r\n    itemIndex = Number(itemIndex);\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info('The order parameter is invalid.', '');\r\n    }\r\n\r\n    let cdformat = $.extend(true, [], file.luckysheet_conditionformat_save);\r\n\r\n    if(cdformat.length == 0){\r\n        return tooltip.info('This worksheet has no conditional format to delete', '');\r\n    }\r\n    else if(cdformat[itemIndex] == null){\r\n        return tooltip.info('The conditional format of the index cannot be found', '');\r\n    }\r\n\r\n    let cdformatItem = cdformat.splice(itemIndex, 1);\r\n\r\n    //\u4FDD\u5B58\u4E4B\u524D\u7684\u89C4\u5219\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //\u4FDD\u5B58\u5F53\u524D\u7684\u89C4\u5219\r\n    file[\"luckysheet_conditionformat_save\"] = cdformat;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //\u5237\u65B0\u4E00\u6B21\u8868\u683C\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //\u53D1\u9001\u7ED9\u540E\u53F0\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return cdformatItem;\r\n}\r\n\r\n\r\n/**\r\n * \u6E05\u9664\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u5185\u5BB9\uFF0C\u4E0D\u540C\u4E8E\u5220\u9664\u9009\u533A\u7684\u529F\u80FD\uFF0C\u4E0D\u9700\u8981\u8BBE\u5B9A\u5355\u5143\u683C\u79FB\u52A8\u60C5\u51B5\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u8981\u6E05\u9664\u7684\u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function clearRange(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    range = JSON.parse(JSON.stringify(range));\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let has_PartMC = false;\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            break;\r\n        }\r\n    }\r\n\r\n    if(has_PartMC){\r\n        return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n    }\r\n\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    if(d.length == 0){\r\n        d = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = d[r][c];\r\n\r\n                if(getObjType(cell) == \"object\"){\r\n                    delete cell[\"m\"];\r\n                    delete cell[\"v\"];\r\n\r\n                    if(cell[\"f\"] != null){\r\n                        delete cell[\"f\"];\r\n                        formula.delFunctionGroup(r, c, file.index);\r\n\r\n                        delete cell[\"spl\"];\r\n                    }\r\n\r\n                    if(cell[\"ct\"] != null && cell[\"ct\"].t == 'inlineStr'){\r\n                        delete cell[\"ct\"];\r\n                    }\r\n                }\r\n                else{\r\n                    d[r][c] = null;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(d, range);\r\n    }\r\n    else{\r\n        file.data = d;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\uFF0C\u8FD4\u56DE\u5220\u9664\u6389\u7684\u6570\u636E\uFF0C\u540C\u65F6\uFF0C\u6307\u5B9A\u662F\u53F3\u4FA7\u5355\u5143\u683C\u5DE6\u79FB\u8FD8\u662F\u4E0B\u65B9\u5355\u5143\u683C\u4E0A\u79FB\r\n * @param {String} move \u5220\u9664\u540E\uFF0C\u5355\u5143\u683C\u5DE6\u79FB/\u4E0A\u79FB\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u8981\u5220\u9664\u7684\u9009\u533A\u8303\u56F4\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteRange(move, options = {}) {\r\n    let moveList = ['left', 'up'];\r\n\r\n    if(!moveList.includes(move)){\r\n        return tooltip.info(\"The move parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    if(move == 'left'){\r\n        luckysheetDeleteCell('moveLeft', str, edr, stc, edc, order);\r\n    }\r\n    else if(move == 'up'){\r\n        luckysheetDeleteCell('moveUp', str, edr, stc, edc, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\u8FDB\u884C\u77E9\u9635\u64CD\u4F5C\uFF0C\u8FD4\u56DE\u64CD\u4F5C\u6210\u529F\u540E\u7684\u7ED3\u679C\u6570\u636E\r\n * @param {String} type \u77E9\u9635\u64CD\u4F5C\u7684\u7C7B\u578B\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function matrixOperation(type, options = {}) {\r\n    let typeValues = [\r\n        'flipUpDown',               // \u4E0A\u4E0B\u7FFB\u8F6C\r\n        'flipLeftRight',            // \u5DE6\u53F3\u7FFB\u8F6C\r\n        'flipClockwise',            // \u987A\u65F6\u9488\u65CB\u8F6C\r\n        'flipCounterClockwise',     // \u9006\u65F6\u9488\u65CB\u8F6C\r\n        'transpose',                // \u8F6C\u7F6E\r\n        'deleteZeroByRow',          // \u6309\u884C\u5220\u9664\u4E24\u7AEF0\u503C\r\n        'deleteZeroByColumn',       // \u6309\u5217\u5220\u9664\u4E24\u7AEF0\u503C\r\n        'removeDuplicateByRow',     // \u6309\u884C\u5220\u9664\u91CD\u590D\u503C\r\n        'removeDuplicateByColumn',  // \u6309\u5217\u5220\u9664\u91CD\u590D\u503C\r\n        'newMatrix'                 // \u751F\u4EA7\u65B0\u77E9\u9635\r\n    ]\r\n\r\n    if (!type || typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter is invalid.', '')\r\n    }\r\n\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        success\r\n    } = {...options}\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().drag.noMulti, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let getdata = getdatabyselection(range);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n\r\n    let getdatalen, collen, arr1;\r\n    switch (type) {\r\n        case 'flipUpDown':\r\n            for (let r = getdata.length - 1; r >= 0; r--) {\r\n                let a = [];\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipLeftRight':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [];\r\n                for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipClockwise':\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let a = [];\r\n                for (let r = getdata.length - 1; r >= 0; r--) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipCounterClockwise':\r\n            for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                let a = [];\r\n                for (let r = 0; r < getdata.length; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'transpose':\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < getdata.length; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'deleteZeroByRow':\r\n            getdatalen = getdata[0].length;\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [], stdel = true, eddel = true;\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                        if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            stdel = false;\r\n                        }\r\n                    }\r\n                    a.push(value);\r\n                }\r\n\r\n                let a1 = [];\r\n                if (a.length == getdatalen) {\r\n                    a1 = a;\r\n                } else {\r\n                    for (let c = a.length - 1; c >= 0; c--) {\r\n                        let value = \"\";\r\n                        if (a[c] != null) {\r\n                            value = a[c];\r\n                            if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                                continue;\r\n                            }\r\n                            else {\r\n                                eddel = false;\r\n                            }\r\n                        }\r\n                        a1.unshift(value);\r\n                    }\r\n\r\n                    let l = getdatalen - a1.length;\r\n                    for (let c1 = 0; c1 < l; c1++) {\r\n                        a1.push(\"\");\r\n                    }\r\n                }\r\n                arr.push(a1);\r\n            }\r\n            break;\r\n        case 'deleteZeroByColumn':\r\n            getdatalen = getdata.length;\r\n            collen = getdata[0].length;\r\n            for (let c = 0; c < collen; c++) {\r\n                let a = [], stdel = true, eddel = true;\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                        if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            stdel = false;\r\n                        }\r\n                    }\r\n                    a.push(value);\r\n                }\r\n\r\n                let a1 = [];\r\n                if (a.length == getdatalen) {\r\n                    a1 = a;\r\n                }\r\n                else {\r\n                    for (let r = a.length - 1; r >= 0; r--) {\r\n                        let value = \"\";\r\n                        if (a[r] != null) {\r\n                            value = a[r];\r\n                            if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                                continue;\r\n                            }\r\n                            else {\r\n                                eddel = false;\r\n                            }\r\n                        }\r\n                        a1.unshift(value);\r\n                    }\r\n\r\n                    let l = getdatalen - a1.length;\r\n                    for (let r1 = 0; r1 < l; r1++) {\r\n                        a1.push(\"\");\r\n                    }\r\n                }\r\n                arr.push(a1);\r\n            }\r\n\r\n            arr1 = [];\r\n            for (let c = 0; c < arr[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < arr.length; r++) {\r\n                    let value = \"\";\r\n                    if (arr[r] != null && arr[r][c] != null) {\r\n                        value = arr[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr1.push(a);\r\n            }\r\n            break;\r\n        case 'removeDuplicateByRow':\r\n            getdatalen = getdata[0].length;\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [], repeat = {};\r\n\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(value.v in repeat){\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                        else{\r\n                            repeat[value.v] = [];\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(repeat[value.v].length == 1){\r\n                            a.push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                let l = getdatalen - a.length;\r\n                for (let c1 = 0; c1 < l; c1++) {\r\n                    a.push(null);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'removeDuplicateByColumn':\r\n            collen = getdata[0].length;\r\n            getdatalen = getdata.length;\r\n            for (let c = 0; c < collen; c++) {\r\n                let a = [], repeat = {};\r\n\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(value.v in repeat){\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                        else{\r\n                            repeat[value.v] = [];\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(repeat[value.v].length == 1){\r\n                            a.push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                a1 = a;\r\n                let l = getdatalen - a1.length;\r\n                for (let r1 = 0; r1 < l; r1++) {\r\n                    a1.push(null);\r\n                }\r\n                arr.push(a1);\r\n            }\r\n\r\n            arr1 = [];\r\n            for (let c = 0; c < arr[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < arr.length; r++) {\r\n                    let value = null;\r\n                    if (arr[r] != null && arr[r][c] != null) {\r\n                        value = arr[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr1.push(a);\r\n            }\r\n            break;\r\n        case 'newMatrix':\r\n            // TODO\r\n            console.log(\"TODO\")\r\n            break;\r\n    }\r\n    editor.controlHandler(arr, range)\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u6307\u5B9A\u5355\u5143\u683C\u533A\u57DF\u7684\u6570\u636E\u8FDB\u884C\u77E9\u9635\u8BA1\u7B97\uFF0C\u8FD4\u56DE\u8BA1\u7B97\u6210\u529F\u540E\u7684\u7ED3\u679C\u6570\u636E\r\n * @param {String} type \u8BA1\u7B97\u65B9\u5F0F\r\n * @param {Number} number \u8BA1\u7B97\u6570\u503C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4,\u652F\u6301\u9009\u533A\u7684\u683C\u5F0F\u4E3A\"A1:B2\"\u3001\"sheetName!A1:B2\"\u6216\u8005{row:[0,1],column:[0,1]}\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function matrixCalculation(type, number, options = {}) {\r\n    let typeValues = [\r\n        'plus',     // \u52A0\r\n        'minus',    // \u51CF\r\n        'multiply', // \u4E58\r\n        'divided',  // \u9664\r\n        'power',    // \u5E42\r\n        'root',     // \u6B21\u65B9\u6839\r\n        'log'       // \u5BF9\u6570log\r\n    ]\r\n\r\n    if (!type || typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter is invalid.', '')\r\n    }\r\n\r\n    if(!isRealNum(number)){\r\n        return tooltip.info('The number parameter is invalid.', '')\r\n    }\r\n\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        success\r\n    } = {...options}\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().drag.noMulti, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let getdata = getdatabyselection(range);\r\n    if (getdata.length == 0) {\r\n        return;\r\n    }\r\n\r\n    let arr = [];\r\n    for (let r = 0; r < getdata.length; r++) {\r\n        let a = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let value = \"\";\r\n            if (getdata[r] != null && getdata[r][c] != null) {\r\n                value = getdata[r][c];\r\n                if (parseInt(value) != null && getdata[r][c].ct != undefined && getdata[r][c].ct.t == \"n\") {\r\n                    if (type == \"minus\") {\r\n                        value.v = value.v - number;\r\n                    }\r\n                    else if (type == \"multiply\") {\r\n                        value.v = value.v * number;\r\n                    }\r\n                    else if (type == \"divided\") {\r\n                        value.v = numFormat(value.v / number, 4);\r\n                    }\r\n                    else if (type == \"power\") {\r\n                        value.v = Math.pow(value.v, number);\r\n                    }\r\n                    else if (type == \"root\") {\r\n                        if (number == 2) {\r\n                            value.v = numFormat(Math.sqrt(value.v), 4);\r\n                        }\r\n                        else if (number == 3 && Math.cbrt) {\r\n                            value.v = numFormat(Math.cbrt(value.v), 4);\r\n                        }\r\n                        else {\r\n                            value.v = numFormat(jfnqrt(value.v, number), 4);\r\n                        }\r\n                    }\r\n                    else if (type == \"log\") {\r\n                        value.v = numFormat(Math.log(value.v) * 10000 / Math.log(Math.abs(number)), 4);\r\n                    }\r\n                    else {\r\n                        value.v = value.v + number;\r\n                    }\r\n\r\n                    if(value.v == null){\r\n                        value.m = \"\";\r\n                    }\r\n                    else{\r\n                        value.m = value.v.toString();\r\n                    }\r\n                }\r\n            }\r\n            a.push(value);\r\n        }\r\n        arr.push(a);\r\n    }\r\n\r\n    editor.controlHandler(arr, range);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u65B0\u589E\u4E00\u4E2Asheet\uFF0C\u8FD4\u56DE\u65B0\u589E\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object} options.sheetObject \u65B0\u589E\u7684\u5DE5\u4F5C\u8868\u7684\u6570\u636E\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u7A7A\u5BF9\u8C61\r\n * @param {Number} options.order \u65B0\u589E\u7684\u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u6700\u540E\u4E00\u4E2A\u7D22\u5F15\u4F4D\u7F6E\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetAdd(options = {}) {\r\n    let lastOrder = Store.luckysheetfile.length - 1;\r\n    let {\r\n        sheetObject = {},\r\n        order = lastOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if(!isRealNum(order)){\r\n        return tooltip.info(\"Parameter is not a table index\", \"\");\r\n    }\r\n\r\n    order = Number(order);\r\n\r\n    let index = sheetmanage.generateRandomSheetIndex();\r\n    // calcChain\u516C\u5F0F\u94FE\u91CC\u7684index\u4E5F\u8981\u8DDF\u7740\u53D8\u5316\r\n    if (sheetObject.calcChain && sheetObject.calcChain.length > 0) {\r\n        sheetObject.calcChain.forEach((item) => {\r\n            item.index = index\r\n        })\r\n    }\r\n    let sheetname = sheetmanage.generateRandomSheetName(Store.luckysheetfile, false);\r\n    if(!!sheetObject.name){\r\n        let sameName = false;\r\n\r\n        for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n            if(Store.luckysheetfile[i].name == sheetObject.name){\r\n                sameName = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(!sameName){\r\n            sheetname = sheetObject.name;\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, {\r\n        \"index\": index,\r\n        \"active\": \"\",\r\n        \"name\": sheetname,\r\n        \"style\": \"\",\r\n        \"colorset\": \"\"\r\n    }));\r\n\r\n    let sheetconfig = {\r\n        \"name\": \"\",\r\n        \"color\": \"\",\r\n        \"status\": \"0\",\r\n        \"order\": \"\",\r\n        \"index\": \"\",\r\n        \"celldata\": [],\r\n        \"row\": Store.defaultrowNum,\r\n        \"column\": Store.defaultcolumnNum,\r\n        \"config\": {},\r\n        \"pivotTable\": null,\r\n        \"isPivotTable\": false\r\n    };\r\n    sheetconfig = $.extend(true, sheetconfig, sheetObject);\r\n\r\n    sheetconfig.index = index;\r\n    sheetconfig.name = sheetname;\r\n    sheetconfig.order = order;\r\n\r\n    if(order <= 0){\r\n        let beforeIndex = Store.luckysheetfile[0].index;\r\n        let beforeObj = $(\"#luckysheet-sheets-item\" + beforeIndex);\r\n        $(\"#luckysheet-sheets-item\" + index).insertBefore(beforeObj);\r\n\r\n        Store.luckysheetfile.splice(0, 0, sheetconfig);\r\n    }\r\n    else{\r\n        if(order > Store.luckysheetfile.length){\r\n            order = Store.luckysheetfile.length;\r\n        }\r\n\r\n        let afterIndex = Store.luckysheetfile[order - 1].index;\r\n        let afterObj = $(\"#luckysheet-sheets-item\" + afterIndex);\r\n        $(\"#luckysheet-sheets-item\" + index).insertAfter(afterObj);\r\n\r\n        Store.luckysheetfile.splice(order, 0, sheetconfig);\r\n    }\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n    })\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n    cleargridelement(true);\r\n\r\n    server.saveParam(\"sha\", null, $.extend(true, {}, sheetconfig));\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n        let redo = {};\r\n        redo[\"type\"] = \"addSheet\";\r\n        redo[\"sheetconfig\"] = $.extend(true, {}, sheetconfig);\r\n        redo[\"index\"] = index;\r\n        redo[\"currentSheetIndex\"] = Store.currentSheetIndex;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    sheetmanage.changeSheetExec(index, false, true);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\uFF0C\u8FD4\u56DE\u5DF2\u5220\u9664\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetDelete(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(Store.luckysheetfile.length === 1){\r\n        return tooltip.info(locale().sheetconfig.noMoreSheet, \"\");\r\n    }\r\n\r\n    sheetmanage.deleteSheet(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u590D\u5236\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\u5230\u6307\u5B9A\u4E0B\u6807\u4F4D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.targetOrder \u65B0\u590D\u5236\u7684\u5DE5\u4F5C\u8868\u76EE\u6807\u4E0B\u6807\u4F4D\u7F6E\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\u7684\u4E0B\u4E00\u4E2A\u4E0B\u6807\u4F4D\u7F6E\uFF08\u9012\u589E\uFF09\r\n * @param {Number} options.order \u88AB\u590D\u5236\u7684\u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetCopy(options = {}) {\r\n    let {\r\n        targetOrder,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(targetOrder == null){\r\n        targetOrder = order + 1;\r\n    }\r\n\r\n    if(!isRealNum(targetOrder)){\r\n        return tooltip.info(\"The targetOrder parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let copyindex = file.index;\r\n    let index = sheetmanage.generateRandomSheetIndex();\r\n\r\n    let copyjson = $.extend(true, {}, file);\r\n    copyjson.order = Store.luckysheetfile.length;\r\n    copyjson.index = index;\r\n    copyjson.name = sheetmanage.generateCopySheetName(Store.luckysheetfile, copyjson.name);\r\n\r\n    let colorset = '';\r\n    if(copyjson.color != null){\r\n        colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + copyjson.color + ';\"></div>';\r\n    }\r\n\r\n    let afterObj = $(\"#luckysheet-sheets-item\" + copyindex);\r\n    if(isRealNum(targetOrder)){\r\n        afterObj = $(\"#luckysheet-sheets-item\" + Store.luckysheetfile[targetOrder - 1].index);\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, {\r\n        \"index\": copyjson.index,\r\n        \"active\": \"\",\r\n        \"name\": copyjson.name,\r\n        \"order\": copyjson.order,\r\n        \"style\": \"\",\r\n        \"colorset\": colorset\r\n    }));\r\n    $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(afterObj);\r\n    Store.luckysheetfile.splice(targetOrder, 0, copyjson);\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n    cleargridelement(true);\r\n\r\n    server.saveParam(\"shc\", index, { \"copyindex\": copyindex, \"name\": copyjson.name });\r\n\r\n    sheetmanage.changeSheetExec(index);\r\n    sheetmanage.reOrderAllSheet();\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfredo.push({\r\n            \"type\": \"copySheet\",\r\n            \"copyindex\": copyindex,\r\n            \"index\": copyjson.index,\r\n            \"sheetIndex\": copyjson.index\r\n        });\r\n    }\r\n    else if (Store.jfredo.length > 0) {\r\n        let jfredostr = Store.jfredo[Store.jfredo.length - 1];\r\n\r\n        if (jfredostr.type == \"copySheet\") {\r\n            jfredostr.index = copyjson.index;\r\n            jfredostr.sheetIndex = copyjson.index;\r\n        }\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return copyjson;\r\n}\r\n\r\n\r\n/**\r\n * \u9690\u85CF\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\uFF0C\u8FD4\u56DE\u88AB\u9690\u85CF\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetHide(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    sheetmanage.setSheetHide(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u53D6\u6D88\u9690\u85CF\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\uFF0C\u8FD4\u56DE\u88AB\u53D6\u6D88\u9690\u85CF\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetShow(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    sheetmanage.setSheetShow(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u4E0B\u6807\u7684\u5DE5\u4F5C\u8868\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\uFF08\u6FC0\u6D3B\u6001\uFF09\uFF0C\u5373\u5207\u6362\u5230\u6307\u5B9A\u7684\u5DE5\u4F5C\u8868\uFF0C\u8FD4\u56DE\u88AB\u6FC0\u6D3B\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Number} order \u8981\u6FC0\u6D3B\u7684\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetActive(order, options = {}) {\r\n    if(order == null || !isRealNum(order) || Store.luckysheetfile[order] == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + file.index).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n    sheetmanage.changeSheet(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n    server.multipleRangeShow()\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u4FEE\u6539\u5DE5\u4F5C\u8868\u540D\u79F0\r\n * @param {String} name \u5DE5\u4F5C\u8868\u540D\u79F0\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetName(name, options = {}) {\r\n    if(getObjType(name) != 'string' || name.toString().length == 0){\r\n        return tooltip.info(\"The name parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let oldtxt = file.name;\r\n    file.name = name;\r\n\r\n    $(\"#luckysheet-sheets-item\" + file.index + \" .luckysheet-sheets-item-name\").text(name);\r\n\r\n    server.saveParam(\"all\", file.index, name, { \"k\": \"name\" });\r\n\r\n    if (Store.clearjfundo) {\r\n        let redo = {};\r\n        redo[\"type\"] = \"sheetName\";\r\n        redo[\"sheetIndex\"] = file.index;\r\n\r\n        redo[\"oldtxt\"] = oldtxt;\r\n        redo[\"txt\"] = name;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u5DE5\u4F5C\u8868\u540D\u79F0\u5904\u7684\u989C\u8272\r\n * @param {String} color \u5DE5\u4F5C\u8868\u989C\u8272\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetColor(color, options = {}) {\r\n    if(getObjType(color) != 'string' || color.toString().length == 0){\r\n        return tooltip.info(\"The color parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let oldcolor = file.color;\r\n    file.color = color;\r\n\r\n    $(\"#luckysheet-sheets-item\" + file.index).find(\".luckysheet-sheets-item-color\").remove();\r\n    $(\"#luckysheet-sheets-item\" + file.index).append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + color + ';\"></div>');\r\n\r\n    server.saveParam(\"all\", file.index, color, { \"k\": \"color\" });\r\n\r\n    if (Store.clearjfundo) {\r\n        let redo = {};\r\n        redo[\"type\"] = \"sheetColor\";\r\n        redo[\"sheetIndex\"] = file.index;\r\n\r\n        redo[\"oldcolor\"] = oldcolor;\r\n        redo[\"color\"] = color;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u5411\u5DE6\u8FB9\u6216\u53F3\u8FB9\u79FB\u52A8\u4E00\u4E2A\u4F4D\u7F6E\uFF0C\u6216\u8005\u6307\u5B9A\u7D22\u5F15\uFF0C\u8FD4\u56DE\u6307\u5B9A\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {String | Number} type \u5DE5\u4F5C\u8868\u79FB\u52A8\u65B9\u5411\u6216\u8005\u79FB\u52A8\u7684\u76EE\u6807\u7D22\u5F15\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u7D22\u5F15\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u7D22\u5F15\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetMove(type, options = {}) {\r\n    if(type != 'left' && type != 'right' && !isRealNum(type)){\r\n        return tooltip.info(\"Type parameter not available\", \"\");\r\n    }\r\n\r\n    if(isRealNum(type)){\r\n        type = parseInt(type);\r\n    }\r\n\r\n    let curOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"ncorrect worksheet index\", \"\");\r\n    }\r\n\r\n    let sheetIndex = file.index;\r\n\r\n    if(type == 'left'){\r\n        if(order == 0){\r\n            return;\r\n        }\r\n\r\n        let prevIndex = Store.luckysheetfile[order - 1].index;\r\n        $(\"#luckysheet-sheets-item\" + sheetIndex).insertBefore($(\"#luckysheet-sheets-item\" + prevIndex));\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(order - 1, 0, file);\r\n    }\r\n    else if(type == 'right'){\r\n        if(order == Store.luckysheetfile.length - 1){\r\n            return;\r\n        }\r\n\r\n        let nextIndex = Store.luckysheetfile[order + 1].index;\r\n        $(\"#luckysheet-sheets-item\" + sheetIndex).insertAfter($(\"#luckysheet-sheets-item\" + nextIndex));\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(order + 1, 0, file);\r\n    }\r\n    else{\r\n        if(type < 0){\r\n            type = 0;\r\n        }\r\n\r\n        if(type > Store.luckysheetfile.length - 1){\r\n            type = Store.luckysheetfile.length - 1;\r\n        }\r\n\r\n        if(type == order){\r\n            return;\r\n        }\r\n\r\n        if(type < order){\r\n            let prevIndex = Store.luckysheetfile[type].index;\r\n            $(\"#luckysheet-sheets-item\" + sheetIndex).insertBefore($(\"#luckysheet-sheets-item\" + prevIndex));\r\n        }\r\n        else{\r\n            let nextIndex = Store.luckysheetfile[type].index;\r\n            $(\"#luckysheet-sheets-item\" + sheetIndex).insertAfter($(\"#luckysheet-sheets-item\" + nextIndex));\r\n        }\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(type, 0, file);\r\n    }\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n    })\r\n\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u91CD\u65B0\u6392\u5E8F\u6240\u6709\u5DE5\u4F5C\u8868\u7684\u4F4D\u7F6E\uFF0C\u6307\u5B9A\u5DE5\u4F5C\u8868\u987A\u5E8F\u7684\u6570\u7EC4\u3002\r\n * @param {Array} orderList \u5DE5\u4F5C\u8868\u987A\u5E8F\uFF0C\u8BBE\u7F6E\u5DE5\u4F5C\u8868\u7684index\u548Corder\u6765\u6307\u5B9A\u4F4D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetOrder(orderList, options = {}) {\r\n    if(orderList == null || orderList.length == 0){\r\n        return tooltip.info(\"Type orderList not available\", \"\");\r\n    }\r\n\r\n    let orderListMap = {};\r\n    orderList.forEach((item) => {\r\n        orderListMap[item.index.toString()] = item.order;\r\n    })\r\n\r\n    Store.luckysheetfile.sort((x, y) => {\r\n        let order_x = orderListMap[x.index.toString()];\r\n        let order_y = orderListMap[y.index.toString()];\r\n\r\n        if(order_x != null && order_y != null){\r\n            return order_x - order_y;\r\n        }\r\n        else if(order_x != null){\r\n            return -1;\r\n        }\r\n        else if(order_y != null){\r\n            return 1;\r\n        }\r\n        else{\r\n            return 1;\r\n        }\r\n    })\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n\r\n        if(i > 0){\r\n            let preIndex = arr[i - 1].index;\r\n            $(\"#luckysheet-sheets-item\" + item.index).insertAfter($(\"#luckysheet-sheets-item\" + preIndex));\r\n        }\r\n    })\r\n\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u5DE5\u4F5C\u8868\u7F29\u653E\u6BD4\u4F8B\r\n * @param {Number} zoom \u5DE5\u4F5C\u8868\u7F29\u653E\u6BD4\u4F8B\uFF0C\u503C\u8303\u56F4\u4E3A0.1 ~ 4\uFF1B\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setSheetZoom(zoom, options = {}) {\r\n    if(!isRealNum(zoom) || zoom < 0.1 || zoom > 4){\r\n        return tooltip.info(\"The zoom parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file[\"zoomRatio\"] = zoom;\r\n\r\n    server.saveParam(\"all\", file.index, zoom, { \"k\": \"zoomRatio\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.zoomRatio = zoom;\r\n\r\n        zoomNumberDomBind();\r\n        zoomRefreshView();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u663E\u793A\u6307\u5B9A\u4E0B\u6807\u5DE5\u4F5C\u8868\u7684\u7F51\u683C\u7EBF\uFF0C\u8FD4\u56DE\u64CD\u4F5C\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u9700\u8981\u663E\u793A\u7F51\u683C\u7EBF\u7684\u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function showGridLines(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.showGridLines = true;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.showGridLines = true;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u9690\u85CF\u6307\u5B9A\u4E0B\u6807\u5DE5\u4F5C\u8868\u7684\u7F51\u683C\u7EBF\uFF0C\u8FD4\u56DE\u64CD\u4F5C\u7684\u5DE5\u4F5C\u8868\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u9700\u8981\u663E\u793A\u7F51\u683C\u7EBF\u7684\u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function hideGridLines(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.showGridLines = false;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.showGridLines = false;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * \u5237\u65B0canvas\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function refresh(options = {}) {\r\n    // luckysheetrefreshgrid();\r\n    jfrefreshgrid();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u6EDA\u52A8\u5F53\u524D\u5DE5\u4F5C\u8868\u4F4D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.scrollLeft \u6A2A\u5411\u6EDA\u52A8\u503C\r\n * @param {Number} options.scrollTop \u7EB5\u5411\u6EDA\u52A8\u503C\r\n * @param {Number} options.targetRow \u7EB5\u5411\u6EDA\u52A8\u5230\u6307\u5B9A\u7684\u884C\u53F7\r\n * @param {Number} options.targetColumn \u6A2A\u5411\u6EDA\u52A8\u5230\u6307\u5B9A\u7684\u5217\u53F7\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function scroll(options = {}){\r\n    let {\r\n        scrollLeft,\r\n        scrollTop,\r\n        targetRow,\r\n        targetColumn,\r\n        success\r\n    } = {...options}\r\n\r\n    if(scrollLeft != null){\r\n        if(!isRealNum(scrollLeft)){\r\n            return tooltip.info(\"The scrollLeft parameter is invalid.\", \"\");\r\n        }\r\n\r\n        $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n    }\r\n    else if(targetColumn != null){\r\n        if(!isRealNum(targetColumn)){\r\n            return tooltip.info(\"The targetColumn parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let col = Store.visibledatacolumn[targetColumn],\r\n            col_pre = targetColumn <= 0 ? 0 : Store.visibledatacolumn[targetColumn - 1];\r\n\r\n        $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n    }\r\n\r\n\r\n    if(scrollTop != null){\r\n        if(!isRealNum(scrollTop)){\r\n            return tooltip.info(\"The scrollTop parameter is invalid.\", \"\");\r\n        }\r\n\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n    }\r\n    else if(targetRow != null){\r\n        if(!isRealNum(targetRow)){\r\n            return tooltip.info(\"The targetRow parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let row = Store.visibledatarow[targetRow],\r\n            row_pre = targetRow <= 0 ? 0 : Store.visibledatarow[targetRow - 1];\r\n\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u6839\u636E\u7A97\u53E3\u5927\u5C0F\u81EA\u52A8resize\u753B\u5E03\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function resize(options = {}){\r\n    luckysheetsizeauto();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u8FD4\u56DE\u6307\u5B9A\u9009\u533A\u622A\u56FE\u540E\u751F\u6210\u7684base64\u683C\u5F0F\u7684\u56FE\u7247\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Object | String} options.range \u9009\u533A\u8303\u56F4\uFF0C\u53EA\u80FD\u4E3A\u5355\u4E2A\u9009\u533A\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n */\r\nexport function getScreenshot(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    let has_PartMC = hasPartMC(Store.config, str, edr, stc, edc);\r\n\r\n    if(has_PartMC){\r\n        return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n    }\r\n\r\n    let visibledatarow = Store.visibledatarow;\r\n    let visibledatacolumn = Store.visibledatacolumn;\r\n\r\n    let scrollHeight, rh_height;\r\n    if (str - 1 < 0) {\r\n        scrollHeight = 0;\r\n        rh_height = visibledatarow[edr];\r\n    }\r\n    else {\r\n        scrollHeight = visibledatarow[str - 1];\r\n        rh_height = visibledatarow[edr] - visibledatarow[str - 1];\r\n    }\r\n\r\n    let scrollWidth, ch_width;\r\n    if (stc - 1 < 0) {\r\n        scrollWidth = 0;\r\n        ch_width = visibledatacolumn[edc];\r\n    }\r\n    else {\r\n        scrollWidth = visibledatacolumn[stc - 1];\r\n        ch_width = visibledatacolumn[edc] - visibledatacolumn[stc - 1];\r\n    }\r\n\r\n    let newCanvas = $(\"<canvas>\").attr({\r\n        width: Math.ceil(ch_width * Store.devicePixelRatio),\r\n        height: Math.ceil(rh_height * Store.devicePixelRatio)\r\n    }).css({ width: ch_width, height: rh_height });\r\n\r\n    luckysheetDrawMain(scrollWidth, scrollHeight, ch_width, rh_height, 1, 1, null, null, newCanvas);\r\n    let ctx_newCanvas = newCanvas.get(0).getContext(\"2d\");\r\n\r\n    //\u8865\u4E0A \u5DE6\u8FB9\u6846\u548C\u4E0A\u8FB9\u6846\r\n    ctx_newCanvas.beginPath();\r\n    ctx_newCanvas.moveTo(\r\n        0,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineTo(\r\n        0,\r\n        Store.devicePixelRatio * rh_height\r\n    );\r\n    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    ctx_newCanvas.stroke();\r\n    ctx_newCanvas.closePath();\r\n\r\n    ctx_newCanvas.beginPath();\r\n    ctx_newCanvas.moveTo(\r\n        0,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineTo(\r\n        Store.devicePixelRatio * ch_width,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    ctx_newCanvas.stroke();\r\n    ctx_newCanvas.closePath();\r\n\r\n    let url = newCanvas.get(0).toDataURL(\"image/png\");\r\n\r\n    return url;\r\n}\r\n\r\n\r\n/**\r\n * \u8BBE\u7F6E\u5DE5\u4F5C\u7C3F\u540D\u79F0\r\n * @param {String} name \u5DE5\u4F5C\u7C3F\u540D\u79F0\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setWorkbookName(name, options = {}) {\r\n    if(name == null || name.toString().length == 0){\r\n        return tooltip.info(\"The name parameter is invalid.\", \"\");\r\n    }\r\n\r\n    $(\"#luckysheet_info_detail_input\").val(name);\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u83B7\u53D6\u5DE5\u4F5C\u7C3F\u540D\u79F0\r\n * @param   {Object}    options         \u53EF\u9009\u53C2\u6570\r\n * @param   {Function}  options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n * @returns {String}    \u8FD4\u56DE\u5DE5\u4F5C\u7C3F\u540D\u79F0\uFF0C\u5982\u679C\u8BFB\u53D6\u5931\u8D25\u5219\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u5E76\u5F39\u7A97\u63D0\u793A\r\n */\r\nexport function getWorkbookName(options = {}) {\r\n\r\n    let name = \"\";\r\n    let element = $(\"#luckysheet_info_detail_input\");\r\n\r\n    if(element.length == 0){\r\n\r\n        tooltip.info('Failed to get workbook name, label loading failed!');\r\n        return name;\r\n\r\n    }\r\n\r\n    name = $.trim(element.val());\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return name;\r\n}\r\n\r\n\r\n/**\r\n * \u64A4\u9500\u5F53\u524D\u64CD\u4F5C\uFF0C\u8FD4\u56DE\u521A\u521A\u64A4\u9500\u7684\u64CD\u4F5C\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function undo(options = {}) {\r\n    let ctr = $.extend(true, {}, Store.jfredo[Store.jfredo.length - 1]);\r\n\r\n    controlHistory.redo(new Event('custom'));\r\n    luckysheetactiveCell();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return ctr;\r\n}\r\n\r\n\r\n/**\r\n * \u91CD\u505A\u5F53\u524D\u64CD\u4F5C\uFF0C\u8FD4\u56DE\u521A\u521A\u91CD\u505A\u7684\u64CD\u4F5C\u5BF9\u8C61\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function redo(options = {}) {\r\n    let ctr = $.extend(true, {}, Store.jfundo[Store.jfundo.length - 1]);\r\n\r\n    controlHistory.undo(new Event('custom'));\r\n    luckysheetactiveCell();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return ctr;\r\n}\r\n\r\n\r\n/**\r\n * \u8FD4\u56DE\u6240\u6709\u5DE5\u4F5C\u8868\u914D\u7F6E\r\n */\r\nexport function getAllSheets() {\r\n    let data = $.extend(true, [], Store.luckysheetfile);\r\n\r\n    data.forEach((item, index, arr) => {\r\n        if(item.data != null && item.data.length > 0){\r\n            item.celldata = sheetmanage.getGridData(item.data);\r\n        }\r\n\r\n        delete item.load;\r\n        delete item.freezen;\r\n\r\n    })\r\n\r\n    return data;\r\n}\r\n\r\n\r\n/**\r\n * \u6839\u636Eindex\u83B7\u53D6sheet\u9875\u914D\u7F6E\r\n *\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {String} options.index \u5DE5\u4F5C\u8868index\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868order\r\n * @param {String} options.name \u5DE5\u4F5C\u8868name\r\n */\r\nexport function getSheet(options = {}){\r\n\r\n    let {\r\n        index,\r\n        order,\r\n        name\r\n    } = {...options};\r\n\r\n    if(index != null){\r\n        return sheetmanage.getSheetByIndex(index);\r\n    }else if(order != null){\r\n        return Store.luckysheetfile[order];\r\n    }else if(name != null){\r\n        return sheetmanage.getSheetByName(name);\r\n    }\r\n\r\n    return sheetmanage.getSheetByIndex();\r\n\r\n}\r\n\r\n/**\r\n * \u5FEB\u6377\u8FD4\u56DE\u6307\u5B9A\u5DE5\u4F5C\u8868\u7684\u6570\u636E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n */\r\nexport function getSheetData(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex)\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let data = $.extend(true, [], file.data);\r\n\r\n    if(data == null || data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n/**\r\n * \u5FEB\u6377\u8FD4\u56DE\u6307\u5B9A\u5DE5\u4F5C\u8868\u7684config\u914D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n */\r\nexport function getConfig(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex)\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let config = $.extend(true, {}, file.config);\r\n\r\n    return config;\r\n}\r\n\r\n/**\r\n * \u5FEB\u6377\u8BBE\u7F6E\u6307\u5B9A\u5DE5\u4F5C\u8868config\u914D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setConfig(cfg, options = {}) {\r\n    if(getObjType(cfg) != 'object'){\r\n        return tooltip.info(\"The cfg parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n\r\n        if(\"rowhidden\" in cfg || \"colhidden\" in cfg || \"rowlen\" in cfg || \"columnlen\" in cfg){\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * \u8FD4\u56DE\u6240\u6709\u8868\u683C\u6570\u636E\u7ED3\u6784\u7684\u4E00\u7EF4\u6570\u7EC4luckysheetfile\r\n */\r\nexport function getLuckysheetfile(){\r\n    return getluckysheetfile();\r\n}\r\n\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u8303\u56F4\u8BBE\u7F6E\u6570\u636E\u9A8C\u8BC1\u529F\u80FD\uFF0C\u5E76\u8BBE\u7F6E\u53C2\u6570\r\n * @param {Object} optionItem \u6570\u636E\u9A8C\u8BC1\u7684\u914D\u7F6E\u4FE1\u606F\r\n * @param {String} optionItem.type \u7C7B\u578B\r\n * @param {String | Null} optionItem.type2 \u6761\u4EF6\u7C7B\u578B\r\n * @param {String | Number} optionItem.value1 \u6761\u4EF6\u503C1\r\n * @param {String | Number} optionItem.value2 \u6761\u4EF6\u503C2\r\n * @param {Boolean} optionItem.checked \u9009\u4E2D\u72B6\u6001\r\n * @param {Boolean} optionItem.remote \u81EA\u52A8\u8FDC\u7A0B\u83B7\u53D6\u9009\u9879\r\n * @param {Boolean} optionItem.prohibitInput \u8F93\u5165\u6570\u636E\u65E0\u6548\u65F6\u7981\u6B62\u8F93\u5165\r\n * @param {Boolean} optionItem.hintShow \u9009\u4E2D\u5355\u5143\u683C\u65F6\u663E\u793A\u63D0\u793A\u8BED\r\n * @param {String} optionItem.hintText \u63D0\u793A\u8BED\u6587\u672C\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u9009\u533A\u8303\u56F4\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function setDataVerification(optionItem, options = {}) {\r\n    if(getObjType(optionItem) != 'object'){\r\n        return tooltip.info(\"The optionItem parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        type,\r\n        type2 = null,\r\n        value1 = '',\r\n        value2 = '',\r\n        remote = false,\r\n        prohibitInput = false,\r\n        hintShow = false,\r\n        hintText = '',\r\n        checked = false\r\n    } = {...optionItem}\r\n\r\n    let typeValues = [\"dropdown\", \"checkbox\", \"number\", \"number_integer\", \"number_decimal\", \"text_content\", \"text_length\", \"date\", \"validity\"];\r\n    let type2Values_1 = [\"bw\", \"nb\", \"eq\", \"ne\", \"gt\", \"lt\", \"gte\", \"lte\"];\r\n    let type2Values_2 = [\"include\", \"exclude\", \"equal\"];\r\n    let type2Values_3 = [\"bw\", \"nb\", \"eq\", \"ne\", \"bf\", \"nbf\", \"af\", \"naf\"];\r\n    let type2Values_4 = [\"card\", \"phone\"];\r\n\r\n    if(!typeValues.includes(type)){\r\n        return tooltip.info(\"The optionItem.type parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let dvText = locale().dataVerification;\r\n\r\n    if(type == 'dropdown'){\r\n        if(value1.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo1);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'checkbox'){\r\n        if(value1.length == 0 || value2.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo2);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n        if(!type2Values_1.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isRealNum(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isRealNum(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                return;\r\n            }\r\n\r\n            if(Number(value2) < Number(value1)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'text_content'){\r\n        if(!type2Values_2.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(value1.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo5);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'text_length'){\r\n        if(!type2Values_1.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isRealNum(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isRealNum(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                return;\r\n            }\r\n\r\n            if(Number(value2) < Number(value1)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'date'){\r\n        if(!type2Values_3.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isdatetime(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isdatetime(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                return;\r\n            }\r\n\r\n            if(diff(value1, value2) > 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo7);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'validity'){\r\n        if(!type2Values_4.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n    }\r\n\r\n    if(getObjType(remote) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.remote parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(prohibitInput) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.prohibitInput parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(hintShow) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.hintShow parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let item = {\r\n        type: type,\r\n        type2: type2,\r\n        value1: value1,\r\n        value2: value2,\r\n        checked: checked,\r\n        remote: remote,\r\n        prohibitInput: prohibitInput,\r\n        hintShow: hintShow,\r\n        hintText: hintText,\r\n    }\r\n\r\n    let currentDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n    let data = $.extend(true, [], file.data);\r\n    if(data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            currentDataVerification[r + '_' + c] = item;\r\n\r\n            if(type == 'checkbox'){\r\n                item.checked ? setcellvalue(r, c, data, item.value1) : setcellvalue(r, c, data, item.value2);\r\n            }\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let historyDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n        if(type == 'checkbox'){\r\n            dataVerificationCtrl.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, data, range);\r\n        }\r\n        else{\r\n            dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n        }\r\n    }\r\n    else{\r\n        file.dataVerification = currentDataVerification;\r\n        file.data = data;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u6307\u5B9A\u5DE5\u4F5C\u8868\u8303\u56F4\u5220\u9664\u6570\u636E\u9A8C\u8BC1\u529F\u80FD\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Array | Object | String} options.range \u9009\u533A\u8303\u56F4\uFF1B\u9ED8\u8BA4\u4E3A\u5F53\u524D\u9009\u533A\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteDataVerification(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let currentDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            delete currentDataVerification[r + '_' + c];\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let historyDataVerification = $.extend(true, {}, file.dataVerification);\r\n        dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n    }\r\n    else{\r\n        file.dataVerification = currentDataVerification;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u5728\u6307\u5B9A\u7684\u5DE5\u4F5C\u8868\u4E2D\u6307\u5B9A\u5355\u5143\u683C\u4F4D\u7F6E\u63D2\u5165\u56FE\u7247\r\n * @param {String} src \u56FE\u7247src\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Number} options.rowIndex \u8981\u63D2\u5165\u56FE\u7247\u7684\u5355\u5143\u683C\u884C\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u4E3A0\r\n * @param {Number} options.colIndex \u8981\u63D2\u5165\u56FE\u7247\u7684\u5355\u5143\u683C\u5217\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u4E3A0\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function insertImage(src, options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        rowIndex,\r\n        colIndex,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        if(rowIndex == null){\r\n            rowIndex = last.row_focus || 0;\r\n        }\r\n\r\n        if(rowIndex < 0){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex > Store.visibledatarow.length){\r\n            rowIndex = Store.visibledatarow.length;\r\n        }\r\n\r\n        if(colIndex == null){\r\n            colIndex = last.column_focus || 0;\r\n        }\r\n\r\n        if(colIndex < 0){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex > Store.visibledatacolumn.length){\r\n            colIndex = Store.visibledatacolumn.length;\r\n        }\r\n\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let width = image.width,\r\n                height = image.height;\r\n\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: width,\r\n                originHeight: height\r\n            }\r\n\r\n            imageCtrl.addImgItem(img);\r\n\r\n            if (success && typeof success === 'function') {\r\n                success();\r\n            }\r\n        }\r\n        image.src = src;\r\n    }\r\n    else {\r\n        let images = file.images || {};\r\n        let config = file.config;\r\n        let zoomRatio = file.zoomRatio || 1;\r\n\r\n        let rowheight = file.row;\r\n        let visibledatarow = file.visibledatarow || [];\r\n        if(visibledatarow.length === 0){\r\n            let rh_height = 0;\r\n\r\n            for (let r = 0; r < rowheight; r++) {\r\n                let rowlen = Store.defaultrowlen;\r\n\r\n                if (config[\"rowlen\"] != null && config[\"rowlen\"][r] != null) {\r\n                    rowlen = config[\"rowlen\"][r];\r\n                }\r\n\r\n                if (config[\"rowhidden\"] != null && config[\"rowhidden\"][r] != null) {\r\n                    visibledatarow.push(rh_height);\r\n                    continue;\r\n                }\r\n\r\n                rh_height += Math.round((rowlen + 1) * zoomRatio);\r\n\r\n                visibledatarow.push(rh_height); //\u884C\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n            }\r\n        }\r\n\r\n        let colwidth = file.column;\r\n        let visibledatacolumn = file.visibledatacolumn || [];\r\n        if(visibledatacolumn.length === 0){\r\n            let ch_width = 0;\r\n\r\n            for (let c = 0; c < colwidth; c++) {\r\n                let firstcolumnlen = Store.defaultcollen;\r\n\r\n                if (config[\"columnlen\"] != null && config[\"columnlen\"][c] != null) {\r\n                    firstcolumnlen = config[\"columnlen\"][c];\r\n                }\r\n\r\n                if(config[\"colhidden\"] != null && config[\"colhidden\"][c] != null){\r\n                    visibledatacolumn.push(ch_width);\r\n                    continue;\r\n                }\r\n\r\n                ch_width += Math.round((firstcolumnlen + 1)*zoomRatio);\r\n\r\n                visibledatacolumn.push(ch_width);//\u5217\u7684\u4E34\u65F6\u957F\u5EA6\u5206\u5E03\r\n            }\r\n        }\r\n\r\n        if(rowIndex == null){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex < 0){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex > visibledatarow.length){\r\n            rowIndex = visibledatarow.length;\r\n        }\r\n\r\n        if(colIndex == null){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex < 0){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex > visibledatacolumn.length){\r\n            colIndex = visibledatacolumn.length;\r\n        }\r\n\r\n        let left = colIndex == 0 ? 0 : visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: image.width,\r\n                originHeight: image.height\r\n            }\r\n\r\n            let width, height;\r\n            let max = 400;\r\n\r\n            if(img.originHeight < img.originWidth){\r\n                height = Math.round(img.originHeight * (max / img.originWidth));\r\n                width = max;\r\n            }\r\n            else{\r\n                width = Math.round(img.originWidth * (max / img.originHeight));\r\n                height = max;\r\n            }\r\n\r\n            let imgItem = $.extend(true, {}, imageCtrl.imgItem);\r\n            imgItem.src = img.src;\r\n            imgItem.originWidth = img.originWidth;\r\n            imgItem.originHeight = img.originHeight;\r\n            imgItem.default.width = width;\r\n            imgItem.default.height = height;\r\n            imgItem.default.left = img.left;\r\n            imgItem.default.top = img.top;\r\n            imgItem.crop.width = width;\r\n            imgItem.crop.height = height;\r\n\r\n            let id = imageCtrl.generateRandomId();\r\n            images[id] = imgItem;\r\n\r\n            file.images = images;\r\n\r\n            if (success && typeof success === 'function') {\r\n                success();\r\n            }\r\n        }\r\n        image.src = src;\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u5220\u9664\u6307\u5B9A\u5DE5\u4F5C\u8868\u4E2D\u7684\u56FE\u7247\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {String | Array} options.idList \u8981\u5220\u9664\u56FE\u7247\u7684id\u96C6\u5408\uFF0C\u4E5F\u53EF\u4E3A\u5B57\u7B26\u4E32`\"all\"`\uFF0Call\u4E3A\u6240\u6709\u7684\u5B57\u7B26\u4E32\uFF1B\u9ED8\u8BA4\u4E3A`\"all\"`\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function deleteImage(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        idList = 'all',\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let images = file.images;\r\n\r\n    if(images == null){\r\n        return tooltip.info(\"The worksheet has no pictures to delete.\", \"\");\r\n    }\r\n\r\n    if(idList != 'all' && getObjType(idList) != 'array'){\r\n        return tooltip.info(\"The idList parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(idList) == 'array'){\r\n        idList.forEach(item => {\r\n            delete images[item];\r\n        })\r\n    }\r\n    else {\r\n        images = null;\r\n    }\r\n\r\n    file.images = images;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        if(imageCtrl.currentImgId != null && (idList == 'all' || idList.includes(imageCtrl.currentImgId))){\r\n            $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n            $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        }\r\n\r\n        imageCtrl.images = images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \u83B7\u53D6\u6307\u5B9A\u5DE5\u4F5C\u8868\u7684\u56FE\u7247\u914D\u7F6E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Number} options.order \u5DE5\u4F5C\u8868\u4E0B\u6807\uFF1B\u9ED8\u8BA4\u503C\u4E3A\u5F53\u524D\u5DE5\u4F5C\u8868\u4E0B\u6807\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function getImageOption(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    setTimeout(function(){\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1)\r\n\r\n    return file.images;\r\n}\r\n\r\n\r\n/**\r\n * data => celldata \uFF0Cdata\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\u8F6C\u5316\u6210 {r, c, v}\u683C\u5F0F\u4E00\u7EF4\u6570\u7EC4\r\n *\r\n * @param {Array} data \u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function transToCellData(data, options = {}){\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(()=>{\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    },0)\r\n\r\n    return sheetmanage.getGridData(data)\r\n}\r\n\r\n\r\n/**\r\n * celldata => data \uFF0Ccelldata\u4E00\u7EF4\u6570\u7EC4\u6570\u636E\u8F6C\u5316\u6210\u8868\u683C\u6240\u9700\u4E8C\u7EF4\u6570\u7EC4\r\n *\r\n * @param {Array} celldata \u4E8C\u7EF4\u6570\u7EC4\u6570\u636E\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function transToData(celldata, options = {}){\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(()=>{\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    },0)\r\n\r\n    return sheetmanage.buildGridData({\r\n        celldata: celldata\r\n    })\r\n}\r\n\r\n/**\r\n * \u5BFC\u51FA\u7684json\u5B57\u7B26\u4E32\u53EF\u4EE5\u76F4\u63A5\u5F53\u4F5C`luckysheet.create(options)`\u521D\u59CB\u5316\u5DE5\u4F5C\u7C3F\u65F6\u7684\u53C2\u6570`options`\u4F7F\u7528\r\n *\r\n */\r\nexport function toJson(){\r\n\r\n    const toJsonOptions = Store.toJsonOptions;\r\n\r\n    // Workbook name\r\n    toJsonOptions.title = $(\"#luckysheet_info_detail_input\").val();\r\n\r\n    toJsonOptions.data = getAllSheets();\r\n\r\n    // row and column\r\n    getluckysheetfile().forEach((file,index)=>{\r\n\r\n        if(file.data == undefined){\r\n            return;\r\n        }\r\n        toJsonOptions.data[index].row = getObjType(file.data) === 'array' ? file.data.length : 0;\r\n        toJsonOptions.data[index].column = getObjType(file.data[0]) === 'array' ? file.data[0].length : 0;\r\n\r\n    })\r\n\r\n    return toJsonOptions;\r\n}\r\n\r\n\r\n/**\r\n * \u4F20\u5165\u76EE\u6807\u8BED\u8A00\uFF0C\u5207\u6362\u5230\u5BF9\u5E94\u7684\u8BED\u8A00\u754C\u9762\r\n * @param {String} lang \u53EF\u9009\u53C2\u6570\uFF1B\u6682\u652F\u6301`\"zh\"`\u3001`\"en\"`\u3001`\"es\"`\uFF1B\u9ED8\u8BA4\u4E3A`\"zh\"`\uFF1B\r\n */\r\nexport function changLang(lang = 'zh'){\r\n    if(!['zh', 'en', 'es'].includes(lang)){\r\n        return tooltip.info(\"The lang parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let options = toJson();\r\n    options.lang = lang;\r\n    luckysheet.create(options);\r\n}\r\n\r\n\r\n/**\r\n * \u5173\u95EDwebsocket\u8FDE\u63A5\r\n */\r\nexport function closeWebsocket(){\r\n    if(server.websocket == null){\r\n        return;\r\n    }\r\n    server.websocket.close(1000);\r\n}\r\n\r\n\r\n/**\r\n * \u6839\u636E\u8303\u56F4\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3Arange\u6570\u7EC4\r\n * @param {String} txt \u8303\u56F4\u5B57\u7B26\u4E32\r\n */\r\nexport function getRangeByTxt(txt){\r\n\r\n    // \u9ED8\u8BA4\u53D6\u5F53\u524D\u7B2C\u4E00\u4E2A\u8303\u56F4\r\n    if(txt == null){\r\n        return {\r\n            column:Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].column,\r\n            row:Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].row\r\n        }\r\n    }\r\n\r\n    const range = conditionformat.getRangeByTxt(txt);\r\n\r\n    return {\r\n        column:range[0].column,\r\n        row:range[0].row\r\n    };\r\n}\r\n\r\n\r\n/**\r\n * \u6839\u636E\u8303\u56F4\u6570\u7EC4\u8F6C\u6362\u4E3A\u8303\u56F4\u5B57\u7B26\u4E32\r\n * @param {Object | Array} range \u8303\u56F4\u6570\u7EC4\r\n */\r\nexport function getTxtByRange(range=Store.luckysheet_select_save){\r\n\r\n    // \u5355\u4E2A\u8303\u56F4\r\n    if(getObjType(range) === 'object'){\r\n        range = [range];\r\n    }\r\n    return conditionformat.getTxtByRange(range);\r\n}\r\n\r\n/**\r\n * \u521D\u59CB\u5316\u5206\u9875\u5668\r\n * @param {Object} config \u5206\u9875\u5668\u914D\u7F6E\r\n * @param {Number} config.pageIndex \u5F53\u524D\u7684\u9875\u7801\r\n * @param {Number} config.pageSize \u6BCF\u9875\u663E\u793A\u591A\u5C11\u6761\u6570\u636E\r\n * @param {Array} config.selectOption \u9009\u62E9\u6BCF\u9875\u7684\u6761\u6570\r\n * @param {Number} config.total \u603B\u6761\u6570\r\n */\r\nexport function pagerInit (config) {\r\n    const {prevPage, nextPage, total} = locale().button;\r\n    $('#luckysheet-bottom-pager').remove()\r\n    $('#luckysheet-sheet-content').after('<div id=\"luckysheet-bottom-pager\" style=\"font-size: 14px; margin-left: 10px; display: inline-block;\"></div>')\r\n    $(\"#luckysheet-bottom-pager\").sPage({\r\n        page: config.pageIndex, //\u5F53\u524D\u9875\u7801\uFF0C\u5FC5\u586B\r\n        total: config.total, //\u6570\u636E\u603B\u6761\u6570\uFF0C\u5FC5\u586B\r\n        selectOption: config.selectOption, // \u9009\u62E9\u6BCF\u9875\u7684\u884C\u6570\uFF0C\r\n        pageSize: config.pageSize, //\u6BCF\u9875\u663E\u793A\u591A\u5C11\u6761\u6570\u636E\uFF0C\u9ED8\u8BA410\u6761\r\n        showTotal: config.showTotal, // \u662F\u5426\u663E\u793A\u603B\u6570\uFF0C\u9ED8\u8BA4\u5173\u95ED\uFF1Afalse\r\n        showSkip: config.showSkip, //\u662F\u5426\u663E\u793A\u8DF3\u9875\uFF0C\u9ED8\u8BA4\u5173\u95ED\uFF1Afalse\r\n        showPN: config.showPN, //\u662F\u5426\u663E\u793A\u4E0A\u4E0B\u7FFB\u9875\uFF0C\u9ED8\u8BA4\u5F00\u542F\uFF1Atrue\r\n        prevPage: config.prevPage || prevPage, //\u4E0A\u7FFB\u9875\u6587\u5B57\u63CF\u8FF0\uFF0C\u9ED8\u8BA4\"\u4E0A\u4E00\u9875\"\r\n        nextPage: config.nextPage || nextPage, //\u4E0B\u7FFB\u9875\u6587\u5B57\u63CF\u8FF0\uFF0C\u9ED8\u8BA4\"\u4E0B\u4E00\u9875\"\r\n        totalTxt: config.totalTxt || total + config.total, // \u6570\u636E\u603B\u6761\u6570\u6587\u5B57\u63CF\u8FF0\uFF0C{total}\u4E3A\u5360\u4F4D\u7B26\uFF0C\u9ED8\u8BA4\"\u603B\u5171\uFF1A{total}\"\r\n        backFun: function (page) {\r\n            page.pageIndex = page.page\r\n            if(!method.createHookFunction(\"onTogglePager\", page)){ return; }\r\n        }\r\n    });\r\n}\r\n\r\n/**\r\n * \u5237\u65B0\u516C\u5F0F\r\n * @param {Function} success \u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function refreshFormula (success) {\r\n    formula.execFunctionGroupForce(true);\r\n    luckysheetrefreshgrid()\r\n    setTimeout(() => {\r\n      if (success && typeof success === 'function') {\r\n          success();\r\n      }\r\n    })\r\n}\r\n\r\n/**\r\n * \u66F4\u65B0sheet\u6570\u636E\r\n * @param {Array} data \u5DE5\u4F5C\u7C3F\u914D\u7F6E\uFF0C\u53EF\u4EE5\u5305\u542B\u591A\u4E2A\u8868\r\n * @param {Object} options \u53EF\u9009\u53C2\u6570\r\n * @param {Function} options.success \u64CD\u4F5C\u7ED3\u675F\u7684\u56DE\u8C03\u51FD\u6570\r\n *\r\n */\r\nexport function updataSheet (options = {}) {\r\n    let {data, success} = options\r\n    let files = Store.luckysheetfile\r\n    for (let i = 0; i < data.length; i++) {\r\n        for (let j = 0; j < files.length; j++) {\r\n            if (files[j].index === data[i].index) {\r\n                files[j] = data[i]\r\n            }\r\n        }\r\n    }\r\n    let file = files[sheetmanage.getSheetIndex(Store.currentSheetIndex)],\r\n        sheetData = sheetmanage.buildGridData(file);\r\n    file.data = sheetData\r\n\r\n    if (!!file.isPivotTable) {\r\n        Store.luckysheetcurrentisPivotTable = true;\r\n        if (!isPivotInitial) {\r\n            pivotTable.changePivotTable(index);\r\n        }\r\n    }\r\n    else{\r\n        Store.luckysheetcurrentisPivotTable = false;\r\n        $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n        luckysheetsizeauto(false);\r\n    }\r\n    sheetmanage.mergeCalculation(file[\"index\"]);\r\n    sheetmanage.setSheetParam();\r\n    setTimeout(function () {\r\n        sheetmanage.showSheet();\r\n        sheetmanage.restoreCache();\r\n        formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n        sheetmanage.restoreSheetAll(Store.currentSheetIndex);\r\n        luckysheetrefreshgrid();\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n    server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n}\r\n\r\n/**\r\n * \u5237\u65B0\u72B6\u6001\u680F\u7684\u72B6\u6001\r\n * @param {Array}  data             \u64CD\u4F5C\u6570\u636E\r\n * @param {Number} r                \u6307\u5B9A\u7684\u884C\r\n * @param {Number} c                \u6307\u5B9A\u7684\u5217\r\n * @param {Function} success        \u56DE\u8C03\u51FD\u6570\r\n */\r\nexport function refreshMenuButtonFocus(data ,r,c , success){\r\n    data = data || Store.flowdata;\r\n    if(r == null && c == null){\r\n        /* \u83B7\u53D6\u9009\u53D6\u8303\u56F4 */\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length -1];\r\n\r\n        r = last.row_focus || last.row[0];\r\n        c = last.column_focus || last.column[0];\r\n    }\r\n\r\n    menuButton.menuButtonFocus(data, r, c);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    })\r\n}\r\n\r\n/**\r\n * \u68C0\u67E5\u9009\u533A\u5185\u6240\u6709cell\u6307\u5B9A\u7C7B\u578B\u7684\u72B6\u6001\u662F\u5426\u6EE1\u8DB3\u6761\u4EF6\uFF08\u4E3B\u8981\u662F\u7C97\u4F53\u3001\u659C\u4F53\u3001\u5220\u9664\u7EBF\u548C\u4E0B\u5212\u7EBF\u7B49\u7B49\uFF09\r\n * @param {String}  type            \u7C7B\u578B\r\n * @param {String}  status          \u76EE\u6807\u72B6\u6001\u503C\r\n */\r\nexport function checkTheStatusOfTheSelectedCells(type,status){\r\n\r\n    /* \u83B7\u53D6\u9009\u533A\u5185\u6240\u6709\u7684\u5355\u5143\u683C-\u6241\u5E73\u540E\u7684\u5904\u7406 */\r\n    let cells = getRangeWithFlatten();\r\n\r\n    let flag = cells.every(({r,c})=>{\r\n        let cell = Store.flowdata[r][c];\r\n        if(cell == null){\r\n            return false;\r\n        }\r\n        return cell[type] == status;\r\n    })\r\n\r\n    return flag;\r\n}\r\n", "import menuButton from './menuButton';\r\nimport formula from '../global/formula';\r\nimport { dynamicArrayHightShow } from '../global/dynamicArray';\r\nimport { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport browser from '../global/browser';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport Store from '../store';\r\nimport method from '../global/method';\r\nimport locale from '../locale/locale';\r\nimport { refreshMenuButtonFocus } from \"../global/api\";\r\n\r\n//\u516C\u5F0F\u51FD\u6570 \u9009\u533A\u5B9E\u4F53\u6846\r\nfunction seletedHighlistByindex(id, r1, r2, c1, c2) {\r\n    let row = Store.visibledatarow[r2],\r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n    let col = Store.visibledatacolumn[c2],\r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n    $('#' + id).css({\r\n        \"left\": col_pre,\r\n        \"width\": col - col_pre - 1,\r\n        \"top\": row_pre,\r\n        \"height\": row - row_pre - 1\r\n    });\r\n}\r\n\r\n//Set selection highlight\r\nfunction selectHightlightShow(isRestore = false) {\r\n    $(\"#luckysheet-cell-selected-boxs\").show();\r\n    $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").siblings(\".luckysheet-cell-selected\").remove();\r\n\r\n    if (Store.luckysheet_select_save.length > 0) {\r\n        for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n            let r1 = Store.luckysheet_select_save[i].row[0],\r\n                r2 = Store.luckysheet_select_save[i].row[1];\r\n            let c1 = Store.luckysheet_select_save[i].column[0],\r\n                c2 = Store.luckysheet_select_save[i].column[1];\r\n\r\n            let rf, cf;\r\n            if (Store.luckysheet_select_save[i].row_focus == null) {\r\n                rf = r1;\r\n            }\r\n            else {\r\n                rf = Store.luckysheet_select_save[i].row_focus;\r\n            }\r\n\r\n            if (Store.luckysheet_select_save[i].column_focus == null) {\r\n                cf = c1;\r\n            }\r\n            else {\r\n                cf = Store.luckysheet_select_save[i].column_focus;\r\n            }\r\n\r\n            let row = Store.visibledatarow[r2],\r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2],\r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            let row_f = Store.visibledatarow[rf],\r\n                row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n            let col_f = Store.visibledatacolumn[cf],\r\n                col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n            if (!!margeset) {\r\n                row_f = margeset.row[1];\r\n                row_pre_f = margeset.row[0];\r\n\r\n                col_f = margeset.column[1];\r\n                col_pre_f = margeset.column[0];\r\n            }\r\n\r\n            Store.luckysheet_select_save[i][\"row\"] = [r1, r2];\r\n            Store.luckysheet_select_save[i][\"column\"] = [c1, c2];\r\n\r\n            Store.luckysheet_select_save[i][\"row_focus\"] = rf;\r\n            Store.luckysheet_select_save[i][\"column_focus\"] = cf;\r\n\r\n            Store.luckysheet_select_save[i][\"left\"] = col_pre_f;\r\n            Store.luckysheet_select_save[i][\"width\"] = col_f - col_pre_f - 1;\r\n            Store.luckysheet_select_save[i][\"top\"] = row_pre_f;\r\n            Store.luckysheet_select_save[i][\"height\"] = row_f - row_pre_f - 1;\r\n\r\n            Store.luckysheet_select_save[i][\"left_move\"] = col_pre;\r\n            Store.luckysheet_select_save[i][\"width_move\"] = col - col_pre - 1;\r\n            Store.luckysheet_select_save[i][\"top_move\"] = row_pre;\r\n            Store.luckysheet_select_save[i][\"height_move\"] = row - row_pre - 1;\r\n\r\n            if (i == 0) {\r\n                if (Store.luckysheet_select_save.length == 1) {\r\n                    if (browser.mobilecheck()) {//\u79FB\u52A8\u7AEF\r\n                        $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                            \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                            \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                            \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                            \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                            \"display\": \"block\",\r\n                            \"border\": \"1px solid #0188fb\"\r\n                        })\r\n                            .find(\".luckysheet-cs-draghandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-fillhandle\")\r\n                            .css(\"display\", \"none\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-touchhandle\")\r\n                            .css(\"display\", \"block\");\r\n                    }\r\n                    else {\r\n                        $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                            \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                            \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                            \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                            \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                            \"display\": \"block\",\r\n                            \"border\": \"1px solid #0188fb\"\r\n                        })\r\n                            .find(\".luckysheet-cs-draghandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-fillhandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-touchhandle\")\r\n                            .css(\"display\", \"none\");\r\n                    }\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                        \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                        \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                        \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                        \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                        \"display\": \"block\",\r\n                        \"border\": \"1px solid rgba(1, 136, 251, 0.15)\"\r\n                    })\r\n                        .find(\".luckysheet-cs-draghandle\")\r\n                        .css(\"display\", \"none\")\r\n                        .end()\r\n                        .find(\".luckysheet-cs-fillhandle\")\r\n                        .css(\"display\", \"none\");\r\n                }\r\n            }\r\n            else {\r\n                $(\"#luckysheet-cell-selected-boxs\").append('<div class=\"luckysheet-cell-selected\" style=\"left: ' + Store.luckysheet_select_save[i][\"left_move\"] + 'px; width: ' + Store.luckysheet_select_save[i][\"width_move\"] + 'px; top: ' + Store.luckysheet_select_save[i][\"top_move\"] + 'px; height: ' + Store.luckysheet_select_save[i][\"height_move\"] + 'px; border: 1px solid rgba(1, 136, 251, 0.15); display: block;\"></div>');\r\n            }\r\n\r\n            if (i == Store.luckysheet_select_save.length - 1) {\r\n                //focus \u53D6\u9009\u533A\u6570\u7EC4\u6700\u540E\u4E00\u4E2A\r\n                $(\"#luckysheet-cell-selected-focus\").css({\r\n                    \"left\": Store.luckysheet_select_save[i][\"left\"],\r\n                    \"width\": Store.luckysheet_select_save[i][\"width\"],\r\n                    \"top\": Store.luckysheet_select_save[i][\"top\"],\r\n                    \"height\": Store.luckysheet_select_save[i][\"height\"],\r\n                    \"display\": \"block\"\r\n                });\r\n                //\u884C\u5217\u6570\r\n                luckysheet_count_show(\r\n                    Store.luckysheet_select_save[i][\"left_move\"],\r\n                    Store.luckysheet_select_save[i][\"top_move\"],\r\n                    Store.luckysheet_select_save[i][\"width_move\"],\r\n                    Store.luckysheet_select_save[i][\"height_move\"],\r\n                    [r1, r2],\r\n                    [c1, c2]\r\n                );\r\n                //\u5DE6\u4E0A\u89D2\u9009\u62E9\u533A\u57DF\u6846\r\n                formula.fucntionboxshow(rf, cf);\r\n                //focus\u5355\u5143\u683C\u6570\u636E\u9A8C\u8BC1\r\n                dataVerificationCtrl.cellFocus(rf, cf);\r\n            }\r\n        }\r\n\r\n        //\u884C\u5217\u6807\u9898\u680F\r\n        selectTitlesShow(Store.luckysheet_select_save, isRestore);\r\n\r\n        //\u5DE6\u4E0A\u89D2\u8303\u56F4\u663E\u793A\r\n        selectHelpboxFill();\r\n\r\n        //\u52A8\u6001\u6570\u7EC4\u663E\u793A\r\n        if (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]) {\r\n            dynamicArrayHightShow(Store.luckysheet_select_save[0].row[0], Store.luckysheet_select_save[0].column[0]);\r\n        }\r\n    \r\n        /* \u5237\u65B0\u5F53\u524D\u72B6\u6001\u680F */\r\n        refreshMenuButtonFocus();\r\n    }\r\n\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_select_save = Store.luckysheet_select_save;\r\n            // Hook function, change the range selection box, selectHightlightShowillbe triggered multiple times when mousemove is moused, and thhistoricalvalue is used here to throttle\r\n        const luckysheet_select_save_previous = JSON.stringify(Store.luckysheet_select_save);\r\n\r\n        if(Store.luckysheet_select_save_previous == null |Store.luckysheet_select_save_previous !== luckysheet_select_save_previous){\r\n            method.createHookFunction('rangeSelect', Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)], Store.luckysheet_select_save);\r\n        }\r\n        \r\n        Store.luckysheet_select_save_previous = luckysheet_select_save_previous;\r\n}\r\n\r\n//\u9009\u533A\u6807\u9898\u680F\r\nfunction selectTitlesShow(rangeArr, isRestore = false) {\r\n    let s = $.extend(true, [], rangeArr);\r\n\r\n    let rowTitleMap = {}, columnTitleMap = {};\r\n    for (let i = 0; i < s.length; i++) {\r\n        let r1 = s[i][\"row\"][0], r2 = s[i][\"row\"][1], c1 = s[i][\"column\"][0], c2 = s[i][\"column\"][1];\r\n\r\n        // if(isRestore){\r\n        //     let margeset = menuButton.mergeborer(Store.flowdata, r1, c1);\r\n        //     if(!!margeset){\r\n        //         r1 = margeset.row[2];\r\n        //         r2 = margeset.row[3];\r\n\r\n        //         c1 = margeset.column[2];\r\n        //         c2 = margeset.column[3];\r\n        //     }\r\n        // }\r\n\r\n        //\u884C\u3001\u5217\u6807\u9898\u680F\r\n        rowTitleMap = selectTitlesMap(rowTitleMap, r1, r2);\r\n        columnTitleMap = selectTitlesMap(columnTitleMap, c1, c2);\r\n    }\r\n\r\n    //\u884C\u6807\u9898\r\n    $(\"#luckysheet-rows-h-selected\").empty();\r\n\r\n    let rowTitleRange = selectTitlesRange(rowTitleMap);\r\n    for (let i = 0; i < rowTitleRange.length; i++) {\r\n        let r1 = rowTitleRange[i][0], r2 = rowTitleRange[i][rowTitleRange[i].length - 1];\r\n        let row = rowLocationByIndex(r2)[1], row_pre = rowLocationByIndex(r1)[0];\r\n\r\n        $(\"#luckysheet-rows-h-selected\").append('<div class=\"luckysheet-rows-h-selected\" style=\"top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);\"></div>');\r\n    }\r\n\r\n    //\u5217\u6807\u9898\r\n    $(\"#luckysheet-cols-h-selected\").empty();\r\n\r\n    let columnTitleRange = selectTitlesRange(columnTitleMap);\r\n    for (let j = 0; j < columnTitleRange.length; j++) {\r\n        let c1 = columnTitleRange[j][0], c2 = columnTitleRange[j][columnTitleRange[j].length - 1];\r\n        let col = colLocationByIndex(c2)[1], col_pre = colLocationByIndex(c1)[0];\r\n\r\n        $(\"#luckysheet-cols-h-selected\").append('<div class=\"luckysheet-cols-h-selected\" style=\"left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);\"></div>');\r\n\r\n    }\r\n}\r\nfunction selectTitlesMap(rangeMap, range1, range2) {\r\n    let map = $.extend(true, {}, rangeMap);\r\n\r\n    for (let i = range1; i <= range2; i++) {\r\n        if (i in map) {\r\n            continue;\r\n        }\r\n\r\n        map[i] = 0;\r\n    }\r\n\r\n    return map;\r\n}\r\nfunction selectTitlesRange(map) {\r\n    let mapArr = [];\r\n\r\n    for (let i in map) {\r\n        mapArr.push(i);\r\n    }\r\n\r\n    mapArr.sort(function (a, b) { return a - b; });\r\n\r\n    let rangeArr = [];\r\n    let item = [];\r\n\r\n    if (mapArr.length > 1) {\r\n        for (let j = 1; j < mapArr.length; j++) {\r\n            if (mapArr[j] - mapArr[j - 1] == 1) {\r\n                item.push(mapArr[j - 1]);\r\n\r\n                if (j == mapArr.length - 1) {\r\n                    item.push(mapArr[j]);\r\n                    rangeArr.push(item);\r\n                }\r\n            }\r\n            else {\r\n                if (j == 1) {\r\n                    if (j == mapArr.length - 1) {\r\n                        item.push(mapArr[j - 1]);\r\n                        rangeArr.push(item);\r\n                        rangeArr.push([mapArr[j]]);\r\n                    }\r\n                    else {\r\n                        rangeArr.push(mapArr[0]);\r\n                    }\r\n                }\r\n                else if (j == mapArr.length - 1) {\r\n                    item.push(mapArr[j - 1]);\r\n                    rangeArr.push(item);\r\n                    rangeArr.push([mapArr[j]]);\r\n                }\r\n                else {\r\n                    item.push(mapArr[j - 1]);\r\n                    rangeArr.push(item);\r\n                    item = [];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        rangeArr.push([mapArr[0]]);\r\n    }\r\n\r\n    return rangeArr;\r\n}\r\n\r\n//\u9009\u533A\u662F\u5426\u91CD\u53E0\r\nfunction selectIsOverlap(range) {\r\n    if (range == null) {\r\n        range = Store.luckysheet_select_save;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    let overlap = false;\r\n    let map = {};\r\n\r\n    for (let s = 0; s < range.length; s++) {\r\n        let str_r = range[s].row[0],\r\n            end_r = range[s].row[1];\r\n        let str_c = range[s].column[0],\r\n            end_c = range[s].column[1];\r\n\r\n        for (let r = str_r; r <= end_r; r++) {\r\n            for (let c = str_c; c <= end_c; c++) {\r\n                if ((r + \"_\" + c) in map) {\r\n                    overlap = true;\r\n                    break;\r\n                }\r\n                else {\r\n                    map[r + \"_\" + c] = 0;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return overlap;\r\n}\r\n// \u534F\u540C\u63D0\u793A\u6846\r\nfunction collaborativeEditBox() {\r\n    let all_width = Store.visibledatacolumn;//\u5F53\u524D\u64CD\u4F5C\u9875\u7684\u6240\u6709\u5217\u8DDD\u79BB\u5DE6\u8FB9\u7684\u8DDD\u79BB\r\n    let all_height = Store.visibledatarow;//\u5F53\u524D\u64CD\u4F5C\u9875\u7684\u6240\u6709\u5217\u8DDD\u79BB\u9876\u90E8\u7684\u8DDD\u79BB\r\n\r\n    Store.cooperativeEdit.changeCollaborationSize.forEach(value => {\r\n        if (value.i == Store.currentSheetIndex) {\r\n            let count_col = value.v.column;//\u7CFB\u7EDF\u63D0\u793A\u6846\u6240\u5728\u7684\u5217\u8303\u56F4\r\n            let change_width = all_width[count_col[0]] -1 //\u63D0\u793A\u6846\u6240\u5728\u5217\u53F7\u4E3A0\u65F6\u8981\u6539\u53D8\u7684\u5BBD\r\n            if(value.v.column[0] !== 0)  {\r\n                //\u7528\u63D0\u793A\u6846\u53F3\u8FB9\u6846\u5230\u56FE\u8868\u6700\u5DE6\u7684\u8DDD\u79BB\u51CF\u53BB\u5DE6\u8FB9\u6846\u5230\u56FE\u8868\u5DE6\u8FB9\u8DDD\u79BB\u518D\u51CF\u53BB\u8FB9\u6846\u503C\r\n                change_width = all_width[count_col[1]] - all_width[count_col[0] - 1] - (count_col[1] - count_col[0] + 1)\r\n            }\r\n            let count_row = value.v.row;//\u7CFB\u7EDF\u63D0\u793A\u6846\u6240\u5728\u7684\u884C\u8303\u56F4\r\n            let change_height = all_height[count_row[0]] -1\r\n            if(value.v.row[0] !== 0){\r\n                change_height = all_height[count_row[1]] - all_height[count_row[0] - 1] - (count_row[1] - count_row[0] + 1)\r\n            }\r\n            let range = Store.cooperativeEdit.merge_range //\u83B7\u53D6\u5355\u5143\u683C\u5408\u5E76\u540E\u7684\u6570\u636E\r\n            let change_left = all_width[value.v.column[0] - 1] - 1 //\u63D0\u793A\u6846\u79BB\u56FE\u8868\u6700\u5DE6\u8FB9\u7684\u8DDD\u79BB\r\n            let change_top = all_height[value.v.row[0] - 1] - 1 //\u63D0\u793A\u6846\u79BB\u56FE\u8868\u6700\u53F3\u8FB9\u7684\u8DDD\u79BB\r\n            if (Store.config.columnlen !== null) {\r\n                //\u5F53\u6539\u53D8\u5BBD\u7684\u5217\u4E0D\u5728\u63D0\u793A\u6846\u8303\u56F4\u5185\u65F6\uFF0C\u5C06\u6539\u53D8\u5217\u7684\u521D\u59CB\u4F4D\u7F6E\u6539\u4E3A\u5728\u63D0\u793A\u6846\u8303\u56F4\u5185\r\n                for (let k in Store.config.columnlen) {\r\n                    if (value.v.column[0] <= k && k <= value.v.column[1]) {\r\n                        Store.luckysheet_cols_change_size_start[1] = k - 0\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n            if (Store.config.rowlen !== null) {\r\n                for (let k in Store.config.rowlen) {\r\n                    if (value.v.row[0] <= k && k <= value.v.row[1]) {\r\n                        Store.luckysheet_rows_change_size_start[1] = k - 0\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n            // \u6539\u53D8\u5217\u5BBD\u7684\u4F4D\u7F6E\u5728\u63D0\u793A\u6846\u8303\u56F4\u5185\r\n            let flag_width = value.v.column[0] <= Store.luckysheet_cols_change_size_start[1] && Store.luckysheet_cols_change_size_start[1] <= value.v.column[1]\r\n            if (flag_width) {\r\n                if (Store.luckysheet_cols_change_size_start[1] == 0) {\r\n                    change_width = all_width[0] - 1\r\n                } else {\r\n                    // \u4E0D\u5728\u63D0\u793A\u6846\u8303\u56F4\u5185\r\n                    let counts = value.v.column;\r\n                    change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                }\r\n            }\r\n            let flag_height = value.v.row[0] <= Store.luckysheet_rows_change_size_start[1] && Store.luckysheet_rows_change_size_start[1] <= value.v.row[1]\r\n            if (flag_height) {\r\n                if (Store.luckysheet_rows_change_size_start[1] == 0) {\r\n                    change_height = all_height[0] - 1\r\n                } else {\r\n                    let counts = value.v.row;\r\n                    change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                }\r\n            }\r\n            //\u5408\u5E76\u5355\u5143\u683C\u65F6\u6267\u884C\r\n            if (Object.keys(range).length > 0 ) {\r\n                let flag_sure_merge = false\r\n                if(range.v.length > 1) {\r\n                    flag_sure_merge = range.v[1][0] == null || Object.keys(range.v[1][0]).length > 0\r\n                }\r\n                if(range.v[0].length > 1) {\r\n                    flag_sure_merge = range.v[0][1] == null || Object.keys(range.v[0][1]).length > 0\r\n                }\r\n                if(flag_sure_merge) {\r\n                    // \u5408\u5E76\u6210\u4E00\u4E2A\u65F6\u6267\u884C\r\n                    let flag_merge_width = range.column[0] <= value.v.column[0] && range.column[1] >= value.v.column[1];\r\n                    change_left = all_width[range.column[0] - 1] - 1\r\n                    change_top = all_height[range.row[0] - 1] - 1\r\n                    change_width = all_width[range.column[1]] - 1\r\n                    change_height = all_height[range.row[1]] - 1\r\n                    if (flag_merge_width) {\r\n                        if (range.column[0] !== 0) {\r\n                            let counts = range.column;\r\n                            change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                        } else {\r\n                            change_left = 0\r\n                        }\r\n                        value.v.column = range.column\r\n                    }\r\n                    let flag_merge_height = range.row[0] <= value.v.row[0] && range.row[1] >= value.v.row[1];\r\n                    if (flag_merge_height) {\r\n                        if (range.row[0] !== 0) {\r\n                            let counts = range.row;\r\n                            change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                        } else {\r\n                            change_top = 0\r\n                        }\r\n                        value.v.row = range.row\r\n                    }\r\n                } else {\r\n                    // \u5408\u5E76\u53D6\u6D88\u53D8\u6210\u591A\u4E2A\u5355\u5143\u683C\u65F6\u6267\u884C\r\n                    change_width = all_width[count_col[0]] - all_width[count_col[0] - 1] - 1\r\n                    if(count_col[0] === 0) {\r\n                        change_width = all_width[count_col[0]] - 1\r\n                    }\r\n                    change_height = all_height[count_row[0]] - all_height[count_row[0] - 1] - 1\r\n                    if(count_row[0] === 0) {\r\n                        change_height = all_height[count_row[0]] - 1\r\n                    }\r\n                }\r\n            }\r\n            $(\"#luckysheet-multipleRange-show-\" + value.id).css({ \"height\": change_height, \"width\": change_width, \"top\": change_top + 'px', \"left\": change_left + 'px' })\r\n            let change_bottom = $(\"#luckysheet-multipleRange-show-\" + value.id)[0].offsetHeight - 1\r\n            $(\"#luckysheet-multipleRange-show-\" + value.id + \">.username\").css({ \"bottom\": change_bottom + 'px' })\r\n        }\r\n    })\r\n}\r\n//\u590D\u5236\u9009\u533A\u865A\u7EBF\u6846\r\nfunction selectionCopyShow(range) {\r\n    $(\"#luckysheet-selection-copy\").empty();\r\n\r\n    if (range == null) {\r\n        range = Store.luckysheet_selection_range;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    if (range.length > 0) {\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0], r2 = range[s].row[1];\r\n            let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n            let row = Store.visibledatarow[r2],\r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2],\r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            let copyDomHtml = '<div class=\"luckysheet-selection-copy\" style=\"display: block; left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px;\">' +\r\n                '<div class=\"luckysheet-selection-copy-top luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-right luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-left luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-hc\"></div>' +\r\n                '</div>';\r\n            $(\"#luckysheet-selection-copy\").append(copyDomHtml);\r\n        }\r\n    }\r\n}\r\n\r\n//\u9009\u533A\u884C\u5217\u6570\u663E\u793A\r\nfunction luckysheet_count_show(left, top, width, height, rowseleted, columnseleted) {\r\n    let rowl = rowseleted[1] - rowseleted[0] + 1,\r\n        coll = columnseleted[1] - columnseleted[0] + 1;\r\n    let drawWidth = Store.luckysheetTableContentHW[0],\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    let scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n\r\n    if (rowl >= 4) {\r\n        let leftv = left - 25;\r\n        if (leftv < 0) {\r\n            leftv = left + 5;\r\n        }\r\n\r\n        if (leftv < scrollWidth) {\r\n            leftv = scrollWidth + 10;\r\n        }\r\n\r\n        let topv = top + height / 2;\r\n        if (height > drawHeight) {\r\n            topv = scrollHeight + drawHeight / 2;\r\n        }\r\n\r\n        $(\"#luckysheet-row-count-show\").css({ \"left\": leftv, \"top\": topv, \"display\": \"block\", \"width\": \"11px\" }).html(\"<div>\" + rowl.toString().split(\"\").join(\"</div><div>\") + \"</div><div>\" + locale_info.row + \"</div>\");\r\n    }\r\n    else {\r\n        $(\"#luckysheet-row-count-show\").hide();\r\n    }\r\n\r\n    if (coll >= 4) {\r\n        let topv = top - 25;\r\n        if (topv < 0) {\r\n            topv = top + 5;\r\n        }\r\n\r\n        if (topv < scrollHeight) {\r\n            topv = scrollHeight + 10;\r\n        }\r\n\r\n        let leftv = left + width / 2;\r\n        if (width > drawWidth) {\r\n            leftv = scrollWidth + drawWidth / 2;\r\n        }\r\n\r\n        $(\"#luckysheet-column-count-show\").css({ \"left\": leftv, \"top\": topv, \"display\": \"block\" }).text(coll + locale_info.column);\r\n    }\r\n    else {\r\n        $(\"#luckysheet-column-count-show\").hide();\r\n    }\r\n}\r\n\r\nfunction selectHelpboxFill() {\r\n    let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let rf = range[\"row_focus\"], cf = range[\"column_focus\"];\r\n    if (Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]) {\r\n        $(\"#luckysheet-helpbox-cell\").text(getRangetxt(Store.currentSheetIndex, {\r\n            column: [cf, cf],\r\n            row: [rf, rf],\r\n        }));\r\n    }\r\n    else {\r\n        $(\"#luckysheet-helpbox-cell\").text(getRangetxt(Store.currentSheetIndex, range));\r\n    }\r\n\r\n}\r\n\r\nexport {\r\n    seletedHighlistByindex,\r\n    selectHightlightShow,\r\n    selectIsOverlap,\r\n    selectionCopyShow,\r\n    collaborativeEditBox,\r\n    luckysheet_count_show,\r\n    selectHelpboxFill\r\n}\r\n", "import { replaceHtml } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport menuButton from './menuButton';\r\nimport editor from '../global/editor';\r\nimport tooltip from '../global/tooltip';\r\nimport { isEditMode } from '../global/validate';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//\u66F4\u591A\u683C\u5F0F\r\nconst luckysheetMoreFormat = {\r\n    moneyFmtList: [\r\n        {\r\n            \"name\": \"\u4EBA\u6C11\u5E01\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\u00A5\"\r\n        }, {\r\n            \"name\": \"\u7F8E\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u6B27\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\u20AC\"\r\n        }, {\r\n            \"name\": \"\u82F1\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u6E2F\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u65E5\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE5\"\r\n        }, {\r\n            \"name\": \"\u963F\u5C14\u5DF4\u5C3C\u4E9A\u5217\u514B\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Lek\"\r\n        }, {\r\n            \"name\": \"\u963F\u5C14\u53CA\u5229\u4E9A\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u963F\u5BCC\u6C57\u5C3C\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"Af\"\r\n        }, {\r\n            \"name\": \"\u963F\u6839\u5EF7\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u963F\u62C9\u4F2F\u8054\u5408\u914B\u957F\u56FD\u8FEA\u62C9\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"dh\"\r\n        }, {\r\n            \"name\": \"\u963F\u9C81\u5DF4\u5F17\u7F57\u6797\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Afl\"\r\n        }, {\r\n            \"name\": \"\u963F\u66FC\u91CC\u4E9A\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"\u963F\u585E\u62DC\u7586\u9A6C\u7EB3\u7279\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u57C3\u53CA\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u57C3\u585E\u4FC4\u6BD4\u4E9A\u6BD4\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Birr\"\r\n        }, {\r\n            \"name\": \"\u5B89\u54E5\u62C9\u5BBD\u624E\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Kz\"\r\n        }, {\r\n            \"name\": \"\u6FB3\u5927\u5229\u4E9A\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u6FB3\u95E8\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MOP\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u5DF4\u591A\u65AF\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u5E03\u4E9A\u65B0\u51E0\u5185\u4E9A\u57FA\u90A3\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"PGK\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u54C8\u9A6C\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u57FA\u65AF\u5766\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u62C9\u572D\u74DC\u62C9\u5C3C\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"Gs\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u6797\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u62FF\u9A6C\u5DF4\u6CE2\u4E9A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"B/\"\r\n        }, {\r\n            \"name\": \"\u5DF4\u897F\u91CC\u4E9A\u4F0A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"R$\"\r\n        }, {\r\n            \"name\": \"\u767D\u4FC4\u7F57\u65AF\u5362\u5E03\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"\u0440\"\r\n        }, {\r\n            \"name\": \"\u767E\u6155\u5927\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4FDD\u52A0\u5229\u4E9A\u5217\u5F17\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"lev\"\r\n        }, {\r\n            \"name\": \"\u51B0\u5C9B\u514B\u6717\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"\u6CE2\u9ED1\u53EF\u5151\u6362\u9A6C\u514B\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"KM\"\r\n        }, {\r\n            \"name\": \"\u6CE2\u5170\u5179\u7F57\u63D0\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"z?\"\r\n        }, {\r\n            \"name\": \"\u73BB\u5229\u7EF4\u4E9A\u8BFA\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Bs\"\r\n        }, {\r\n            \"name\": \"\u4F2F\u5229\u5179\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u535A\u8328\u74E6\u7EB3\u666E\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"P\"\r\n        }, {\r\n            \"name\": \"\u4E0D\u4E39\u52AA\u624E\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Nu\"\r\n        }, {\r\n            \"name\": \"\u5E03\u9686\u8FEA\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FBu\"\r\n        }, {\r\n            \"name\": \"\u671D\u9C9C\u5706\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?KP\"\r\n        }, {\r\n            \"name\": \"\u4E39\u9EA6\u514B\u6717\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"\u4E1C\u52A0\u52D2\u6BD4\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u591A\u7C73\u5C3C\u52A0\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RD$\"\r\n        }, {\r\n            \"name\": \"\u4FC4\u56FD\u5362\u5E03\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u5384\u7ACB\u7279\u91CC\u4E9A\u7EB3\u514B\u6CD5\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Nfk\"\r\n        }, {\r\n            \"name\": \"\u975E\u6D32\u91D1\u878D\u5171\u540C\u4F53\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CFA\"\r\n        }, {\r\n            \"name\": \"\u83F2\u5F8B\u5BBE\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u6590\u6D4E\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4F5B\u5F97\u89D2\u57C3\u65AF\u5E93\u591A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CVE\"\r\n        }, {\r\n            \"name\": \"\u798F\u514B\u5170\u7FA4\u5C9B\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u5188\u6BD4\u4E9A\u8FBE\u62C9\u897F\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GMD\"\r\n        }, {\r\n            \"name\": \"\u521A\u679C\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FrCD\"\r\n        }, {\r\n            \"name\": \"\u54E5\u4F26\u6BD4\u4E9A\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u54E5\u65AF\u8FBE\u9ECE\u52A0\u79D1\u6717\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u53E4\u5DF4\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u53E4\u5DF4\u53EF\u5151\u6362\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u572D\u4E9A\u90A3\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u54C8\u8428\u514B\u65AF\u5766\u575A\u6208\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u6D77\u5730\u53E4\u5FB7\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"HTG\"\r\n        }, {\r\n            \"name\": \"\u97E9\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u8377\u5C5E\u5B89\u7684\u5217\u65AF\u76FE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"NAf.\"\r\n        }, {\r\n            \"name\": \"\u6D2A\u90FD\u62C9\u65AF\u62C9\u4F26\u76AE\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"L\"\r\n        }, {\r\n            \"name\": \"\u5409\u5E03\u63D0\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Fdj\"\r\n        }, {\r\n            \"name\": \"\u5409\u5C14\u5409\u65AF\u65AF\u5766\u7D22\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"KGS\"\r\n        }, {\r\n            \"name\": \"\u51E0\u5185\u4E9A\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FG\"\r\n        }, {\r\n            \"name\": \"\u52A0\u62FF\u5927\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u52A0\u7EB3\u585E\u5730\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GHS\"\r\n        }, {\r\n            \"name\": \"\u67EC\u57D4\u5BE8\u745E\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Riel\"\r\n        }, {\r\n            \"name\": \"\u6377\u514B\u514B\u6717\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"K?\"\r\n        }, {\r\n            \"name\": \"\u6D25\u5DF4\u5E03\u97E6\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5361\u5854\u5C14\u91CC\u4E9A\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"\u5F00\u66FC\u7FA4\u5C9B\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u79D1\u6469\u7F57\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CF\"\r\n        }, {\r\n            \"name\": \"\u79D1\u5A01\u7279\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u514B\u7F57\u5730\u4E9A\u5E93\u7EB3\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"kn\"\r\n        }, {\r\n            \"name\": \"\u80AF\u5C3C\u4E9A\u5148\u4EE4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ksh\"\r\n        }, {\r\n            \"name\": \"\u83B1\u7D22\u6258\u6D1B\u8482\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"LSL\"\r\n        }, {\r\n            \"name\": \"\u8001\u631D\u57FA\u666E\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u9ECE\u5DF4\u5AE9\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"L\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u7ACB\u9676\u5B9B\u7ACB\u7279\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Lt\"\r\n        }, {\r\n            \"name\": \"\u5229\u6BD4\u4E9A\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u5229\u6BD4\u4E9A\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5362\u65FA\u8FBE\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RF\"\r\n        }, {\r\n            \"name\": \"\u7F57\u9A6C\u5C3C\u4E9A\u5217\u4F0A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RON\"\r\n        }, {\r\n            \"name\": \"\u9A6C\u8FBE\u52A0\u65AF\u52A0\u963F\u91CC\u4E9A\u91CC\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ar\"\r\n        }, {\r\n            \"name\": \"\u9A6C\u5C14\u4EE3\u592B\u62C9\u83F2\u4E9A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rf\"\r\n        }, {\r\n            \"name\": \"\u9A6C\u62C9\u7EF4\u514B\u74E6\u67E5\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MWK\"\r\n        }, {\r\n            \"name\": \"\u9A6C\u6765\u897F\u4E9A\u6797\u5409\u7279\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RM\"\r\n        }, {\r\n            \"name\": \"\u9A6C\u5176\u987F\u6234\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u6BDB\u91CC\u6C42\u65AF\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MURs\"\r\n        }, {\r\n            \"name\": \"\u6BDB\u91CC\u5854\u5C3C\u4E9A\u4E4C\u5409\u4E9A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MRO\"\r\n        }, {\r\n            \"name\": \"\u8499\u53E4\u56FE\u683C\u91CC\u514B\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u5B5F\u52A0\u62C9\u5854\u5361\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u79D8\u9C81\u65B0\u7D22\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"S/\"\r\n        }, {\r\n            \"name\": \"\u7F05\u7538\u5F00\u4E9A\u7279\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"K\"\r\n        }, {\r\n            \"name\": \"\u6469\u5C14\u591A\u74E6\u5217\u4F0A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MDL\"\r\n        }, {\r\n            \"name\": \"\u6469\u6D1B\u54E5\u8FEA\u62C9\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"dh\"\r\n        }, {\r\n            \"name\": \"\u83AB\u6851\u6BD4\u514B\u6885\u8482\u5361\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MTn\"\r\n        }, {\r\n            \"name\": \"\u58A8\u897F\u54E5\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u7EB3\u7C73\u6BD4\u4E9A\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5357\u975E\u5170\u7279\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"R\"\r\n        }, {\r\n            \"name\": \"\u5357\u82CF\u4E39\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u5C3C\u52A0\u62C9\u74DC\u79D1\u591A\u5DF4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"C$\"\r\n        }, {\r\n            \"name\": \"\u5C3C\u6CCA\u5C14\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"\u5C3C\u65E5\u5229\u4E9A\u5948\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u632A\u5A01\u514B\u6717\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"\u4E54\u6CBB\u4E9A\u62C9\u745E\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GEL\"\r\n        }, {\r\n            \"name\": \"\u4EBA\u6C11\u5E01\uFF08\u79BB\u5CB8\uFF09\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE5\"\r\n        }, {\r\n            \"name\": \"\u745E\u5178\u514B\u6717\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"\u745E\u58EB\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CHF\"\r\n        }, {\r\n            \"name\": \"\u585E\u5C14\u7EF4\u4E9A\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u585E\u62C9\u5229\u6602\u5229\u6602\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SLL\"\r\n        }, {\r\n            \"name\": \"\u585E\u820C\u5C14\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SCR\"\r\n        }, {\r\n            \"name\": \"\u6C99\u7279\u91CC\u4E9A\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"\u5723\u591A\u7F8E\u591A\u5E03\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Db\"\r\n        }, {\r\n            \"name\": \"\u5723\u8D6B\u52D2\u62FF\u7FA4\u5C9B\u78C5\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u65AF\u91CC\u5170\u5361\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"\u65AF\u5A01\u58EB\u5170\u91CC\u5170\u5409\u5C3C\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SZL\"\r\n        }, {\r\n            \"name\": \"\u82CF\u4E39\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SDG\"\r\n        }, {\r\n            \"name\": \"\u82CF\u91CC\u5357\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u6240\u7F57\u95E8\u7FA4\u5C9B\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u7D22\u9A6C\u91CC\u5148\u4EE4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SOS\"\r\n        }, {\r\n            \"name\": \"\u5854\u5409\u514B\u65AF\u5766\u7D22\u83AB\u5C3C\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Som\"\r\n        }, {\r\n            \"name\": \"\u592A\u5E73\u6D0B\u6CD5\u90CE\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"FCFP\"\r\n        }, {\r\n            \"name\": \"\u6CF0\u56FD\u94E2\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u5766\u6851\u5C3C\u4E9A\u5148\u4EE4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"TSh\"\r\n        }, {\r\n            \"name\": \"\u6C64\u52A0\u6F58\u52A0\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"T$\"\r\n        }, {\r\n            \"name\": \"\u7279\u7ACB\u5C3C\u8FBE\u548C\u591A\u5DF4\u54E5\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u7A81\u5C3C\u65AF\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u571F\u8033\u5176\u91CC\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u74E6\u52AA\u963F\u56FE\u74E6\u56FE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"VUV\"\r\n        }, {\r\n            \"name\": \"\u5371\u5730\u9A6C\u62C9\u683C\u67E5\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Q\"\r\n        }, {\r\n            \"name\": \"\u59D4\u5185\u745E\u62C9\u535A\u5229\u74E6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Bs\"\r\n        }, {\r\n            \"name\": \"\u6587\u83B1\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4E4C\u5E72\u8FBE\u5148\u4EE4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"UGX\"\r\n        }, {\r\n            \"name\": \"\u4E4C\u514B\u5170\u683C\u91CC\u592B\u5C3C\u4E9A\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\u0433\u0440\u043D.\"\r\n        }, {\r\n            \"name\": \"\u4E4C\u62C9\u572D\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4E4C\u5179\u522B\u514B\u65AF\u5766\u82CF\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"so?m\"\r\n        }, {\r\n            \"name\": \"\u897F\u8428\u6469\u4E9A\u5854\u62C9\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"WST\"\r\n        }, {\r\n            \"name\": \"\u65B0\u52A0\u5761\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u65B0\u53F0\u5E01\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"NT$\"\r\n        }, {\r\n            \"name\": \"\u65B0\u897F\u5170\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u5308\u7259\u5229\u798F\u6797\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ft\"\r\n        }, {\r\n            \"name\": \"\u53D9\u5229\u4E9A\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u7259\u4E70\u52A0\u5143\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4E9A\u7F8E\u5C3C\u4E9A\u5FB7\u62C9\u59C6\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Dram\"\r\n        }, {\r\n            \"name\": \"\u4E5F\u95E8\u91CC\u4E9A\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"\u4F0A\u62C9\u514B\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u4F0A\u6717\u91CC\u4E9A\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"\u4EE5\u8272\u5217\u65B0\u8C22\u514B\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u5370\u5EA6\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u5370\u5EA6\u5C3C\u897F\u4E9A\u5362\u6BD4\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rp\"\r\n        }, {\r\n            \"name\": \"\u7EA6\u65E6\u7B2C\u7EB3\u5C14\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"\u8D8A\u5357\u76FE\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"\u8D5E\u6BD4\u4E9A\u514B\u74E6\u67E5\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"ZMW\"\r\n        }, {\r\n            \"name\": \"\u76F4\u5E03\u7F57\u9640\u9551\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"\uFFE1\"\r\n        }, {\r\n            \"name\": \"\u667A\u5229\u6BD4\u7D22\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"\u4E2D\u975E\u91D1\u878D\u5408\u4F5C\u6CD5\u90CE\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FCFA\"\r\n        }\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930\u5E748\u67085\u65E5\",\r\n            \"value\": 'yyyy\"\u5E74\"M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"8\u67085\u65E5\",\r\n            \"value\": 'M\"\u6708\"d\"\u65E5\"'\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u534801:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u53481:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm'\r\n        },\r\n        {\r\n            \"name\": \"\u4E0B\u53481:30:30\",\r\n            \"value\": '\u4E0A\u5348/\u4E0B\u5348 h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 \u4E0B\u534801:30\",\r\n            \"value\": \"MM-dd \u4E0A\u5348/\u4E0B\u5348 hh:mm\"\r\n        },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930\u5E748\u67085\u65E5\u661F\u671F\u4E8C \u4E0B\u53481:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    numFmtList: [\r\n        {\r\n            \"name\": \"1235\",\r\n            \"value\": \"0\"\r\n        },\r\n        {\r\n            \"name\": \"1234.56\",\r\n            \"value\": \"0.00\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0_);(#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0_);[Red](#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00_);(#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00_);[Red](#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,235\",\r\n            \"value\": \"$#,##0_);($#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,235\",\r\n            \"value\": \"$#,##0_);[Red]($#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,234.56\",\r\n            \"value\": \"$#,##0.00_);($#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,234.56\",\r\n            \"value\": \"$#,##0.00_);[Red]($#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"1234.56\",\r\n            \"value\": \"@\"\r\n        },\r\n        {\r\n            \"name\": \"123456%\",\r\n            \"value\": \"0%\"\r\n        },\r\n        {\r\n            \"name\": \"123456.00%\",\r\n            \"value\": \"0.00%\"\r\n        },\r\n        {\r\n            \"name\": \"1.23E+03\",\r\n            \"value\": \"0.00E+00\"\r\n        },\r\n        {\r\n            \"name\": \"1.2E+3\",\r\n            \"value\": \"##0.0E+0\"\r\n        },\r\n        {\r\n            \"name\": \"1234 5/9\",\r\n            \"value\": \"# ?/?\"\r\n        },\r\n        {\r\n            \"name\": \"1234 14/25\",\r\n            \"value\": \"# ??/??\"\r\n        },\r\n        {\r\n            \"name\": \"$ 1,235\",\r\n            \"value\": '_($* #,##0_);_(...($* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": '_(* #,##0_);_(*..._(* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"$ 1,234.56\",\r\n            // \"value\": '_($* #,##0.00_)...* \"-\"??_);_(@_)'\r\n            \"value\": '_($* #,##0.00_);_(...($* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": '_(* #,##0.00_);...* \"-\"??_);_(@_)'\r\n        },\r\n    ],\r\n    createDialog: function(type){\r\n        let _this = this;\r\n\r\n        const currencyDetail = locale().currencyDetail;\r\n        const locale_format = locale().format;\r\n        const locale_button = locale().button;\r\n\r\n        this.moneyFmtList = [\r\n            {'name': currencyDetail.RMB,'pos': 'before','value': '\u00A5'},\r\n            {'name': currencyDetail.USdollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.EUR,'pos': 'before','value': '\u20AC'},\r\n            {'name': currencyDetail.GBP,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.HK,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.JPY,'pos': 'before','value': '\uFFE5'},\r\n            {'name': currencyDetail.AlbanianLek,'pos': 'before','value': 'Lek'},\r\n            {'name': currencyDetail.AlgerianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.Afghani,'pos': 'after','value': 'Af'},\r\n            {'name': currencyDetail.ArgentinePeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.UnitedArabEmiratesDirham,'pos': 'before','value': 'dh'},\r\n            {'name': currencyDetail.ArubanFlorin,'pos': 'before','value': 'Afl'},\r\n            {'name': currencyDetail.OmaniRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.Azerbaijanimanat,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.EgyptianPound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.EthiopianBirr,'pos': 'before','value': 'Birr'},\r\n            {'name': currencyDetail.AngolaKwanza,'pos': 'before','value': 'Kz'},\r\n            {'name': currencyDetail.AustralianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Patacas,'pos': 'before','value': 'MOP'},\r\n            {'name': currencyDetail.BarbadosDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.PapuaNewGuineaKina,'pos': 'before','value': 'PGK'},\r\n            {'name': currencyDetail.BahamianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.PakistanRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.ParaguayanGuarani,'pos': 'after','value': 'Gs'},\r\n            {'name': currencyDetail.BahrainiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.PanamanianBalboa,'pos': 'before','value': 'B/'},\r\n            {'name': currencyDetail.Brazilianreal,'pos': 'before','value': 'R$'},\r\n            {'name': currencyDetail.Belarusianruble,'pos': 'after','value': '\u0440'},\r\n            {'name': currencyDetail.BermudianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.BulgarianLev,'pos': 'before','value': 'lev'},\r\n            {'name': currencyDetail.IcelandKrona,'pos': 'before','value': 'kr'},\r\n            {'name': currencyDetail.BosniaHerzegovinaConvertibleMark,'pos': 'before','value': 'KM'},\r\n            {'name': currencyDetail.PolishZloty,'pos': 'after','value': 'z?'},\r\n            {'name': currencyDetail.Boliviano,'pos': 'before','value': 'Bs'},\r\n            {'name': currencyDetail.BelizeDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.BotswanaPula,'pos': 'before','value': 'P'},\r\n            {'name': currencyDetail.NotDannuzhamu,'pos': 'before','value': 'Nu'},\r\n            {'name': currencyDetail.BurundiFranc,'pos': 'before','value': 'FBu'},\r\n            {'name': currencyDetail.NorthKoreanWon,'pos': 'before','value': '?KP'},\r\n            {'name': currencyDetail.DanishKrone,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.EastCaribbeanDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.DominicaPeso,'pos': 'before','value': 'RD$'},\r\n            {'name': currencyDetail.RussianRuble,'pos': 'after','value': '?'},\r\n            {'name': currencyDetail.EritreanNakfa,'pos': 'before','value': 'Nfk'},\r\n            {'name': currencyDetail.CFAfranc,'pos': 'before','value': 'CFA'},\r\n            {'name': currencyDetail.PhilippinePeso,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.FijiDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CapeVerdeEscudo,'pos': 'before','value': 'CVE'},\r\n            {'name': currencyDetail.FalklandIslandsPound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.GambianDalasi,'pos': 'before','value': 'GMD'},\r\n            {'name': currencyDetail.Congolesefranc,'pos': 'before','value': 'FrCD'},\r\n            {'name': currencyDetail.ColombianPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CostaRicanColon,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.CubanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Cubanconvertiblepeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.GuyanaDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.KazakhstanTenge,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.Haitiangourde,'pos': 'before','value': 'HTG'},\r\n            {'name': currencyDetail.won,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.NetherlandsAntillesGuilder,'pos': 'before','value': 'NAf.'},\r\n            {'name': currencyDetail.Honduraslempiras,'pos': 'before','value': 'L'},\r\n            {'name': currencyDetail.DjiboutiFranc,'pos': 'before','value': 'Fdj'},\r\n            {'name': currencyDetail.KyrgyzstanSom,'pos': 'before','value': 'KGS'},\r\n            {'name': currencyDetail.GuineaFranc,'pos': 'before','value': 'FG'},\r\n            {'name': currencyDetail.CanadianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.GhanaianCedi,'pos': 'before','value': 'GHS'},\r\n            {'name': currencyDetail.Cambodianriel,'pos': 'before','value': 'Riel'},\r\n            {'name': currencyDetail.CzechKoruna,'pos': 'after','value': 'K?'},\r\n            {'name': currencyDetail.ZimbabweDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.QatariRiyal,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.CaymanIslandsDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Comorianfranc,'pos': 'before','value': 'CF'},\r\n            {'name': currencyDetail.KuwaitiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.CroatianKuna,'pos': 'before','value': 'kn'},\r\n            {'name': currencyDetail.KenyanShilling,'pos': 'before','value': 'Ksh'},\r\n            {'name': currencyDetail.LesothoLoti,'pos': 'before','value': 'LSL'},\r\n            {'name': currencyDetail.LaoKip,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.LebanesePound,'pos': 'before','value': 'L\uFFE1'},\r\n            {'name': currencyDetail.Lithuanianlitas,'pos': 'before','value': 'Lt'},\r\n            {'name': currencyDetail.LibyanDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.LiberianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.RwandaFranc,'pos': 'before','value': 'RF'},\r\n            {'name': currencyDetail.RomanianLeu,'pos': 'before','value': 'RON'},\r\n            {'name': currencyDetail.MalagasyAriary,'pos': 'before','value': 'Ar'},\r\n            {'name': currencyDetail.MaldivianRufiyaa,'pos': 'before','value': 'Rf'},\r\n            {'name': currencyDetail.MalawiKwacha,'pos': 'before','value': 'MWK'},\r\n            {'name': currencyDetail.MalaysianRinggit,'pos': 'before','value': 'RM'},\r\n            {'name': currencyDetail.MacedoniawearingDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.MauritiusRupee,'pos': 'before','value': 'MURs'},\r\n            {'name': currencyDetail.MauritanianOuguiya,'pos': 'before','value': 'MRO'},\r\n            {'name': currencyDetail.MongolianTugrik,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.BangladeshiTaka,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.PeruvianNuevoSol,'pos': 'before','value': 'S/'},\r\n            {'name': currencyDetail.MyanmarKyat,'pos': 'before','value': 'K'},\r\n            {'name': currencyDetail.MoldovanLeu,'pos': 'before','value': 'MDL'},\r\n            {'name': currencyDetail.MoroccanDirham,'pos': 'before','value': 'dh'},\r\n            {'name': currencyDetail.MozambiqueMetical,'pos': 'before','value': 'MTn'},\r\n            {'name': currencyDetail.MexicanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.NamibianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SouthAfricanRand,'pos': 'before','value': 'R'},\r\n            {'name': currencyDetail.SouthSudanesePound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.NicaraguaCordoba,'pos': 'before','value': 'C$'},\r\n            {'name': currencyDetail.NepaleseRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.NigerianNaira,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.NorwegianKrone,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.GeorgianLari,'pos': 'before','value': 'GEL'},\r\n            {'name': currencyDetail.RenminbiOffshore,'pos': 'before','value': '\uFFE5'},\r\n            {'name': currencyDetail.SwedishKrona,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.SwissFranc,'pos': 'before','value': 'CHF'},\r\n            {'name': currencyDetail.SerbianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.SierraLeone,'pos': 'before','value': 'SLL'},\r\n            {'name': currencyDetail.SeychellesRupee,'pos': 'before','value': 'SCR'},\r\n            {'name': currencyDetail.SaudiRiyal,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.SaoTomeDobra,'pos': 'before','value': 'Db'},\r\n            {'name': currencyDetail.SaintHelenapound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.SriLankaRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.SwazilandLilangeni,'pos': 'before','value': 'SZL'},\r\n            {'name': currencyDetail.SudanesePound,'pos': 'before','value': 'SDG'},\r\n            {'name': currencyDetail.Surinamesedollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SolomonIslandsDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SomaliShilling,'pos': 'before','value': 'SOS'},\r\n            {'name': currencyDetail.TajikistanSomoni,'pos': 'before','value': 'Som'},\r\n            {'name': currencyDetail.PacificFranc,'pos': 'after','value': 'FCFP'},\r\n            {'name': currencyDetail.ThaiBaht,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.TanzanianShilling,'pos': 'before','value': 'TSh'},\r\n            {'name': currencyDetail.TonganPaanga,'pos': 'before','value': 'T$'},\r\n            {'name': currencyDetail.TrinidadandTobagoDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.TunisianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.TurkishLira,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.VanuatuVatu,'pos': 'before','value': 'VUV'},\r\n            {'name': currencyDetail.GuatemalanQuetzal,'pos': 'before','value': 'Q'},\r\n            {'name': currencyDetail.CommissionBolivar,'pos': 'before','value': 'Bs'},\r\n            {'name': currencyDetail.BruneiDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.UgandanShilling,'pos': 'before','value': 'UGX'},\r\n            {'name': currencyDetail.UkrainianHryvnia,'pos': 'before','value': '\u0433\u0440\u043D.'},\r\n            {'name': currencyDetail.UruguayanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Uzbekistansom,'pos': 'before','value': 'so?m'},\r\n            {'name': currencyDetail.WesternSamoaTala,'pos': 'before','value': 'WST'},\r\n            {'name': currencyDetail.SingaporeDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.NT,'pos': 'before','value': 'NT$'},\r\n            {'name': currencyDetail.NewZealandDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.HungarianForint,'pos': 'before','value': 'Ft'},\r\n            {'name': currencyDetail.SyrianPound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.JamaicanDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.ArmenianDram,'pos': 'before','value': 'Dram'},\r\n            {'name': currencyDetail.YemeniRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.IraqiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.IranianRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.NewIsraeliShekel,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.IndianRupee,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.IndonesianRupiah,'pos': 'before','value': 'Rp'},\r\n            {'name': currencyDetail.JordanianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.VND,'pos': 'after','value': '?'},\r\n            {'name': currencyDetail.ZambianKwacha,'pos': 'before','value': 'ZMW'},\r\n            {'name': currencyDetail.GibraltarPound,'pos': 'before','value': '\uFFE1'},\r\n            {'name': currencyDetail.ChileanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CFAFrancBEAC,'pos': 'before','value': 'FCFA'}\r\n        ];\r\n\r\n        this.dateFmtList = locale().dateFmtList;\r\n\r\n        this.numFmtList = [\r\n            {\r\n                \"name\": \"1235\",\r\n                \"value\": \"0\"\r\n            },\r\n            {\r\n                \"name\": \"1234.56\",\r\n                \"value\": \"0.00\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0_);(#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0_);[Red](#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00_);(#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00_);[Red](#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,235\",\r\n                \"value\": \"$#,##0_);($#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,235\",\r\n                \"value\": \"$#,##0_);[Red]($#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,234.56\",\r\n                \"value\": \"$#,##0.00_);($#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,234.56\",\r\n                \"value\": \"$#,##0.00_);[Red]($#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"1234.56\",\r\n                \"value\": \"@\"\r\n            },\r\n            {\r\n                \"name\": \"123456%\",\r\n                \"value\": \"0%\"\r\n            },\r\n            {\r\n                \"name\": \"123456.00%\",\r\n                \"value\": \"0.00%\"\r\n            },\r\n            {\r\n                \"name\": \"1.23E+03\",\r\n                \"value\": \"0.00E+00\"\r\n            },\r\n            {\r\n                \"name\": \"1.2E+3\",\r\n                \"value\": \"##0.0E+0\"\r\n            },\r\n            {\r\n                \"name\": \"1234 5/9\",\r\n                \"value\": \"# ?/?\"\r\n            },\r\n            {\r\n                \"name\": \"1234 14/25\",\r\n                \"value\": \"# ??/??\"\r\n            },\r\n            {\r\n                \"name\": \"$ 1,235\",\r\n                \"value\": '_($* #,##0_);_(...($* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": '_(* #,##0_);_(*..._(* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"$ 1,234.56\",\r\n                // \"value\": '_($* #,##0.00_)...* \"-\"??_);_(@_)'\r\n                \"value\": '_($* #,##0.00_);_(...($* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": '_(* #,##0.00_);...* \"-\"??_);_(@_)'\r\n            },\r\n        ]    \r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-moreFormat-dialog\").remove();\r\n\r\n        let title = \"\", content = '';\r\n\r\n        if(type == \"morecurrency\"){ //\u8D27\u5E01\r\n            title = locale_format.titleCurrency;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.moneyFmtList.length; i++){\r\n                let name = _this.moneyFmtList[i][\"name\"];\r\n                let pos = _this.moneyFmtList[i][\"pos\"];\r\n                let value = _this.moneyFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                                '<input type=\"hidden\" value=\"'+ pos +'\"/>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"morecurrency\">'+\r\n                        '<div class=\"decimal\">'+\r\n                            '<label>'+ locale_format.decimalPlaces +'\uFF1A</label>'+\r\n                            '<input type=\"number\" class=\"formulaInputFocus\" value=\"2\" min=\"0\" max=\"9\"/>'+\r\n                        '</div>'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n        else if(type == \"moredatetime\"){ //\u65E5\u671F\u65F6\u95F4\r\n            title = locale_format.titleDateTime;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.dateFmtList.length; i++){\r\n                let name = _this.dateFmtList[i][\"name\"];\r\n                let value = _this.dateFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"moredatetime\">'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n        else if(type == \"moredigit\"){ //\u6570\u5B57\r\n            title = locale_format.titleNumber;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.numFmtList.length; i++){\r\n                let name = _this.numFmtList[i][\"name\"];\r\n                let value = _this.numFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"moredigit\">'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-moreFormat-dialog\", \r\n            \"addclass\": \"luckysheet-moreFormat-dialog\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-moreFormat-dialog-confirm\" class=\"btn btn-primary\">'+ locale_button.confirm +'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+ locale_button.cancel +'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-moreFormat-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-moreFormat-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        \r\n        $(\"#luckysheet-moreFormat-dialog .listbox .listItem\").eq(0).addClass(\"on\");\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        //\u9009\u62E9\u683C\u5F0F\r\n        $(document).on(\"click\", \"#luckysheet-moreFormat-dialog .listbox .listItem\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        //\u786E\u5B9A\r\n        $(document).off(\"click.moreFormatConfirm\").on(\"click.moreFormatConfirm\", \"#luckysheet-moreFormat-dialog #luckysheet-moreFormat-dialog-confirm\", function(){\r\n            $(\"#luckysheet-moreFormat-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let value = $(\"#luckysheet-moreFormat-dialog .listbox .listItem.on .value\").text();\r\n            let id = $(this).parents(\"#luckysheet-moreFormat-dialog\").find(\".box\").attr(\"id\");\r\n\r\n            if(id == \"morecurrency\"){ //\u8D27\u5E01\r\n                if(value.indexOf(\"?\") != -1){\r\n                    return;\r\n                }\r\n\r\n                let decimal = parseInt($(\"#luckysheet-moreFormat-dialog .decimal input\").val().trim());\r\n\r\n                if(decimal.toString() == \"NaN\" || decimal < 0 || decimal > 9){\r\n                    if(isEditMode()){\r\n                        alert(\"\u5C0F\u6570\u4F4D\u6570\u5FC5\u987B\u57280-9\u4E4B\u95F4\uFF01\");\r\n                    }   \r\n                    else{\r\n                        tooltip.info(\"\u5C0F\u6570\u4F4D\u6570\u5FC5\u987B\u57280-9\u4E4B\u95F4\uFF01\", \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                let str = \"\";\r\n\r\n                if(decimal > 0){\r\n                    for(let i = 1; i <= decimal; i++){\r\n                        str += \"0\";\r\n                    }\r\n\r\n                    str = \"0.\" + str;\r\n                }\r\n                else{\r\n                    str = \"#\";\r\n                }\r\n\r\n                let pos = $(\"#luckysheet-moreFormat-dialog .listbox .listItem.on input:hidden\").val();\r\n\r\n                if(pos == \"before\"){\r\n                    str = '\"' + value + '\" ' + str;\r\n                }\r\n                else if(pos == \"after\"){\r\n                    str = str + ' \"' + value + '\"';\r\n                }\r\n\r\n                menuButton.updateFormat(d, \"ct\", str);\r\n            }\r\n            else if(id == \"moredatetime\"){ //\u65E5\u671F\u65F6\u95F4\r\n                menuButton.updateFormat(d, \"ct\", value);\r\n            }\r\n            else if(id == \"moredigit\"){ //\u6570\u5B57\r\n                menuButton.updateFormat(d, \"ct\", value);\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default luckysheetMoreFormat;", "import { replaceHtml, chatatABC } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { modelHTML, keycode } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport sheetmanage from './sheetmanage';\r\nimport { isEditMode } from '../global/validate';\r\nimport { valueShowEs } from '../global/format';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport editor from '../global/editor';\r\nimport tooltip from '../global/tooltip';\r\nimport func_methods from '../global/func_methods';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport {checkProtectionLockedRangeList,checkProtectionAllSelected,checkProtectionSelectLockedOrUnLockedCells,checkProtectionNotEnable,checkProtectionLocked} from './protection';\r\n\r\n\r\n//\u67E5\u627E\u66FF\u6362\r\nconst luckysheetSearchReplace = {\r\n    createDialog: function(source){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-search-replace\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n        const locale_button = _locale.button;\r\n\r\n        let content = '<div class=\"tabBox\">' +\r\n                        '<span id=\"searchTab\">'+ locale_findAndReplace.find +'</span>' +\r\n                        '<span id=\"replaceTab\">'+ locale_findAndReplace.replace +'</span>' +\r\n                      '</div>' +\r\n                      '<div class=\"ctBox\">' +\r\n                        '<div class=\"inputBox\">' +\r\n                            '<div class=\"textboxs\" id=\"searchInput\">'+ locale_findAndReplace.findTextbox +'\uFF1A<input class=\"formulaInputFocus\" spellcheck=\"false\" value=\"\"/></div>' +\r\n                            '<div class=\"textboxs\" id=\"replaceInput\">'+ locale_findAndReplace.replaceTextbox +'\uFF1A<input class=\"formulaInputFocus\" spellcheck=\"false\" value=\"\"/></div>' +\r\n                            '<div class=\"checkboxs\">' +\r\n                                '<div id=\"regCheck\">' +\r\n                                    '<input type=\"checkbox\"/>' +\r\n                                    '<span>'+ locale_findAndReplace.regexTextbox +'</span>' +\r\n                                '</div>' +    \r\n                                '<div id=\"wordCheck\">' +\r\n                                    '<input type=\"checkbox\"/>' +\r\n                                    '<span>'+ locale_findAndReplace.wholeTextbox +'</span>' +\r\n                                '</div>' +    \r\n                                '<div id=\"caseCheck\">' +\r\n                                    '<input type=\"checkbox\"/>' +\r\n                                    '<span>'+ locale_findAndReplace.distinguishTextbox +'</span>' +\r\n                                '</div>' +    \r\n                            '</div>' +\r\n                        '</div>' +\r\n                        '<div class=\"btnBox\">' +\r\n                            '<button id=\"replaceAllBtn\" class=\"btn btn-default\">'+ locale_findAndReplace.allReplaceBtn +'</button>' +\r\n                            '<button id=\"replaceBtn\" class=\"btn btn-default\">'+ locale_findAndReplace.replaceBtn +'</button>' +\r\n                            '<button id=\"searchAllBtn\" class=\"btn btn-default\">'+ locale_findAndReplace.allFindBtn +'</button>' +\r\n                            '<button id=\"searchNextBtn\" class=\"btn btn-default\">'+ locale_findAndReplace.findBtn +'</button>' +\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-search-replace\", \r\n            \"addclass\": \"luckysheet-search-replace\", \r\n            \"title\": \"\", \r\n            \"content\": content, \r\n            \"botton\": '<button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.close+'</button>', \r\n            \"style\": \"z-index:100003\",\r\n            \"close\":locale_button.close\r\n        }));\r\n        let $t = $(\"#luckysheet-search-replace\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 500).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-replace\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    \r\n        if(source == \"0\"){\r\n            $(\"#luckysheet-search-replace #searchTab\").addClass(\"on\").siblings().removeClass(\"on\");\r\n            $(\"#luckysheet-search-replace #replaceInput\").hide();\r\n            $(\"#luckysheet-search-replace #replaceAllBtn\").hide();\r\n            $(\"#luckysheet-search-replace #replaceBtn\").hide();\r\n        }\r\n        else if(source == \"1\"){\r\n            $(\"#luckysheet-search-replace #replaceTab\").addClass(\"on\").siblings().removeClass(\"on\");\r\n            $(\"#luckysheet-search-replace #replaceInput\").show();\r\n            $(\"#luckysheet-search-replace #replaceAllBtn\").show();\r\n            $(\"#luckysheet-search-replace #replaceBtn\").show();\r\n        }\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        //\u67E5\u627E\u66FF\u6362 \u5207\u6362\r\n        $(document).off(\"click.SRtabBoxspan\").on(\"click.SRtabBoxspan\", \"#luckysheet-search-replace .tabBox span\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n            let $id = $(this).attr(\"id\");\r\n            if($id == \"searchTab\"){\r\n                $(\"#luckysheet-search-replace #replaceInput\").hide();\r\n                $(\"#luckysheet-search-replace #replaceAllBtn\").hide();\r\n                $(\"#luckysheet-search-replace #replaceBtn\").hide();\r\n\r\n                $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n            }\r\n            else if($id == \"replaceTab\"){\r\n                $(\"#luckysheet-search-replace #replaceInput\").show();\r\n                $(\"#luckysheet-search-replace #replaceAllBtn\").show();\r\n                $(\"#luckysheet-search-replace #replaceBtn\").show();\r\n\r\n                $(\"#luckysheet-search-replace #replaceInput input\").focus();\r\n            }\r\n        });\r\n\r\n        //\u67E5\u627E\u4E0B\u4E00\u4E2A\r\n        $(document).off(\"keyup.SRsearchInput\").on(\"keyup.SRsearchInput\", \"#luckysheet-search-replace #searchInput input\", function(event){\r\n            let kcode = event.keyCode;\r\n            if(kcode == keycode.ENTER){\r\n                _this.searchNext();\r\n            }\r\n        });\r\n        $(document).off(\"click.SRsearchNextBtn\").on(\"click.SRsearchNextBtn\", \"#luckysheet-search-replace #searchNextBtn\", function(){\r\n            _this.searchNext();\r\n        });\r\n\r\n        //\u67E5\u627E\u5168\u90E8\r\n        $(document).off(\"click.SRsearchAllBtn\").on(\"click.SRsearchAllBtn\", \"#luckysheet-search-replace #searchAllBtn\", function(){\r\n            _this.searchAll();\r\n        });\r\n        $(document).off(\"click.SRsearchAllboxItem\").on(\"click.SRsearchAllboxItem\", \"#luckysheet-search-replace #searchAllbox .boxItem\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n            let r = $(this).attr(\"data-row\");\r\n            let c = $(this).attr(\"data-col\");\r\n            let sheetIndex = $(this).attr(\"data-sheetIndex\");\r\n\r\n            if(sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(sheetIndex);\r\n            }\r\n\r\n            Store.luckysheet_select_save = [\r\n                { \"row\": [r, r], \"column\": [c, c] }\r\n            ];\r\n\r\n            selectHightlightShow();\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n                scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let winH = $(\"#luckysheet-cell-main\").height(), \r\n                winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            if (col - scrollLeft - winW + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n            }\r\n            else if (col_pre - scrollLeft - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n            }\r\n\r\n            if (row - scrollTop - winH + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n            }\r\n            else if (row_pre - scrollTop - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n            }\r\n        });\r\n\r\n        //\u66FF\u6362\r\n        $(document).off(\"click.SRreplaceBtn\").on(\"click.SRreplaceBtn\", \"#luckysheet-search-replace #replaceBtn\", function(){\r\n            _this.replace();\r\n        });\r\n\r\n        //\u5168\u90E8\u66FF\u6362\r\n        $(document).off(\"click.SRreplaceAllBtn\").on(\"click.SRreplaceAllBtn\", \"#luckysheet-search-replace #replaceAllBtn\", function(){\r\n            _this.replaceAll();\r\n        });\r\n    },\r\n    searchNext: function(){\r\n        let _this = this;\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if(searchText == \"\" || searchText == null){\r\n            return;\r\n        }\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n        let range;\r\n        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n            range = [{ \r\n                \"row\": [0, Store.flowdata.length - 1], \r\n                \"column\": [0, Store.flowdata[0].length - 1] \r\n            }];\r\n        }\r\n        else{\r\n            range = $.extend(true, [], Store.luckysheet_select_save);                \r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if(searchIndexArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.noFindTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.noFindTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let count = 0;\r\n\r\n        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n            if(Store.luckysheet_select_save.length == 0){\r\n                count = 0;\r\n            }\r\n            else{\r\n                for(let i = 0; i < searchIndexArr.length; i++){\r\n                    if(searchIndexArr[i].r == Store.luckysheet_select_save[0].row[0] && searchIndexArr[i].c == Store.luckysheet_select_save[0].column[0]){\r\n                        if(i == searchIndexArr.length - 1){\r\n                            count = 0;\r\n                        }\r\n                        else{\r\n                            count = i + 1;\r\n                        }\r\n\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = [{ \r\n                \"row\": [searchIndexArr[count].r, searchIndexArr[count].r], \r\n                \"column\": [searchIndexArr[count].c, searchIndexArr[count].c] \r\n            }];\r\n        }\r\n        else{\r\n            let rf = range[range.length - 1].row_focus;\r\n            let cf = range[range.length - 1].column_focus;\r\n\r\n            for(let i = 0; i < searchIndexArr.length; i++){\r\n                if(searchIndexArr[i].r == rf && searchIndexArr[i].c == cf){\r\n                    if(i == searchIndexArr.length - 1){\r\n                        count = 0;\r\n                    }\r\n                    else{\r\n                        count = i + 1;\r\n                    }\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                if(searchIndexArr[count].r >= r1 && searchIndexArr[count].r <= r2 && searchIndexArr[count].c >= c1 && searchIndexArr[count].c <= c2){\r\n                    let obj = range[s];\r\n                    obj[\"row_focus\"] = searchIndexArr[count].r;\r\n                    obj[\"column_focus\"] = searchIndexArr[count].c;\r\n                    range.splice(s, 1);\r\n                    range.push(obj);\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = range;\r\n        }\r\n\r\n        selectHightlightShow();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(), \r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[searchIndexArr[count].r], \r\n            row_pre = searchIndexArr[count].r - 1 == -1 ? 0 : Store.visibledatarow[searchIndexArr[count].r - 1];\r\n        let col = Store.visibledatacolumn[searchIndexArr[count].c], \r\n            col_pre = searchIndexArr[count].c - 1 == -1 ? 0 : Store.visibledatacolumn[searchIndexArr[count].c - 1];\r\n\r\n        if (col - scrollLeft - winW + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n        }\r\n        else if (col_pre - scrollLeft - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n        }\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        }\r\n        else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n        \r\n        if($(\"#searchAllbox\").is(\":visible\")){\r\n            $(\"#luckysheet-search-replace #searchAllbox .boxItem\").removeClass(\"on\");\r\n        }\r\n    },\r\n    searchAll: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        $(\"#luckysheet-search-replace #searchAllbox\").remove();\r\n        \r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if(searchText == \"\" || searchText == null){\r\n            return;\r\n        }\r\n\r\n        let range;\r\n        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n            range = [{ \r\n                \"row\": [0, Store.flowdata.length - 1], \r\n                \"column\": [0, Store.flowdata[0].length - 1] \r\n            }];\r\n        }\r\n        else{\r\n            range = $.extend(true, [], Store.luckysheet_select_save);                \r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if(searchIndexArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.noFindTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.noFindTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let searchAllHtml = '';\r\n\r\n        for(let i = 0; i < searchIndexArr.length; i++){\r\n            let value_ShowEs = valueShowEs(searchIndexArr[i].r, searchIndexArr[i].c, Store.flowdata).toString();\r\n\r\n            if(value_ShowEs.indexOf(\"</\") > -1 && value_ShowEs.indexOf(\">\") > -1){\r\n                searchAllHtml += '<div class=\"boxItem\" data-row=\"' + searchIndexArr[i].r + '\" data-col=\"' + searchIndexArr[i].c + '\" data-sheetIndex=\"' + Store.currentSheetIndex + '\">' +\r\n                                    '<span>' + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '</span>' +\r\n                                    '<span>' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '</span>' +\r\n                                    '<span>' + value_ShowEs + '</span>' +\r\n                                 '</div>';\r\n            }\r\n            else{\r\n                searchAllHtml += '<div class=\"boxItem\" data-row=\"' + searchIndexArr[i].r + '\" data-col=\"' + searchIndexArr[i].c + '\" data-sheetIndex=\"' + Store.currentSheetIndex + '\">' +\r\n                                    '<span>' + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '</span>' +\r\n                                    '<span>' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '</span>' +\r\n                                    '<span title=\"' + value_ShowEs + '\">' + value_ShowEs + '</span>' +\r\n                                 '</div>';\r\n            }\r\n        }\r\n        \r\n        $('<div id=\"searchAllbox\"><div class=\"boxTitle\"><span>'+ locale_findAndReplace.searchTargetSheet +'</span><span>'+locale_findAndReplace.searchTargetCell+'</span><span>'+locale_findAndReplace.searchTargetValue+'</span></div><div class=\"boxMain\">' + searchAllHtml + '</div></div>').appendTo($(\"#luckysheet-search-replace\"));\r\n        \r\n        $(\"#luckysheet-search-replace #searchAllbox .boxItem\").eq(0).addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n        Store.luckysheet_select_save = [{ \r\n            \"row\": [searchIndexArr[0].r, searchIndexArr[0].r], \r\n            \"column\": [searchIndexArr[0].c, searchIndexArr[0].c] \r\n        }];\r\n\r\n        selectHightlightShow();\r\n    },\r\n    getSearchIndexArr: function(searchText, range){\r\n        let arr = [];\r\n        let obj = {};\r\n\r\n        //\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\r\n        let regCheck = false;\r\n        if($(\"#luckysheet-search-replace #regCheck input[type='checkbox']\").is(\":checked\")){\r\n            regCheck = true;\r\n        }\r\n\r\n        //\u6574\u8BCD\u5339\u914D\r\n        let wordCheck = false;\r\n        if($(\"#luckysheet-search-replace #wordCheck input[type='checkbox']\").is(\":checked\")){\r\n            wordCheck = true;\r\n        }\r\n\r\n        //\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\r\n        let caseCheck = false;\r\n        if($(\"#luckysheet-search-replace #caseCheck input[type='checkbox']\").is(\":checked\")){\r\n            caseCheck = true;\r\n        }\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            let r1 = range[s].row[0], r2 = range[s].row[1];\r\n            let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n            for(let r = r1; r <= r2; r++){\r\n                for(let c = c1; c <= c2; c++){\r\n                    let cell = Store.flowdata[r][c];\r\n\r\n                    if(cell != null){\r\n                        let value = valueShowEs(r, c, Store.flowdata);\r\n\r\n                        if(value == 0){\r\n                            value = value.toString();\r\n                        }\r\n\r\n                        if(value != null && value != \"\"){\r\n                            value = value.toString();\r\n\r\n                            // 1. \u52FE\u9009\u6574\u8BCD \u76F4\u63A5\u5339\u914D\r\n                            // 2. \u52FE\u9009\u4E86\u6B63\u5219 \u7ED3\u5408\u662F\u5426\u52FE\u9009 \u6784\u9020\u6B63\u5219 \r\n                            // 3. \u4EC0\u4E48\u90FD\u6CA1\u9009 \u7528\u5B57\u7B26\u4E32 indexOf \u5339\u914D\r\n\r\n                            if(wordCheck){ //\u6574\u8BCD\r\n                                if(caseCheck){\r\n                                    if(searchText == value){\r\n                                        if(!((r + \"_\" + c) in obj)){\r\n                                            obj[r + \"_\" + c] = 0;\r\n                                            arr.push({\"r\": r, \"c\": c});\r\n                                        }\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    let txt = searchText.toLowerCase();\r\n                                    if(txt == value.toLowerCase()){\r\n                                        if(!((r + \"_\" + c) in obj)){\r\n                                            obj[r + \"_\" + c] = 0;\r\n                                            arr.push({\"r\": r, \"c\": c});\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if(regCheck){ //\u6B63\u5219\u8868\u8FBE\u5F0F\r\n                                let reg;\r\n                                // \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\r\n                                if(caseCheck){\r\n                                    reg = new RegExp(func_methods.getRegExpStr(searchText), \"g\");\r\n                                }\r\n                                else{\r\n                                    reg = new RegExp(func_methods.getRegExpStr(searchText), \"ig\");\r\n                                }\r\n\r\n                                if(reg.test(value)){\r\n                                    if(!((r + \"_\" + c) in obj)){\r\n                                        obj[r + \"_\" + c] = 0;\r\n                                        arr.push({\"r\": r, \"c\": c});\r\n                                    }\r\n                                }\r\n                            }\r\n                            else{\r\n                                if(~value.indexOf(searchText)){\r\n                                    if(!((r + \"_\" + c) in obj)){\r\n                                        obj[r + \"_\" + c] = 0;\r\n                                        arr.push({\"r\": r, \"c\": c});\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    replace: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        if(!Store.allowEdit){\r\n            tooltip.info(locale_findAndReplace.modeTip, \"\");\r\n            return;\r\n        }\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if(searchText == \"\" || searchText == null){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.searchInputTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.searchInputTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let range;\r\n        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n            range = [{ \r\n                \"row\": [0, Store.flowdata.length - 1], \r\n                \"column\": [0, Store.flowdata[0].length - 1] \r\n            }];\r\n        }\r\n        else{\r\n            range = $.extend(true, [], Store.luckysheet_select_save);                \r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if(searchIndexArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.noReplceTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.noReplceTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let count = null;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last.row_focus;\r\n        let cf = last.column_focus;\r\n\r\n        for(let i = 0; i < searchIndexArr.length; i++){\r\n            if(searchIndexArr[i].r == rf && searchIndexArr[i].c == cf){\r\n                count = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(count == null){\r\n            if(searchIndexArr.length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_findAndReplace.noMatchTip);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_findAndReplace.noMatchTip, \"\");\r\n                }\r\n\r\n                return;\r\n            }\r\n            else{\r\n                count = 0;\r\n            }\r\n        }\r\n\r\n        //\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\r\n        let regCheck = false;\r\n        if($(\"#luckysheet-search-replace #regCheck input[type='checkbox']\").is(\":checked\")){\r\n            regCheck = true;\r\n        }\r\n\r\n        //\u6574\u8BCD\u5339\u914D\r\n        let wordCheck = false;\r\n        if($(\"#luckysheet-search-replace #wordCheck input[type='checkbox']\").is(\":checked\")){\r\n            wordCheck = true;\r\n        }\r\n\r\n        //\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\r\n        let caseCheck = false;\r\n        if($(\"#luckysheet-search-replace #caseCheck input[type='checkbox']\").is(\":checked\")){\r\n            caseCheck = true;\r\n        }\r\n\r\n        let replaceText = $(\"#luckysheet-search-replace #replaceInput input\").val();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        let r, c;\r\n        if(wordCheck){\r\n            r = searchIndexArr[count].r;\r\n            c = searchIndexArr[count].c;\r\n\r\n            let v = replaceText;\r\n\r\n            if(!checkProtectionLocked(r, c, Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            setcellvalue(r, c, d, v);\r\n        }\r\n        else{\r\n            let reg;\r\n            if(caseCheck){\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"g\");\r\n            }\r\n            else{\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"ig\");\r\n            }\r\n\r\n            r = searchIndexArr[count].r;\r\n            c = searchIndexArr[count].c;\r\n\r\n            if(!checkProtectionLocked(r, c, Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let v = valueShowEs(r, c, d).toString().replace(reg, replaceText);\r\n\r\n            setcellvalue(r, c, d, v);\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [r, r], \"column\": [c, c] }];\r\n\r\n        if($(\"#luckysheet-search-replace #searchAllbox\").is(\":visible\")){\r\n            $(\"#luckysheet-search-replace #searchAllbox\").hide();\r\n        }\r\n\r\n        jfrefreshgrid(d, Store.luckysheet_select_save);\r\n        selectHightlightShow();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(), \r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[r], \r\n            row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c], \r\n            col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        if (col - scrollLeft - winW + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n        }\r\n        else if (col_pre - scrollLeft - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n        }\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        }\r\n        else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n    },\r\n    replaceAll: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        if(!Store.allowEdit){\r\n            tooltip.info(locale_findAndReplace.modeTip, \"\");\r\n            return;\r\n        }\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if(searchText == \"\" || searchText == null){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.searchInputTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.searchInputTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let range;\r\n        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n            range = [{ \r\n                \"row\": [0, Store.flowdata.length - 1], \r\n                \"column\": [0, Store.flowdata[0].length - 1] \r\n            }];\r\n        }\r\n        else{\r\n            range = $.extend(true, [], Store.luckysheet_select_save);                \r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if(searchIndexArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_findAndReplace.noReplceTip);\r\n            }\r\n            else{\r\n                tooltip.info(locale_findAndReplace.noReplceTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\r\n        let regCheck = false;\r\n        if($(\"#luckysheet-search-replace #regCheck input[type='checkbox']\").is(\":checked\")){\r\n            regCheck = true;\r\n        }\r\n\r\n        //\u6574\u8BCD\u5339\u914D\r\n        let wordCheck = false;\r\n        if($(\"#luckysheet-search-replace #wordCheck input[type='checkbox']\").is(\":checked\")){\r\n            wordCheck = true;\r\n        }\r\n\r\n        //\u533A\u5206\u5927\u5C0F\u5199\u5339\u914D\r\n        let caseCheck = false;\r\n        if($(\"#luckysheet-search-replace #caseCheck input[type='checkbox']\").is(\":checked\")){\r\n            caseCheck = true;\r\n        }\r\n\r\n        let replaceText = $(\"#luckysheet-search-replace #replaceInput input\").val();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let replaceCount = 0;\r\n        if(wordCheck){\r\n            for(let i = 0; i < searchIndexArr.length; i++){\r\n                let r = searchIndexArr[i].r;\r\n                let c = searchIndexArr[i].c;\r\n\r\n                if(!checkProtectionLocked(r, c, Store.currentSheetIndex, false)){\r\n                    continue;\r\n                }\r\n\r\n                let v = replaceText;\r\n\r\n                setcellvalue(r, c, d, v);\r\n\r\n                range.push({ \"row\": [r, r], \"column\": [c, c] });\r\n                replaceCount++;\r\n            }\r\n        }\r\n        else{\r\n            let reg;\r\n            if(caseCheck){\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"g\");\r\n            }\r\n            else{\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"ig\");\r\n            }\r\n\r\n            for(let i = 0; i < searchIndexArr.length; i++){\r\n                let r = searchIndexArr[i].r;\r\n                let c = searchIndexArr[i].c;\r\n\r\n                if(!checkProtectionLocked(r, c, Store.currentSheetIndex, false)){\r\n                    continue;\r\n                }\r\n\r\n                let v = valueShowEs(r, c, d).toString().replace(reg, replaceText);\r\n\r\n                setcellvalue(r, c, d, v);\r\n\r\n                range.push({ \"row\": [r, r], \"column\": [c, c] });\r\n                replaceCount++;\r\n            }\r\n        }\r\n\r\n        if($(\"#luckysheet-search-replace #searchAllbox\").is(\":visible\")){\r\n            $(\"#luckysheet-search-replace #searchAllbox\").hide();\r\n        }\r\n\r\n        jfrefreshgrid(d, range);\r\n\r\n        Store.luckysheet_select_save = $.extend(true, [], range);\r\n        selectHightlightShow();\r\n\r\n        let succeedInfo = replaceHtml(locale_findAndReplace.successTip, { \r\n            \"xlength\": replaceCount\r\n        });\r\n        if(isEditMode()){\r\n            alert(succeedInfo);\r\n        }\r\n        else{\r\n            tooltip.info(succeedInfo, \"\");\r\n        }\r\n    }\r\n}\r\n\r\nexport default luckysheetSearchReplace;", "import { replaceHtml } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { isRealNull } from '../global/validate';\r\nimport { isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport conditionformat from './conditionformat';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//\u5B9A\u4F4D\r\nconst luckysheetLocationCell = {\r\n    createDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-locationCell-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_location = _locale.findAndReplace;\r\n        const locale_button = _locale.button;\r\n\r\n        let content = '<div class=\"listbox\">'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" checked=\"checked\" id=\"locationConstant\">'+\r\n                            '<label for=\"locationConstant\">'+locale_location.locationConstant+'</label>'+\r\n                            '<div class=\"subbox\">'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"date\" id=\"locationConstantDate\">'+\r\n                                    '<label for=\"locationConstantDate\">'+locale_location.locationDate+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"number\" id=\"locationConstantNumber\">'+\r\n                                    '<label for=\"locationConstantNumber\">'+locale_location.locationDigital+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"string\" id=\"locationConstantString\">'+\r\n                                    '<label for=\"locationConstantString\">'+locale_location.locationString+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"boolean\" id=\"locationConstantBoolean\">'+\r\n                                    '<label for=\"locationConstantBoolean\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"error\" id=\"locationConstantError\">'+\r\n                                    '<label for=\"locationConstantError\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationFormula\">'+\r\n                            '<label for=\"locationFormula\">'+locale_location.locationFormula+'</label>'+\r\n                            '<div class=\"subbox\">'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"date\" id=\"locationFormulaDate\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaDate\" style=\"color: #666\">'+locale_location.locationDate+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"number\" id=\"locationFormulaNumber\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaNumber\" style=\"color: #666\">'+locale_location.locationDigital+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"string\" id=\"locationFormulaString\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaString\" style=\"color: #666\">'+locale_location.locationString+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"boolean\" id=\"locationFormulaBoolean\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaBoolean\" style=\"color: #666\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"error\" id=\"locationFormulaError\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaError\" style=\"color: #666\">'+locale_location.locationError+'</label>'+\r\n                                '</div>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationNull\">'+\r\n                            '<label for=\"locationNull\">'+locale_location.locationNull+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationCF\">'+\r\n                            '<label for=\"locationCF\">'+locale_location.locationCondition+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationStepRow\">'+\r\n                            '<label for=\"locationStepRow\">'+locale_location.locationRowSpan+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationStepColumn\">'+\r\n                            '<label for=\"locationStepColumn\">'+locale_location.locationColumnSpan+'</label>'+\r\n                        '</div>'+\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-locationCell-dialog\", \r\n            \"addclass\": \"luckysheet-locationCell-dialog\", \r\n            \"title\": locale_location.location, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-locationCell-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-locationCell-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-locationCell-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const locale_location = locale().findAndReplace;\r\n\r\n        $(document).on(\"click\", \"#luckysheet-locationCell-dialog .listItem input:radio\", function(e){\r\n            $(\"#luckysheet-locationCell-dialog .listItem input:checkbox\").prop(\"disabled\", true);\r\n            $(\"#luckysheet-locationCell-dialog .listItem .subbox label\").css(\"color\", \"#666\");\r\n\r\n            $(this).siblings(\".subbox\").find(\"input:checkbox\").removeAttr(\"disabled\");\r\n            $(this).siblings(\".subbox\").find(\"label\").css(\"color\", \"#000\");\r\n        });\r\n\r\n        $(document).off(\"click.locationCellConfirm\").on(\"click.locationCellConfirm\", \"#luckysheet-locationCell-dialog #luckysheet-locationCell-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-locationCell-dialog\").hide();\r\n\r\n            let $radio = $(\"#luckysheet-locationCell-dialog .listItem input:radio:checked\");\r\n            let id = $radio.attr(\"id\");\r\n\r\n            if(id == \"locationConstant\" || id == \"locationFormula\"){\r\n                let $checkbox = $radio.siblings(\".subbox\").find(\"input:checkbox:checked\");\r\n\r\n                let value;\r\n                if($checkbox.length == 0){\r\n                    return;\r\n                }\r\n                else if($checkbox.length == 5){\r\n                    value = \"all\";\r\n                }\r\n                else{\r\n                    let arr = [];\r\n                    \r\n                    for(let i = 0; i < $checkbox.length; i++){\r\n                        if($($checkbox[i]).hasClass(\"date\")){\r\n                            arr.push(\"d\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"number\")){\r\n                            arr.push(\"n\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"string\")){\r\n                            arr.push(\"s,g\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"boolean\")){\r\n                            arr.push(\"b\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"error\")){\r\n                            arr.push(\"e\");\r\n                        }\r\n                    }\r\n\r\n                    value = arr.join(\",\");\r\n                }\r\n\r\n                let range;\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    //\u5355\u4E2A\u5355\u5143\u683C\r\n                    range = [{\"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1]}];\r\n                }\r\n                else{\r\n                    range = $.extend(true, [], Store.luckysheet_select_save);\r\n                }\r\n\r\n                _this.apply(range, id, value);\r\n            }\r\n            else if(id == \"locationStepRow\"){\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1])){\r\n                    if(isEditMode()){\r\n                        alert(locale_location.locationTiplessTwoRow);\r\n                    }\r\n                    else{\r\n                        tooltip.info(\"\", locale_location.locationTiplessTwoRow); \r\n                    }\r\n                    return;                            \r\n                }\r\n\r\n                let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                _this.apply(range, \"locationStepRow\");\r\n            }\r\n            else if(id == \"locationStepColumn\"){\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    if(isEditMode()){\r\n                        alert(locale_location.locationTiplessTwoColumn);\r\n                    }\r\n                    else{\r\n                        tooltip.info(\"\", locale_location.locationTiplessTwoColumn);    \r\n                    }\r\n                    return;                            \r\n                }\r\n\r\n                let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                _this.apply(range, \"locationStepColumn\");\r\n            }\r\n            else{\r\n                let range;\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    //\u5355\u4E2A\u5355\u5143\u683C\r\n                    range = [{\"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1]}];\r\n                }\r\n                else{\r\n                    range = $.extend(true, [], Store.luckysheet_select_save);\r\n                }\r\n\r\n                _this.apply(range, id);\r\n            }\r\n        });\r\n    },\r\n    apply: function(range, type, value){\r\n        const locale_location = locale().findAndReplace; \r\n        let rangeArr = [];\r\n\r\n        if(type == \"locationFormula\" || type == \"locationConstant\" || type == \"locationNull\"){ //\u516C\u5F0F \u5E38\u91CF \u7A7A\u503C\r\n            let minR = null, maxR = null, minC = null, maxC = null, cellSave = {};\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let st_r = range[s].row[0],\r\n                    ed_r = range[s].row[1],\r\n                    st_c = range[s].column[0],\r\n                    ed_c = range[s].column[1];\r\n\r\n                if(minR == null || minR < st_r){\r\n                    minR = st_r;\r\n                }\r\n                if(maxR == null || maxR > ed_r){\r\n                    maxR = ed_r;\r\n                }\r\n                if(minC == null || minC < st_c){\r\n                    minC = st_c;\r\n                }\r\n                if(maxC == null || maxC > ed_c){\r\n                    maxC = ed_c;\r\n                }\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if(cell != null && cell.mc != null){\r\n                            cell = Store.flowdata[cell.mc.r][cell.mc.c];\r\n                        }\r\n\r\n                        if(type == 'locationFormula' && cell != null && !isRealNull(cell.v) && cell.f != null && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                        else if(type == 'locationConstant' && cell != null && !isRealNull(cell.v) && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                        else if(type == 'locationNull' && (cell == null || isRealNull(cell.v))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n        else if(type == \"locationCF\"){ //\u6761\u4EF6\u683C\u5F0F\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            let ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n            let data = Store.luckysheetfile[index][\"data\"];\r\n\r\n            if(ruleArr == null || ruleArr.length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_location.locationTipNotFindCell);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_location.locationTipNotFindCell);\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            computeMap = conditionformat.compute(ruleArr, data);\r\n\r\n            if(Object.keys(computeMap).length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_location.locationTipNotFindCell);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_location.locationTipNotFindCell);\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            let minR = null, maxR = null, minC = null, maxC = null, cellSave = {};\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let st_r = range[s].row[0],\r\n                    ed_r = range[s].row[1],\r\n                    st_c = range[s].column[0],\r\n                    ed_c = range[s].column[1];\r\n\r\n                if(minR == null || minR < st_r){\r\n                    minR = st_r;\r\n                }\r\n                if(maxR == null || maxR > ed_r){\r\n                    maxR = ed_r;\r\n                }\r\n                if(minC == null || minC < st_c){\r\n                    minC = st_c;\r\n                }\r\n                if(maxC == null || maxC > ed_c){\r\n                    maxC = ed_c;\r\n                }\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        if((r + '_' + c) in computeMap){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n        else if(type == \"locationStepRow\"){ //\u95F4\u9694\u884C\r\n            for(let s = 0; s < range.length; s++){\r\n                if(range[s].row[0] == range[s].row[1]){\r\n                    continue;\r\n                }\r\n\r\n                let st_r = range[s].row[0], ed_r = range[s].row[1];\r\n                let st_c = range[s].column[0], ed_c = range[s].column[1];\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    if((r - st_r) % 2 == 0){\r\n                        rangeArr.push({\"row\": [r, r], \"column\": [st_c, ed_c]});\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"locationStepColumn\"){ //\u95F4\u9694\u5217\r\n            for(let s = 0; s < range.length; s++){\r\n                if(range[s].column[0] == range[s].column[1]){\r\n                    continue;\r\n                }\r\n\r\n                let st_r = range[s].row[0], ed_r = range[s].row[1];\r\n                let st_c = range[s].column[0], ed_c = range[s].column[1];\r\n\r\n                for(let c = st_c; c <= ed_c; c++){\r\n                    if((c - st_c) % 2 == 0){\r\n                        rangeArr.push({\"row\": [st_r, ed_r], \"column\": [c, c]});\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if(rangeArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_location.locationTipNotFindCell);\r\n            }\r\n            else{\r\n                tooltip.info(\"\", locale_location.locationTipNotFindCell);  \r\n            }\r\n        }\r\n        else{\r\n            Store.luckysheet_select_save = rangeArr;\r\n            selectHightlightShow(); \r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n                scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let winH = $(\"#luckysheet-cell-main\").height(), \r\n                winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n            let r1 = Store.luckysheet_select_save[0][\"row\"][0],\r\n                r2 = Store.luckysheet_select_save[0][\"row\"][1],\r\n                c1 = Store.luckysheet_select_save[0][\"column\"][0],\r\n                c2 = Store.luckysheet_select_save[0][\"column\"][1];\r\n\r\n            let row = Store.visibledatarow[r2], \r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2], \r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            if (col - scrollLeft - winW + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n            }\r\n            else if (col_pre - scrollLeft - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n            }\r\n\r\n            if (row - scrollTop - winH + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n            }\r\n            else if (row_pre - scrollTop - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n            }\r\n        }\r\n    },\r\n    getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr){\r\n        if(Object.keys(cellSave).length == 0){\r\n            return rangeArr;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let stack_str = null, \r\n            stack_edr = null, \r\n            stack_stc = null, \r\n            stack_edc = null;\r\n\r\n        for(let r = minR; r <= maxR; r++){\r\n            for(let c = minC; c <= maxC; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if((r + '_' + c) in cellSave){\r\n                    if(cell != null && cell.mc != null){\r\n                        if(stack_stc == null){\r\n                            let range = {\r\n                                'row': [cell.mc.r, cell.mc.r + cell.mc.rs - 1],\r\n                                'column': [cell.mc.c, cell.mc.c + cell.mc.cs - 1]\r\n                            };\r\n                            rangeArr.push(range);\r\n                            cellSave = _this.deleteCellInSave(cellSave, range);\r\n                            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                        }\r\n                        else if(c < stack_edc){\r\n                            let range = {\r\n                                'row': [stack_str, stack_edr],\r\n                                'column': [stack_stc, stack_edc]\r\n                            }\r\n                            rangeArr.push(range);\r\n                            cellSave = _this.deleteCellInSave(cellSave, range);\r\n                            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                        }\r\n                        else{\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if(stack_stc == null){\r\n                        stack_stc = c;\r\n                        stack_edc = c;\r\n\r\n                        stack_str = r;\r\n                        stack_edr = r;\r\n                    }\r\n                    else if(c > stack_edc){\r\n                        stack_edc = c;\r\n                    }\r\n                }\r\n                else if(stack_stc != null){\r\n                    if(cell != null && cell.mc != null){\r\n                        break;\r\n                    }\r\n                    else if(c < stack_stc){\r\n\r\n                    }\r\n                    else if(c <= stack_edc){\r\n                        let range = {\r\n                            'row': [stack_str, stack_edr],\r\n                            'column': [stack_stc, stack_edc]\r\n                        }\r\n                        rangeArr.push(range);\r\n                        cellSave = _this.deleteCellInSave(cellSave, range);\r\n                        return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                    }\r\n                    else{\r\n                        stack_edr = r;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if(stack_stc != null){\r\n            let range = {\r\n                'row': [stack_str, stack_edr],\r\n                'column': [stack_stc, stack_edc]\r\n            }\r\n            rangeArr.push(range);\r\n            cellSave = _this.deleteCellInSave(cellSave, range);\r\n            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n    },\r\n    deleteCellInSave(cellSave, range){\r\n        for(let r = range.row[0]; r <= range.row[1]; r++){\r\n            for(let c = range.column[0]; c <= range.column[1]; c++){\r\n                delete cellSave[r + '_' + c];\r\n            }\r\n        }\r\n\r\n        return cellSave;\r\n    }\r\n}\r\n\r\nexport default luckysheetLocationCell;", "import formula from '../global/formula';\r\nimport editor from '../global/editor';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport { modelHTML } from './constant';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//if\u516C\u5F0F\u751F\u6210\u5668\r\nconst ifFormulaGenerator = {\r\n    singleRangeFocus: false,\r\n    init: function(){\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n        //\u70B9\u51FB\u9009\u62E9\u5355\u5143\u683C\r\n        $(document).off(\"focus.IFcompareValue\").on(\"focus.IFcompareValue\", \"#luckysheet-ifFormulaGenerator-dialog #compareValue\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            _this.singleRangeFocus = true;\r\n        });\r\n        $(document).off(\"click.IFsingRange\").on(\"click.IFsingRange\", \"#luckysheet-ifFormulaGenerator-dialog .singRange\", function(){\r\n            let value = $(\"#luckysheet-ifFormulaGenerator-dialog #compareValue\").val().trim();\r\n\r\n            if(formula.iscelldata(value)){\r\n                _this.singleRangeDialog(value);\r\n            }\r\n            else{\r\n                _this.singleRangeDialog();\r\n            }\r\n        });\r\n        $(document).off(\"click.IFsingRangeConfirm\").on(\"click.IFsingRangeConfirm\", \"#luckysheet-ifFormulaGenerator-singleRange-confirm\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            let value = $(this).parents(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").find(\"input\").val().trim();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #compareValue\").val(value);\r\n\r\n            _this.singleRangeFocus = false;                 \r\n        });\r\n        $(document).off(\"click.IFsingRangeCancel\").on(\"click.IFsingRangeCancel\", \"#luckysheet-ifFormulaGenerator-singleRange-cancel\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            _this.singleRangeFocus = false;                 \r\n        });\r\n        $(document).off(\"click.IFsingRangeClose\").on(\"click.IFsingRangeClose\", \"#luckysheet-ifFormulaGenerator-singleRange-dialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            _this.singleRangeFocus = false;\r\n        });\r\n\r\n        //\u70B9\u51FB\u9009\u62E9\u8303\u56F4\r\n        $(document).off(\"click.IFmultiRange\").on(\"click.IFmultiRange\", \"#luckysheet-ifFormulaGenerator-dialog .multiRange\", function(){\r\n            _this.multiRangeDialog();\r\n\r\n            _this.singleRangeFocus = false;\r\n        });\r\n        $(document).off(\"click.IFmultiRangeConfirm\").on(\"click.IFmultiRangeConfirm\", \"#luckysheet-ifFormulaGenerator-multiRange-confirm\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            let value = $(this).parents(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").find(\"input\").val().trim();\r\n            let cellrange = formula.getcellrange(value);\r\n            let str_r = cellrange[\"row\"][0], \r\n                end_r = cellrange[\"row\"][1], \r\n                str_c = cellrange[\"column\"][0], \r\n                end_c = cellrange[\"column\"][1];\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n            let arr = [];\r\n            \r\n            //\u83B7\u53D6\u8303\u56F4\u5185\u6240\u6709\u6570\u503C\r\n            for(let r = str_r; r <= end_r; r++){\r\n                for(let c = str_c; c <= end_c; c++){\r\n                    if(d[r] != null && d[r][c] != null && d[r][c][\"ct\"] != null && d[r][c][\"ct\"][\"t\"] == \"n\"){\r\n                        arr.push(d[r][c][\"v\"]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u4ECE\u5927\u5230\u5C0F\u6392\u5E8F\r\n            for(let j = 0; j < arr.length; j++){\r\n                for(let k = 0; k < arr.length - 1 - j; k++){\r\n                    if(arr[k] < arr[k + 1]){\r\n                        let temp = arr[k];\r\n                        arr[k] = arr[k + 1];\r\n                        arr[k + 1] = temp;\r\n                    }\r\n                }\r\n            }\r\n\r\n            let largeNum = arr[0];\r\n            let smallNum = arr[arr.length - 1];\r\n            \r\n            //\u8D4B\u503C\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #smallRange\").val(smallNum);\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #largeRange\").val(largeNum);\r\n        });\r\n        $(document).off(\"click.IFmultiRangeCancel\").on(\"click.IFmultiRangeCancel\", \"#luckysheet-ifFormulaGenerator-multiRange-cancel\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n        });\r\n        $(document).off(\"click.IFmultiRangeClose\").on(\"click.IFmultiRangeClose\", \"#luckysheet-ifFormulaGenerator-multiRange-dialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n        });\r\n\r\n        //\u9009\u62E9 \u5212\u5206\u65B9\u5F0F\r\n        $(document).on(\"change\", \"#DivisionMethod\", function(){\r\n            let value = $(this).find(\"option:selected\").val();\r\n\r\n            if(value == \"2\"){\r\n                $(\"#DivisionMethodVal\").hide();\r\n            }\r\n            else{\r\n                $(\"#DivisionMethodVal\").show();   \r\n            }\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").empty();\r\n        });\r\n\r\n        //\u70B9\u51FB \u751F\u6210 \u6309\u94AE\r\n        $(document).off(\"click.IFcreateBtn\").on(\"click.IFcreateBtn\", \"#luckysheet-ifFormulaGenerator-dialog #createBtn\", function(){\r\n            let compareValue = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#compareValue\").val().trim();\r\n            if(compareValue == \"\"){\r\n                _this.info(locale_formula.ifGenTipNotNullValue);\r\n                return;\r\n            }\r\n\r\n            let method = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#DivisionMethod option:selected\").val();\r\n            if(method == \"2\"){\r\n                let itemHtml =  '<div class=\"item\">'+\r\n                                    '<input type=\"number\" class=\"smallNum formulaInputFocus\"/>'+\r\n                                    '<select class=\"operator\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                    '<select class=\"operator2\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<input type=\"number\" class=\"largeNum formulaInputFocus\"/>'+\r\n                                    '<span>'+locale_formula.ifGenTipLableTitile+'\uFF1A</span>'+\r\n                                    '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"\">'+\r\n                                    '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                                '</div>';\r\n                $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").append(itemHtml);                \r\n            }\r\n            else{\r\n                let smallRange = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#smallRange\").val().trim();\r\n                let largeRange = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#largeRange\").val().trim();\r\n                let DivisionMethodVal = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#DivisionMethodVal\").val().trim();\r\n                \r\n                if(smallRange == \"\" || largeRange == \"\"){\r\n                    _this.info(locale_formula.ifGenTipRangeNotforNull);\r\n                    return;\r\n                }\r\n                else if(DivisionMethodVal == \"\"){\r\n                    _this.info(locale_formula.ifGenTipCutValueNotforNull);\r\n                    return;\r\n                }\r\n\r\n                _this.getIfList(compareValue, smallRange, largeRange, method, DivisionMethodVal);\r\n            }\r\n        });\r\n\r\n        //\u70B9\u51FB \u5220\u9664\u6761\u4EF6\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-dialog .item .fa-remove\", function(){\r\n            $(this).parents(\".item\").remove();\r\n        });\r\n\r\n        //\u70B9\u51FB \u786E\u8BA4 \u6309\u94AE\r\n        $(document).off(\"click.IFconfirmBtn\").on(\"click.IFconfirmBtn\", \"#luckysheet-ifFormulaGenerator-dialog-confirm\", function(){\r\n            let $item = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\".ifList .item\");\r\n            let str = '';\r\n\r\n            $($item.toArray().reverse()).each(function(i, e){\r\n                let smallNum = $(e).find(\".smallNum\").val().trim();\r\n                let largeNum = $(e).find(\".largeNum\").val().trim();\r\n                let operator = $(e).find(\".operator option:selected\").val();\r\n                let operator2 = $(e).find(\".operator2 option:selected\").val();\r\n                let compareValue = $(e).find(\".compareValue\").text();\r\n\r\n                let markText = $(e).find(\".markText\").val().trim();\r\n                if(markText == \"\"){\r\n                    markText = locale_formula.ifGenTipLableTitile + (i + 1);\r\n                }\r\n\r\n                if(smallNum == \"\" && largeNum == \"\"){\r\n                    return true;\r\n                }\r\n\r\n                let s;\r\n                if(operator == \"0\"){\r\n                    s = compareValue + \">=\" + smallNum;\r\n                }\r\n                else{\r\n                    s = compareValue + \">\" + smallNum;\r\n                }\r\n\r\n                let l;\r\n                if(operator2 == \"0\"){\r\n                    l = compareValue + \"<=\" + largeNum;\r\n                }\r\n                else{\r\n                    l = compareValue + \"<\" + largeNum;\r\n                }\r\n\r\n                let a;\r\n                if(i == 0 && largeNum == \"\"){\r\n                    a = s;\r\n                }\r\n                else if(i == ($item.length - 1) && smallNum == \"\"){\r\n                    a = l;\r\n                }\r\n                else{\r\n                    a = \"and(\"+s+\",\"+l+\")\";\r\n                }\r\n\r\n                if(i == 0){\r\n                    str = 'if('+ a +',\"'+ markText +'\")';\r\n                }\r\n                else{\r\n                    str = 'if('+ a +',\"'+ markText +'\",'+ str +')';\r\n                }\r\n            })\r\n            \r\n            if(str.length == 0){\r\n                _this.info(locale_formula.ifGenTipNotGenCondition);\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_index = last[\"row_focus\"], \r\n                col_index = last[\"column_focus\"];\r\n            \r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n\r\n            $(\"#luckysheet-rich-text-editor\").html(\"=\" + str);\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n            $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        });\r\n\r\n        //info\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-info .luckysheet-model-close-btn\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-info .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n        });\r\n    },\r\n    ifFormulaDialog: function(fp){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").remove();\r\n\r\n        let compareValue = \"\";\r\n        let ifListHtml = '';\r\n\r\n        if(!!fp){\r\n            let arr = fp.split(\"if(\");\r\n\r\n            for(let i = 1; i < arr.length; i++){\r\n                let txt = arr[i].replace(\"and(\",\"\").replace(/\\)/g,\"\").replace(/\\\"/g,\"\");\r\n                let arr2 = txt.split(\",\");\r\n                arr2 = _this.clearArr(arr2);\r\n                \r\n                compareValue = _this.splitTxt(arr2[0])[0];\r\n\r\n                let smallNum, largeNum, markText;\r\n                if(arr2.length == 3){\r\n                    smallNum = _this.splitTxt(arr2[0])[1];\r\n                    largeNum = _this.splitTxt(arr2[1])[2];\r\n                    markText = arr2[2];\r\n                }\r\n                else{\r\n                    smallNum = _this.splitTxt(arr2[0])[1];\r\n                    largeNum = _this.splitTxt(arr2[0])[2];\r\n                    markText = arr2[1];\r\n                }\r\n\r\n                let itemHtml =  '<div class=\"item\">'+\r\n                                    '<input type=\"number\" class=\"smallNum formulaInputFocus\" value=\"'+ smallNum +'\"/>'+\r\n                                    '<select class=\"operator\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                    '<select class=\"operator2\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<input type=\"number\" class=\"largeNum formulaInputFocus\" value=\"'+ largeNum +'\"/>'+\r\n                                    '<span>'+locale_formula.ifGenTipLableTitile+'\uFF1A</span>'+\r\n                                    '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"'+ markText +'\">'+\r\n                                    '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                                '</div>'; \r\n                ifListHtml += itemHtml;                             \r\n            }\r\n        }\r\n\r\n        let content = '<div class=\"ifAttr\">'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"compareValue\"> '+ locale_formula.ifGenCompareValueTitle +' </label>'+\r\n                            '<div class=\"inpBox\">'+\r\n                                '<input id=\"compareValue\" class=\"formulaInputFocus\" value=\"'+ compareValue +'\"/>'+\r\n                                '<i class=\"singRange fa fa-table\" aria-hidden=\"true\" title=\"'+ locale_formula.ifGenSelectCellTitle +'\"></i>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"smallRange\"> '+ locale_formula.ifGenRangeTitle +' </label>'+\r\n                            '<input type=\"number\" id=\"smallRange\" class=\"formulaInputFocus\"/>'+\r\n                            '<span class=\"text\"> '+ locale_formula.ifGenRangeTo +' </span>'+\r\n                            '<input type=\"number\" id=\"largeRange\" class=\"formulaInputFocus\"/>'+\r\n                            '<div id=\"rangeAssess\">'+\r\n                                '<span> '+ locale_formula.ifGenRangeEvaluate +' </span>'+\r\n                                '<i class=\"multiRange fa fa-table\" aria-hidden=\"true\" title=\"'+ locale_formula.ifGenSelectRangeTitle +'\"></i>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"DivisionMethod\"> '+ locale_formula.ifGenCutWay +' </label>'+\r\n                            '<select id=\"DivisionMethod\">'+\r\n                                '<option value=\"0\"> '+ locale_formula.ifGenCutSame +' </option>'+\r\n                                '<option value=\"1\"> '+ locale_formula.ifGenCutNpiece +' </option>'+\r\n                                '<option value=\"2\"> '+ locale_formula.ifGenCutCustom +' </option>'+\r\n                            '</select>'+\r\n                            '<input id=\"DivisionMethodVal\" class=\"formulaInputFocus\"/>'+\r\n                            '<div id=\"createBtn\"> '+ locale_formula.ifGenCutSame +' </div>'+\r\n                        '</div>'+\r\n                      '</div>'+\r\n                      '<div class=\"ifList\">'+ifListHtml+'</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-dialog\", \r\n            \"title\": locale_formula.ifGenerate, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 590).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    clearArr: function(arr){\r\n        for(let i = 0; i < arr.length; i++){\r\n            if(arr[i] == \"\" || arr[i] == null || arr[i] == undefined){\r\n                arr.splice(i, 1);\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    splitTxt: function(txt){\r\n        let compareValue, smallNum, largeNum;\r\n        \r\n        if(txt.indexOf(\">=\") != -1){\r\n            compareValue = txt.split(\">=\")[0];\r\n            smallNum = txt.split(\">=\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\">\") != -1){\r\n            compareValue = txt.split(\">\")[0];\r\n            smallNum = txt.split(\">\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\"<=\") != -1){\r\n            compareValue = txt.split(\"<=\")[0];\r\n            largeNum = txt.split(\"<=\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\"<\") != -1){\r\n            compareValue = txt.split(\"<\")[0];\r\n            largeNum = txt.split(\"<\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n    },\r\n    singleRangeDialog: function(value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        if(value == null){\r\n            value = \"\";\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-singleRange-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-singleRange-dialog\", \r\n            \"title\": locale_formula.ifGenTipSelectCell, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+locale_formula.ifGenTipSelectCellPlace+'\" value=\"'+ value +'\">', \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-singleRange-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-ifFormulaGenerator-singleRange-cancel\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    multiRangeDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-multiRange-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-multiRange-dialog\", \r\n            \"title\": locale_formula.ifGenTipSelectRange, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+locale_formula.ifGenTipSelectRangePlace+'\" value=\"\">', \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-multiRange-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-ifFormulaGenerator-multiRange-cancel\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    getIfList: function(compareValue, smallRange, largeRange, method, methodVal){\r\n        const locale_formula = locale().formula;\r\n\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").empty();\r\n\r\n        smallRange = parseInt(smallRange);\r\n        largeRange = parseInt(largeRange);\r\n        methodVal = parseInt(methodVal);\r\n\r\n        let arr = [];\r\n\r\n        if(method == \"0\"){\r\n            let len = Math.ceil((largeRange - smallRange) / methodVal); \r\n            for(let i = 0; i <= len; i++){\r\n                let num = smallRange + methodVal * i;\r\n                if(i == 0 || num >= largeRange){\r\n                    arr.push(\"\");\r\n                }\r\n                else{\r\n                    arr.push(num);\r\n                }\r\n            }\r\n            \r\n        }\r\n        else if(method == \"1\"){\r\n            let addnum = Math.ceil((largeRange - smallRange) / methodVal);\r\n            for(let i = 0; i <= methodVal; i++){\r\n                let num = smallRange + addnum * i;\r\n                if(i == 0 || num >= largeRange){\r\n                    arr.push(\"\");\r\n                }\r\n                else{\r\n                    arr.push(num);\r\n                }\r\n            }\r\n        }\r\n        for(let j = 0; j < arr.length - 1; j++){\r\n            let markText;\r\n            if(j == 0){\r\n                markText = \"\u5C0F\u4E8E\" + arr[j + 1];\r\n            }\r\n            else if(j == arr.length - 2){\r\n                markText = \"\u5927\u4E8E\u7B49\u4E8E\" + arr[j];\r\n            }\r\n            else{\r\n                markText = arr[j] + \"\u5230\" + arr[j + 1];\r\n            }\r\n\r\n            let itemHtml =  '<div class=\"item\">'+\r\n                                '<input type=\"number\" class=\"smallNum formulaInputFocus\" value=\"'+ arr[j] +'\"/>'+\r\n                                '<select class=\"operator\">'+\r\n                                    '<option value=\"0\"> <= </option>'+\r\n                                    '<option value=\"1\"> < </option>'+\r\n                                '</select>'+\r\n                                '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                '<select class=\"operator2\">'+\r\n                                    '<option value=\"0\"> <= </option>'+\r\n                                    '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                '</select>'+\r\n                                '<input type=\"number\" class=\"largeNum formulaInputFocus\" value=\"'+ arr[j + 1] +'\"/>'+\r\n                                '<span>'+locale_formula.ifGenTipLableTitile+'\uFF1A</span>'+\r\n                                '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"'+ markText +'\">'+\r\n                                '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                            '</div>';\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").append(itemHtml);\r\n        }\r\n    },\r\n    info: function(title){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-ifFormulaGenerator-info\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-info\", \r\n            \"addclass\": \"\", \r\n            \"title\": title, \r\n            \"content\": \"\", \r\n            \"botton\": '<button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;'+locale_button.close+'&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-info\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-info\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    }\r\n}\r\n\r\nexport default ifFormulaGenerator;", "import { luckysheet_getcelldata } from '../function/func';\r\n// import functionlist from '../function/functionlist';\r\n// import Store.luckysheet_function from '../function/Store.luckysheet_function';\r\nimport formula from '../global/formula';\r\nimport { isRealNum, isRealNull } from '../global/validate';\r\nimport { modelHTML } from './constant';\r\nimport { luckysheet_count_show } from './select';\r\nimport { replaceHtml, getObjType } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//\u63D2\u5165\u51FD\u6570\r\nconst insertFormula = {\r\n    init: function(){\r\n        let _this = this;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button;\r\n\r\n        $(document).off(\"keyup.fxSFLI\").on(\"keyup.fxSFLI\", \"#searchFormulaListInput\", function(){\r\n            $(\"#formulaTypeList\").empty();\r\n            let txt = $(this).val().toUpperCase();\r\n            let functionlist = Store.functionlist;\r\n\r\n            if(txt == \"\"){\r\n                //\u82E5\u6CA1\u6709\u67E5\u627E\u5185\u5BB9\u5219\u6839\u636E\u7C7B\u522B\u7B5B\u9009\r\n                _this.formulaListByType($(\"#formulaTypeSelect option:selected\").val());\r\n            }\r\n            else{\r\n                for(let i = 0; i < functionlist.length; i++){\r\n                    if(/^[a-zA-Z]+$/.test(txt)){\r\n                        if(functionlist[i].n.indexOf(txt) != \"-1\"){\r\n                            $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n                        }\r\n                    }\r\n                    else if(functionlist[i].a.indexOf(txt) != \"-1\"){\r\n                        $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n                    }\r\n                }\r\n            }\r\n            \r\n            $(\"#formulaTypeList .listBox:first-child\").addClass(\"on\"); //\u9ED8\u8BA4\u516C\u5F0F\u5217\u8868\u7B2C\u4E00\u4E2A\u4E3A\u9009\u4E2D\u72B6\u6001\r\n        });\r\n\r\n        $(document).off(\"change.fxFormulaTS\").on(\"change.fxFormulaTS\", \"#formulaTypeSelect\", function(){\r\n            let type = $(\"#formulaTypeSelect option:selected\").val();\r\n            _this.formulaListByType(type);\r\n        });\r\n\r\n        $(document).off(\"click.fxListbox\").on(\"click.fxListbox\", \"#formulaTypeList .listBox\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        //\u9009\u62E9\u516C\u5F0F\u540E\u5F39\u51FA\u53C2\u6570\u680F\u5F39\u6846\r\n        $(document).off(\"click.fxFormulaCf\").on(\"click.fxFormulaCf\", \"#luckysheet-search-formula-confirm\", function(){\r\n            let formula = $(\"#luckysheet-search-formula .listBox.on\").attr(\"name\");\r\n            let formulaTxt = '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">'+ formula.toUpperCase() +'</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n            \r\n            $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n            _this.formulaParmDialog(formula);\r\n        });\r\n\r\n        //\u516C\u5F0F\u53C2\u6570\u6846\r\n        $(document).off(\"focus.fxParamInput\").on(\"focus.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            let parmIndex = $(this).parents(\".parmBox\").index();\r\n            formula.data_parm_index = parmIndex;\r\n\r\n            let formulatxt = $(this).parents(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-title-text\").text();\r\n            let parmLen = Store.luckysheet_function[formulatxt].p.length;\r\n\r\n            let parmDetail, parmRepeat;\r\n            if(parmIndex >= parmLen){\r\n                parmDetail = Store.luckysheet_function[formulatxt].p[parmLen - 1].detail;\r\n                parmRepeat = Store.luckysheet_function[formulatxt].p[parmLen - 1].repeat;\r\n            }\r\n            else{\r\n                parmDetail = Store.luckysheet_function[formulatxt].p[parmIndex].detail;\r\n                parmRepeat = Store.luckysheet_function[formulatxt].p[parmIndex].repeat;\r\n            }\r\n\r\n            //\u53C2\u6570\u9009\u533A\u663E\u793A\uFF0C\u53C2\u6570\u503C\u663E\u793A\r\n            _this.parmTxtShow($(this).val());\r\n            \r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            _this.functionStrCompute();\r\n            \r\n            //\u53C2\u6570\u540D\u79F0\u548C\u91CA\u4E49\u5207\u6362\r\n            $(\"#luckysheet-search-formula-parm .parmDetailsBox\").empty();\r\n\r\n            let parmName = $(this).parents(\".parmBox\").find(\".name\").text();\r\n            $('<span>'+ parmName +':</span><span>'+ parmDetail +'</span>').appendTo($(\"#luckysheet-search-formula-parm .parmDetailsBox\"));\r\n            \r\n            //\u516C\u5F0F\u53C2\u6570\u53EF\u81EA\u589E\uFF08\u53C2\u6570\u81EA\u589E\u6700\u591A5\u4E2A\uFF09\r\n            if(parmRepeat == \"y\"){\r\n                let parmCount = $(\"#luckysheet-search-formula-parm .parmBox\").length;\r\n\r\n                if(parmCount < 5 && parmIndex == (parmCount - 1)){\r\n                    $('<div class=\"parmBox\"><div class=\"name\">'+ locale_formulaMore.valueTitle +''+ (parmCount + 1) +'</div><div class=\"txt\"><input class=\"formulaInputFocus\" /><i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i></div><div class=\"val\">=</div></div>').appendTo($(\"#luckysheet-search-formula-parm .parmListBox\"));\r\n                }\r\n            }\r\n        });\r\n\r\n        $(document).off(\"blur.fxParamInput\").on(\"blur.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            let txt = $(this).val();\r\n\r\n            if(formula.getfunctionParam(txt).fn == null && !formula.iscelldata(txt)){\r\n                if(!isRealNum(txt) && txt != \"\" && txt.length <= 2 && txt.indexOf('\"') != 0 && txt.lastIndexOf('\"') != 0){\r\n                    txt = '\"' + txt + '\"';\r\n                    $(this).val(txt);\r\n\r\n                    _this.parmTxtShow(txt);\r\n                    _this.functionStrCompute();\r\n                }\r\n            }\r\n        });\r\n        \r\n        $(document).off(\"keyup.fxParamInput\").on(\"keyup.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            //\u53C2\u6570\u9009\u533A\u663E\u793A\uFF0C\u53C2\u6570\u503C\u663E\u793A\r\n            _this.parmTxtShow($(this).val());\r\n\r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            _this.functionStrCompute();\r\n        });\r\n\r\n        //\u70B9\u51FB\u56FE\u6807\u9009\u53D6\u6570\u636E\u8303\u56F4\r\n        $(document).off(\"click.fxParamI\").on(\"click.fxParamI\", \"#luckysheet-search-formula-parm .parmBox i\", function(){\r\n            formula.data_parm_index = $(this).parents(\".parmBox\").index();\r\n            \r\n            //\u9009\u53D6\u8303\u56F4\u5F39\u51FA\u6846\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n            $(\"#luckysheet-search-formula-parm-select\").remove();\r\n            \r\n            if($(this).parents(\".parmBox\").find(\".txt input\").val() == \"\"){\r\n                $(\"body\").append(replaceHtml(modelHTML, { \r\n                    \"id\": \"luckysheet-search-formula-parm-select\", \r\n                    \"addclass\": \"luckysheet-search-formula-parm-select\", \r\n                    \"title\": locale_formulaMore.tipSelectDataRange, \r\n                    \"content\": \"<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='\"+ locale_formulaMore.tipDataRangeTile +\"' readonly='true' placeholder='\"+ locale_formulaMore.tipDataRangeTile +\"'>\", \r\n                    \"botton\": '<button id=\"luckysheet-search-formula-parm-select-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button>', \r\n                    \"style\": \"z-index:100003\" \r\n                }));\r\n            }\r\n            else{\r\n                $(\"body\").append(replaceHtml(modelHTML, { \r\n                    \"id\": \"luckysheet-search-formula-parm-select\", \r\n                    \"addclass\": \"luckysheet-search-formula-parm-select\", \r\n                    \"title\": locale_formulaMore.tipSelectDataRange, \r\n                    \"content\": \"<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='\"+ locale_formulaMore.tipDataRangeTile +\"' readonly='true' value='\"+ $(this).parents(\".parmBox\").find(\".txt input\").val() +\"'>\", \r\n                    \"botton\": '<button id=\"luckysheet-search-formula-parm-select-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button>', \r\n                    \"style\": \"z-index:100003\" \r\n                }));\r\n            }\r\n\r\n            let $t = $(\"#luckysheet-search-formula-parm-select\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n                myh = $t.outerHeight(), \r\n                myw = $t.outerWidth();\r\n            let winw = $(window).width(), winh = $(window).height();\r\n            let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n            $(\"#luckysheet-search-formula-parm-select\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n            \r\n            //\u53C2\u6570\u9009\u533A\u865A\u7EBF\u6846\r\n            _this.parmTxtShow($(this).parents(\".parmBox\").find(\".txt input\").val());\r\n        });\r\n\r\n        //\u70B9\u51FB\u786E\u5B9A\r\n        $(document).off(\"click.fxParamCf\").on(\"click.fxParamCf\", \"#luckysheet-search-formula-parm-confirm\", function(){\r\n            $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        });\r\n\r\n        //\u9009\u53D6\u8303\u56F4\u540E\u4F20\u56DE\u53C2\u6570\u680F\u5F39\u6846\r\n        $(document).off(\"click.fxParamSelectCf\").on(\"click.fxParamSelectCf\", \"#luckysheet-search-formula-parm-select-confirm\", function(){\r\n            let parmIndex = $(\"#luckysheet-search-formula-parm-select-input\").attr(\"data_parm_index\");\r\n\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n            $(\"#luckysheet-search-formula-parm\").show();\r\n            $(\"#luckysheet-search-formula-parm .parmBox\").eq(parmIndex).find(\".txt input\").focus();\r\n        });\r\n    },\r\n    formulaListDialog: function(){\r\n        let _this = this;\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-search-formula\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-search-formula\", \r\n            \"addclass\": \"luckysheet-search-formula\", \r\n            \"title\": \"\", \r\n            \"content\": \"<div class='inpbox'><label for='searchFormulaListInput'>\"+ locale_formulaMore.findFunctionTitle +\"\uFF1A</label><input class='formulaInputFocus' id='searchFormulaListInput' placeholder='\"+ locale_formulaMore.tipInputFunctionName +\"' spellcheck='false'/></div><div class='selbox'><label>\"+locale_formulaMore.selectCategory+\"\uFF1A</label><select id='formulaTypeSelect'><option value='0'>\"+locale_formulaMore.Math+\"</option><option value='1'>\"+locale_formulaMore.Statistical+\"</option><option value='2'>\"+locale_formulaMore.Lookup+\"</option><option value='3'>\"+locale_formulaMore.luckysheet+\"</option><option value='4'>\"+locale_formulaMore.dataMining+\"</option><option value='5'>\"+locale_formulaMore.Database+\"</option><option value='6'>\"+locale_formulaMore.Date+\"</option><option value='7'>\"+locale_formulaMore.Filter+\"</option><option value='8'>\"+locale_formulaMore.Financial+\"</option><option value='9'>\"+locale_formulaMore.Engineering+\"</option><option value='10'>\"+locale_formulaMore.Logical+\"</option><option value='11'>\"+locale_formulaMore.Operator+\"</option><option value='12'>\"+locale_formulaMore.Text+\"</option><option value='13'>\"+locale_formulaMore.Parser+\"</option><option value='14'>\"+locale_formulaMore.Array+\"</option><option value='-1'>\"+locale_formulaMore.other+\"</option></select></div><div class='listbox'><label>\"+locale_formulaMore.selectFunctionTitle+\"\uFF1A</label><div id='formulaTypeList'></div></div>\", \r\n            \"botton\": '<button id=\"luckysheet-search-formula-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-search-formula\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-formula\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3, \"user-select\": \"none\" }).show();\r\n        \r\n        _this.formulaListByType(\"0\"); //\u9ED8\u8BA4\u516C\u5F0F\u5217\u8868\u4E3A\u7C7B\u578B0\r\n        $(\"#searchFormulaListInput\").focus();\r\n    },\r\n    formulaListByType: function(type){\r\n        $(\"#formulaTypeList\").empty();\r\n        let functionlist = Store.functionlist;\r\n                    \r\n        for(let i = 0; i < functionlist.length; i++){\r\n            if((type == \"-1\" && functionlist[i].t > 14) || functionlist[i].t == type){\r\n                $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n            }\r\n        }\r\n\r\n        $(\"#formulaTypeList .listBox:first-child\").addClass(\"on\"); //\u9ED8\u8BA4\u516C\u5F0F\u5217\u8868\u7B2C\u4E00\u4E2A\u4E3A\u9009\u4E2D\u72B6\u6001\r\n    },\r\n    formulaParmDialog: function(formulaTxt, parm){ //\u53C2\u6570\u5F39\u51FA\u6846\r\n        let parm_title = '',\r\n            parm_content = '',\r\n            parm_list_content = '';\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button;\r\n        let functionlist = Store.functionlist;\r\n\r\n        for(let i = 0; i < functionlist.length; i++){\r\n            if(functionlist[i].n == formulaTxt.toUpperCase()){\r\n                parm_title = functionlist[i].n;\r\n\r\n                for(let j = 0; j < functionlist[i].p.length; j++){\r\n                    if(parm == null){\r\n                        //\u65E0\u53C2\u6570\r\n                        parm_list_content += '<div class=\"parmBox\">'+\r\n                                                '<div class=\"name\">'+ functionlist[i].p[j].name +'</div>'+\r\n                                                '<div class=\"txt\">'+\r\n                                                    '<input class=\"formulaInputFocus\" spellcheck=\"false\"/>' +\r\n                                                    '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i>'+\r\n                                                '</div>'+\r\n                                                '<div class=\"val\">=</div>'+\r\n                                             '</div>';\r\n                    }\r\n                    else{\r\n                        //\u6709\u53C2\u6570\r\n                        if(parm[j] == null){\r\n                            parm[j] = \"\";\r\n                        }\r\n\r\n                        parm_list_content += '<div class=\"parmBox\">'+\r\n                                                '<div class=\"name\">'+ functionlist[i].p[j].name +'</div>'+\r\n                                                '<div class=\"txt\">'+\r\n                                                    '<input class=\"formulaInputFocus\" value=\"'+ parm[j] +'\" spellcheck=\"false\"/>'+\r\n                                                    '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i>'+\r\n                                                '</div>'+\r\n                                                '<div class=\"val\">=</div>'+\r\n                                             '</div>';\r\n                    }\r\n                }\r\n\r\n                parm_content =  '<div>'+\r\n                                    '<div class=\"parmListBox\">'+ parm_list_content +'</div>'+\r\n                                    '<div class=\"formulaDetails\">'+ functionlist[i].d +'</div>'+\r\n                                    '<div class=\"parmDetailsBox\"></div>'+\r\n                                    '<div class=\"result\">'+locale_formulaMore.calculationResult+' = <span></span></div>'+\r\n                                '</div>';\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-search-formula\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        \r\n        $(\"#luckysheet-search-formula-parm\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-search-formula-parm\", \r\n            \"addclass\": \"luckysheet-search-formula-parm\", \r\n            \"title\": parm_title, \r\n            \"content\": parm_content, \r\n            \"botton\": '<button id=\"luckysheet-search-formula-parm-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-formula-parm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        \r\n        //\u53C2\u6570\u680F\u7B2C\u4E00\u4E2A\u53C2\u6570\u805A\u7126\uFF0C\u663E\u793A\u9009\u53D6\u865A\u7EBF\u6846\r\n        $(\"#luckysheet-search-formula-parm .parmBox:eq(0) input\").focus();\r\n\r\n        //\u904D\u5386\u53C2\u6570\uFF0C\u6709\u53C2\u6570\u663E\u793A\u503C\uFF0C\u65E0\u663E\u793A\u7A7A\r\n        $(\"#luckysheet-search-formula-parm .parmBox\").each(function(index,e){\r\n            let parmtxt = $(e).find(\".txt input\").val();\r\n            \r\n            if(formula.getfunctionParam(parmtxt).fn == null){ //\u53C2\u6570\u4E0D\u662F\u516C\u5F0F\r\n                if(formula.iscelldata(parmtxt)){ //\u53C2\u6570\u662F\u9009\u533A\r\n                    let txtdata = luckysheet_getcelldata(parmtxt).data;\r\n\r\n                    if(getObjType(txtdata) == \"array\"){ //\u53C2\u6570\u4E3A\u591A\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                        let txtArr = [];\r\n                        \r\n                        for(let i = 0; i < txtdata.length; i++){\r\n                            for(let j = 0; j < txtdata[i].length; j++){\r\n                                let cell = txtdata[i][j];\r\n\r\n                                if(cell == null || isRealNull(cell.v)){\r\n                                    txtArr.push(null);\r\n                                }\r\n                                else{\r\n                                    txtArr.push(cell.v);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ txtArr.join(\",\") +\"}\");\r\n                    }\r\n                    else{ //\u53C2\u6570\u4E3A\u5355\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                        $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ txtdata.v +\"}\");\r\n                    }\r\n                }\r\n                else{ //\u53C2\u6570\u4E0D\u662F\u9009\u533A\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ parmtxt +\"}\");\r\n                }\r\n            }\r\n            else{ //\u53C2\u6570\u662F\u516C\u5F0F\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ (new Function(\"return \" + $.trim(formula.functionParserExe(\"=\" + parmtxt)))()) +\"}\");\r\n            }\r\n        })\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();                        \r\n        formula.data_parm_index = 0;\r\n        formula.rangestart = true;\r\n    },\r\n    parmTxtShow: function(parmtxt){\r\n        if(formula.getfunctionParam(parmtxt).fn == null){ //\u53C2\u6570\u4E0D\u662F\u516C\u5F0F\r\n            if(formula.iscelldata(parmtxt)){ //\u53C2\u6570\u662F\u9009\u533A\r\n                let cellrange = formula.getcellrange(parmtxt);\r\n                let r1 = cellrange.row[0], \r\n                    r2 = cellrange.row[1], \r\n                    c1 = cellrange.column[0], \r\n                    c2 = cellrange.column[1];\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1 \r\n                }).show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column);\r\n\r\n                let txtdata = luckysheet_getcelldata(parmtxt).data;\r\n                if(getObjType(txtdata) == \"array\"){ //\u53C2\u6570\u4E3A\u591A\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                    let txtArr = [];\r\n                    \r\n                    for(let i = 0; i < txtdata.length; i++){\r\n                        for(let j = 0; j < txtdata[i].length; j++){\r\n                            let cell = txtdata[i][j];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                txtArr.push(null);\r\n                            }\r\n                            else{\r\n                                txtArr.push(cell.v);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ txtArr.join(\",\") +\"}\");\r\n                }\r\n                else{ //\u53C2\u6570\u4E3A\u5355\u4E2A\u5355\u5143\u683C\u9009\u533A\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ txtdata.v +\"}\");\r\n                }\r\n            }\r\n            else{ //\u53C2\u6570\u4E0D\u662F\u9009\u533A\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ parmtxt +\"}\");\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            }\r\n        }\r\n        else{   \r\n            //\u53C2\u6570\u662F\u516C\u5F0F\r\n            let txt;\r\n            for(let k = 0; k < formula.getfunctionParam(parmtxt).param.length; k++){\r\n                if(formula.iscelldata(formula.getfunctionParam(parmtxt).param[k])){\r\n                    txt = formula.getfunctionParam(parmtxt).param[k];\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let cellrange = formula.getcellrange(txt);\r\n            let r1 = cellrange.row[0], \r\n                r2 = cellrange.row[1], \r\n                c1 = cellrange.column[0], \r\n                c2 = cellrange.column[1];\r\n            let row = Store.visibledatarow[r2], \r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2], \r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                \"left\": col_pre, \r\n                \"width\": col - col_pre - 1, \r\n                \"top\": row_pre, \r\n                \"height\": row - row_pre - 1 \r\n            }).show();\r\n            $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n            luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column);\r\n\r\n            $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ (new Function(\"return \" + $.trim(formula.functionParserExe(\"=\" + parmtxt)))()) +\"}\");\r\n        }\r\n    },\r\n    functionStrCompute: function(){\r\n        let isVal = true; //\u53C2\u6570\u4E0D\u4E3A\u7A7A\r\n        let parmValArr = []; //\u53C2\u6570\u503C\u96C6\u5408\r\n        let lvi = -1; //\u6700\u540E\u4E00\u4E2A\u6709\u503C\u7684\u53C2\u6570\u7D22\u5F15\r\n\r\n        let formulatxt = $(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-title-text\").text();\r\n        let p = Store.luckysheet_function[formulatxt].p;\r\n        \r\n        $(\"#luckysheet-search-formula-parm .parmBox\").each(function(i, e){\r\n            let parmtxt = $(e).find(\".txt input\").val();\r\n\r\n            let parmRequire;\r\n            if(i < p.length){\r\n                parmRequire = p[i].require;\r\n            }\r\n            else{\r\n                parmRequire = p[p.length - 1].require;\r\n            }\r\n\r\n            if(parmtxt == \"\" && parmRequire == \"m\"){\r\n                isVal = false;\r\n            }\r\n\r\n            if(parmtxt != \"\"){\r\n                lvi = i;\r\n            }\r\n        });\r\n\r\n        //\u5355\u5143\u683C\u663E\u793A\r\n        let functionHtmlTxt;\r\n        if(lvi == -1){\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"()\"; \r\n        }\r\n        else if(lvi == 0){\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + $(\"#luckysheet-search-formula-parm .parmBox\").eq(0).find(\".txt input\").val() + \")\"; \r\n        }\r\n        else{\r\n            for(let j = 0; j <= lvi; j++){\r\n                parmValArr.push($(\"#luckysheet-search-formula-parm .parmBox\").eq(j).find(\".txt input\").val());\r\n            }\r\n\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + parmValArr.join(\",\") + \")\";    \r\n        }\r\n\r\n        let function_str = formula.functionHTMLGenerate(functionHtmlTxt);\r\n        $(\"#luckysheet-rich-text-editor\").html(function_str);\r\n        $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n        \r\n        if(isVal){ //\u516C\u5F0F\u8BA1\u7B97\r\n            let fp = $.trim(formula.functionParserExe($(\"#luckysheet-rich-text-editor\").text()));\r\n            \r\n            let result = null;\r\n\r\n            try {\r\n                result = new Function(\"return \" + fp)();\r\n            } \r\n            catch (e) {\r\n                result = formula.error.n;\r\n            }\r\n\r\n            $(\"#luckysheet-search-formula-parm .result span\").text(result);\r\n        }\r\n    }\r\n}\r\n\r\nexport default insertFormula;", "import { selectionCopyShow, selectIsOverlap } from './select';\r\nimport { luckyColor, iconfontObjects } from './constant';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport luckysheetMoreFormat from './moreFormat';\r\nimport alternateformat from './alternateformat';\r\nimport conditionformat from './conditionformat';\r\nimport server from './server';\r\nimport { luckysheet_searcharray } from './sheetSearch';\r\nimport luckysheetFreezen from './freezen';\r\nimport luckysheetsizeauto from './resize';\r\nimport { createFilter } from './filter';\r\nimport luckysheetSearchReplace from './searchReplace';\r\nimport luckysheetLocationCell from './locationCell';\r\nimport ifFormulaGenerator from './ifFormulaGenerator';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport insertFormula from './insertFormula';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetPostil from './postil';\r\nimport { isRealNum, isRealNull, isEditMode, hasPartMC } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { genarate, update, is_date } from '../global/format';\r\nimport { jfrefreshgrid, luckysheetrefreshgrid } from '../global/refresh';\r\nimport { sortSelection } from '../global/sort';\r\nimport luckysheetformula from '../global/formula';\r\nimport { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport { isdatatypemulti } from '../global/datecontroll';\r\nimport { rowlenByRange, getCellTextSplitArr } from '../global/getRowlen';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { getFontStyleByCell, checkstatusByCell} from '../global/getdata';\r\nimport { countfunc } from '../global/count';\r\nimport { hideMenuByCancel } from '../global/cursorPos';\r\nimport { getSheetIndex, getRangetxt, getluckysheetfile } from '../methods/get';\r\nimport { setluckysheetfile } from '../methods/set';\r\nimport {isInlineStringCell,isInlineStringCT,updateInlineStringFormat,convertCssToStyleList,inlineStyleAffectAttribute,updateInlineStringFormatOutside} from './inlineString';\r\nimport { replaceHtml, getObjType, rgbTohex, mouseclickposition, luckysheetfontformat,luckysheetContainerFocus } from '../utils/util';\r\nimport {openProtectionModal,checkProtectionFormatCells,checkProtectionNotEnable} from './protection';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport {checkTheStatusOfTheSelectedCells} from '../global/api';\r\n\r\nconst menuButton = {\r\n    \"menu\": '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton ${subclass} luckysheet-mousedown-cancel\" id=\"luckysheet-icon-${id}-menuButton\">${item}</div>',\r\n    // \"item\": '<div itemvalue=\"${value}\" itemname=\"${name}\" class=\"luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 0px 3px 1px;\"><span style=\"margin-right:3px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span> ${name} <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\">${example}</span></div></div>',\r\n    \"item\": '<div itemvalue=\"${value}\" itemname=\"${name}\" class=\"luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 0px 3px 1px;\"><span style=\"margin-right:3px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span> ${name} <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel ${iconClass}\" style=\"user-select: none;\">${example}</span></div></div>',\r\n    \"split\": '<div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>',\r\n    \"color\": '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel luckysheet-menuButton ${sub}\" id=\"${id}\"><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-color-reset\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${resetColor}</div></div> <div class=\"luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <input type=\"text\" class=\"luckysheet-color-selected\" /> </div> </div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> ${coloritem}</div>',\r\n    \"coloritem\": '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel ${class}\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${name}</div></div>',\r\n    \"subcolor\": '<div id=\"luckysheet-icon-${id}-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-menuButton-sub luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <input type=\"text\" class=\"luckysheet-color-selected\" /> </div> </div></div>',\r\n    \"rightclickmenu\": null,\r\n    \"submenuhide\": {},\r\n    focus: function($obj, value){\r\n        if($obj.attr(\"id\")==\"luckysheet-icon-font-family-menuButton\"){\r\n            if (isdatatypemulti(value)[\"num\"]) {\r\n                 let  _locale = locale();\r\n                const locale_fontarray = _locale.fontarray;\r\n                value = locale_fontarray[parseInt(value)];\r\n                if(value==null){\r\n                    value = this.defualtFont[itemvalue];\r\n                }\r\n            }\r\n        }\r\n        $obj.find(\".luckysheet-cols-menuitem\").find(\"span.icon\").html(\"\");\r\n        if(value == null){\r\n            $obj.find(\".luckysheet-cols-menuitem\").eq(0).find(\"span.icon\").html('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n        }\r\n        else{\r\n            $obj.find(\".luckysheet-cols-menuitem[itemvalue='\"+ value +\"']\").find(\"span.icon\").html('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n        }\r\n    },\r\n    createButtonMenu: function(itemdata){\r\n        let itemset = \"\";\r\n        let _this = this;\r\n\r\n        for(let i = 0; i < itemdata.length; i++){\r\n            let item = itemdata[i];\r\n\r\n            if(item.value==\"split\"){\r\n                itemset += _this.split;\r\n            }\r\n            else{\r\n                if(item.example==\"more\"){\r\n                    // itemset += replaceHtml(_this.item, {\"value\": item.value, \"name\": item.text, \"example\": \"\u25BA\", \"sub\": \"luckysheet-cols-submenu\"});\r\n                    itemset += replaceHtml(_this.item, {\"value\": item.value, \"name\": item.text, \"example\": \"\", \"sub\": \"luckysheet-cols-submenu\", \"iconClass\": \"iconfont luckysheet-iconfont-youjiantou\"});\r\n\r\n                }\r\n                else{\r\n                    itemset += replaceHtml(_this.item, {\"value\": item.value, \"name\": item.text, \"example\": item.example, \"sub\": \"\", \"iconClass\": \"\"});\r\n                }\r\n            }\r\n        }\r\n\r\n        return itemset;\r\n    },\r\n    cancelPaintModel: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-sheettable_0\").removeClass(\"luckysheetPaintCursor\");\r\n\r\n        if(Store.luckysheet_copy_save[\"dataSheetIndex\"] == Store.currentSheetIndex){\r\n            Store.luckysheet_selection_range = [];\r\n            selectionCopyShow();\r\n        }\r\n        else{\r\n            Store.luckysheetfile[getSheetIndex(Store.luckysheet_copy_save[\"dataSheetIndex\"])].luckysheet_selection_range = [];\r\n        }\r\n        \r\n        Store.luckysheet_copy_save = {};\r\n\r\n        _this.luckysheetPaintModelOn = false;\r\n        $(\"#luckysheetpopover\").fadeOut(200,function(){\r\n            $(\"#luckysheetpopover\").remove();\r\n        });\r\n    },\r\n    luckysheetPaintModelOn:false,\r\n    luckysheetPaintSingle: false,\r\n    initialMenuButton: function(){\r\n        let _this = this;\r\n\r\n        //\u683C\u5F0F\u5237\r\n        $(\"#luckysheet-icon-paintformat\").click(function(e){\r\n            e.stopPropagation();\r\n            let _locale = locale();\r\n            let locale_paint = _locale.paint;\r\n\r\n            if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_paint.tipSelectRange);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\",locale_paint.tipSelectRange);\r\n                }\r\n                return;\r\n            }\r\n            else if(Store.luckysheet_select_save.length > 1){\r\n                if(isEditMode()){\r\n                    alert(locale_paint.tipNotMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\",locale_paint.tipNotMulti);\r\n                }\r\n                return;\r\n            }\r\n\r\n            tooltip.popover(\"<i class='fa fa-paint-brush'></i> \"+locale_paint.start+\"\", \"topCenter\", true, null, locale_paint.end,function(){\r\n                _this.cancelPaintModel();\r\n            });\r\n            $(\"#luckysheet-sheettable_0\").addClass(\"luckysheetPaintCursor\");\r\n\r\n            Store.luckysheet_selection_range = [{ \"row\": Store.luckysheet_select_save[0].row, \"column\": Store.luckysheet_select_save[0].column }];\r\n            selectionCopyShow();\r\n\r\n            let RowlChange = false, HasMC = false;\r\n            for(let r = Store.luckysheet_select_save[0].row[0]; r <= Store.luckysheet_select_save[0].row[1]; r++){\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && (r in Store.config[\"rowlen\"])){\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for(let c = Store.luckysheet_select_save[0].column[0]; c <= Store.luckysheet_select_save[0].column[1]; c++){\r\n                    let cell = Store.flowdata[r][c];\r\n                    \r\n                    if(getObjType(cell) == \"object\" && (\"mc\" in cell) && cell.mc.rs != null){\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n            Store.luckysheet_copy_save = { \"dataSheetIndex\": Store.currentSheetIndex, \"copyRange\": [{ \"row\": Store.luckysheet_select_save[0].row, \"column\": Store.luckysheet_select_save[0].column }], \"RowlChange\": RowlChange, \"HasMC\": HasMC };\r\n\r\n            _this.luckysheetPaintModelOn = true;\r\n            _this.luckysheetPaintSingle = true;\r\n        });\r\n        $(\"#luckysheet-icon-paintformat\").dblclick(function(){\r\n            let _locale = locale();\r\n            let locale_paint = _locale.paint;\r\n            if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_paint.tipSelectRange);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\",locale_paint.tipSelectRange);  \r\n                }\r\n                return;\r\n            }\r\n            else if(Store.luckysheet_select_save.length > 1){\r\n                if(isEditMode()){\r\n                    alert(locale_paint.tipNotMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\",locale_paint.tipNotMulti);\r\n                }\r\n                return;\r\n            }\r\n\r\n            tooltip.popover(\"<i class='fa fa-paint-brush'></i> \"+locale_paint.start, \"topCenter\", true, null, locale_paint.end,function(){\r\n                _this.cancelPaintModel();\r\n            });\r\n            $(\"#luckysheet-sheettable_0\").addClass(\"luckysheetPaintCursor\");\r\n\r\n            Store.luckysheet_selection_range = [{ \"row\": Store.luckysheet_select_save[0].row, \"column\": Store.luckysheet_select_save[0].column }];\r\n            selectionCopyShow();\r\n\r\n            let RowlChange = false, HasMC = false;\r\n            for(let r = Store.luckysheet_select_save[0].row[0]; r <= Store.luckysheet_select_save[0].row[1]; r++){\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && (r in Store.config[\"rowlen\"])){\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for(let c = Store.luckysheet_select_save[0].column[0]; c <= Store.luckysheet_select_save[0].column[1]; c++){\r\n                    let cell = Store.flowdata[r][c];\r\n                    \r\n                    if(getObjType(cell) == \"object\" && (\"mc\" in cell) && cell.mc.rs != null){\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n            Store.luckysheet_copy_save = { \"dataSheetIndex\": Store.currentSheetIndex, \"copyRange\": [{ \"row\": Store.luckysheet_select_save[0].row, \"column\": Store.luckysheet_select_save[0].column }], \"RowlChange\": RowlChange, \"HasMC\": HasMC };\r\n            \r\n            _this.luckysheetPaintModelOn = true;\r\n            _this.luckysheetPaintSingle = false;\r\n        });\r\n\r\n        //\u8D27\u5E01\u683C\u5F0F\r\n        $(\"#luckysheet-icon-currency\").click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n            _this.updateFormat(d, \"ct\", \"\u00A5 #.00\");\r\n        });\r\n\r\n        //\u767E\u5206\u6BD4\r\n        $(\"#luckysheet-icon-percent\").click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n\r\n            _this.updateFormat(d, \"ct\", \"0.00%\");\r\n        });\r\n\r\n        //\u51CF\u5C11\u5C0F\u6570\u4F4D\u6570\r\n        $(\"#luckysheet-icon-fmt-decimal-decrease\").click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n            let row_index = Store.luckysheet_select_save[0][\"row_focus\"], \r\n                col_index = Store.luckysheet_select_save[0][\"column_focus\"];\r\n            let foucsStatus = _this.checkstatus(d, row_index, col_index, \"ct\");\r\n            let cell = d[row_index][col_index];\r\n\r\n            if(foucsStatus == null || foucsStatus.t != \"n\"){\r\n                return;\r\n            }\r\n\r\n            if(foucsStatus.fa == \"General\"){\r\n                let mask = genarate(cell.v);\r\n                foucsStatus = mask[1];\r\n            }\r\n\r\n            //\u4E07\u4EBF\u683C\u5F0F\r\n            let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n            if(reg.test(foucsStatus.fa)){\r\n                if(foucsStatus.fa.indexOf(\".\") > -1){\r\n                    if(foucsStatus.fa.substr(-2) == \".0\"){\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa.split(\".\")[0]);\r\n                    }\r\n                    else{\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa.substr(0, foucsStatus.fa.length - 1));   \r\n                    }\r\n                }\r\n                else{\r\n                    _this.updateFormat(d, \"ct\", foucsStatus.fa);\r\n                }\r\n\r\n                return;\r\n            }\r\n            //Uncaught ReferenceError: Cannot access 'fa' before initialization\r\n            let prefix = \"\", main = \"\", fa = [];\r\n            if(foucsStatus.fa.indexOf(\".\")>-1){\r\n                fa = foucsStatus.fa.split(\".\");\r\n                prefix = fa[0];\r\n                main = fa[1];\r\n            }\r\n            else{\r\n                return;\r\n            }\r\n\r\n            fa = main.split(\"\");\r\n            let tail = \"\";\r\n            for(let i = fa.length-1; i >= 0; i--){\r\n                let c = fa[i];\r\n                if((c!=\"#\" && c!=\"0\" && c!=\",\" && isNaN(parseInt(c)))) {\r\n                    tail = c + tail;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let fmt = \"\";\r\n            if(foucsStatus.fa.indexOf(\".\")>-1){\r\n                let suffix = main;\r\n                if(tail.length>0){\r\n                    suffix = main.replace(tail, \"\");\r\n                }\r\n\r\n                let pos = suffix.replace(/#/g, \"0\");\r\n                pos = pos.substr(0, pos.length-1);\r\n                if(pos==\"\"){\r\n                    fmt = prefix + tail;\r\n                }\r\n                else{\r\n                    fmt = prefix + \".\" + pos + tail;\r\n                }\r\n            }\r\n\r\n            _this.updateFormat(d, \"ct\", fmt);\r\n        });\r\n\r\n        //\u589E\u52A0\u5C0F\u6570\u4F4D\u6570\r\n        $(\"#luckysheet-icon-fmt-decimal-increase\").click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n            let row_index = Store.luckysheet_select_save[0][\"row_focus\"], \r\n                col_index = Store.luckysheet_select_save[0][\"column_focus\"];\r\n            let foucsStatus = _this.checkstatus(d, row_index, col_index, \"ct\");\r\n            let cell = d[row_index][col_index];\r\n\r\n            if(foucsStatus== null || foucsStatus.t != \"n\"){\r\n                return;\r\n            }\r\n\r\n            if(foucsStatus.fa == \"General\"){\r\n                let mask = genarate(cell.v);\r\n                foucsStatus = mask[1];\r\n            }\r\n\r\n            if(foucsStatus.fa == \"General\"){\r\n                _this.updateFormat(d, \"ct\", \"#.0\");\r\n                return;\r\n            }\r\n\r\n            //\u4E07\u4EBF\u683C\u5F0F\r\n            let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n            if(reg.test(foucsStatus.fa)){\r\n                if(foucsStatus.fa.indexOf(\".\") > -1){\r\n                    _this.updateFormat(d, \"ct\", foucsStatus.fa + \"0\");\r\n                }\r\n                else{\r\n                    if(foucsStatus.fa.substr(-1) == \"0\"){\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa + \".0\");\r\n                    }\r\n                    else{\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa + \"0.0\");\r\n                    }\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            //Uncaught ReferenceError: Cannot access 'fa' before initialization\r\n            let prefix = \"\", main = \"\", fa = [];\r\n            \r\n            if(foucsStatus.fa.indexOf(\".\")>-1){\r\n                fa = foucsStatus.fa.split(\".\");\r\n                prefix = fa[0];\r\n                main = fa[1];\r\n            }\r\n            else{\r\n                main = foucsStatus.fa;\r\n            }\r\n\r\n            fa = main.split(\"\");\r\n            let tail = \"\";\r\n            for(let i = fa.length - 1; i >= 0; i--){\r\n                let c = fa[i];\r\n                if(( c!=\"#\" && c!=\"0\" && c!=\",\" && isNaN(parseInt(c)))) {\r\n                    tail = c + tail;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let fmt = \"\";\r\n            if(foucsStatus.fa.indexOf(\".\")>-1){\r\n                let suffix = main;\r\n                if(tail.length>0){\r\n                    suffix = main.replace(tail, \"\");\r\n                }\r\n\r\n                let pos = suffix.replace(/#/g, \"0\");\r\n                pos += \"0\";\r\n                fmt = prefix + \".\" + pos + tail;\r\n            }\r\n            else{\r\n                if(tail.length>0){\r\n                    fmt = main.replace(tail, \"\") + \".0\" + tail;\r\n                }\r\n                else{\r\n                    fmt = main + \".0\" + tail;\r\n                }\r\n            }\r\n\r\n\r\n            _this.updateFormat(d, \"ct\", fmt);\r\n        });\r\n\r\n        //\u66F4\u591A\u683C\u5F0F\r\n        $(\"#luckysheet-icon-fmt-other\").click(function(){\r\n            const _locale = locale();\r\n            const locale_format = _locale.format;\r\n            const locale_defaultFmt = _locale.defaultFmt;\r\n\r\n            let menuButtonId = $(this).attr(\"id\")+\"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                let itemdata = locale_defaultFmt;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                // luckysheet-menuButton-sub\r\n                let menu = replaceHtml(_this.menu, {\"id\": \"fmt-other\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\"});\r\n\r\n                let subitemdata = [\r\n                    {\"text\":locale_format.moreCurrency+\"...\", \"value\":\"morecurrency\", \"example\":\"\"},\r\n                    {\"text\":locale_format.moreDateTime+\"...\", \"value\":\"moredatetime\", \"example\":\"\"},\r\n                    {\"text\":locale_format.moreNumber+\"...\", \"value\":\"moredigit\", \"example\":\"\"}\r\n                ];\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, {\"id\": \"fmtOtherSelf\", \"item\": subitemset, \"subclass\": \"luckysheet-menuButton-sub\"});\r\n                \r\n                //luckysheet-icon-fmt-other-menuButton_sub\r\n                $(\"body\").append(menu+submenu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(250);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\"),itemname = $t.attr(\"itemname\");\r\n                    $(\"#luckysheet-icon-fmt-other\").find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ itemname +\" \");\r\n\r\n                    if(itemvalue == \"fmtOtherSelf\"){\r\n                        return;\r\n                    }\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);//\u53D6\u6570\u636E\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    _this.updateFormat(d, \"ct\", itemvalue);\r\n                });\r\n\r\n                //\u66F4\u591A\u683C\u5F0F\r\n                $(\"#luckysheet-icon-fmtOtherSelf-menuButton\").find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-fmtOtherSelf-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let itemvalue = $(this).attr(\"itemvalue\");\r\n\r\n                    luckysheetMoreFormat.createDialog(itemvalue);\r\n                    luckysheetMoreFormat.init();\r\n                })\r\n            } else {\r\n                const text =$(this).find(\".luckysheet-toolbar-menu-button-caption\").text().trim();\r\n                const format = locale_defaultFmt.find(f => f.text === text);\r\n                if(format) {\r\n                    _this.focus($menuButton, format.value);\r\n                }\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top+25, \"lefttop\");\r\n        });\r\n\r\n        //\u5B57\u4F53\u8BBE\u7F6E\r\n        $(\"#luckysheet-icon-font-family\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let menuButtonId = $(this).attr(\"id\")+\"-menuButton\";\r\n            let $menuButton = $(\"#\"+menuButtonId);\r\n            if($menuButton.length == 0){\r\n                // const locale_fontarray = locale().fontarray;\r\n                // let itemdata = [];\r\n\r\n                // for(let a=0;a<locale_fontarray.length;a++){\r\n                //     let fItem = locale_fontarray[a];\r\n                //     let ret = {};\r\n                //     ret.value = a;\r\n                //     ret.text = \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\"+fItem+\"'>\"+fItem+\"</span>\";\r\n                //     ret.example = \"\";\r\n                //     itemdata.push(ret);\r\n                // }\r\n\r\n                let itemset = _this.createButtonMenu(_this.fontSelectList);\r\n\r\n                let menu = replaceHtml(_this.menu, {\"id\": \"font-family\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\"});\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\"+menuButtonId).width(200);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.on(\"click\", \".luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\"), itemname = $t.attr(\"itemname\");\r\n                    _this.focus($menuButton, itemvalue);\r\n                    $(\"#luckysheet-icon-font-family\").find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ itemname +\" \");\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                    _this.updateFormat(d, \"ff\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top+25, \"lefttop\");\r\n        });\r\n\r\n        //\u5B57\u4F53\u989C\u8272\r\n        $(\"#luckysheet-icon-text-color\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let color =  $(this).attr(\"color\");\r\n            if(color == null){\r\n                color = \"#000000\";\r\n            }\r\n            _this.updateFormat(d, \"fc\", color);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-text-color-menu\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\"+menuButtonId);\r\n\r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_toolbar = _locale.toolbar;\r\n                const locale_button = _locale.button;\r\n                const locale_alternatingColors = _locale.alternatingColors;\r\n                let itemdata = [\r\n                    {\"name\":locale_toolbar.alternatingColors+\"...\", \"id\":\"luckysheet-color-alternate\", \"example\":\"\"}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n                let subid = \"text-color-self\";\r\n                let coloritem = replaceHtml(_this.coloritem, {\"class\": \"luckysheet-icon-alternateformat\", \"name\": locale_toolbar.alternatingColors+\"...\"});\r\n                let menu = replaceHtml(_this.color, {\"id\":menuButtonId, \"coloritem\": coloritem, \"colorself\": subid, \"sub\": \"\",\"resetColor\":locale_toolbar.resetColor});\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\").spectrum({\r\n                    showPalette: true,\r\n                    showPaletteOnly: true,\r\n                    preferredFormat: \"hex\",\r\n                    clickoutFiresChange: false,\r\n                    showInitial: true,\r\n                    showInput: true,\r\n                    flat: true,\r\n                    hideAfterPaletteSelect: true,\r\n                    showSelectionPalette: true,\r\n                    maxPaletteSize: 8,\r\n                    maxSelectionSize: 8,\r\n                    cancelText: locale_button.cancel,\r\n                    chooseText: locale_button.confirm,\r\n                    togglePaletteMoreText: locale_toolbar.customColor,\r\n                    togglePaletteLessText: locale_toolbar.collapse,\r\n                    togglePaletteOnly: true,\r\n                    clearText: locale_toolbar.clearText,\r\n                    color: luckysheetConfigsetting.defaultTextColor,\r\n                    noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n                    localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n                    palette: [[\"#000\",\"#444\",\"#666\",\"#999\",\"#ccc\",\"#eee\",\"#f3f3f3\",\"#fff\"],\r\n                    [\"#f00\",\"#f90\",\"#ff0\",\"#0f0\",\"#0ff\",\"#00f\",\"#90f\",\"#f0f\"],\r\n                    [\"#f4cccc\",\"#fce5cd\",\"#fff2cc\",\"#d9ead3\",\"#d0e0e3\",\"#cfe2f3\",\"#d9d2e9\",\"#ead1dc\"],\r\n                    [\"#ea9999\",\"#f9cb9c\",\"#ffe599\",\"#b6d7a8\",\"#a2c4c9\",\"#9fc5e8\",\"#b4a7d6\",\"#d5a6bd\"],\r\n                    [\"#e06666\",\"#f6b26b\",\"#ffd966\",\"#93c47d\",\"#76a5af\",\"#6fa8dc\",\"#8e7cc3\",\"#c27ba0\"],\r\n                    [\"#c00\",\"#e69138\",\"#f1c232\",\"#6aa84f\",\"#45818e\",\"#3d85c6\",\"#674ea7\",\"#a64d79\"],\r\n                    [\"#900\",\"#b45f06\",\"#bf9000\",\"#38761d\",\"#134f5c\",\"#0b5394\",\"#351c75\",\"#741b47\"],\r\n                    [\"#600\",\"#783f04\",\"#7f6000\",\"#274e13\",\"#0c343d\",\"#073763\",\"#20124d\",\"#4c1130\"]],\r\n                    change: function (color) {\r\n                        let $input = $(this);\r\n                        if (color != null) {\r\n                            color = color.toHexString();\r\n                        }\r\n                        else {\r\n                            color = \"#000\";\r\n                        }\r\n\r\n                        let oldcolor = null;\r\n                        // $(\"#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", color);\r\n                        // \u4E0B\u8FB9\u6846\u6362\u6210\u4E86\u4E00\u4E2ADIV\r\n                        $(\"#luckysheet-icon-text-color .text-color-bar\").css(\"background-color\", color);\r\n                        $(\"#luckysheet-icon-text-color\").attr(\"color\", color);\r\n\r\n                        let d = editor.deepCopyFlowData(Store.flowdata);\r\n                        _this.updateFormat(d, \"fc\", color);\r\n\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n                    },\r\n                });\r\n\r\n                $menuButton.find(\".luckysheet-color-reset\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $input = $(\"#\"+ menuButtonId).find(\".luckysheet-color-selected\");\r\n                    $input.val(\"#000000\");\r\n                    $(\"#luckysheet-icon-text-color\").attr(\"color\", null);\r\n                    $input.spectrum(\"set\", \"#000000\");\r\n                    $(\"#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", \"#000000\");\r\n                    \r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"fc\", null);\r\n                });\r\n\r\n                //\u4EA4\u66FF\u989C\u8272\r\n                $menuButton.find(\".luckysheet-icon-alternateformat\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_alternatingColors.errorInfo);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_alternatingColors.errorInfo, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n                    let isExists = alternateformat.rangeIsExists(range)[0];\r\n                    if(!isExists){\r\n                        alternateformat.modelfocusIndex = 0;\r\n                        alternateformat.new(range);    \r\n                    }\r\n\r\n                    alternateformat.init();\r\n                    alternateformat.perfect();\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n\r\n            let offsetTop = $(this).offset().top+26;\r\n            setTimeout(function(){\r\n                let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                $input.spectrum(\"set\", $input.val());\r\n                mouseclickposition($menuButton, menuleft-28, offsetTop, \"lefttop\");\r\n            }, 1);\r\n        });\r\n\r\n        //\u80CC\u666F\u989C\u8272\r\n        $(\"#luckysheet-icon-cell-color\").click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let color =  $(this).attr(\"color\");\r\n            if(color == null){\r\n                color = \"#ffffff\";\r\n            }\r\n            _this.updateFormat(d, \"bg\", color);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-cell-color-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                let subid = \"cell-color-self\";\r\n\r\n                const _locale = locale();\r\n                const locale_toolbar = _locale.toolbar;\r\n                const locale_button = _locale.button;\r\n                const locale_alternatingColors = _locale.alternatingColors;\r\n\r\n                let coloritem = replaceHtml(_this.coloritem, { \"class\": \"luckysheet-icon-alternateformat\", \"name\": locale_toolbar.alternatingColors+\"...\" });\r\n                let menu = replaceHtml(_this.color, { \"id\": menuButtonId, \"coloritem\": coloritem, \"colorself\": subid, \"sub\": \"\",\"resetColor\":locale_toolbar.resetColor });\r\n                \r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\").spectrum({\r\n                    showPalette: true,\r\n                    showPaletteOnly: true,\r\n                    preferredFormat: \"hex\",\r\n                    clickoutFiresChange: false,\r\n                    showInitial: true,\r\n                    showInput: true,\r\n                    flat: true,\r\n                    hideAfterPaletteSelect: true,\r\n                    showSelectionPalette: true,\r\n                    maxPaletteSize: 8,\r\n                    maxSelectionSize: 8,\r\n                    color: luckysheetConfigsetting.defaultCellColor,\r\n                    cancelText: locale_button.cancel,\r\n                    chooseText: locale_button.confirm,\r\n                    togglePaletteMoreText: locale_toolbar.customColor,\r\n                    togglePaletteLessText: locale_toolbar.collapse,\r\n                    togglePaletteOnly: true,\r\n                    clearText: locale_toolbar.clearText,\r\n                    noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n                    localStorageKey: \"spectrum.bgcolor\" + server.gridKey,\r\n                    palette: [\r\n                        [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                        [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                        [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                        [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                        [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                        [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                        [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                        [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n                    ],\r\n                    change: function (color) {\r\n                        let $input = $(this);\r\n                        if (color != null) {\r\n                            color = color.toHexString();\r\n                        }\r\n                        else {\r\n                            color = \"#fff\";\r\n                        }\r\n\r\n                        let oldcolor = null;\r\n                        // $(\"#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", color);\r\n                        // \u4E0B\u8FB9\u6846\u6362\u6210\u4E86\u4E00\u4E2ADIV\r\n                        $(\"#luckysheet-icon-cell-color .text-color-bar\").css(\"background-color\", color);\r\n                        \r\n                        $(\"#luckysheet-icon-cell-color\").attr(\"color\", color);\r\n                        let d = editor.deepCopyFlowData(Store.flowdata);\r\n                        _this.updateFormat(d, \"bg\", color);\r\n\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n                    }\r\n                });\r\n\r\n                $menuButton.find(\".luckysheet-color-reset\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                    $input.val(\"#ffffff\");\r\n                    $(\"#luckysheet-icon-cell-color\").attr(\"color\", null);\r\n                    $input.spectrum(\"set\", \"#ffffff\");\r\n                    $(\"#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", \"#ffffff\");\r\n                    \r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"bg\", null);\r\n                });\r\n\r\n                //\u4EA4\u66FF\u989C\u8272\r\n                $menuButton.find(\".luckysheet-icon-alternateformat\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_alternatingColors.errorInfo);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_alternatingColors.errorInfo, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n                    let isExists = alternateformat.rangeIsExists(range)[0];\r\n                    if(!isExists){\r\n                        alternateformat.modelfocusIndex = 0;\r\n                        alternateformat.new(range);    \r\n                    }\r\n\r\n                    alternateformat.init();\r\n                    alternateformat.perfect();\r\n                });\r\n\r\n                $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\").val(\"#fff\");\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n\r\n            let offsetTop = $(this).offset().top + 26;\r\n            setTimeout(function(){\r\n                let $input = $(\"#\"+ menuButtonId).find(\".luckysheet-color-selected\");\r\n                $input.spectrum(\"set\", $input.val());\r\n                mouseclickposition($menuButton, menuleft - 28, offsetTop, \"lefttop\");\r\n            }, 1);\r\n        });\r\n\r\n\r\n        //\u5B57\u4F53\u5927\u5C0F\r\n        let luckysheet_fs_setTimeout = null;\r\n        $(\"#luckysheet-icon-font-size\").mousedown(function(e){\r\n            if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0){\r\n                let w = window.getSelection();\r\n                if(w.type!=\"None\"){\r\n                    let range = w.getRangeAt(0);\r\n                    if(!range.collapsed){\r\n                        Store.inlineStringEditRange = range.cloneRange();\r\n                    }\r\n                }\r\n            }\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    { \"text\": \"9\", \"value\": \"9\", \"example\": \"\" },\r\n                    { \"text\": \"10\", \"value\": \"10\", \"example\": \"\" },\r\n                    { \"text\": \"11\", \"value\": \"11\", \"example\": \"\" },\r\n                    { \"text\": \"12\", \"value\": \"12\", \"example\": \"\" },\r\n                    { \"text\": \"14\", \"value\": \"14\", \"example\": \"\" },\r\n                    { \"text\": \"16\", \"value\": \"16\", \"example\": \"\" },\r\n                    { \"text\": \"18\", \"value\": \"18\", \"example\": \"\" },\r\n                    { \"text\": \"20\", \"value\": \"20\", \"example\": \"\" },\r\n                    { \"text\": \"22\", \"value\": \"22\", \"example\": \"\" },\r\n                    { \"text\": \"24\", \"value\": \"24\", \"example\": \"\" },\r\n                    { \"text\": \"26\", \"value\": \"26\", \"example\": \"\" },\r\n                    { \"text\": \"28\", \"value\": \"28\", \"example\": \"\" },\r\n                    { \"text\": \"36\", \"value\": \"36\", \"example\": \"\" },\r\n                    { \"text\": \"48\", \"value\": \"48\", \"example\": \"\" },\r\n                    { \"text\": \"72\", \"value\": \"72\", \"example\": \"\" }\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"font-size\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(150);\r\n                _this.focus($menuButton, 10);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\"), $input = $(\"#luckysheet-icon-font-size input\");\r\n                    $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\", itemvalue);\r\n                    _this.focus($menuButton, itemvalue);\r\n                    $input.val(itemvalue);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"fs\", itemvalue);\r\n                    \r\n                    clearTimeout(luckysheet_fs_setTimeout);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let defualtvalue = $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\");\r\n            if(defualtvalue == null){\r\n                defualtvalue = 10;\r\n            }\r\n            _this.focus($menuButton, defualtvalue);\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n\r\n\r\n        })\r\n        .find(\"input.luckysheet-toolbar-textinput\").keydown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).keyup(function(e){\r\n            if(e.keyCode != 13){//Enter\r\n                return;\r\n            }\r\n\r\n            let $this = $(this);\r\n\r\n            let itemvalue = parseInt($this.val());\r\n            let $menuButton = $(\"#luckysheet-icon-font-size-menuButton\");\r\n            _this.focus($menuButton, itemvalue);\r\n            \r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat(d, \"fs\", itemvalue);\r\n            \r\n            luckysheet_fs_setTimeout = setTimeout(function(){\r\n                $menuButton.hide();\r\n                $this.blur();\r\n            }, 200);\r\n        });\r\n\r\n        //\u8FB9\u6846\u8BBE\u7F6E\r\n        $(\"#luckysheet-icon-border-all\").click(function(){\r\n\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let type = $(this).attr(\"type\");\r\n            if(type == null){\r\n                type = \"border-all\";\r\n            }\r\n\r\n            let subcolormenuid = \"luckysheet-icon-borderColor-menuButton\";\r\n            let color = $(\"#\" + subcolormenuid).find(\".luckysheet-color-selected\").val();\r\n            let style = $(\"#luckysheetborderSizepreview\").attr(\"itemvalue\");\r\n\r\n            if(color == null || color == \"\"){\r\n                color = \"#000\";\r\n            }\r\n\r\n            if(style == null || style == \"\"){\r\n                style = \"1\";\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"borderInfo\"] == null){\r\n                cfg[\"borderInfo\"] = [];\r\n            }\r\n\r\n            let borderInfo = {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": type,\r\n                \"color\": color,\r\n                \"style\": style,\r\n                \"range\": $.extend(true, [], Store.luckysheet_select_save)\r\n            }\r\n\r\n            cfg[\"borderInfo\"].push(borderInfo);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length  = 0;\r\n\r\n                let redo = [];\r\n\r\n                redo[\"type\"] = \"borderChange\";\r\n\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n                \r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-border-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if($menuButton.length == 0){\r\n                let canvasH = 10, canvasW = 120;\r\n                const _locale = locale();\r\n                const locale_border = _locale.border;\r\n                const locale_toolbar = _locale.toolbar;\r\n                const locale_button = _locale.button;\r\n                let itemdata = [\r\n                    {\"text\": locale_border.borderTop, \"value\": \"border-top\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-top iconfont luckysheet-iconfont-shangbiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderBottom, \"value\":\"border-bottom\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-bottom iconfont luckysheet-iconfont-xiabiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderLeft, \"value\":\"border-left\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-left iconfont luckysheet-iconfont-zuobiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderRight, \"value\":\"border-right\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-right iconfont luckysheet-iconfont-youbiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\":\"\"},\r\n                    {\"text\": locale_border.borderNone, \"value\": \"border-none\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-none iconfont luckysheet-iconfont-wubiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderAll, \"value\": \"border-all\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont luckysheet-iconfont-quanjiabiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderOutside, \"value\": \"border-outside\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-outside iconfont luckysheet-iconfont-sizhoujiabiankuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_border.borderInside, \"value\": \"border-inside\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-inside iconfont luckysheet-iconfont-neikuangxian\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderHorizontal, \"value\": \"border-horizontal\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-horizontal iconfont luckysheet-iconfont-neikuanghengxian\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_border.borderVertical, \"value\": \"border-vertical\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-vertical iconfont luckysheet-iconfont-neikuangshuxian\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": \"<span id='luckysheet-icon-borderColor-linecolor' class='luckysheet-mousedown-cancel' style='border-bottom:3px solid #000;'>\"+ locale_border.borderColor +\"</span>\", \"value\":\"borderColor\", \"example\":\"more\"},\r\n                    {\"text\": \"\"+ locale_border.borderSize +\"<img id='luckysheetborderSizepreview' width=100 height=10 src='data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==' style='position:absolute;bottom:-5px;right:0px;width:100px;height:10px;'>\", \"value\":\"borderSize\", \"example\":\"more\"}\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.border;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"border-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                let subitemdata = [\r\n                    {\"text\": locale_border.borderNone, \"value\": \"0\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='Thin' class='border-Thin' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"1\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='Hair' class='border-Hair' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"2\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='Dotted' class='border-Dotted' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"3\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='Dashed' class='border-Dashed' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"4\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='DashDot' class='border-DashDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"5\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='DashDotDot' class='border-DashDotDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"6\", \"example\": \"\"},\r\n                    // {\"text\":\"<canvas type='Double' class='border-Double' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\":\"7\", \"example\":\"\"},\r\n                    {\"text\": \"<canvas type='Medium' class='border-Medium' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"8\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='MediumDashed' class='border-MediumDashed' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"9\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='MediumDashDot' class='border-MediumDashDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"10\", \"example\": \"\"},\r\n                    {\"text\": \"<canvas type='MediumDashDotDot' class='border-MediumDashDotDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"11\", \"example\": \"\"},\r\n                    // {\"text\":\"<canvas type='SlantedDashDot' class='border-SlantedDashDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\":\"12\", \"example\":\"\"},\r\n                    {\"text\": \"<canvas type='Thick' class='border-Thick' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\": \"13\", \"example\": \"\"}\r\n                ];\r\n\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, { \"id\": \"borderSize\", \"item\": subitemset, \"subclass\": \"luckysheet-menuButton-sub\" });\r\n                let submenuid = \"luckysheet-icon-borderSize-menuButton\";\r\n                let subcolormenuid = \"luckysheet-icon-borderColor-menuButton\";\r\n                let colormenu = replaceHtml(_this.color, { \"id\": subcolormenuid, \"coloritem\": \"\", \"colorself\": \"\", \"sub\": \"luckysheet-menuButton-sub\",resetColor:locale_toolbar.resetColor });\r\n\r\n                $(\"body\").append(menu + colormenu + submenu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(170);\r\n                _this.focus($menuButton, \"border-all\");\r\n\r\n                $(\"#\" + submenuid + \" canvas\").each(function(i){\r\n                    let type = $(this).attr(\"type\");\r\n                    let itemvalue = $(this).closest(\".luckysheet-cols-menuitem\").attr(\"itemvalue\");\r\n                    let canvasborder = $(this).addClass(\"luckysheet-mousedown-cancel\").get(0).getContext(\"2d\");\r\n                    canvasborder.translate(0.5, 0.5);\r\n\r\n                    _this.setLineDash(canvasborder, itemvalue, \"h\", 0, 5, 100, 5);\r\n                    \r\n                    canvasborder.strokeStyle = \"#000000\";\r\n                    canvasborder.stroke();\r\n                    canvasborder.closePath();\r\n                });\r\n\r\n                $(\"#\" + submenuid + \" .luckysheet-cols-menuitem\").click(function(){\r\n                    $(\"#\"+ submenuid).hide();\r\n\r\n                    let $t = $(this), \r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    \r\n                    if(itemvalue == 0){\r\n                        $(\"#luckysheetborderSizepreview\").attr(\"src\", \"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==\").attr(\"itemvalue\", null);\r\n                    }\r\n                    else{\r\n                        let bg = $t.find(\"canvas\").get(0).toDataURL(\"image/png\");\r\n                        $(\"#luckysheetborderSizepreview\").attr(\"src\", bg).attr(\"itemvalue\", itemvalue);\r\n                    }\r\n                    \r\n                    _this.focus($(\"#\" + submenuid), itemvalue);\r\n                });\r\n                \r\n                // border choose menu\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    if(itemvalue == \"borderColor\" || itemvalue == \"borderSize\"){\r\n                        return;\r\n                    }\r\n\r\n                    if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                        return;\r\n                    }\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                    let color = $(\"#\"+ subcolormenuid).find(\".luckysheet-color-selected\").val();\r\n                    let style = $(\"#luckysheetborderSizepreview\").attr(\"itemvalue\");\r\n\r\n                    if(color == null || color == \"\"){\r\n                        color = \"#000\";\r\n                    }\r\n\r\n                    if(style == null || style == \"\"){\r\n                        style = \"1\";\r\n                    }\r\n\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    if(cfg[\"borderInfo\"] == null){\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    let borderInfo = {\r\n                        \"rangeType\": \"range\",\r\n                        \"borderType\": itemvalue,\r\n                        \"color\": color,\r\n                        \"style\": style,\r\n                        \"range\": $.extend(true, [], Store.luckysheet_select_save)\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"].push(borderInfo);\r\n\r\n                    if (Store.clearjfundo) {\r\n                        Store.jfundo.length  = 0;\r\n\r\n                        let redo = [];\r\n\r\n                        redo[\"type\"] = \"borderChange\";\r\n\r\n                        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n                        \r\n                        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                        Store.jfredo.push(redo);\r\n                    }\r\n\r\n                    server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n\r\n                    Store.config = cfg;\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n                    setTimeout(function () {\r\n                        luckysheetrefreshgrid();\r\n                    }, 1);\r\n\r\n                    $(\"#luckysheet-icon-border-all\").attr(\"type\", itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-border-all\").find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-\" + itemvalue + iconfontObject[itemvalue]);\r\n\r\n                    _this.focus($menuButton, itemvalue);\r\n                });\r\n\r\n                $(\"#\" + subcolormenuid).find(\".luckysheet-color-selected\").spectrum({\r\n                    showPalette: true,\r\n                    showPaletteOnly: true,\r\n                    preferredFormat: \"hex\",\r\n                    clickoutFiresChange: false,\r\n                    showInitial: true,\r\n                    showInput: true,\r\n                    flat: true,\r\n                    hideAfterPaletteSelect: true,\r\n                    showSelectionPalette: true,\r\n                    maxPaletteSize: 8,\r\n                    maxSelectionSize: 8,\r\n                    color: \"#000\",\r\n                    cancelText: locale_button.cancel,\r\n                    chooseText: locale_button.confirm,\r\n                    togglePaletteMoreText: locale_toolbar.customColor,\r\n                    togglePaletteLessText: locale_toolbar.collapse,\r\n                    togglePaletteOnly: true,\r\n                    clearText: locale_toolbar.clearText,\r\n                    noColorSelectedText:locale_toolbar.noColorSelectedText,\r\n                    localStorageKey: \"spectrum.bordercolor\" + server.gridKey,\r\n                    palette: [\r\n                        [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                        [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                        [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                        [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                        [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                        [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                        [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                        [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n                    ],\r\n                    change: function (color) {\r\n                        let $input = $(this);\r\n                        if (color != null) {\r\n                            color = color.toHexString();\r\n                        }\r\n                        else {\r\n                            color = \"#000\";\r\n                        }\r\n\r\n                        let oldcolor = null;\r\n                        $(\"#luckysheet-icon-borderColor-linecolor\").css(\"border-bottom-color\", color);\r\n                        $(\"#\"+ subcolormenuid).find(\".luckysheet-color-selected\").val(color);\r\n                    }\r\n                });\r\n\r\n                $(\"#\"+ subcolormenuid).find(\".luckysheet-color-reset\").click(function(){\r\n                    let $input = $(\"#\"+ subcolormenuid).find(\".luckysheet-color-selected\");\r\n                    $input.val(\"#000\");\r\n                    $(\"#luckysheet-icon-cell-color\").attr(\"color\", null);\r\n                    $input.spectrum(\"set\", \"#000\");\r\n                    $(\"#luckysheet-icon-borderColor-linecolor\").css(\"border-bottom-color\", \"#000\");\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft-28, $(this).offset().top+25, \"lefttop\");\r\n        });\r\n\r\n        //\u5408\u5E76\u5355\u5143\u683C\r\n        $(\"#luckysheet-icon-merge-button\").click(function(){\r\n\r\n            if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            if(selectIsOverlap()){\r\n                if(isEditMode()){\r\n                    alert(\"\u4E0D\u80FD\u5408\u5E76\u91CD\u53E0\u533A\u57DF\");\r\n                }\r\n                else{\r\n                    tooltip.info(\"\u4E0D\u80FD\u5408\u5E76\u91CD\u53E0\u533A\u57DF\", \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            if(Store.config[\"merge\"] != null){\r\n                let has_PartMC = false;\r\n\r\n                for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                    let r1 = Store.luckysheet_select_save[s].row[0], \r\n                        r2 = Store.luckysheet_select_save[s].row[1];\r\n                    let c1 = Store.luckysheet_select_save[s].column[0], \r\n                        c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                    has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                    if(has_PartMC){\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(has_PartMC){\r\n                    if(isEditMode()){\r\n                        alert(\"\u65E0\u6CD5\u5BF9\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\");\r\n                    }\r\n                    else{\r\n                        tooltip.info(\"\u65E0\u6CD5\u5BF9\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\u6267\u884C\u6B64\u64CD\u4F5C\", \"\"); \r\n                    }\r\n                    return;    \r\n                }\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat_mc(d, \"mergeAll\");\r\n        });\r\n\r\n        $(\"#luckysheet-icon-merge-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_merge =  _locale.merge;\r\n\r\n                let itemdata = [\r\n                    {\"text\": locale_merge.mergeAll, \"value\": \"mergeAll\", \"example\": \"\"},\r\n                    {\"text\": locale_merge.mergeV, \"value\": \"mergeV\", \"example\": \"\"},\r\n                    {\"text\": locale_merge.mergeH, \"value\": \"mergeH\", \"example\": \"\"},\r\n                    {\"text\": locale_merge.mergeCancel, \"value\": \"mergeCancel\", \"example\": \"\"}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"merge-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\"+menuButtonId).width(110);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    if(selectIsOverlap()){\r\n                        if(isEditMode()){\r\n                            alert(locale_merge.overlappingError);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_merge.overlappingError, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    if(Store.config[\"merge\"] != null){\r\n                        let has_PartMC = false;\r\n\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if(has_PartMC){\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(has_PartMC){\r\n                            if(isEditMode()){\r\n                                alert(locale_merge.partiallyError);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_merge.partiallyError, \"\"); \r\n                            }\r\n                            return;    \r\n                        }\r\n                    }\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat_mc(d, itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u6C34\u5E73\u5BF9\u9F50\r\n        $(\"#luckysheet-icon-align\").click(function(){\r\n        \tlet itemvalue = $(\"#luckysheet-icon-align\").attr(\"type\");\r\n        \tif(itemvalue == null){\r\n        \t\titemvalue = \"left\";\r\n        \t}\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat(d, \"ht\", itemvalue);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-align-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_align = _locale.align;\r\n                let itemdata = [\r\n                    {\"text\": locale_align.left, \"value\": \"left\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont luckysheet-iconfont-wenbenzuoduiqi\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_align.center, \"value\": \"center\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-center iconfont luckysheet-iconfont-wenbenjuzhongduiqi\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_align.right, \"value\": \"right\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-right iconfont luckysheet-iconfont-wenbenyouduiqi\" style=\"user-select: none;\"> </div> </div>'}\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.align;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"align-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-align\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-\" + itemvalue + iconfontObject[itemvalue]);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"ht\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u5782\u76F4\u5BF9\u9F50\r\n        $(\"#luckysheet-icon-valign\").click(function(){\r\n        \tlet itemvalue = $(\"#luckysheet-icon-valign\").attr(\"type\");\r\n        \tif(itemvalue == null){\r\n        \t\titemvalue = \"bottom\";\r\n        \t}\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat(d, \"vt\", itemvalue);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-valign-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_align = _locale.align;\r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    {\"text\": locale_align.top, \"value\": \"top\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-top iconfont luckysheet-iconfont-dingbuduiqi\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_align.middle, \"value\": \"middle\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-middle iconfont luckysheet-iconfont-shuipingduiqi\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_align.bottom, \"value\": \"bottom\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont luckysheet-iconfont-dibuduiqi\" style=\"user-select: none;\"> </div> </div>'}\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.align;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"valign-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton, \"bottom\");\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-valign\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-\" + itemvalue + iconfontObject[itemvalue]);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"vt\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u6587\u672C\u6362\u884C\r\n        $(\"#luckysheet-icon-textwrap-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_textWrap = _locale.textWrap;\r\n                let itemdata = [\r\n                    {\"text\": locale_textWrap.overflow, \"value\": \"overflow\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-overflow iconfont luckysheet-iconfont-yichu1\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_textWrap.wrap, \"value\": \"wrap\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-wrap iconfont luckysheet-iconfont-zidonghuanhang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_textWrap.clip, \"value\": \"clip\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont luckysheet-iconfont-jieduan\" style=\"user-select: none;\"> </div> </div>'}\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.textWrap;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"textwrap-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton, \"clip\");\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-textwrap\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-\" + itemvalue + iconfontObject[itemvalue]);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"tb\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u6587\u672C\u65CB\u8F6C\r\n        $(\"#luckysheet-icon-rotation-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_rotation = _locale.rotation;\r\n                let itemdata = [\r\n                    {\"text\": locale_rotation.none, \"value\": \"none\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wuxuanzhuang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_rotation.angleup, \"value\": \"angleup\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angleup iconfont luckysheet-iconfont-xiangshangqingxie\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_rotation.angledown, \"value\": \"angledown\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angledown iconfont luckysheet-iconfont-xiangxiaqingxie\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_rotation.vertical, \"value\": \"vertical\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-vertical iconfont luckysheet-iconfont-shupaiwenzi\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_rotation.rotationUp, \"value\": \"rotation-up\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-up iconfont luckysheet-iconfont-wenbenxiangshang\" style=\"user-select: none;\"> </div> </div>'},\r\n                    {\"text\": locale_rotation.rotationDown, \"value\": \"rotation-down\", \"example\": '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-down iconfont luckysheet-iconfont-xiangxia90\" style=\"user-select: none;\"> </div> </div>'},\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.rotation;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"rotation-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n\r\n                // \u6587\u5B57\u65CB\u8F6C\u603B Stack Vertically \u592A\u957F\u4E86\uFF0C\u62C9\u5BBD\u5230160\r\n                $menuButton = $(\"#\" + menuButtonId).width(160);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-rotation\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-\" + itemvalue + iconfontObject[itemvalue]);\r\n                    \r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"tr\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u51BB\u7ED3\u884C\u5217\r\n        $(\"#luckysheet-icon-freezen-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_freezen = _locale.freezen;\r\n                let itemdata = [\r\n                    {\"text\": locale_freezen.freezenRow, \"value\": \"freezenRow\", \"example\": ''},\r\n                    {\"text\": locale_freezen.freezenColumn, \"value\": \"freezenColumn\", \"example\": ''},\r\n                    {\"text\": locale_freezen.freezenRC, \"value\": \"freezenRC\", \"example\": ''},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_freezen.freezenRowRange, \"value\": \"freezenRowRange\", \"example\": ''},\r\n                    {\"text\": locale_freezen.freezenColumnRange, \"value\": \"freezenColumnRange\", \"example\": ''},\r\n                    {\"text\": locale_freezen.freezenRCRange, \"value\": \"freezenRCRange\", \"example\": ''},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_freezen.freezenCancel, \"value\": \"freezenCancel\", \"example\": ''}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"freezen-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(170);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    // store frozen\r\n                    luckysheetFreezen.saveFrozen(itemvalue);\r\n\r\n                    if(itemvalue == \"freezenRow\"){ //\u9996\u884C\u51BB\u7ED3\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n                        if(row_st == -1){\r\n                            row_st = 0;\r\n                        }\r\n                        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                        let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n                        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        if (luckysheetFreezen.freezenverticaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenVertical();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenColumn\"){ //\u9996\u5217\u51BB\u7ED3\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n                        if(col_st == -1){\r\n                            col_st = 0;\r\n                        }\r\n                        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                        let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenHorizontal();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenRC\"){ //\u9996\u884C\u5217\u51BB\u7ED3\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n                        if(row_st == -1){\r\n                            row_st = 0;\r\n                        }\r\n                        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                        let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n                        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n                        if(col_st == -1){\r\n                            col_st = 0;\r\n                        }\r\n                        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                        let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenRowRange\"){ //\u9009\u533A\u884C\u51BB\u7ED3\r\n                        if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(locale_freezen.noSeletionError);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_freezen.noSeletionError, \"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                        \r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_focus = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n\r\n                        if(row_focus > row_st){\r\n                            row_st = row_focus;\r\n                        }\r\n                        \r\n                        if(row_st == -1){\r\n                            row_st = 0;\r\n                        }\r\n\r\n                        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                        let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n                        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        if (luckysheetFreezen.freezenverticaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenVertical();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenColumnRange\"){ //\u9009\u533A\u5217\u51BB\u7ED3\r\n                        if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(locale_freezen.noSeletionError);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_freezen.noSeletionError,\"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                        \r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let column_focus = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n\r\n                        if(column_focus > col_st){\r\n                            col_st = column_focus;\r\n                        }\r\n\r\n                        if(col_st == -1){\r\n                            col_st = 0;\r\n                        }\r\n\r\n                        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                        let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenHorizontal();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenRCRange\"){ //\u9009\u533A\u884C\u5217\u51BB\u7ED3\r\n                        if(Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(locale_freezen.noSeletionError);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_freezen.noSeletionError,\"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                        \r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_focus = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n\r\n                        if(row_focus > row_st){\r\n                            row_st = row_focus;\r\n                        }\r\n                        \r\n                        if(row_st == -1){\r\n                            row_st = 0;\r\n                        }\r\n\r\n                        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                        let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n                        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n                        let column_focus = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n\r\n                        if(column_focus > col_st){\r\n                            col_st = column_focus;\r\n                        }\r\n\r\n                        if(col_st == -1){\r\n                            col_st = 0;\r\n                        }\r\n                        \r\n                        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                        let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        \r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    }\r\n                    else if(itemvalue == \"freezenCancel\"){ //Cancel freezen\r\n                        if (luckysheetFreezen.freezenverticaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenVertical();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenHorizontal();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.scrollAdapt();\r\n                    }\r\n\r\n                    setTimeout(function(){\r\n                        luckysheetsizeauto();\r\n                    },0);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 68, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u8FC7\u6EE4\u548C\u6392\u5E8F\r\n        $(\"#luckysheet-icon-autofilter\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            if($menuButton.length == 0){\r\n                const _locale = locale();\r\n                const locale_sort = _locale.sort;\r\n                const locale_filter = _locale.filter;\r\n                let itemdata = [\r\n                    {\"text\": locale_sort.asc, \"value\": \"asc\", \"example\": '<i class=\"iconfont luckysheet-iconfont-shengxu\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_sort.desc, \"value\": \"desc\", \"example\": '<i class=\"iconfont luckysheet-iconfont-jiangxu\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_sort.custom+\"...\", \"value\": \"diysort\", \"example\": '<i class=\"iconfont luckysheet-iconfont-zidingyipaixu\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_filter.filter, \"value\": \"filter\", \"example\": '<i class=\"iconfont luckysheet-iconfont-shaixuan2\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_filter.clearFilter, \"value\": \"clearfilter\", \"example\": '<i class=\"iconfont luckysheet-iconfont-qingchushaixuan\" aria-hidden=\"true\"></i>'}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, {\"id\":\"autofilter\", \"item\": itemset, \"subclass\":\"\", \"sub\":\"\"});\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(150);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"diysort\"){\r\n                        $(\"#luckysheetorderby\").click();\r\n                    }\r\n                    else if(itemvalue == \"asc\"){\r\n                        sortSelection(true);\r\n                    }\r\n                    else if(itemvalue == \"desc\"){\r\n                        sortSelection(false);\r\n                    }\r\n                    else if(itemvalue == \"filter\"){\r\n                        if($('#luckysheet-filter-options-sheet' + Store.currentSheetIndex).length > 0){\r\n                            $(\"#luckysheet-filter-initial\").click();\r\n                        }\r\n                        else{\r\n                            createFilter();\r\n                        }\r\n                    }\r\n                    else if(itemvalue == \"clearfilter\"){\r\n                        $(\"#luckysheet-filter-initial\").click();\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u67E5\u627E\u548C\u66FF\u6362\r\n        $(\"#luckysheet-icon-seachmore\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_findAndReplace = _locale.findAndReplace;\r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    {\"text\": locale_findAndReplace.find+\" ...\", \"value\": \"search\", \"example\": '<i class=\"iconfont luckysheet-iconfont-sousuo\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_findAndReplace.replace+\" ...\", \"value\": \"replace\", \"example\": '<i class=\"iconfont luckysheet-iconfont-tihuan\" aria-hidden=\"true\"></i>'},\r\n                    // {\"text\": locale_findAndReplace.goto+\" ...\", \"value\": \"goto\", \"example\": '<i class=\"iconfont luckysheet-iconfont-zhuandao1\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_findAndReplace.location+\" ...\", \"value\": \"location\", \"example\": '<i class=\"iconfont luckysheet-iconfont-dingwei\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_findAndReplace.formula, \"value\": \"locationFormula\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.date, \"value\": \"locationConstantDate\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.number, \"value\": \"locationConstantNumber\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.string, \"value\": \"locationConstantString\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.error, \"value\": \"locationConstantError\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.condition, \"value\": \"locationCF\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.rowSpan, \"value\": \"locationStepRow\", \"example\": locale_findAndReplace.locationExample},\r\n                    {\"text\": locale_findAndReplace.columnSpan, \"value\": \"locationStepColumn\", \"example\": locale_findAndReplace.locationExample}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"seachmore\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"search\" || itemvalue == \"replace\"){ //\u67E5\u627E\u66FF\u6362\r\n                        if(itemvalue == \"search\"){\r\n                            luckysheetSearchReplace.createDialog(0);\r\n                        }\r\n                        else if(itemvalue == \"replace\"){\r\n                            luckysheetSearchReplace.createDialog(1);    \r\n                        }\r\n                        \r\n                        luckysheetSearchReplace.init();\r\n\r\n                        $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                    }\r\n                    else if(itemvalue == \"location\"){ //\u5B9A\u4F4D\u6761\u4EF6\r\n                        luckysheetLocationCell.createDialog();\r\n                        luckysheetLocationCell.init();\r\n                    }\r\n                    else if(itemvalue == \"locationFormula\" || itemvalue == \"locationConstantDate\" || itemvalue == \"locationConstantNumber\" || itemvalue == \"locationConstantString\" || itemvalue == \"locationConstantError\" || itemvalue == \"locationCF\"){ \r\n                        let last = Store.luckysheet_select_save[0];\r\n                        \r\n                        let range;\r\n                        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && last.row[0] == last.row[1] && last.column[0] == last.column[1])){\r\n                            //\u5355\u4E2A\u5355\u5143\u683C\r\n                            range = [{\"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1]}];\r\n                        }\r\n                        else{\r\n                            range = $.extend(true, [], Store.luckysheet_select_save);\r\n                        }\r\n\r\n                        if(itemvalue == \"locationFormula\"){               //\u516C\u5F0F\r\n                            luckysheetLocationCell.apply(range, \"locationFormula\", \"all\");\r\n                        }\r\n                        else if(itemvalue == \"locationConstantDate\"){     //\u65E5\u671F\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"d\");\r\n                        }\r\n                        else if(itemvalue == \"locationConstantNumber\"){   //\u6570\u5B57\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"n\");\r\n                        }\r\n                        else if(itemvalue == \"locationConstantString\"){   //\u5B57\u7B26\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"s,g\");\r\n                        }\r\n                        else if(itemvalue == \"locationConstantError\"){    //\u9519\u8BEF\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"e\");\r\n                        }\r\n                        else if(itemvalue == \"locationCF\"){               //\u6761\u4EF6\u683C\u5F0F\r\n                            luckysheetLocationCell.apply(range, \"locationCF\");\r\n                        }\r\n                    }\r\n                    else if(itemvalue == \"locationStepRow\"){ //\u95F4\u9694\u884C\r\n                        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1])){\r\n                            if(isEditMode()){\r\n                                alert(locale_findAndReplace.lessTwoRowTip);\r\n                            }\r\n                            else{\r\n                                tooltip.info(\"\", locale_findAndReplace.lessTwoRowTip); \r\n                            }\r\n                            return;                            \r\n                        }\r\n\r\n                        let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                        luckysheetLocationCell.apply(range, \"locationStepRow\");\r\n                    }\r\n                    else if(itemvalue == \"locationStepColumn\"){ //\u95F4\u9694\u5217\r\n                        if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                            if(isEditMode()){\r\n                                alert(locale_findAndReplace.lessTwoColumnTip);\r\n                            }\r\n                            else{\r\n                                tooltip.info(\"\", locale_findAndReplace.lessTwoColumnTip); \r\n                            }\r\n                            return;                            \r\n                        }\r\n\r\n                        let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                        luckysheetLocationCell.apply(range, \"locationStepColumn\");\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u516C\u5F0F\r\n        $(\"#luckysheet-icon-function\").click(function(){\r\n            _this.autoSelectionFormula(\"SUM\");\r\n        });\r\n\r\n        //\u516C\u5F0F\u83DC\u5355\r\n        $(\"#luckysheet-icon-function-menu\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            const _locale = locale();\r\n            const locale_formula = _locale.formula;\r\n            \r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    {\"text\": locale_formula.sum, \"value\": \"SUM\", \"example\": 'SUM'},\r\n                    {\"text\": locale_formula.average, \"value\": \"AVERAGE\", \"example\": 'AVERAGE'},\r\n                    {\"text\": locale_formula.count, \"value\": \"COUNT\", \"example\": 'COUNT'},\r\n                    {\"text\": locale_formula.max, \"value\": \"MAX\", \"example\": 'MAX'},\r\n                    {\"text\": locale_formula.min, \"value\": \"MIN\", \"example\": 'MIN'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_formula.ifGenerate, \"value\": \"if\", \"example\": 'IF'},\r\n                    {\"text\": locale_formula.find+\" ...\", \"value\": \"formula\", \"example\": \"\"}\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"function-menu\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"if\"){\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let r = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n                        let c = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n\r\n                        if(!!Store.flowdata[r] && !!Store.flowdata[r][c] && !!Store.flowdata[r][c][\"f\"]){\r\n                            let fp = Store.flowdata[r][c][\"f\"].toString();\r\n\r\n                            if(fp.indexOf(\"=if(\") != -1){\r\n                                ifFormulaGenerator.ifFormulaDialog(fp);\r\n                            }\r\n                            else{\r\n                                if(isEditMode()){\r\n                                    alert(locale_formula.tipNotBelongToIf);\r\n                                }\r\n                                else{\r\n                                    tooltip.info(locale_formula.tipNotBelongToIf,\"\");\r\n                                }\r\n                                return;\r\n                            }\r\n                        }\r\n                        else{\r\n                            ifFormulaGenerator.ifFormulaDialog();\r\n                        }\r\n\r\n                        ifFormulaGenerator.init();\r\n                    }\r\n                    else if(itemvalue == \"formula\"){\r\n                        //\u70B9\u51FB\u51FD\u6570\u67E5\u627E\u5F39\u51FA\u6846\r\n                        if(Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(locale_formula.tipSelectCell);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_formula.tipSelectCell,\"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                        let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n                        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n                        \r\n                        let cell = Store.flowdata[row_index][col_index];\r\n                        if(cell != null && cell.f != null){\r\n                            //\u5355\u5143\u683C\u6709\u8BA1\u7B97\r\n                            let functionStr = luckysheetformula.getfunctionParam(cell.f);\r\n                            if(functionStr.fn != null){\r\n                                //\u6709\u51FD\u6570\u516C\u5F0F\r\n                                insertFormula.formulaParmDialog(functionStr.fn, functionStr.param);\r\n                            }\r\n                            else{\r\n                                //\u65E0\u51FD\u6570\u516C\u5F0F\r\n                                insertFormula.formulaListDialog();\r\n                            }\r\n                        }\r\n                        else{\r\n                            //\u5355\u5143\u683C\u65E0\u8BA1\u7B97\r\n                            $(\"#luckysheet-rich-text-editor\").html('<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>');\r\n                            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n                            insertFormula.formulaListDialog();\r\n                        }\r\n\r\n                        insertFormula.init();\r\n                    }\r\n                    else {\r\n                        _this.autoSelectionFormula(itemvalue);\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft-48, $(this).offset().top+25, \"lefttop\");\r\n        });\r\n\r\n        //\u52A0\u7C97\r\n        $(\"#luckysheet-icon-bold\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(e){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            \r\n            let flag = checkTheStatusOfTheSelectedCells(\"bl\",1);\r\n            let foucsStatus = flag ? 0 : 1;\r\n\r\n            _this.updateFormat(d, \"bl\", foucsStatus);\r\n        });\r\n\r\n        //\u659C\u4F53\r\n        $(\"#luckysheet-icon-italic\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let flag = checkTheStatusOfTheSelectedCells(\"it\",1);\r\n            let foucsStatus = flag ? 0 : 1;\r\n\r\n            _this.updateFormat(d, \"it\", foucsStatus);\r\n        });\r\n\r\n        //\u5220\u9664\u7EBF\r\n        $(\"#luckysheet-icon-strikethrough\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let flag = checkTheStatusOfTheSelectedCells(\"cl\",1);\r\n            let foucsStatus = flag ? 0 : 1;\r\n\r\n            _this.updateFormat(d, \"cl\", foucsStatus);\r\n        });\r\n\r\n        //\u4E0B\u5212\u7EBF\r\n        $(\"#luckysheet-icon-underline\").mousedown(function(e){\r\n            hideMenuByCancel(e);\r\n            e.stopPropagation();\r\n        }).click(function(){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let flag = checkTheStatusOfTheSelectedCells(\"un\",1);\r\n            let foucsStatus = flag ? 0 : 1;\r\n\r\n            _this.updateFormat(d, \"un\", foucsStatus);\r\n        });\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F\r\n        $(\"#luckysheet-icon-conditionformat\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            const conditionformat_text = locale().conditionformat;\r\n            \r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    { \"text\": conditionformat_text.highlightCellRules, \"value\": \"highlightCellRule\", \"example\": \"more\" },\r\n                    { \"text\": conditionformat_text.itemSelectionRules, \"value\": \"projectSelectRule\", \"example\": \"more\" },\r\n                    { \"text\": conditionformat_text.dataBar, \"value\": \"dataBar\", \"example\": \"more\" },\r\n                    { \"text\": conditionformat_text.colorGradation, \"value\": \"colorGradation\", \"example\": \"more\" },\r\n                    { \"text\": conditionformat_text.icons, \"value\": \"icons\", \"example\": \"\" },\r\n                    { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n                    { \"text\": conditionformat_text.newRule, \"value\": \"newRule\", \"example\": \"\" },\r\n                    { \"text\": conditionformat_text.deleteRule, \"value\": \"deleteRule\", \"example\": \"more\" },\r\n                    { \"text\": conditionformat_text.manageRules, \"value\": \"administerRule\", \"example\": \"\" }\r\n                ];\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n                let menu = replaceHtml(_this.menu, {\"id\": \"conditionformat\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\"});\r\n                \r\n                //\u7A81\u51FA\u663E\u793A\u5355\u5143\u683C\u89C4\u5219\u5B50\u83DC\u5355\r\n                let subitemdata = [\r\n                    { \"text\": conditionformat_text.greaterThan, \"value\": \"greaterThan\", \"example\": \">\" },\r\n                    { \"text\": conditionformat_text.lessThan, \"value\": \"lessThan\", \"example\": \"<\" },\r\n                    { \"text\": conditionformat_text.between, \"value\": \"betweenness\", \"example\": \"[]\" },\r\n                    { \"text\": conditionformat_text.equal, \"value\": \"equal\", \"example\": \"=\" },\r\n                    { \"text\": conditionformat_text.textContains, \"value\": \"textContains\", \"example\": \"()\" },\r\n                    { \"text\": conditionformat_text.occurrence, \"value\": \"occurrenceDate\", \"example\": conditionformat_text.yesterday },\r\n                    { \"text\": conditionformat_text.duplicateValue, \"value\": \"duplicateValue\", \"example\": \"##\" }\r\n                ];\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, {\"id\": \"highlightCellRule\", \"item\": subitemset, \"subclass\": \"luckysheet-menuButton-sub\"});\r\n                \r\n                //\u9879\u76EE\u9009\u53D6\u89C4\u5219\u5B50\u83DC\u5355\r\n                let subitemdata2 = [\r\n                    { \"text\": conditionformat_text.top10, \"value\": \"top10\", \"example\": conditionformat_text.top10 },\r\n                    { \"text\": conditionformat_text.top10_percent, \"value\": \"top10%\", \"example\": conditionformat_text.top10_percent },\r\n                    { \"text\": conditionformat_text.last10, \"value\": \"last10\", \"example\": conditionformat_text.last10 },\r\n                    { \"text\": conditionformat_text.last10_percent, \"value\": \"last10%\", \"example\": conditionformat_text.last10_percent },\r\n                    { \"text\": conditionformat_text.aboveAverage, \"value\": \"AboveAverage\", \"example\": conditionformat_text.above },\r\n                    { \"text\": conditionformat_text.belowAverage, \"value\": \"SubAverage\", \"example\": conditionformat_text.below }\r\n                ];\r\n                let subitemset2 = _this.createButtonMenu(subitemdata2);\r\n                let submenu2 = replaceHtml(_this.menu, {\"id\": \"projectSelectRule\", \"item\": subitemset2, \"subclass\": \"luckysheet-menuButton-sub\"});\r\n                \r\n                //\u6570\u636E\u6761\u5B50\u83DC\u5355\r\n                let submenu3 = `<div id=\"luckysheet-icon-dataBar-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel\" style=\"width: 126px;padding: 5px;top: 118.5px;left: 1321.48px;display: none;\">\r\n                                    <div itemvalue=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 0;\" title=\"${conditionformat_text.gradientDataBar_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"1\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px 0;\" title=\"${conditionformat_text.gradientDataBar_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"2\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px 0;\" title=\"${conditionformat_text.gradientDataBar_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"3\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -36px;\" title=\"${conditionformat_text.gradientDataBar_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"4\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -36px;\" title=\"${conditionformat_text.gradientDataBar_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"5\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -36px;\" title=\"${conditionformat_text.gradientDataBar_6}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"6\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -72px;\" title=\"${conditionformat_text.solidColorDataBar_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"7\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -72px;\" title=\"${conditionformat_text.solidColorDataBar_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"8\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -72px;\" title=\"${conditionformat_text.solidColorDataBar_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"9\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -108px;\" title=\"${conditionformat_text.solidColorDataBar_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"10\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -108px;\" title=\"${conditionformat_text.solidColorDataBar_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"11\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -108px;\" title=\"${conditionformat_text.solidColorDataBar_6}\"></div>\r\n                                    </div>\r\n                                </div>`;\r\n\r\n                //\u8272\u9636\r\n                let submenu4 = `<div id=\"luckysheet-icon-colorGradation-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel\" style=\"width: 126px;padding: 5px;top: 143.5px;left: 1321.48px;display: none;\">\r\n                                    <div itemvalue=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 0;\" title=\"${conditionformat_text.colorGradation_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"1\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px 0;\" title=\"${conditionformat_text.colorGradation_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"2\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px 0;\" title=\"${conditionformat_text.colorGradation_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"3\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px 0;\" title=\"${conditionformat_text.colorGradation_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"4\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -36px;\" title=\"${conditionformat_text.colorGradation_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"5\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -36px;\" title=\"${conditionformat_text.colorGradation_6}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"6\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -36px;\" title=\"${conditionformat_text.colorGradation_7}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"7\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px -36px;\" title=\"${conditionformat_text.colorGradation_8}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"8\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -72px;\" title=\"${conditionformat_text.colorGradation_9}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"9\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -72px;\" title=\"${conditionformat_text.colorGradation_10}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"10\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -72px;\" title=\"${conditionformat_text.colorGradation_11}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"11\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px -72px;\" title=\"${conditionformat_text.colorGradation_12}\"></div>\r\n                                    </div>\r\n                                </div>`;\r\n\r\n                //\u6E05\u9664\u89C4\u5219\u5B50\u83DC\u5355\r\n                let subitemdata6 = [\r\n                    { \"text\": conditionformat_text.deleteSheetRule, \"value\": \"delSheet\", \"example\": \"\" }\r\n                ];\r\n                let subitemset6 = _this.createButtonMenu(subitemdata6);\r\n                let submenu6 = replaceHtml(_this.menu, {\"id\": \"deleteRule\", \"item\": subitemset6, \"subclass\":\"luckysheet-menuButton-sub\"});\r\n\r\n                $(\"body\").append(menu + submenu + submenu2 + submenu3 + submenu4 + submenu6);\r\n                $menuButton = $(\"#\" + menuButtonId).width(190);\r\n                $(\"#luckysheet-icon-highlightCellRule-menuButton\").width(160);\r\n                $(\"#luckysheet-icon-projectSelectRule-menuButton\").width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"icons\"){\r\n                        if(Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(conditionformat_text.pleaseSelectRange);\r\n                            }\r\n                            else{\r\n                                tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        conditionformat.CFiconsDialog();\r\n                        conditionformat.init();\r\n                    }\r\n                    else if(itemvalue == \"newRule\"){\r\n                        if(Store.luckysheet_select_save.length == 0){\r\n                            if(isEditMode()){\r\n                                alert(conditionformat_text.pleaseSelectRange);\r\n                            }\r\n                            else{\r\n                                tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        conditionformat.newConditionRuleDialog(0);\r\n                        conditionformat.init();\r\n                    }\r\n                    else if(itemvalue == \"administerRule\"){\r\n                        let loadSheetUrl = server.loadSheetUrl;\r\n                        let file = getluckysheetfile();\r\n\r\n                        if(loadSheetUrl != \"\" && loadSheetUrl != null){\r\n                            let sheetindex = [];\r\n                            for(let i = 0; i < file.length; i++){\r\n                                sheetindex.push(file[i].index);\r\n                            }\r\n\r\n                            $.post(loadSheetUrl, {\"gridKey\" : server.gridKey, \"index\": sheetindex.join(\",\")}, function (d) {\r\n                                let dataset = new Function(\"return \" + d)();\r\n\r\n                                setTimeout(function(){\r\n                                    Store.loadingObj.close()\r\n                                }, 500);\r\n\r\n                                for(let item in dataset){\r\n                                    if(item == Store.currentSheetIndex){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    let otherfile = file[getSheetIndex(item)];\r\n\r\n                                    otherfile.celldata = dataset[item.toString()];\r\n                                    otherfile[\"data\"] = sheetmanage.buildGridData(otherfile);\r\n                                }\r\n\r\n                                setluckysheetfile(file);\r\n\r\n                                conditionformat.fileClone =  $.extend(true, [], file);\r\n                                conditionformat.administerRuleDialog();\r\n                                conditionformat.init();\r\n                            });\r\n                        }\r\n                        else{\r\n                            conditionformat.fileClone =  $.extend(true, [], file);\r\n                            conditionformat.administerRuleDialog();\r\n                            conditionformat.init();\r\n                        }\r\n                    }\r\n                });\r\n\r\n                //\u7A81\u51FA\u663E\u793A\u5355\u5143\u683C\u89C4\u5219\u5B50\u83DC\u5355\u70B9\u51FB\u4E8B\u4EF6\r\n                $(document).off(\"click.CFhighlightCellRule\").on(\"click.CFhighlightCellRule\", \"#luckysheet-icon-highlightCellRule-menuButton .luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-highlightCellRule-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        if(isEditMode()){\r\n                            alert(conditionformat_text.pleaseSelectRange);\r\n                        }\r\n                        else{\r\n                            tooltip.info(conditionformat_text.pleaseSelectRange, \"\"); \r\n                        }\r\n                        return;\r\n                    }\r\n                    else{\r\n                        let textCellColorHtml = conditionformat.textCellColorHtml();\r\n\r\n                        let title, content;\r\n                        switch(itemvalue){\r\n                            case \"greaterThan\":\r\n                                title = conditionformat_text.conditionformat_greaterThan;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"greaterThan\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_greaterThan_title}\uFF1A</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div> \r\n                                                ${textCellColorHtml} \r\n                                            </div>`;\r\n                                break;\r\n                            case \"lessThan\":\r\n                                title = conditionformat_text.conditionformat_lessThan;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"lessThan\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_lessThan_title}\uFF1A</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"betweenness\":\r\n                                title = conditionformat_text.conditionformat_betweenness;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"betweenness\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_betweenness_title}\uFF1A</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div class=\"inpbox2 range\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                        <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.to}</div>\r\n                                                    <div class=\"inpbox2 range\">\r\n                                                        <input id=\"conditionVal2\" class=\"formulaInputFocus\"/>\r\n                                                        <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                    </div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"equal\":\r\n                                title = conditionformat_text.conditionformat_equal;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"equal\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_equal_title}\uFF1A</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"textContains\":\r\n                                title = conditionformat_text.conditionformat_textContains;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"textContains\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_textContains_title}\uFF1A</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break; \r\n                            case \"occurrenceDate\":\r\n                                title = conditionformat_text.conditionformat_occurrenceDate;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"occurrenceDate\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_occurrenceDate_title}\uFF1A</div>\r\n                                                <div class=\"inpbox\">\r\n                                                    <input id=\"daterange-btn\" class=\"formulaInputFocus\" readonly=\"readonly\" placeholder=\"${conditionformat_text.pleaseSelectADate}\"/>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break; \r\n                            case \"duplicateValue\":\r\n                                title = conditionformat_text.conditionformat_duplicateValue;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"duplicateValue\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_duplicateValue_title}\uFF1A</div>\r\n                                                <select id=\"conditionVal\" class=\"selectbox\">\r\n                                                    <option value=\"0\">${conditionformat_text.duplicateValue}</option>\r\n                                                    <option value=\"1\">${conditionformat_text.uniqueValue}</option>\r\n                                                </select>\r\n                                                <div style=\"margin:5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;      \r\n                        }\r\n\r\n                        conditionformat.conditionformatDialog(title, content); \r\n                    }\r\n                });\r\n\r\n                //\u9879\u76EE\u9009\u53D6\u89C4\u5219\u5B50\u83DC\u5355\u70B9\u51FB\u4E8B\u4EF6\r\n                $(document).off(\"click.CFprojectSelectRule\").on(\"click.CFprojectSelectRule\", \"#luckysheet-icon-projectSelectRule-menuButton .luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-projectSelectRule-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        if(isEditMode()){\r\n                            alert(conditionformat_text.pleaseSelectRange);\r\n                        }\r\n                        else{\r\n                            tooltip.info(conditionformat_text.pleaseSelectRange, \"\"); \r\n                        }\r\n                        return;\r\n                    }\r\n                    else{\r\n                        let textCellColorHtml = conditionformat.textCellColorHtml();\r\n\r\n                        let title, content;\r\n                        switch(itemvalue){\r\n                            case \"top10\":\r\n                                title = conditionformat_text.conditionformat_top10;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"top10\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_top10_title}\uFF1A</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.top}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.oneself}</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"top10%\":\r\n                                title = conditionformat_text.conditionformat_top10_percent;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"top10%\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_top10_title}\uFF1A</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.top}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">%</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"last10\":\r\n                                title = conditionformat_text.conditionformat_last10;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"last10\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_last10_title}\uFF1A</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.last}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.oneself}</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"last10%\":\r\n                                title = conditionformat_text.conditionformat_last10_percent;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"last10%\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_last10_title}\uFF1A</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.last}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">%</div>\r\n                                                </div>\r\n                                                <div style=\"margin:5px 0;\">\u8BBE\u7F6E\u4E3A\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break;\r\n                            case \"AboveAverage\":\r\n                                title = conditionformat_text.conditionformat_AboveAverage;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"AboveAverage\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_AboveAverage_title}\uFF1A</div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAsByArea}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break; \r\n                            case \"SubAverage\":\r\n                                title = conditionformat_text.conditionformat_SubAverage;\r\n                                content =  `<div class=\"box\" data-itemvalue=\"SubAverage\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_SubAverage_title}\uFF1A</div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAsByArea}\uFF1A</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                break; \r\n                        }\r\n\r\n                        conditionformat.conditionformatDialog(title,content);\r\n                    }\r\n                });\r\n\r\n                //\u6570\u636E\u6761\u5B50\u83DC\u5355\u70B9\u51FB\u4E8B\u4EF6\r\n                $(document).off(\"click.CFdataBar\").on(\"click.CFdataBar\", \"#luckysheet-icon-dataBar-menuButton .luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-dataBar-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(Store.luckysheet_select_save.length > 0){\r\n                        let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                        let format = conditionformat.dataBarList[itemvalue][\"format\"];\r\n\r\n                        conditionformat.updateItem(\"dataBar\", cellrange, format);\r\n                    }\r\n                });\r\n\r\n                //\u8272\u9636\u5B50\u83DC\u5355\u70B9\u51FB\u4E8B\u4EF6\r\n                $(document).off(\"click.CFcolorGradation\").on(\"click.CFcolorGradation\", \"#luckysheet-icon-colorGradation-menuButton .luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-colorGradation-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(Store.luckysheet_select_save.length > 0){\r\n                        let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                        let format = conditionformat.colorGradationList[itemvalue][\"format\"];\r\n\r\n                        conditionformat.updateItem(\"colorGradation\", cellrange, format);\r\n                    }\r\n                });\r\n\r\n                //\u6E05\u9664\u89C4\u5219\u5B50\u83DC\u5355\u70B9\u51FB\u4E8B\u4EF6\r\n                $(document).off(\"click.CFdeleteRule\").on(\"click.CFdeleteRule\", \"#luckysheet-icon-deleteRule-menuButton .luckysheet-cols-menuitem\", function(){\r\n                    $menuButton.hide();\r\n                    $(\"#luckysheet-icon-deleteRule-menuButton\").hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"delSheet\"){\r\n                        conditionformat.updateItem(\"delSheet\");\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //\u6279\u6CE8\r\n        $(\"#luckysheet-icon-postil\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\")+\"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            \r\n            const locale_comment = locale().comment;\r\n\r\n            $menuButton.remove();\r\n\r\n            // if($menuButton.length == 0){\r\n                luckysheetPostil.removeActivePs();\r\n\r\n                let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                \r\n                let row_index = last[\"row_focus\"];\r\n                if(row_index == null){\r\n                    row_index = last[\"row\"][0];\r\n                }\r\n\r\n                let col_index = last[\"column_focus\"];\r\n                if(col_index == null){\r\n                    col_index = last[\"column\"][0];\r\n                }\r\n\r\n                let itemdata;\r\n                if(Store.flowdata[row_index][col_index] != null && Store.flowdata[row_index][col_index].ps != null){\r\n                    itemdata = [\r\n                        {\"text\": locale_comment.edit, \"value\": \"editPs\", \"example\": \"\"},\r\n                        {\"text\": locale_comment.delete, \"value\": \"delPs\", \"example\": \"\"},\r\n                        {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                        {\"text\": locale_comment.showOne, \"value\": \"showHidePs\", \"example\": \"\"},\r\n                        {\"text\": locale_comment.showAll, \"value\": \"showHideAllPs\", \"example\": \"\"}\r\n                    ];\r\n                }\r\n                else{\r\n                    itemdata = [\r\n                        {\"text\": locale_comment.insert, \"value\": \"newPs\", \"example\": \"\"},\r\n                        {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                        {\"text\": locale_comment.showAll, \"value\": \"showHideAllPs\", \"example\": \"\"}\r\n                    ];\r\n                }\r\n                \r\n                let itemset = _this.createButtonMenu(itemdata);\r\n                let menu = replaceHtml(_this.menu, {\"id\": \"postil\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\"});\r\n                \r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\"+menuButtonId).width(150);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n                    \r\n                    if(itemvalue == \"newPs\"){\r\n                        luckysheetPostil.newPs(row_index, col_index);\r\n                    }\r\n                    else if(itemvalue == \"editPs\"){\r\n                        luckysheetPostil.editPs(row_index, col_index);\r\n                    }\r\n                    else if(itemvalue == \"delPs\"){\r\n                        luckysheetPostil.delPs(row_index, col_index);\r\n                    }\r\n                    else if(itemvalue == \"showHidePs\"){\r\n                        luckysheetPostil.showHidePs(row_index, col_index);\r\n                    }\r\n                    else if(itemvalue == \"showHideAllPs\"){\r\n                        luckysheetPostil.showHideAllPs();\r\n                    }\r\n                });\r\n            // }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n        \r\n        //sheet protection\r\n        $(\"#luckysheet-icon-protection\").click(function(){\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n            openProtectionModal(sheetFile);\r\n        });\r\n\r\n        //print\r\n        $(\"#luckysheet-icon-print\").click(function(){\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_print = _locale.print;\r\n            if($menuButton.length == 0){\r\n                let itemdata = [\r\n                    {\"text\": locale_print.menuItemPrint, \"value\": \"print\", \"example\": '<i class=\"iconfont luckysheet-iconfont-dayin\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": \"\", \"value\": \"split\", \"example\": \"\"},\r\n                    {\"text\": locale_print.menuItemAreas, \"value\": \"areas\", \"example\": '<i class=\"iconfont luckysheet-iconfont-tihuan\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_print.menuItemRows, \"value\": \"rows\", \"example\": '<i class=\"iconfont luckysheet-iconfont-zhuandao1\" aria-hidden=\"true\"></i>'},\r\n                    {\"text\": locale_print.menuItemColumns, \"value\": \"columns\", \"example\": '<i class=\"iconfont luckysheet-iconfont-dingwei\" aria-hidden=\"true\"></i>'},\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { \"id\": \"print\", \"item\": itemset, \"subclass\": \"\", \"sub\": \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function(){\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this), itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if(itemvalue == \"print\"){ //Print config\r\n                        alert(\"print\");\r\n                    }\r\n                    else if(itemvalue == \"areas\" || itemvalue == \"rows\" || itemvalue == \"columns\"){ //range\r\n                        alert(\"areas\");\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if(tlen > userlen && (tlen + menuleft) > $(\"#\" + Store.container).width()){\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n        \r\n        $(\"body\").on(\"mouseover mouseleave\",\".luckysheet-menuButton .luckysheet-cols-submenu\", function(e){\r\n            let $t = $(this), attrid = $t.attr(\"itemvalue\"), \r\n                $attr = $(\"#luckysheet-icon-\" + attrid + \"-menuButton\");\r\n            \r\n            if (e.type === \"mouseover\") {\r\n                let $con = $t.parent();\r\n                let winW = $(window).width(), winH = $(window).height();\r\n                let menuW = $con.width(), attrH = $attr.height() + 25, attrW = $attr.width() + 5;\r\n                let offset = $t.offset();\r\n                let top = offset.top, left = offset.left + menuW;\r\n\r\n                if (left + attrW > winW) {\r\n                    left = offset.left - attrW;\r\n                }\r\n\r\n                if (top + attrH > winH) {\r\n                    top = winH - attrH;\r\n                }\r\n\r\n                $attr.css({ \"top\": top, \"left\": left }).show();\r\n                _this.rightclickmenu = $t;\r\n            } else {\r\n                clearTimeout(_this.submenuhide[$attr.attr('id')]);\r\n                _this.submenuhide[$attr.attr('id')] = setTimeout(function () { $attr.hide(); }, 200);\r\n            }\r\n        }).on(\"mouseover mouseleave\",\".luckysheet-menuButton-sub\", function(e){\r\n            if (e.type === \"mouseover\") {\r\n                _this.rightclickmenu.addClass(\"luckysheet-cols-menuitem-hover\");\r\n                clearTimeout(_this.submenuhide[$(this).attr('id')]);\r\n            } \r\n            else {\r\n                _this.rightclickmenu.removeClass(\"luckysheet-cols-menuitem-hover\");\r\n                $(this).hide();\r\n            }\r\n        });\r\n    },\r\n    getQKBorder: function(width, type, color){\r\n        let bordertype = \"\";\r\n\r\n        if(width.indexOf(\"pt\") > -1){\r\n            width = parseFloat(width);\r\n            \r\n            if(width < 1){\r\n\r\n            }\r\n            else if(width < 1.5){\r\n                bordertype = \"Medium\";\r\n            }\r\n            else{\r\n                bordertype = \"Thick\";\r\n            }\r\n        }\r\n        else{\r\n            width = parseFloat(width);\r\n            \r\n            if(width < 2){\r\n\r\n            }\r\n            else if(width < 3){\r\n                bordertype = \"Medium\";\r\n            }\r\n            else{\r\n                bordertype = \"Thick\";\r\n            }\r\n        }\r\n\r\n        let style = 0;\r\n        type = type.toLowerCase();\r\n\r\n        if(type == \"double\"){\r\n            style = 2;\r\n        }\r\n        else if(type == \"dotted\"){\r\n            if(bordertype == \"Medium\" || bordertype == \"Thick\"){\r\n                style = 3;\r\n            }\r\n            else{\r\n                style = 10;\r\n            }\r\n        }\r\n        else if(type == \"dashed\"){\r\n            if(bordertype == \"Medium\" || bordertype == \"Thick\"){\r\n                style = 4;\r\n            }\r\n            else{\r\n                style = 9;\r\n            }\r\n        }\r\n        else if(type == \"solid\"){\r\n            if(bordertype == \"Medium\"){\r\n                style = 8;\r\n            }\r\n            else if(bordertype == \"Thick\"){\r\n                style = 13;\r\n            }\r\n            else{\r\n                style = 1;\r\n            }\r\n        }\r\n        \r\n        return [style, color];\r\n    },\r\n    updateFormatCell:function(d, attr, foucsStatus,row_st, row_ed, col_st, col_ed){\r\n        if(d==null || attr==null){\r\n            return;\r\n        }\r\n        if(attr == \"ct\"){\r\n            for (let r = row_st; r <= row_ed; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                for (let c = col_st; c <= col_ed; c++) {\r\n                    let cell = d[r][c], value = null;\r\n                    \r\n                    if (getObjType(cell) == \"object\") {\r\n                        value = d[r][c][\"v\"];\r\n                    }\r\n                    else{\r\n                        value = d[r][c];\r\n                    }\r\n\r\n                    if(foucsStatus != \"@\" && isRealNum(value)){\r\n                        value = parseFloat(value);\r\n                    }\r\n\r\n                    let mask = update(foucsStatus, value);\r\n                    let type = \"n\";\r\n                    \r\n                    if(is_date(foucsStatus) || foucsStatus === 14 || foucsStatus === 15 || foucsStatus === 16 || foucsStatus === 17 || foucsStatus === 18 || foucsStatus === 19 || foucsStatus === 20 || foucsStatus === 21 || foucsStatus === 22 || foucsStatus === 45 || foucsStatus === 46 || foucsStatus === 47){\r\n                        type = \"d\";\r\n                    }\r\n                    else if(foucsStatus == \"@\" || foucsStatus === 49){\r\n                        type = \"s\"\r\n                    }\r\n                    else if(foucsStatus == \"General\" || foucsStatus === 0){\r\n                        // type = \"g\"; \r\n                        type = isRealNum(value) ? \"n\" : \"g\";\r\n                    }\r\n\r\n                    if (getObjType(cell) == \"object\") {\r\n                        d[r][c][\"m\"] = mask;\r\n                        if(d[r][c][\"ct\"] == null){\r\n                            d[r][c][\"ct\"] = {};\r\n                        }\r\n                        d[r][c][\"ct\"][\"fa\"] = foucsStatus;\r\n                        d[r][c][\"ct\"][\"t\"] = type;\r\n                    }\r\n                    else{\r\n                        d[r][c] = { \"ct\":{\"fa\":foucsStatus, \"t\":type}, \"v\": value, \"m\": mask };\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(attr == \"ht\"){\r\n                if(foucsStatus == \"left\"){\r\n                    foucsStatus = \"1\";\r\n                }\r\n                else if(foucsStatus == \"center\"){\r\n                    foucsStatus = \"0\";\r\n                }\r\n                else if(foucsStatus == \"right\"){\r\n                    foucsStatus = \"2\";\r\n                }\r\n            }\r\n            else if(attr == \"vt\"){\r\n                if(foucsStatus == \"top\"){\r\n                    foucsStatus = \"1\";\r\n                }\r\n                else if(foucsStatus == \"middle\"){\r\n                    foucsStatus = \"0\";\r\n                }\r\n                else if(foucsStatus == \"bottom\"){\r\n                    foucsStatus = \"2\";\r\n                }\r\n            }\r\n            else if(attr == \"tb\"){\r\n                if(foucsStatus == \"overflow\"){\r\n                    foucsStatus = \"1\";\r\n                }\r\n                else if(foucsStatus == \"clip\"){\r\n                    foucsStatus = \"0\";\r\n                }\r\n                else if(foucsStatus == \"wrap\"){\r\n                    foucsStatus = \"2\";\r\n                }\r\n            }\r\n            else if(attr == \"tr\"){\r\n                if(foucsStatus == \"none\"){\r\n                    foucsStatus = \"0\";\r\n                }\r\n                else if(foucsStatus == \"angleup\"){\r\n                    foucsStatus = \"1\";\r\n                }\r\n                else if(foucsStatus == \"angledown\"){\r\n                    foucsStatus = \"2\";\r\n                }\r\n                else if(foucsStatus == \"vertical\"){\r\n                    foucsStatus = \"3\";\r\n                }\r\n                else if(foucsStatus == \"rotation-up\"){\r\n                    foucsStatus = \"4\";\r\n                }\r\n                else if(foucsStatus == \"rotation-down\"){\r\n                    foucsStatus = \"5\";\r\n                }\r\n            }\r\n\r\n            for (let r = row_st; r <= row_ed; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                for (let c = col_st; c <= col_ed; c++) {\r\n                    let value = d[r][c];\r\n                    \r\n                    if (getObjType(value) == \"object\") {\r\n                        // if(attr in inlineStyleAffectAttribute && isInlineStringCell(value)){\r\n                            updateInlineStringFormatOutside(value, attr, foucsStatus);\r\n                        // }\r\n                        // else{\r\n                            d[r][c][attr] = foucsStatus;\r\n                        // }\r\n                        \r\n                    }\r\n                    else{\r\n                        d[r][c] = { v: value };\r\n                        d[r][c][attr] = foucsStatus;\r\n                    }\r\n\r\n                    // if(attr == \"tr\" && d[r][c].tb != null){\r\n                    //     d[r][c].tb = \"0\";\r\n                    // }\r\n                }\r\n            }\r\n        }\r\n\r\n    },\r\n    updateFormat: function(d, attr, foucsStatus){\r\n        let _this = this;\r\n\r\n        if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let canvasElement = document.createElement('canvas');\r\n        let canvas = canvasElement.getContext(\"2d\");\r\n\r\n        if(attr in inlineStyleAffectAttribute ){\r\n            if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 ) {\r\n                let value = $(\"#luckysheet-input-box\").text();\r\n                if(value.substr(0,1)!=\"=\"){\r\n                    let cell = d[Store.luckysheetCellUpdate[0]][Store.luckysheetCellUpdate[1]];\r\n                    updateInlineStringFormat(cell, attr, foucsStatus, luckysheetformula.rangeResizeTo);\r\n                    // return;\r\n                }\r\n            }\r\n        }\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if(cfg[\"rowlen\"] == null){\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n            let row_st = Store.luckysheet_select_save[s][\"row\"][0], \r\n                row_ed = Store.luckysheet_select_save[s][\"row\"][1];\r\n            let col_st = Store.luckysheet_select_save[s][\"column\"][0], \r\n                col_ed = Store.luckysheet_select_save[s][\"column\"][1];\r\n\r\n            this.updateFormatCell(d, attr, foucsStatus, row_st, row_ed, col_st, col_ed);\r\n\r\n            if(attr == \"tb\" || attr == \"tr\" || attr == \"fs\"){\r\n                cfg = rowlenByRange(d, row_st, row_ed, cfg);\r\n            }\r\n        }\r\n\r\n        let allParam = {};\r\n        if(attr == \"tb\" || attr == \"tr\" || attr == \"fs\"){\r\n            allParam = {\r\n                \"cfg\": cfg,\r\n                \"RowlChange\": true\r\n            }\r\n        }\r\n\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, allParam, false);\r\n    },\r\n    updateFormat_mc: function(d, foucsStatus){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if(cfg[\"merge\"] == null){\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if(foucsStatus == \"mergeCancel\"){\r\n            for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                let range = Store.luckysheet_select_save[i];\r\n                let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                if(r1 == r2 && c1 == c2){\r\n                    continue;\r\n                }\r\n\r\n                let fv = {};\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = d[r][c];\r\n\r\n                        if(cell != null && cell.mc != null){\r\n                            let mc_r = cell.mc.r, mc_c = cell.mc.c;\r\n\r\n                            if(\"rs\" in cell.mc){\r\n                                delete cell.mc;\r\n                                delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                                fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                            }\r\n                            else{\r\n                                // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                                let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                                delete cell_clone.v;\r\n                                delete cell_clone.m;\r\n                                delete cell_clone.ct;\r\n                                delete cell_clone.f;\r\n                                delete cell_clone.spl;\r\n\r\n                                d[r][c] = cell_clone;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            let isHasMc = false; //\u9009\u533A\u662F\u5426\u542B\u6709 \u5408\u5E76\u7684\u5355\u5143\u683C\r\n\r\n            for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                let range = Store.luckysheet_select_save[i];\r\n                let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = d[r][c];\r\n\r\n                        if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                            isHasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(isHasMc){//\u9009\u533A\u6709\u5408\u5E76\u5355\u5143\u683C\uFF08\u9009\u533A\u90FD\u6267\u884C \u53D6\u6D88\u5408\u5E76\uFF09\r\n                for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                    let range = Store.luckysheet_select_save[i];\r\n                    let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                    let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        continue;\r\n                    }\r\n\r\n                    let fv = {};\r\n\r\n                    for(let r = r1; r <= r2; r++){\r\n                        for(let c = c1; c <= c2; c++){\r\n                            let cell = d[r][c];\r\n\r\n                            if(cell != null && cell.mc != null){\r\n                                let mc_r = cell.mc.r, mc_c = cell.mc.c;\r\n\r\n                                if(\"rs\" in cell.mc){\r\n                                    delete cell.mc;\r\n                                    delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                                    fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                                }\r\n                                else{\r\n                                // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                                let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                                    delete cell_clone.v;\r\n                                    delete cell_clone.m;\r\n                                    delete cell_clone.ct;\r\n                                    delete cell_clone.f;\r\n                                    delete cell_clone.spl;\r\n\r\n                                    d[r][c] = cell_clone;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                    let range = Store.luckysheet_select_save[i];\r\n                    let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                    let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        continue;\r\n                    }\r\n\r\n                    if(foucsStatus == \"mergeAll\"){\r\n                        let fv = {}, isfirst = false;\r\n\r\n                        for(let r = r1; r <= r2; r++){\r\n                            for(let c = c1; c <= c2; c++){\r\n                                let cell = d[r][c];\r\n\r\n                                if(cell != null && (isInlineStringCT(cell.ct) || !isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { \"mc\": { \"r\": r1, \"c\": c1 } };\r\n                            }\r\n                        }\r\n\r\n                        d[r1][c1] = fv;\r\n                        d[r1][c1].mc = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                        cfg[\"merge\"][r1 + \"_\" + c1] = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n                    }\r\n                    else if(foucsStatus == \"mergeV\"){\r\n                        for(let c = c1; c <= c2; c++){\r\n                            let fv = {}, isfirst = false;\r\n\r\n                            for(let r = r1; r <= r2; r++){\r\n                                let cell = d[r][c];\r\n\r\n                                if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { \"mc\": { \"r\": r1, \"c\": c } };\r\n                            }\r\n\r\n                            d[r1][c] = fv;\r\n                            d[r1][c].mc = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n\r\n                            cfg[\"merge\"][r1 + \"_\" + c] = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n                        }\r\n                    }\r\n                    else if(foucsStatus == \"mergeH\"){\r\n                        for(let r = r1; r <= r2; r++){\r\n                            let fv = {}, isfirst = false;\r\n\r\n                            for(let c = c1; c <= c2; c++){\r\n                                let cell = d[r][c];\r\n\r\n                                if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { \"mc\": { \"r\": r, \"c\": c1 } };\r\n                            }\r\n\r\n                            d[r][c1] = fv;\r\n                            d[r][c1].mc = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                            cfg[\"merge\"][r + \"_\" + c1] = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push({\r\n                \"type\": \"mergeChange\",\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"data\": Store.flowdata,\r\n                \"curData\": d,\r\n                \"range\": $.extend(true, [], Store.luckysheet_select_save),\r\n                \"config\": $.extend(true, {}, Store.config),\r\n                \"curConfig\": cfg\r\n            });\r\n        }\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, {\"cfg\": cfg});\r\n        Store.clearjfundo = true;\r\n    },\r\n    borderfix: function(d, r, c){\r\n        // return [-1, -1, 2, 2];\r\n\r\n        let cell = d[r][c];\r\n        let bg = null;\r\n        \r\n        if(cell == null){\r\n            return [-1, 0, 0, -1];\r\n        }\r\n        else if(d[r][c].bg == null || d[r][c].bg == \"\"){\r\n            return [-1, 0, 0, -1];\r\n        }\r\n        else {\r\n            return [-2, -1, 1, 0];\r\n            //return [-2, -2, 1, 0];\r\n        }\r\n    },\r\n    changeMenuButtonDom:function(attr, foucsStatus, _locale){\r\n        let _this = this;\r\n        if(_locale==null){\r\n            _locale = locale();\r\n        }\r\n        const locale_fontarray = _locale.fontarray;\r\n        const locale_fontjson = _locale.fontjson;\r\n\r\n        if(attr == \"bl\"){\r\n            if(foucsStatus != \"0\"){\r\n                $(\"#luckysheet-icon-bold\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-icon-bold\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        }\r\n        else if(attr == \"it\"){\r\n            if(foucsStatus != \"0\"){\r\n                $(\"#luckysheet-icon-italic\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-icon-italic\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        }\r\n        else if(attr == \"cl\"){\r\n            if(foucsStatus != \"0\"){\r\n                $(\"#luckysheet-icon-strikethrough\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-icon-strikethrough\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        }\r\n        else if(attr == \"un\"){\r\n            if(foucsStatus != \"0\"){\r\n                $(\"#luckysheet-icon-underline\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-icon-underline\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        }\r\n        else if(attr == \"ff\"){\r\n            let menuButtonId = \"luckysheet-icon-font-family-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            // const locale_fontarray = locale().fontarray;\r\n            let itemname = locale_fontarray[0], itemvalue = 0;\r\n            if(foucsStatus != null){\r\n                if(isdatatypemulti(foucsStatus)[\"num\"]){\r\n                    itemvalue = parseInt(foucsStatus);\r\n                    itemname = locale_fontarray[itemvalue];\r\n\r\n                    if(itemname==null){\r\n                        itemvalue = _this.defualtFont[itemvalue];\r\n                        itemname = itemvalue;\r\n                        if(itemvalue!=null){\r\n                            _this.addFontTolist(itemvalue);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    foucsStatus = foucsStatus.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n                    itemvalue = foucsStatus;\r\n                    itemname = foucsStatus;\r\n\r\n                    _this.addFontTolist(itemvalue);\r\n                }   \r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n            $(\"#luckysheet-icon-font-family\").find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ itemname +\" \");\r\n        }\r\n        else if(attr == \"fs\"){\r\n            let $menuButton = $(\"#luckysheet-icon-font-size-menuButton\");\r\n            let itemvalue = foucsStatus, $input = $(\"#luckysheet-icon-font-size input\");\r\n            _this.focus($menuButton, itemvalue);\r\n            $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\", itemvalue);\r\n            $input.val(itemvalue);\r\n        }\r\n        else if(attr == \"ht\"){\r\n            let $menuButton = $(\"#luckysheet-icon-align-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-align\"), itemvalue = \"left\";\r\n            \r\n            if(foucsStatus == \"0\"){\r\n                itemvalue = \"center\";\r\n            }\r\n            else if(foucsStatus == \"2\"){\r\n                itemvalue = \"right\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.align;\r\n\r\n            let $icon = $(\"#luckysheet-icon-align\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n            $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-\" + itemvalue + iconfontObject[itemvalue]);\r\n            $menuButton.hide();\r\n        }\r\n        else if(attr == \"vt\"){\r\n            let $menuButton = $(\"#luckysheet-icon-valign-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-valign\"), itemvalue = \"bottom\";\r\n            \r\n            if(foucsStatus == \"1\"){\r\n                itemvalue = \"top\";\r\n            }\r\n            else if(foucsStatus == \"0\"){\r\n                itemvalue = \"middle\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.align;\r\n\r\n            let $icon = $(\"#luckysheet-icon-valign\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n            $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-\" + itemvalue+ iconfontObject[itemvalue]);\r\n            $menuButton.hide();\r\n        }\r\n        else if(attr == \"tb\"){\r\n            let $menuButton = $(\"#luckysheet-icon-textwrap-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-textwrap\"), itemvalue = \"clip\";\r\n            \r\n            if(foucsStatus == \"1\"){\r\n                itemvalue = \"overflow\";\r\n            }\r\n            else if(foucsStatus == \"2\"){\r\n                itemvalue = \"wrap\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.textWrap;\r\n\r\n            let $icon = $(\"#luckysheet-icon-textwrap\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n            $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-\" + itemvalue + iconfontObject[itemvalue]);\r\n            $menuButton.hide();\r\n        }\r\n        else if(attr == \"tr\"){\r\n            let $menuButton = $(\"#luckysheet-icon-rotation-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-rotation\"), itemvalue = \"none\";\r\n            \r\n            if(foucsStatus == \"1\"){\r\n                itemvalue = \"angleup\";\r\n            }\r\n            else if(foucsStatus == \"2\"){\r\n                itemvalue = \"angledown\";\r\n            }\r\n            else if(foucsStatus == \"3\"){\r\n                itemvalue = \"vertical\";\r\n            }\r\n            else if(foucsStatus == \"4\"){\r\n                itemvalue = \"rotation-up\";\r\n            }\r\n            else if(foucsStatus == \"5\"){\r\n                itemvalue = \"rotation-down\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.rotation;\r\n\r\n            let $icon = $(\"#luckysheet-icon-rotation\").attr(\"type\", itemvalue).find(\".luckysheet-icon-img-container\");\r\n            $icon.removeAttr(\"class\").addClass(\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-\" + itemvalue + iconfontObject[itemvalue]);\r\n            $menuButton.hide();\r\n        }\r\n        else if(attr == \"ct\") {\r\n            let $menuButton = $(\"#luckysheet-icon-fmt-other\");\r\n            const _locale = locale();\r\n            const locale_defaultFmt = _locale.defaultFmt;\r\n            if(!foucsStatus) {\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ locale_defaultFmt[0].text +\" \");\r\n                return;\r\n            }\r\n            const {fa} = foucsStatus;\r\n            const format = locale_defaultFmt.find(f => f.value === fa);\r\n            if(format) {\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ format.text +\" \");\r\n            } else {\r\n                const otherFormat = locale_defaultFmt.find(f => f.value === \"fmtOtherSelf\");\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \"+ otherFormat.text +\" \");\r\n            }\r\n        }\r\n    },\r\n    inputMenuButtonFocus:function(focusTarget){\r\n        var  w = window.getSelection(); \r\n        var range = w.getRangeAt(0);\r\n        let startContainer = range.startContainer;\r\n        Store.inlineStringEditRange = null;\r\n        const _locale = locale();\r\n        if(startContainer.parentNode.tagName==\"SPAN\"){\r\n            let cssText = startContainer.parentNode.style.cssText;\r\n            let stylelist = convertCssToStyleList(cssText);\r\n            for(let key in stylelist){\r\n                this.changeMenuButtonDom(key, stylelist[key], _locale);\r\n            }\r\n        }\r\n    },\r\n    menuButtonFocus: function(d, r, c){\r\n        let _this = this;\r\n        let foucsList = [\"bl\", \"it\", \"cl\", \"ff\", \"ht\", \"vt\", \"fs\", \"tb\", \"tr\", \"ct\", \"un\"];\r\n        const _locale = locale();\r\n        for(let i = 0; i < foucsList.length; i++){\r\n            let attr = foucsList[i];\r\n            let foucsStatus = _this.checkstatus(d, r, c, attr);\r\n\r\n            this.changeMenuButtonDom(attr, foucsStatus, _locale);\r\n        }\r\n    },\r\n    checkstatus: function(d, r, c, a){\r\n        if(d==null || d[r]==null){\r\n            console.warn(\"It's incorrect data\", r, c);\r\n            return null;\r\n        }\r\n        let foucsStatus = d[r][c];\r\n        return checkstatusByCell(foucsStatus, a);\r\n    },\r\n    setLineDash: function(canvasborder, type, hv, m_st, m_ed, line_st, line_ed){\r\n    \tlet borderType = {\r\n            \"0\": \"none\", \r\n            \"1\": \"Thin\", \r\n            \"2\": \"Hair\", \r\n            \"3\": \"Dotted\", \r\n            \"4\": \"Dashed\", \r\n            \"5\": \"DashDot\", \r\n            \"6\": \"DashDotDot\", \r\n            \"7\": \"Double\", \r\n            \"8\": \"Medium\", \r\n            \"9\": \"MediumDashed\", \r\n            \"10\": \"MediumDashDot\", \r\n            \"11\": \"MediumDashDotDot\", \r\n            \"12\": \"SlantedDashDot\", \r\n            \"13\": \"Thick\"\r\n        };\r\n\r\n        type = borderType[type.toString()];\r\n\r\n    \ttry {\r\n        \tif(type == \"Hair\"){\r\n                canvasborder.setLineDash([1, 2]);\r\n            }\r\n            else if(type.indexOf(\"DashDotDot\") > -1){\r\n                canvasborder.setLineDash([2, 2, 5, 2, 2]);\r\n            }\r\n            else if(type.indexOf(\"DashDot\") > -1){\r\n                canvasborder.setLineDash([2, 5, 2]);\r\n            }\r\n            else if(type.indexOf(\"Dotted\") > -1){\r\n                canvasborder.setLineDash([2]);\r\n            }\r\n            else if(type.indexOf(\"Dashed\") > -1){\r\n                canvasborder.setLineDash([3]);\r\n            }\r\n            else{\r\n            \tcanvasborder.setLineDash([0]);\r\n            }\r\n        } \r\n        catch(e) {\r\n    \t\tconsole.log(e);\r\n    \t}\r\n\r\n        canvasborder.beginPath();\r\n\r\n        if(type.indexOf(\"Medium\") > -1){\r\n        \tif(hv == \"h\"){\r\n        \t\tcanvasborder.moveTo(m_st, m_ed - 0.5);\r\n            \tcanvasborder.lineTo(line_st, line_ed - 0.5);\r\n        \t}\r\n        \telse{\r\n        \t\tcanvasborder.moveTo(m_st - 0.5, m_ed);\r\n            \tcanvasborder.lineTo(line_st - 0.5, line_ed);\r\n        \t}\r\n            \r\n            canvasborder.lineWidth = 2;\r\n        }\r\n        else if(type == \"Thick\"){\r\n            canvasborder.moveTo(m_st, m_ed);\r\n            canvasborder.lineTo(line_st, line_ed);\r\n            canvasborder.lineWidth = 3;\r\n        }\r\n        else {\r\n            canvasborder.moveTo(m_st, m_ed);\r\n            canvasborder.lineTo(line_st, line_ed);\r\n            canvasborder.lineWidth = 1;\r\n        }\r\n    },\r\n    moveMergeData: function(d, offset_r, offset_c){\r\n        if(isRealNull(d)){\r\n            return d;\r\n        }\r\n\r\n        let deleMC = [], insertMC=[], hasMC = false;\r\n\r\n        for(let r = 0; r < d.length; r++){\r\n            for(let c = 0; c < d[0].length; c++){\r\n                let cell = d[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    if(cell.mc.rs != null){\r\n                        deleMC.push({ \r\n                            rs: cell.mc.rs, \r\n                            cs: cell.mc.cs, \r\n                            r: cell.mc.r, \r\n                            c: cell.mc.c\r\n                        });\r\n                        insertMC.push({ \r\n                            rs: cell.mc.rs, \r\n                            cs: cell.mc.cs, \r\n                            r: cell.mc.r + offset_r, \r\n                            c: cell.mc.c + offset_c\r\n                        });\r\n\r\n                        hasMC= true;\r\n                    }\r\n\r\n                    d[r][c].mc.r += offset_r;\r\n                    d[r][c].mc.c += offset_c;\r\n                }\r\n            }\r\n        }\r\n\r\n        return { \"deleMC\": deleMC, \"insertMC\": insertMC, \"hasMC\": hasMC };\r\n    },\r\n    getRangeInMerge: function(st_r, rlen, st_c, clen, sheetIndex){\r\n        let _this = this;\r\n\r\n        let mergelist = [];\r\n        let cfg = null;\r\n        if(sheetIndex != null){\r\n            cfg = $.extend(true, {}, _this.getSheetConfig());\r\n        }\r\n        else{\r\n            cfg = $.extend(true, {}, Store.config);\r\n        }\r\n\r\n        if(cfg != null && cfg[\"merge\"] != null){\r\n            for(let key in cfg[\"merge\"]){\r\n                let mc = cfg[\"merge\"][key];\r\n                if(!((st_r + rlen - 1) < mc.r || st_r > (mc.r + mc.rs - 1)) && !((st_c + clen - 1) < mc.c || st_c > (mc.c + mc.cs - 1))){\r\n                    mergelist.push(mc);\r\n                }\r\n            }\r\n        }\r\n\r\n        return mergelist;\r\n    },\r\n    mergeborer: function(d, row_index, col_index){\r\n        if(d==null || d[row_index]==null){\r\n            console.warn(\"Merge info is null\", row_index, col_index);\r\n            return null;\r\n        }\r\n        let value = d[row_index][col_index];\r\n        \r\n        if(getObjType(value) == \"object\" && (\"mc\" in value)){\r\n            let margeMaindata = value[\"mc\"];\r\n            if(margeMaindata==null){\r\n                console.warn(\"Merge info is null\", row_index, col_index);\r\n                return null;\r\n            }\r\n            col_index = margeMaindata.c;\r\n            row_index = margeMaindata.r;\r\n\r\n\r\n            if(d[row_index][col_index]==null){\r\n                console.warn(\"Main merge Cell info is null\", row_index, col_index);\r\n                return null;\r\n            }\r\n            let col_rs = d[row_index][col_index].mc.cs;\r\n            let row_rs = d[row_index][col_index].mc.rs;\r\n\r\n            let margeMain = d[row_index][col_index].mc;\r\n            \r\n            let start_r, end_r, row, row_pre;\r\n            for(let r = row_index; r < margeMain.rs + row_index; r++){\r\n                if (r == 0) {\r\n                    start_r = - 1;\r\n                }\r\n                else {\r\n                    start_r = Store.visibledatarow[r - 1] - 1;\r\n                }\r\n\r\n                end_r = Store.visibledatarow[r];\r\n\r\n                if(row_pre == null){\r\n                    row_pre = start_r;\r\n                    row = end_r;\r\n                }\r\n                else{\r\n                    row += end_r - start_r - 1;\r\n                }\r\n            }\r\n\r\n            let start_c, end_c, col, col_pre; \r\n            for(let c = col_index; c < margeMain.cs + col_index; c++){\r\n                if (c == 0) {\r\n                    start_c = 0;\r\n                }\r\n                else {\r\n                    start_c = Store.visibledatacolumn[c - 1];\r\n                }\r\n\r\n                end_c = Store.visibledatacolumn[c];\r\n\r\n                if(col_pre == null){\r\n                    col_pre = start_c;\r\n                    col = end_c;\r\n                }\r\n                else{\r\n                    col += end_c - start_c;\r\n                }\r\n            }\r\n\r\n            return {\r\n                \"row\": [row_pre , row, row_index, row_index + row_rs - 1], \r\n                \"column\": [col_pre, col , col_index, col_index + col_rs - 1]\r\n            };\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    mergeMoveData: {},\r\n    mergeMoveMain: function(columnseleted, rowseleted, s, top , height, left , width){\r\n        let _this = this;\r\n        let mergesetting = sheetmanage.getSheetMerge();\r\n        \r\n        if(mergesetting == null){\r\n            return;\r\n        }\r\n\r\n        let mcset = [];\r\n        for(let key in mergesetting){\r\n            mcset.push(key);\r\n        }\r\n\r\n        if(rowseleted[0] > rowseleted[1]){\r\n            rowseleted[1] = rowseleted[0];\r\n        }\r\n\r\n        if(columnseleted[0] > columnseleted[1]){\r\n            columnseleted[1] = columnseleted[0];\r\n        }\r\n\r\n        let offloop = true;\r\n        _this.mergeMoveData = {};\r\n\r\n        while (offloop) {\r\n            offloop = false;\r\n\r\n            for(let i = 0; i < mcset.length; i++){\r\n                let key = mcset[i];\r\n                let mc = mergesetting[key];\r\n\r\n                if(key in _this.mergeMoveData){\r\n                    continue;\r\n                }\r\n\r\n                let changeparam  = _this.mergeMove(mc, columnseleted, rowseleted, s, top, height, left, width);\r\n\r\n                if(changeparam != null){\r\n                    _this.mergeMoveData[key] = mc;\r\n                    \r\n                    columnseleted = changeparam[0];\r\n                    rowseleted= changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n\r\n                    offloop = true;\r\n                }\r\n                else{\r\n                    delete _this.mergeMoveData[key];\r\n                }\r\n            }\r\n        }\r\n        \r\n        return [columnseleted, rowseleted, top, height, left, width];\r\n    },\r\n    mergeMove: function(mc, columnseleted, rowseleted, s, top , height, left , width){\r\n        let _this = this;\r\n        \r\n        let row_st = mc.r, row_ed = mc.r + mc.rs - 1;\r\n        let col_st = mc.c, col_ed = mc.c + mc.cs - 1;\r\n        let ismatch = false;\r\n\r\n        if(columnseleted[1] < columnseleted[0]){\r\n            columnseleted[0] = columnseleted[1];\r\n        }\r\n\r\n        if(rowseleted[1] < rowseleted[0]){\r\n            rowseleted[0] = rowseleted[1];\r\n        }\r\n\r\n        if( (columnseleted[0] <= col_st && columnseleted[1] >= col_ed && rowseleted[0] <= row_st && rowseleted[1] >= row_ed) || (!(columnseleted[1] < col_st || columnseleted[0] > col_ed) && !(rowseleted[1] < row_st || rowseleted[0] > row_ed))){\r\n            let margeset = _this.mergeborer(Store.flowdata, mc.r, mc.c);\r\n            if(!!margeset){\r\n                let row = margeset.row[1],\r\n                    row_pre = margeset.row[0],\r\n                    row_index = margeset.row[2],\r\n                    col = margeset.column[1],\r\n                    col_pre = margeset.column[0],\r\n                    col_index = margeset.column[2];\r\n\r\n                if(!(columnseleted[1] < col_st || columnseleted[0] > col_ed)){\r\n                    //\u5411\u4E0A\u6ED1\u52A8\r\n                    if(rowseleted[0] <= row_ed && rowseleted[0] >= row_st){\r\n                        height += top - row_pre;\r\n                        top = row_pre;\r\n                        rowseleted[0] = row_st;\r\n                    }\r\n                    \r\n                    //\u5411\u4E0B\u6ED1\u52A8\u6216\u8005\u5C45\u4E2D\u65F6\u5F80\u4E0A\u6ED1\u52A8\u7684\u5411\u4E0B\u8865\u9F50\r\n                    if(rowseleted[1] >= row_st && rowseleted[1] <= row_ed){\r\n                        if(s.row_focus >= row_st && s.row_focus <= row_ed){\r\n                            height = row - top;\r\n                        }\r\n                        else{\r\n                            height = row - top;\r\n                        }\r\n                        \r\n                        rowseleted[1] = row_ed;\r\n                    }\r\n                }\r\n                \r\n                if(!(rowseleted[1] < row_st || rowseleted[0] > row_ed)){\r\n                    if(columnseleted[0] <= col_ed && columnseleted[0] >= col_st){\r\n                        width += left - col_pre;\r\n                        left = col_pre;\r\n                        columnseleted[0] = col_st;\r\n                    }\r\n                    \r\n                    //\u5411\u53F3\u6ED1\u52A8\u6216\u8005\u5C45\u4E2D\u65F6\u5F80\u5DE6\u6ED1\u52A8\u7684\u5411\u4E0B\u8865\u9F50\r\n                    if(columnseleted[1] >= col_st && columnseleted[1] <= col_ed){\r\n                        if(s.column_focus >= col_st && s.column_focus <= col_ed){\r\n                            width = col - left;\r\n                        }\r\n                        else{\r\n                            width = col - left;\r\n                        }\r\n                        \r\n                        columnseleted[1] = col_ed;\r\n                    }\r\n                }\r\n\r\n                ismatch = true;\r\n            }\r\n        }\r\n       \r\n        if(ismatch){\r\n            return [columnseleted, rowseleted, top , height, left , width];\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    getCellRealSize: function(d, cell_r, cell_c){\r\n        let _this = this;\r\n\r\n        let width = Store.defaultcollen;\r\n        let height = Store.defaultrowlen;\r\n        let celldata = d[cell_r][cell_c];\r\n\r\n        if(!!celldata && celldata[\"mc\"] != null){\r\n            let mc = celldata[\"mc\"];\r\n            let margeset = _this.mergeborer(d, mc.r, mc.c);\r\n\r\n            if(!!margeset){\r\n                let row = margeset.row[1];\r\n                let row_pre = margeset.row[0];\r\n                let row_index = margeset.row[2];\r\n                let row_index_ed = margeset.row[3];\r\n\r\n                let col = margeset.column[1];\r\n                let col_pre = margeset.column[0];\r\n                let col_index = margeset.column[2];\r\n                let col_index_ed = margeset.column[3];                    \r\n\r\n                width = col - col_pre - 1;\r\n                height = row - row_pre - 1;\r\n            }\r\n        }\r\n        else{\r\n            let config = getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)][\"config\"];\r\n            \r\n            if (config[\"columnlen\"] != null && config[\"columnlen\"][cell_c] != null) {\r\n                width = config[\"columnlen\"][cell_c];\r\n            }\r\n            \r\n            if (config[\"rowlen\"] != null && config[\"rowlen\"][cell_r] != null) {\r\n                height = config[\"rowlen\"][cell_r];\r\n            }\r\n        }\r\n\r\n        return [width, height];\r\n    },\r\n    getTextHeightCache: {},\r\n    getTextSize: function(text, font){\r\n        let fontarray = locale().fontarray;\r\n        let f = font || '10pt ' + fontarray[0];\r\n        \r\n        let _this = this;\r\n\r\n        if (f in _this.getTextHeightCache){\r\n            return _this.getTextHeightCache[f];\r\n        }\r\n\r\n        if($(\"#luckysheetTextSizeTest\").length == 0){\r\n            $('<span id=\"luckysheetTextSizeTest\" style=\"float:left;white-space:nowrap;visibility:hidden;margin:0;padding:0;\">' + text + '</span>').appendTo($('body'));\r\n        }\r\n\r\n        let o = $(\"#luckysheetTextSizeTest\").text(text).css({'font': f}),\r\n            w = o.innerWidth(), \r\n            h = o.innerHeight();\r\n\r\n        _this.getTextHeightCache[f] = [w, h];\r\n       \r\n        return [w, h];\r\n    },\r\n    activeFormulaInput: function(row_index, col_index, rowh, columnh, formula, isnull){\r\n        let _this = this;\r\n\r\n        if(isnull == null){\r\n            isnull = false;\r\n        }\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n        if(isnull){\r\n            let formulaTxt = '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">'+ formula.toUpperCase() +'</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n\r\n            $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n\r\n            let currSelection = window.getSelection();\r\n            let $span = $(\"#luckysheet-rich-text-editor\").find(\"span\");\r\n            luckysheetformula.setCaretPosition($span.get($span.length-2), 0, 1);\r\n\r\n            return;\r\n        }\r\n\r\n        let row_pre = rowLocationByIndex(rowh[0])[0], \r\n            row = rowLocationByIndex(rowh[1])[1], \r\n            col_pre = colLocationByIndex(columnh[0])[0], \r\n            col = colLocationByIndex(columnh[1])[1];\r\n\r\n        let formulaTxt = '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">'+ formula.toUpperCase() +'</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"0\" dir=\"auto\" style=\"color:'+ luckyColor[0] +';\">'+ getRangetxt(Store.currentSheetIndex, {\"row\":rowh, \"column\":columnh }, Store.currentSheetIndex) +'</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n        $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n\r\n        luckysheetformula.israngeseleciton();\r\n        luckysheetformula.rangestart = true;\r\n        luckysheetformula.rangedrag_column_start = false;\r\n        luckysheetformula.rangedrag_row_start = false;\r\n        luckysheetformula.rangechangeindex = 0;\r\n        luckysheetformula.rangeSetValue({ \"row\": rowh, \"column\": columnh });\r\n        luckysheetformula.func_selectedrange = { \r\n            \"left\": col_pre, \r\n            \"width\": col - col_pre - 1, \r\n            \"top\": row_pre, \r\n            \"height\": row - row_pre - 1, \r\n            \"left_move\": col_pre, \r\n            \"width_move\": col - col_pre - 1, \r\n            \"top_move\": row_pre, \r\n            \"height_move\": row - row_pre - 1, \r\n            \"row\": [row_index, row_index], \r\n            \"column\": [col_index, col_index] \r\n        };\r\n        \r\n        $(\"#luckysheet-formula-functionrange-select\").css({ \"left\": col_pre, \"width\": col - col_pre - 1, \"top\": row_pre, \"height\": row - row_pre - 1 }).show();\r\n\r\n        $(\"#luckysheet-formula-help-c\").hide();\r\n    },\r\n    backFormulaInput: function(d, r, c, rowh, columnh, formula){\r\n        let _this = this;\r\n\r\n        let f = '='+ formula.toUpperCase() +'('+ getRangetxt(Store.currentSheetIndex, {\"row\":rowh, \"column\":columnh }, Store.currentSheetIndex) +')';\r\n        let v = luckysheetformula.execfunction(f, r, c);\r\n        let value = { \"v\": v[1], \"f\": v[2] };\r\n        setcellvalue(r, c, d, value);\r\n        luckysheetformula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": Store.currentSheetIndex });\r\n\r\n        server.historyParam(d, Store.currentSheetIndex, {\"row\": [r, r], \"column\": [c, c]});\r\n    },\r\n    checkNoNullValue: function(cell){\r\n        let v = cell;\r\n        if(getObjType(v) == \"object\"){\r\n            v = v.v;\r\n        }\r\n\r\n        if(!isRealNull(v) && isdatatypemulti(v).num && (cell.ct == null || cell.ct.t == null || cell.ct.t == \"n\"  || cell.ct.t == \"g\")   ){\r\n            return true;\r\n        }\r\n        else{\r\n            return false;\r\n        }\r\n    },\r\n    checkNoNullValueAll: function(cell){\r\n        let v = cell;\r\n        if(getObjType(v) == \"object\"){\r\n            v = v.v;\r\n        }\r\n\r\n        if(!isRealNull(v)){\r\n            return true;\r\n        }\r\n        else{\r\n            return false;\r\n        }\r\n    },\r\n    getNoNullValue: function(d, st_x, ed, type){\r\n        let _this = this;\r\n        let hasValueSum = 0, hasValueStart = null;\r\n        let nullNum = 0, nullTime = 0;\r\n\r\n        for(let r = ed - 1 ; r >= 0; r--){\r\n            let cell;\r\n            if(type == \"c\"){\r\n                cell = d[st_x][r];\r\n            }\r\n            else{\r\n                cell = d[r][st_x];\r\n            }\r\n\r\n            if(_this.checkNoNullValue(cell)){\r\n                hasValueSum++;\r\n                hasValueStart = r;\r\n            }\r\n            else if(cell == null || cell.v == null || cell.v == \"\"){\r\n                nullNum++;\r\n\r\n                if(nullNum >= 40){\r\n                    if(nullTime <= 0){\r\n                        nullTime = 1;\r\n                    }\r\n                    else{\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n\r\n        return hasValueStart;\r\n    },\r\n    singleFormulaInput: function(d, _index, fix, st_m, ed_m, formula, type, noNum, noNull){\r\n        let _this = this;\r\n\r\n        if(type == null){\r\n            type = \"r\";\r\n        }\r\n\r\n        if(noNum == null){\r\n            noNum = true;\r\n        }\r\n\r\n        if(noNull == null){\r\n            noNull = true;\r\n        }\r\n        \r\n        let isNull = true, isNum= false;\r\n        \r\n        for(let c = st_m; c <= ed_m; c++){\r\n            let cell = null;\r\n\r\n            if(type == \"c\"){\r\n                cell = d[c][fix];\r\n            }\r\n            else{\r\n                cell = d[fix][c];\r\n            }\r\n\r\n            if(_this.checkNoNullValue(cell)){\r\n                isNull = false;\r\n                isNum= true;\r\n            }\r\n            else if(_this.checkNoNullValueAll(cell)){\r\n                isNull = false;\r\n            }\r\n        } \r\n\r\n        if(isNull && noNull){\r\n            let st_r_r = _this.getNoNullValue(d, _index, fix, type);\r\n\r\n            if(st_r_r == null){\r\n                if(type == \"c\"){\r\n                    _this.activeFormulaInput(_index, fix, null, null, formula, true);\r\n                }\r\n                else{\r\n                    _this.activeFormulaInput(fix, _index, null, null, formula, true);\r\n                }\r\n            }\r\n            else{\r\n                if(_index == st_m){\r\n                    for(let c = st_m; c <= ed_m; c++){\r\n                        let st_r_r = _this.getNoNullValue(d, c, fix, type);\r\n                        \r\n                        if(st_r_r == null){\r\n                            break;\r\n                        }\r\n\r\n                        if(type == \"c\"){\r\n                            _this.backFormulaInput(d, c, fix, [c, c], [st_r_r, fix-1], formula);\r\n                        }\r\n                        else{\r\n                            _this.backFormulaInput(d, fix, c, [st_r_r, fix-1], [c, c], formula);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    for(let c = ed_m; c >= st_m; c--){\r\n                        let st_r_r = _this.getNoNullValue(d, c, fix, type);\r\n                        \r\n                        if(st_r_r == null){\r\n                            break;\r\n                        }\r\n\r\n                        if(type == \"c\"){\r\n                            _this.backFormulaInput(d, c, fix, [c, c], [st_r_r, fix-1], formula);\r\n                        }\r\n                        else{\r\n                            _this.backFormulaInput(d, fix, c, [st_r_r, fix-1], [c, c], formula);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(isNum && noNum){\r\n            let cell = null;\r\n\r\n            if(type == \"c\"){\r\n                cell = d[ed_m + 1][fix];\r\n            }\r\n            else{\r\n                cell = d[fix][ed_m + 1];\r\n            }\r\n\r\n            /* \u5907\u6CE8\uFF1A\u5728\u641C\u5BFB\u7684\u65F6\u5019\u6392\u9664\u81EA\u5DF1\u4EE5\u89E3\u51B3\u5355\u5143\u683C\u51FD\u6570\u5F15\u7528\u81EA\u5DF1\u7684\u95EE\u9898 */\r\n            if(cell != null && cell.v != null && cell.v.toString().length > 0){\r\n                let c = ed_m + 1;\r\n\r\n                if(type == \"c\"){\r\n                    cell = d[ed_m + 1][fix];\r\n                }\r\n                else{\r\n                    cell = d[fix][ed_m + 1];\r\n                }\r\n\r\n                while ( cell != null && cell.v != null && cell.v.toString().length > 0) {\r\n                    \r\n                    c++;\r\n                    let len = null;\r\n                    \r\n                    if(type == \"c\"){\r\n                        len = d.length;\r\n                    }\r\n                    else{\r\n                        len = d[0].length;\r\n                    }\r\n\r\n                    if(c >= len){\r\n                        return;\r\n                    }\r\n                    \r\n                    if(type == \"c\"){\r\n                        cell = d[c][fix];\r\n                    }\r\n                    else{\r\n                        cell = d[fix][c];\r\n                    }\r\n                }\r\n\r\n                if(type == \"c\"){\r\n                    _this.backFormulaInput(d, c, fix, [st_m, ed_m], [fix ,fix], formula);\r\n                }\r\n                else{\r\n                    _this.backFormulaInput(d, fix, c, [fix ,fix], [st_m, ed_m], formula);\r\n                }\r\n            }\r\n            else{\r\n                if(type == \"c\"){\r\n                    _this.backFormulaInput(d, ed_m + 1, fix, [st_m, ed_m], [fix ,fix], formula);\r\n                }\r\n                else{\r\n                    _this.backFormulaInput(d, fix, ed_m + 1, [fix ,fix], [st_m, ed_m], formula);\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            return true;\r\n        }\r\n    },\r\n    autoSelectionFormula: function(formula){\r\n        let _this = this;\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let nullfindnum = 40;\r\n        let isfalse = true;\r\n        luckysheetformula.execFunctionExist = [];\r\n\r\n        let execFormulaInput_c = function(d, st_r, ed_r, st_c, ed_c, formula){\r\n            let st_c_c = _this.getNoNullValue(d, st_r, ed_c, \"c\");\r\n\r\n            if(st_c_c == null){\r\n                _this.activeFormulaInput(st_r, st_c, null, null, formula, true);\r\n            }\r\n            else{\r\n                _this.activeFormulaInput(st_r, st_c, [st_r, ed_r], [st_c_c, ed_c - 1], formula);\r\n            }\r\n        }\r\n\r\n        let execFormulaInput = function(d, st_r, ed_r, st_c, ed_c, formula){\r\n            let st_r_c = _this.getNoNullValue(d, st_c, ed_r, \"r\");\r\n\r\n            if(st_r_c == null){\r\n                execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula);\r\n            }\r\n            else{\r\n                _this.activeFormulaInput(st_r, st_c, [st_r_c, ed_r - 1], [st_c, ed_c], formula);\r\n            }\r\n        }\r\n\r\n        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n            let st_r = Store.luckysheet_select_save[s].row[0], \r\n                ed_r = Store.luckysheet_select_save[s].row[1];\r\n            let st_c = Store.luckysheet_select_save[s].column[0], \r\n                ed_c = Store.luckysheet_select_save[s].column[1];\r\n            let row_index = Store.luckysheet_select_save[s].row_focus, \r\n                col_index = Store.luckysheet_select_save[s].column_focus;\r\n\r\n            if(st_r == ed_r && st_c == ed_c){\r\n                if(ed_r - 1 < 0 && ed_c - 1 < 0){\r\n                    _this.activeFormulaInput(st_r, st_c, null, null, formula, true);\r\n                    return;\r\n                }\r\n\r\n                if(ed_r - 1 >= 0 && _this.checkNoNullValue(d[ed_r - 1][st_c])){\r\n                    execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula);\r\n                }\r\n                else if(ed_c - 1 >= 0 && _this.checkNoNullValue(d[st_r][ed_c - 1])){\r\n                    execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula);\r\n                }\r\n                else{\r\n                    execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula);\r\n                }\r\n            }\r\n            else if(st_r == ed_r){\r\n                isfalse = _this.singleFormulaInput(d, col_index, st_r, st_c, ed_c, formula, \"r\");\r\n            }\r\n            else if(st_c == ed_c){\r\n                isfalse = _this.singleFormulaInput(d, row_index, st_c, st_r, ed_r, formula, \"c\");\r\n            }\r\n            else{\r\n                let r_false = true;\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    r_false = _this.singleFormulaInput(d, col_index, r, st_c, ed_c, formula, \"r\", true, false) && r_false;\r\n                }\r\n\r\n                let c_false = true;\r\n                for(let c = st_c; c <= ed_c; c++){\r\n                    c_false = _this.singleFormulaInput(d, row_index, c, st_r, ed_r, formula, \"c\", true, false) && c_false;\r\n                }\r\n\r\n                isfalse = !!r_false && !!c_false;\r\n            }\r\n\r\n            isfalse = isfalse && isfalse;\r\n        }\r\n\r\n        if(!isfalse){\r\n            luckysheetformula.execFunctionExist.reverse();\r\n            luckysheetformula.execFunctionGroup(null, null, null, null, d);\r\n            jfrefreshgrid(d, Store.luckysheet_select_save);\r\n\r\n            clearTimeout(Store.jfcountfuncTimeout);\r\n            Store.jfcountfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n        }\r\n    },\r\n    getStyleByCell: function(d, r, c){\r\n        let _this = this;\r\n        let style = \"\";\r\n        \r\n        //\u4EA4\u66FF\u989C\u8272\r\n        let af_compute = alternateformat.getComputeMap();\r\n        let checksAF = alternateformat.checksAF(r, c, af_compute);\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F\r\n        let cf_compute = conditionformat.getComputeMap();\r\n        let checksCF = conditionformat.checksCF(r, c, cf_compute);\r\n\r\n        const locale_fontarray = locale().fontarray;\r\n\r\n        let cell = d[r][c];\r\n        let ct = cell.ct, isInline=false;\r\n        if(isInlineStringCell(cell)){\r\n            isInline = true;\r\n        }\r\n        for(let key in cell){\r\n            let value = _this.checkstatus(d, r, c , key);\r\n\r\n            if(checksAF != null || (checksCF != null && checksCF[\"cellColor\"] != null)){\r\n                if(checksCF != null && checksCF[\"cellColor\"] != null){\r\n                    style += \"background: \" + checksCF[\"cellColor\"] + \";\";\r\n                }\r\n                else if(checksAF != null){\r\n                    style += \"background: \" + checksAF[1] + \";\";\r\n                }\r\n            }\r\n\r\n            if(getObjType(value) == \"object\"){\r\n                continue;\r\n            }\r\n\r\n            if(key == \"bg\" || checksAF != null || (checksCF != null && checksCF[\"cellColor\"] != null)){\r\n                if(checksCF != null && checksCF[\"cellColor\"] != null){\r\n                    style += \"background: \" + checksCF[\"cellColor\"] + \";\";\r\n                }\r\n                else if(checksAF != null){\r\n                    style += \"background: \" + checksAF[1] + \";\";\r\n                }\r\n                else{\r\n                    style += \"background: \" + value + \";\";\r\n                }\r\n            }\r\n\r\n            // if(!isInline){\r\n            //     if(key == \"bl\" && value != \"0\"){\r\n            //         style += \"font-weight: bold;\";\r\n            //     }\r\n    \r\n            //     if(key == \"it\" && value != \"0\"){\r\n            //         style += \"font-style:italic;\";\r\n            //     }\r\n    \r\n            //     if(key == \"ff\" && value != \"0\"){\r\n            //         let f = value;\r\n            //         if(!isNaN(parseInt(value))){\r\n            //             f = locale_fontarray[parseInt(value)];\r\n            //         }\r\n            //         style += \"font-family: \" + f + \";\";\r\n            //     }\r\n    \r\n            //     if(key == \"fs\" && value != \"10\"){\r\n            //         style += \"font-size: \"+ value + \"pt;\";\r\n            //     }\r\n    \r\n            //     if((key == \"fc\" && value != \"#000000\") || checksAF != null || (checksCF != null && checksCF[\"textColor\"] != null)){\r\n            //         if(checksCF != null && checksCF[\"textColor\"] != null){\r\n            //             style += \"color: \" + checksCF[\"textColor\"] + \";\";\r\n            //         }\r\n            //         else if(checksAF != null){\r\n            //             style += \"color: \" + checksAF[0] + \";\";\r\n            //         }\r\n            //         else{\r\n            //             style += \"color: \" + value + \";\";  \r\n            //         }\r\n            //     }\r\n            // }\r\n\r\n            if(key == \"ht\" && value != \"1\"){\r\n                if(value == \"0\"){\r\n                    style += \"text-align: center;\";\r\n                }\r\n                else if(value == \"2\"){\r\n                    style += \"text-align: right;\";\r\n                }\r\n            }\r\n\r\n            if(key == \"vt\" && value != \"1\"){\r\n                if(value == \"0\"){\r\n                    style += \"align-items: center;\";\r\n                }\r\n                else if(value == \"2\"){\r\n                    style += \"align-items: flex-end;\";\r\n                }\r\n            }\r\n        }\r\n\r\n        if(!isInline){\r\n            style += getFontStyleByCell(cell,checksAF,checksCF);\r\n        }\r\n\r\n        return style;\r\n    },\r\n    fontSelectList:[],\r\n    defualtFont:[\"Times New Roman\",\"Arial\",\"Tahoma\",\"Verdana\",\"\u5FAE\u8F6F\u96C5\u9ED1\",\"\u5B8B\u4F53\",\"\u9ED1\u4F53\",\"\u6977\u4F53\",\"\u4EFF\u5B8B\",\"\u65B0\u5B8B\u4F53\",\"\u534E\u6587\u65B0\u9B4F\",\"\u534E\u6587\u884C\u6977\",\"\u534E\u6587\u96B6\u4E66\"],\r\n    addFontTolist:function(fontName) {\r\n        fontName = fontName.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n        let isNone = true;\r\n        for(let a=0;a<this.fontSelectList.length;a++){\r\n            let fItem = this.fontSelectList[a];\r\n            if(fItem.value == fontName){\r\n                isNone = false;\r\n                break\r\n            }\r\n        }\r\n\r\n        let  _locale = locale();\r\n        const locale_fontjson = _locale.fontjson;\r\n        if(fontName in locale_fontjson){\r\n            isNone = false;\r\n        }\r\n\r\n        if(isNone){\r\n            let ret = {};\r\n            ret.value = fontName;\r\n            ret.index = this.fontSelectList.length;\r\n            ret.type = \"userDefined\";\r\n            ret.text = \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\"+fontName+\"'>\"+fontName+\"</span>\";\r\n            ret.example = \"\";\r\n            this.fontSelectList.push(ret);\r\n\r\n            let $menuButton = $(\"#luckysheet-icon-font-family-menuButton\");\r\n            let itemset = this.createButtonMenu(this.fontSelectList);\r\n            $menuButton.html(itemset);\r\n        }\r\n    },\r\n    fontInitial:function(fontList) {\r\n        let itemdata = [];\r\n        const locale_fontarray = locale().fontarray;\r\n        for(let a=0;a<locale_fontarray.length;a++){\r\n            let fItem = locale_fontarray[a];\r\n            let ret = {};\r\n            ret.value = fItem;\r\n            ret.index = a;\r\n            ret.type = \"inner\";\r\n            ret.text = \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\"+fItem+\"'>\"+fItem+\"</span>\";\r\n            ret.example = \"\";\r\n            itemdata.push(ret);\r\n        }\r\n\r\n        if(fontList!=null){\r\n            for(let a=0;a<fontList.length;a++){\r\n                let fItem = fontList[a];\r\n                let ret = {};\r\n                ret.value = fItem.fontName;\r\n                ret.index = a;\r\n                ret.type = \"userDefined\";\r\n                ret.text = \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\"+fItem.fontName+\"'>\"+fItem.fontName+\"</span>\";\r\n                ret.example = \"\";\r\n                itemdata.push(ret);\r\n\r\n                if(document.fonts && !document.fonts.check(\"12px \"+fItem.fontName)){\r\n                    if(fItem.url){\r\n                        const fontface = new FontFace(fItem.fontName, `url(${fItem.url})`);\r\n                        document.fonts.add(fontface);\r\n                        fontface.load();\r\n                    }\r\n                }\r\n            }\r\n\r\n            document.fonts && document.fonts.ready.then(function() {\r\n                // Any operation that needs to be done only after all the fonts\r\n                // have finished loading can go here.\r\n                // console.log(\"font ready\");\r\n            });\r\n        }\r\n\r\n        this.fontSelectList = itemdata;\r\n    }\r\n}\r\n\r\nexport default menuButton;", "import { columeHeader_word, columeHeader_word_index, luckysheetdefaultFont } from '../controllers/constant';\r\nimport menuButton from '../controllers/menuButton';\r\nimport { isdatatype, isdatatypemulti } from '../global/datecontroll';\r\nimport { hasChinaword,isRealNum } from '../global/validate';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport numeral from 'numeral';\r\n// import method from '../global/method';\r\n\r\n/**\r\n * Common tool methods\r\n */\r\n\r\n/**\r\n * Determine whether a string is in standard JSON format\r\n * @param {String} str \r\n */\r\nfunction isJsonString(str) {\r\n    try {\r\n        if (typeof JSON.parse(str) == \"object\") {\r\n            return true;\r\n        }\r\n    }\r\n    catch (e) { }\r\n    return false;\r\n}\r\n\r\n\r\n/**\r\n * extend two objects\r\n * @param {Object } jsonbject1\r\n * @param {Object } jsonbject2 \r\n */\r\nfunction common_extend(jsonbject1, jsonbject2) {\r\n    let resultJsonObject = {};\r\n\r\n    for (let attr in jsonbject1) {\r\n        resultJsonObject[attr] = jsonbject1[attr];\r\n    }\r\n\r\n    for (let attr in jsonbject2) {\r\n        // undefined is equivalent to no setting\r\n        if(jsonbject2[attr] == undefined){\r\n            continue;\r\n        }\r\n        resultJsonObject[attr] = jsonbject2[attr];\r\n    }\r\n\r\n    return resultJsonObject;\r\n};\r\n\r\n// \u66FF\u6362temp\u4E2D\u7684${xxx}\u4E3A\u6307\u5B9A\u5185\u5BB9 ,temp:\u5B57\u7B26\u4E32\uFF0C\u8FD9\u91CC\u6307html\u4EE3\u7801\uFF0Cdataarry\uFF1A\u4E00\u4E2A\u5BF9\u8C61{\"xxx\":\"\u66FF\u6362\u7684\u5185\u5BB9\"}\r\n// \u4F8B\uFF1Aluckysheet.replaceHtml(\"${image}\",{\"image\":\"abc\",\"jskdjslf\":\"abc\"})   ==>  abc\r\nfunction replaceHtml(temp, dataarry) {\r\n    return temp.replace(/\\$\\{([\\w]+)\\}/g, function (s1, s2) { let s = dataarry[s2]; if (typeof (s) != \"undefined\") { return s; } else { return s1; } });\r\n};\r\n\r\n//\u83B7\u53D6\u6570\u636E\u7C7B\u578B\r\nfunction getObjType(obj) {\r\n    let toString = Object.prototype.toString;\r\n\r\n    let map = {\r\n        '[object Boolean]': 'boolean',\r\n        '[object Number]': 'number',\r\n        '[object String]': 'string',\r\n        '[object Function]': 'function',\r\n        '[object Array]': 'array',\r\n        '[object Date]': 'date',\r\n        '[object RegExp]': 'regExp',\r\n        '[object Undefined]': 'undefined',\r\n        '[object Null]': 'null',\r\n        '[object Object]': 'object'\r\n    }\r\n\r\n    // if(obj instanceof Element){\r\n    //     return 'element';\r\n    // }\r\n\r\n    return map[toString.call(obj)];\r\n}\r\n\r\n//\u83B7\u53D6\u5F53\u524D\u65E5\u671F\u65F6\u95F4\r\nfunction getNowDateTime(format) {\r\n    let now = new Date();\r\n    let year = now.getFullYear();  //\u5F97\u5230\u5E74\u4EFD\r\n    let month = now.getMonth();  //\u5F97\u5230\u6708\u4EFD\r\n    let date = now.getDate();  //\u5F97\u5230\u65E5\u671F\r\n    let day = now.getDay();  //\u5F97\u5230\u5468\u51E0\r\n    let hour = now.getHours();  //\u5F97\u5230\u5C0F\u65F6\r\n    let minu = now.getMinutes();  //\u5F97\u5230\u5206\u949F\r\n    let sec = now.getSeconds();  //\u5F97\u5230\u79D2\r\n\r\n    month = month + 1;\r\n    if (month < 10) month = \"0\" + month;\r\n    if (date < 10) date = \"0\" + date;\r\n    if (hour < 10) hour = \"0\" + hour;\r\n    if (minu < 10) minu = \"0\" + minu;\r\n    if (sec < 10) sec = \"0\" + sec;\r\n\r\n    let time = '';\r\n\r\n    //\u65E5\u671F\r\n    if(format == 1) {\r\n        time = year + \"-\" + month + \"-\" + date;\r\n    }\r\n    //\u65E5\u671F\u65F6\u95F4\r\n    else if(format == 2) {\r\n        time = year + \"-\" + month + \"-\" + date+ \" \" + hour + \":\" + minu + \":\" + sec;\r\n    }\r\n\r\n    return time;\r\n}\r\n\r\n//\u989C\u8272 16\u8FDB\u5236\u8F6Crgb\r\nfunction hexToRgb(hex) {\r\n    let color = [], rgb = [];\r\n    hex = hex.replace(/#/, \"\");\r\n\r\n    if (hex.length == 3) { // \u5904\u7406 \"#abc\" \u6210 \"#aabbcc\"\r\n        let tmp = [];\r\n\r\n        for (let i = 0; i < 3; i++) {\r\n            tmp.push(hex.charAt(i) + hex.charAt(i));\r\n        }\r\n\r\n        hex = tmp.join(\"\");\r\n    }\r\n\r\n    for (let i = 0; i < 3; i++) {\r\n        color[i] = \"0x\" + hex.substr(i + 2, 2);\r\n        rgb.push(parseInt(Number(color[i])));\r\n    }\r\n\r\n    return 'rgb(' + rgb.join(\",\") + ')';\r\n};\r\n\r\n//\u989C\u8272 rgb\u8F6C16\u8FDB\u5236\r\nfunction rgbTohex(color) {\r\n    let rgb;\r\n\r\n    if (color.indexOf(\"rgba\") > -1) {\r\n        rgb = color.replace(\"rgba(\", \"\").replace(\")\", \"\").split(',');\r\n    }\r\n    else {\r\n        rgb = color.replace(\"rgb(\", \"\").replace(\")\", \"\").split(',');\r\n    }\r\n\r\n    let r = parseInt(rgb[0]);\r\n    let g = parseInt(rgb[1]);\r\n    let b = parseInt(rgb[2]);\r\n\r\n    let hex = \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\r\n\r\n    return hex;\r\n};\r\n\r\n//\u5217\u4E0B\u6807  \u5B57\u6BCD\u8F6C\u6570\u5B57\r\nfunction ABCatNum(a) {\r\n    // abc = abc.toUpperCase();\r\n\r\n    // let abc_len = abc.length;\r\n    // if (abc_len == 0) {\r\n    //     return NaN;\r\n    // }\r\n\r\n    // let abc_array = abc.split(\"\");\r\n    // let wordlen = columeHeader_word.length;\r\n    // let ret = 0;\r\n\r\n    // for (let i = abc_len - 1; i >= 0; i--) {\r\n    //     if (i == abc_len - 1) {\r\n    //         ret += columeHeader_word_index[abc_array[i]];\r\n    //     }\r\n    //     else {\r\n    //         ret += Math.pow(wordlen, abc_len - i - 1) * (columeHeader_word_index[abc_array[i]] + 1);\r\n    //     }\r\n    // }\r\n\r\n    // return ret;\r\n    if(a==null || a.length==0){\r\n        return NaN;\r\n    }\r\n    var str=a.toLowerCase().split(\"\");\r\n    var num=0;\r\n    var al = str.length;\r\n    var getCharNumber = function(charx){\r\n        return charx.charCodeAt() -96;\r\n    };\r\n    var numout = 0;\r\n    var charnum = 0;\r\n    for(var i = 0; i < al; i++){\r\n        charnum = getCharNumber(str[i]);\r\n        numout += charnum * Math.pow(26, al-i-1);\r\n    };\r\n    // console.log(a, numout-1);\r\n    if(numout==0){\r\n        return NaN;\r\n    }\r\n    return numout-1;\r\n};\r\n\r\n//\u5217\u4E0B\u6807  \u6570\u5B57\u8F6C\u5B57\u6BCD\r\nfunction chatatABC(n) {\r\n    // let wordlen = columeHeader_word.length;\r\n\r\n    // if (index < wordlen) {\r\n    //     return columeHeader_word[index];\r\n    // }\r\n    // else {\r\n    //     let last = 0, pre = 0, ret = \"\";\r\n    //     let i = 1, n = 0;\r\n\r\n    //     while (index >= (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i++) - 1)) {\r\n    //         n = i;\r\n    //     }\r\n\r\n    //     let index_ab = index - (wordlen / (wordlen - 1)) * (Math.pow(wordlen, n - 1) - 1);//970\r\n    //     last = index_ab + 1;\r\n\r\n    //     for (let x = n; x > 0; x--) {\r\n    //         let last1 = last, x1 = x;//-702=268, 3\r\n\r\n    //         if (x == 1) {\r\n    //             last1 = last1 % wordlen;\r\n\r\n    //             if (last1 == 0) {\r\n    //                 last1 = 26;\r\n    //             }\r\n\r\n    //             return ret + columeHeader_word[last1 - 1];\r\n    //         }\r\n\r\n    //         last1 = Math.ceil(last1 / Math.pow(wordlen, x - 1));\r\n    //         //last1 = last1 % wordlen;\r\n    //         ret += columeHeader_word[last1 - 1];\r\n\r\n    //         if (x > 1) {\r\n    //             last = last - (last1 - 1) * wordlen;\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    var orda = 'a'.charCodeAt(0); \r\n   \r\n    var ordz = 'z'.charCodeAt(0); \r\n   \r\n    var len = ordz - orda + 1; \r\n   \r\n    var s = \"\"; \r\n   \r\n    while( n >= 0 ) { \r\n   \r\n        s = String.fromCharCode(n % len + orda) + s; \r\n   \r\n        n = Math.floor(n / len) - 1; \r\n   \r\n    } \r\n   \r\n    return s.toUpperCase(); \r\n};\r\n\r\nfunction ceateABC(index) {\r\n    let wordlen = columeHeader_word.length;\r\n\r\n    if (index < wordlen) {\r\n        return columeHeader_word;\r\n    }\r\n    else {\r\n        let relist = [];\r\n        let i = 2, n = 0;\r\n\r\n        while (index < (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i) - 1)) {\r\n            n = i;\r\n            i++;\r\n        }\r\n\r\n        for (let x = 0; x < n; x++) {\r\n\r\n            if (x == 0) {\r\n                relist = relist.concat(columeHeader_word);\r\n            }\r\n            else {\r\n                relist = relist.concat(createABCdim(x), index);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nfunction createABCdim(x, count) {\r\n    let chwl = columeHeader_word.length;\r\n\r\n    if (x == 1) {\r\n        let ret = [];\r\n        let c = 0, con = true;\r\n\r\n        for (let i = 0; i < chwl; i++) {\r\n            let b = columeHeader_word[i];\r\n\r\n            for (let n = 0; n < chwl; n++) {\r\n                let bq = b + columeHeader_word[n];\r\n                ret.push(bq);\r\n                c++;\r\n\r\n                if (c > index) {\r\n                    return ret;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if (x == 2) {\r\n        let ret = [];\r\n        let c = 0, con = true;\r\n\r\n        for (let i = 0; i < chwl; i++) {\r\n            let bb = columeHeader_word[i];\r\n\r\n            for (let w = 0; w < chwl; w++) {\r\n                let aa = columeHeader_word[w];\r\n\r\n                for (let n = 0; n < chwl; n++) {\r\n                    let bqa = bb + aa + columeHeader_word[n];\r\n                    ret.push(bqa);\r\n                    c++;\r\n\r\n                    if (c > index) {\r\n                        return ret;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * \u8BA1\u7B97\u5B57\u7B26\u4E32\u5B57\u8282\u957F\u5EA6\r\n * @param {*} val \u5B57\u7B26\u4E32\r\n * @param {*} subLen \u8981\u622A\u53D6\u7684\u5B57\u7B26\u4E32\u957F\u5EA6\r\n */\r\nfunction getByteLen(val,subLen) {\r\n    if(subLen === 0){\r\n        return \"\";\r\n    }\r\n\r\n    if (val == null) {\r\n        return 0;\r\n    }\r\n\r\n    let len = 0;\r\n    for (let i = 0; i < val.length; i++) {\r\n        let a = val.charAt(i);\r\n\r\n        if (a.match(/[^\\x00-\\xff]/ig) != null) {\r\n            len += 2;\r\n        }\r\n        else {\r\n            len += 1;\r\n        }\r\n\r\n        if(isRealNum(subLen) && len === ~~subLen){\r\n            return val.substring(0,i)\r\n        }\r\n\r\n    }\r\n\r\n    return len;\r\n};\r\n\r\n//\u6570\u7EC4\u53BB\u91CD\r\nfunction ArrayUnique(dataArr) {\r\n    let result = [];\r\n    let obj = {};\r\n    if (dataArr.length > 0) {\r\n        for (let i = 0; i < dataArr.length; i++) {\r\n            let item = dataArr[i];\r\n            if (!obj[item]) {\r\n                result.push(item);\r\n                obj[item] = 1;\r\n            }\r\n        }\r\n    }\r\n    return result\r\n}\r\n\r\n//\u83B7\u53D6\u5B57\u4F53\u914D\u7F6E\r\nfunction luckysheetfontformat(format) {\r\n    let fontarray = locale().fontarray;\r\n    if (getObjType(format) == \"object\") {\r\n        let font = \"\";\r\n\r\n        //font-style\r\n        if (format.it == \"0\" || format.it == null) {\r\n            font += \"normal \";\r\n        }\r\n        else {\r\n            font += \"italic \";\r\n        }\r\n\r\n        //font-variant\r\n        font += \"normal \";\r\n\r\n        //font-weight\r\n        if (format.bl == \"0\" || format.bl == null) {\r\n            font += \"normal \";\r\n        }\r\n        else {\r\n            font += \"bold \";\r\n        }\r\n\r\n        //font-size/line-height\r\n        if (!format.fs) {\r\n            font += Store.defaultFontSize + \"pt \";\r\n        }\r\n        else {\r\n            font += Math.ceil(format.fs) + \"pt \";\r\n        }\r\n\r\n        if (!format.ff) {\r\n            \r\n            font += fontarray[0] + ', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\", \"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif';\r\n        }\r\n        else {\r\n            let fontfamily = null;\r\n            let fontjson = locale().fontjson;\r\n            if (isdatatypemulti(format.ff)[\"num\"]) {\r\n                fontfamily = fontarray[parseInt(format.ff)];\r\n            }\r\n            else {\r\n\r\n                // fontfamily = fontarray[fontjson[format.ff]];\r\n                fontfamily = format.ff;\r\n\r\n                fontfamily = fontfamily.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n\r\n                if(fontfamily.indexOf(\" \")>-1){\r\n                    fontfamily = '\"' + fontfamily + '\"';\r\n                }\r\n\r\n                if(fontfamily!=null && document.fonts && !document.fonts.check(\"12px \"+fontfamily)){\r\n                    menuButton.addFontTolist(fontfamily);\r\n                }\r\n            }\r\n\r\n            if (fontfamily == null) {\r\n                fontfamily = fontarray[0];\r\n            }\r\n\r\n            font += fontfamily + ', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\", \"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif';\r\n        }\r\n\r\n        return font;\r\n    }\r\n    else {\r\n        return luckysheetdefaultFont();\r\n    }\r\n}\r\n\r\n//\u53F3\u952E\u83DC\u5355\r\nfunction showrightclickmenu($menu, x, y) {\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let menuW = $menu.width(), menuH = $menu.height();\r\n    let top = y, left = x;\r\n\r\n    if (x + menuW > winW) {\r\n        left = x - menuW;\r\n    }\r\n\r\n    if (y + menuH > winH) {\r\n        top = y - menuH;\r\n    }\r\n\r\n    if (top < 0) {\r\n        top = 0;\r\n    }\r\n\r\n    $menu.css({ \"top\": top, \"left\": left }).show();\r\n}\r\n\r\n//\u5355\u5143\u683C\u7F16\u8F91\u805A\u7126\r\nfunction luckysheetactiveCell() {\r\n    if (!!Store.fullscreenmode) {\r\n        setTimeout(function () {\r\n            $(\"#luckysheet-rich-text-editor\").focus().select();\r\n        }, 50);\r\n    }\r\n}\r\n\r\n//\u5355\u5143\u683C\u7F16\u8F91\u805A\u7126\r\nfunction luckysheetContainerFocus() {\r\n    // $(\"#\" + Store.container).focus({ \r\n    //     preventScroll: true \r\n    // });\r\n    \r\n    // fix jquery error: Uncaught TypeError: ((n.event.special[g.origType] || {}).handle || g.handler).apply is not a function\r\n\r\n    $(\"#\" + Store.container).attr(\"tabindex\", 0).focus();\r\n}\r\n\r\n//\u6570\u5B57\u683C\u5F0F\r\nfunction numFormat(num, type) {\r\n    if (num == null || isNaN(parseFloat(num)) || hasChinaword(num) || num == -Infinity || num == Infinity) {\r\n        return null;\r\n    }\r\n\r\n    let floatlen = 6, ismustfloat = false;\r\n    if (type == null || type == \"auto\") {\r\n        if (num < 1) {\r\n            floatlen = 6;\r\n        }\r\n        else {\r\n            floatlen = 1;\r\n        }\r\n    }\r\n    else {\r\n        if (isdatatype(type) == \"num\") {\r\n            floatlen = parseInt(type);\r\n            ismustfloat = true;\r\n        }\r\n        else {\r\n            floatlen = 6;\r\n        }\r\n    }\r\n\r\n    let format = \"\", value = null;\r\n    for (let i = 0; i < floatlen; i++) {\r\n        format += \"0\";\r\n    }\r\n\r\n    if (!ismustfloat) {\r\n        format = \"[\" + format + \"]\";\r\n    }\r\n\r\n    if (num >= 1e+21) {\r\n        value = parseFloat(numeral(num).value());\r\n    }\r\n    else {\r\n        value = parseFloat(numeral(num).format(\"0.\" + format));\r\n    }\r\n\r\n    return value;\r\n}\r\n\r\nfunction numfloatlen(n) {\r\n    if (n != null && !isNaN(parseFloat(n)) && !hasChinaword(n)) {\r\n        let value = numeral(n).value();\r\n        let lens = value.toString().split(\".\");\r\n\r\n        if (lens.length == 1) {\r\n            lens = 0;\r\n        }\r\n        else {\r\n            lens = lens[1].length;\r\n        }\r\n\r\n        return lens;\r\n    }\r\n    else {\r\n        return null;\r\n    }\r\n}\r\n\r\n//\u4E8C\u7EA7\u83DC\u5355\u663E\u793A\u4F4D\u7F6E\r\nfunction mouseclickposition($menu, x, y, p) {\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let menuW = $menu.width(), menuH = $menu.height();\r\n    let top = y, left = x;\r\n\r\n    if (p == null) {\r\n        p = \"lefttop\";\r\n    }\r\n\r\n    if (p == \"lefttop\") {\r\n        $menu.css({ \"top\": y, \"left\": x }).show();\r\n    }\r\n    else if (p == \"righttop\") {\r\n        $menu.css({ \"top\": y, \"left\": x - menuW }).show();\r\n    }\r\n    else if (p == \"leftbottom\") {\r\n        $menu.css({ \"bottom\": winH - y - 12, \"left\": x }).show();\r\n    }\r\n    else if (p == \"rightbottom\") {\r\n        $menu.css({ \"bottom\": winH - y - 12, \"left\": x - menuW }).show();\r\n    }\r\n}\r\n\r\n/**\r\n * \u5143\u7D20\u9009\u62E9\u5668\r\n * @param {String}  selector css\u9009\u62E9\u5668\r\n * @param {String}  context  \u6307\u5B9A\u7236\u7EA7DOM\r\n */\r\nfunction $$(selector, context) {\r\n    context = context || document\r\n    var elements = context.querySelectorAll(selector)\r\n    return elements.length == 1\r\n        ? Array.prototype.slice.call(elements)[0]\r\n        : Array.prototype.slice.call(elements)\r\n}\r\n\r\n/** \r\n * \u4E32\u884C\u52A0\u8F7D\u6307\u5B9A\u7684\u811A\u672C\r\n * \u4E32\u884C\u52A0\u8F7D[\u5F02\u6B65]\u9010\u4E2A\u52A0\u8F7D\uFF0C\u6BCF\u4E2A\u52A0\u8F7D\u5B8C\u6210\u540E\u52A0\u8F7D\u4E0B\u4E00\u4E2A\r\n * \u5168\u90E8\u52A0\u8F7D\u5B8C\u6210\u540E\u6267\u884C\u56DE\u8C03\r\n * @param {Array|String}  scripts \u6307\u5B9A\u8981\u52A0\u8F7D\u7684\u811A\u672C\r\n * @param {Object} options \u5C5E\u6027\u8BBE\u7F6E\r\n * @param {Function} callback \u6210\u529F\u540E\u56DE\u8C03\u7684\u51FD\u6570\r\n * @return {Array} \u6240\u6709\u751F\u6210\u7684\u811A\u672C\u5143\u7D20\u5BF9\u8C61\u6570\u7EC4\r\n */\r\n\r\nfunction seriesLoadScripts(scripts, options, callback) {\r\n    if (typeof (scripts) !== 'object') {\r\n        var scripts = [scripts];\r\n    }\r\n    var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;\r\n    var s = [];\r\n    var last = scripts.length - 1;\r\n    //\u9012\u5F52\r\n    var recursiveLoad = function (i) {\r\n        s[i] = document.createElement('script');\r\n        s[i].setAttribute('type', 'text/javascript');\r\n        // Attach handlers for all browsers\r\n        // \u5F02\u6B65\r\n        s[i].onload = s[i].onreadystatechange = function () {\r\n            if (!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {\r\n                this.onload = this.onreadystatechange = null;\r\n                this.parentNode.removeChild(this);\r\n                if (i !== last) {\r\n                    recursiveLoad(i + 1);\r\n                } else if (typeof (callback) === 'function') {\r\n                    callback()\r\n                };\r\n            }\r\n        }\r\n        // \u540C\u6B65\r\n        s[i].setAttribute('src', scripts[i]);\r\n\r\n        // \u8BBE\u7F6E\u5C5E\u6027\r\n        if (typeof options === 'object') {\r\n            for (var attr in options) {\r\n                s[i].setAttribute(attr, options[attr]);\r\n            }\r\n        }\r\n\r\n        HEAD.appendChild(s[i]);\r\n    };\r\n    recursiveLoad(0);\r\n}\r\n\r\n\r\n/**\r\n * \u5E76\u884C\u52A0\u8F7D\u6307\u5B9A\u7684\u811A\u672C\r\n * \u5E76\u884C\u52A0\u8F7D[\u540C\u6B65]\u540C\u65F6\u52A0\u8F7D\uFF0C\u4E0D\u7BA1\u4E0A\u4E2A\u662F\u5426\u52A0\u8F7D\u5B8C\u6210\uFF0C\u76F4\u63A5\u52A0\u8F7D\u5168\u90E8\r\n * \u5168\u90E8\u52A0\u8F7D\u5B8C\u6210\u540E\u6267\u884C\u56DE\u8C03\r\n * @param {Array|String}  scripts \u6307\u5B9A\u8981\u52A0\u8F7D\u7684\u811A\u672C\r\n * @param {Object} options \u5C5E\u6027\u8BBE\u7F6E\r\n * @param {Function} callback \u6210\u529F\u540E\u56DE\u8C03\u7684\u51FD\u6570\r\n * @return {Array} \u6240\u6709\u751F\u6210\u7684\u811A\u672C\u5143\u7D20\u5BF9\u8C61\u6570\u7EC4\r\n */\r\n\r\nfunction parallelLoadScripts(scripts, options, callback) {\r\n    if (typeof (scripts) !== 'object') {\r\n        var scripts = [scripts];\r\n    }\r\n    var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;\r\n    var s = [];\r\n    var loaded = 0;\r\n    for (var i = 0; i < scripts.length; i++) {\r\n        s[i] = document.createElement('script');\r\n        s[i].setAttribute('type', 'text/javascript');\r\n        // Attach handlers for all browsers\r\n        // \u5F02\u6B65\r\n        s[i].onload = s[i].onreadystatechange = function () {\r\n            if (!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {\r\n                loaded++;\r\n                this.onload = this.onreadystatechange = null;\r\n                this.parentNode.removeChild(this);\r\n                if (loaded === scripts.length && typeof (callback) === 'function') callback();\r\n            }\r\n        };\r\n        // \u540C\u6B65\r\n        s[i].setAttribute('src', scripts[i]);\r\n\r\n        // \u8BBE\u7F6E\u5C5E\u6027\r\n        if (typeof options === 'object') {\r\n            for (var attr in options) {\r\n                s[i].setAttribute(attr, options[attr]);\r\n            }\r\n        }\r\n\r\n        HEAD.appendChild(s[i]);\r\n    }\r\n}\r\n\r\n/**\r\n* \u52A8\u6001\u6DFB\u52A0css\r\n* @param {String}  url \u6307\u5B9A\u8981\u52A0\u8F7D\u7684css\u5730\u5740\r\n*/\r\nfunction loadLink(url) {\r\n    var doc = document;\r\n    var link = doc.createElement(\"link\");\r\n    link.setAttribute(\"rel\", \"stylesheet\");\r\n    link.setAttribute(\"type\", \"text/css\");\r\n    link.setAttribute(\"href\", url);\r\n\r\n    var heads = doc.getElementsByTagName(\"head\");\r\n    if (heads.length) {\r\n        heads[0].appendChild(link);\r\n    }\r\n    else {\r\n        doc.documentElement.appendChild(link);\r\n    }\r\n}\r\n\r\n/**\r\n* \u52A8\u6001\u6DFB\u52A0\u4E00\u7EC4css\r\n* @param {String}  url \u6307\u5B9A\u8981\u52A0\u8F7D\u7684css\u5730\u5740\r\n*/\r\nfunction loadLinks(urls) {\r\n    if (typeof (urls) !== 'object') {\r\n        urls = [urls];\r\n    }\r\n    if (urls.length) {\r\n        urls.forEach(url => {\r\n            loadLink(url);\r\n        });\r\n    }\r\n}\r\n\r\nfunction transformRangeToAbsolute(txt1){\r\n    if(txt1 ==null ||txt1.length==0){\r\n        return null;\r\n    }\r\n\r\n    let txtArray = txt1.split(\",\");\r\n    let ret = \"\";\r\n    for(let i=0;i<txtArray.length;i++){\r\n        let txt = txtArray[i];\r\n        let txtSplit = txt.split(\"!\"), sheetName=\"\", rangeTxt=\"\";\r\n        if(txtSplit.length>1){\r\n            sheetName = txtSplit[0];\r\n            rangeTxt = txtSplit[1];\r\n        }\r\n        else{\r\n            rangeTxt = txtSplit[0];\r\n        }\r\n\r\n        let rangeTxtArray = rangeTxt.split(\":\");\r\n\r\n        let rangeRet = \"\";\r\n        for(let a=0;a<rangeTxtArray.length;a++){\r\n            let t = rangeTxtArray[a];\r\n\r\n            let row = t.replace(/[^0-9]/g, \"\");\r\n            let col = t.replace(/[^A-Za-z]/g, \"\");\r\n            let rangeTT = \"\"\r\n            if(col!=\"\"){\r\n                rangeTT += \"$\" + col;\r\n            }\r\n\r\n            if(row!=\"\"){\r\n                rangeTT += \"$\" + row;\r\n            }\r\n\r\n            rangeRet+=rangeTT+\":\";\r\n        }\r\n\r\n        rangeRet = rangeRet.substr(0, rangeRet.length-1);\r\n\r\n        ret += sheetName + rangeRet + \",\";\r\n    }\r\n\r\n    return ret.substr(0, ret.length-1); \r\n}\r\n\r\nfunction openSelfModel(id, isshowMask=true){\r\n    let $t = $(\"#\"+id)\r\n            .find(\".luckysheet-modal-dialog-content\")\r\n            .css(\"min-width\", 300)\r\n            .end(), \r\n        myh = $t.outerHeight(), \r\n        myw = $t.outerWidth();\r\n    let winw = $(window).width(), winh = $(window).height();\r\n    let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n    $t.css({ \r\n    \"left\": (winw + scrollLeft - myw) / 2, \r\n    \"top\": (winh + scrollTop - myh) / 3 \r\n    }).show();\r\n\r\n    if(isshowMask){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n    }\r\n}\r\n\r\n/**\r\n * \u76D1\u63A7\u5BF9\u8C61\u53D8\u66F4\r\n * @param {*} data \r\n */\r\n// const createProxy = (data,list=[]) => {\r\n//     if (typeof data === 'object' && data.toString() === '[object Object]') {\r\n//       for (let k in data) {\r\n//         if(list.includes(k)){\r\n//             if (typeof data[k] === 'object') {\r\n//               defineObjectReactive(data, k, data[k])\r\n//             } else {\r\n//               defineBasicReactive(data, k, data[k])\r\n//             }\r\n//         }\r\n//       }\r\n//     }\r\n// }\r\n\r\nconst createProxy = (data, k, callback) => {\r\n    if(!data.hasOwnProperty(k)){ \r\n        console.info('No %s in data',k);\r\n        return; \r\n    };\r\n\r\n    if (getObjType(data) === 'object') {\r\n        if (getObjType(data[k]) === 'object' || getObjType(data[k]) === 'array') {\r\n            defineObjectReactive(data, k, data[k], callback)\r\n        } else {\r\n            defineBasicReactive(data, k, data[k], callback)\r\n        }\r\n    }\r\n}\r\n  \r\nfunction defineObjectReactive(obj, key, value, callback) {\r\n    // \u9012\u5F52\r\n    obj[key] = new Proxy(value, {\r\n      set(target, property, val, receiver) {\r\n        \r\n          setTimeout(() => {\r\n            callback(target, property, val, receiver);\r\n          }, 0);\r\n\r\n        return Reflect.set(target, property, val, receiver)\r\n      }\r\n    })\r\n}\r\n  \r\nfunction defineBasicReactive(obj, key, value, callback) {\r\n    Object.defineProperty(obj, key, {\r\n      enumerable: true,\r\n      configurable: false,\r\n      get() {\r\n        return value\r\n      },\r\n      set(newValue) {\r\n        if (value === newValue) return\r\n        console.log(`\u53D1\u73B0 ${key} \u5C5E\u6027 ${value} -> ${newValue}`)\r\n\r\n        setTimeout(() => {\r\n            callback(value,newValue);\r\n        }, 0);\r\n\r\n        value = newValue\r\n\r\n      }\r\n    })\r\n}\r\n\r\n/**\r\n * Remove an item in the specified array\r\n * @param {array} array Target array \r\n * @param {string} item What needs to be removed\r\n */\r\nfunction arrayRemoveItem(array, item) {\r\n    array.some((curr, index, arr)=>{\r\n        if(curr === item){\r\n            arr.splice(index, 1);\r\n            return curr === item;\r\n        }\r\n    })\r\n}\r\n\r\n/**\r\n * camel \u5F62\u5F0F\u7684\u5355\u8BCD\u8F6C\u6362\u4E3A - \u5F62\u5F0F \u5982 fillColor -> fill-color\r\n * @param {string} camel camel \u5F62\u5F0F\r\n * @returns\r\n */\r\n function camel2split(camel) {\r\n    return camel.replace(/([A-Z])/g, function(all, group) {\r\n        return '-' + group.toLowerCase();\r\n    });\r\n}\r\n  \r\nexport {\r\n    isJsonString,\r\n    common_extend,\r\n    replaceHtml,\r\n    getObjType,\r\n    getNowDateTime,\r\n    hexToRgb,\r\n    rgbTohex,\r\n    ABCatNum,\r\n    chatatABC,\r\n    ceateABC,\r\n    createABCdim,\r\n    getByteLen,\r\n    ArrayUnique,\r\n    luckysheetfontformat,\r\n    showrightclickmenu,\r\n    luckysheetactiveCell,\r\n    numFormat,\r\n    numfloatlen,\r\n    mouseclickposition,\r\n    $$,\r\n    seriesLoadScripts,\r\n    parallelLoadScripts,\r\n    loadLinks,\r\n    luckysheetContainerFocus,\r\n    transformRangeToAbsolute,\r\n    openSelfModel,\r\n    createProxy,\r\n    arrayRemoveItem,\r\n    camel2split\r\n}", "import { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport { selectHightlightShow } from './select';\r\nimport menuButton from './menuButton';\r\nimport luckysheetFreezen from './freezen';\r\nimport Store from '../store';\r\n\r\n//\u8BBE\u5907\u662F\u79FB\u52A8\u7AEF\r\nexport default function mobileinit(){\r\n    //\u53BB\u9664\u6EDA\u52A8\u6761\r\n    Store.cellMainSrollBarSize = 0;\r\n\r\n    //\u6ED1\u52A8\u6EDA\u52A8\u8868\u683C\r\n    let luckysheet_touchmove_status = false,\r\n        luckysheet_touchmove_startPos = {},\r\n        luckysheet_touchhandle_status = false,\r\n        _scrollTimer = null;\r\n    $(document).on(\"touchstart\", \"#luckysheet-grid-window-1\", function(event){\r\n        clearInterval(_scrollTimer);//clear timer\r\n        luckysheet_touchmove_status = true;\r\n\r\n        let touch = event.originalEvent.targetTouches[0];\r\n        luckysheet_touchmove_startPos = {\r\n            x: touch.pageX,\r\n            y: touch.pageY,\r\n            vy:0, //vy\u53EF\u4EE5\u7406\u89E3\u4E3A\u6ED1\u52A8\u7684\u529B\u5EA6\r\n            moveType:\"y\",\r\n        }\r\n    })\r\n    $(document).on(\"touchmove\", \"#luckysheet-grid-window-1\", function(event){\r\n        if(event.originalEvent.targetTouches.length > 1 || (event.scale && event.scale !== 1)){\r\n            return;\r\n        }\r\n\r\n        let touch = event.originalEvent.targetTouches[0];\r\n\r\n        if(luckysheet_touchmove_status){//\u6EDA\u52A8\r\n            let slideX = touch.pageX - luckysheet_touchmove_startPos.x;\r\n            let slideY = touch.pageY - luckysheet_touchmove_startPos.y;\r\n\r\n            luckysheet_touchmove_startPos.x = touch.pageX;\r\n            luckysheet_touchmove_startPos.y = touch.pageY;\r\n\r\n            let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n\r\n            // console.log(\"start\",scrollTop, slideY,touch.pageY);\r\n\r\n            scrollLeft -= slideX;\r\n            scrollTop -= slideY;\r\n\r\n            // console.log(touch,touch.pageY, luckysheet_touchmove_startPos.y, slideY);\r\n\r\n            if(scrollLeft < 0){\r\n                scrollLeft = 0;\r\n            }\r\n\r\n            if(scrollTop < 0){\r\n                scrollTop = 0;\r\n            }\r\n            \r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n\r\n            luckysheet_touchmove_startPos.vy_y = slideY;\r\n            luckysheet_touchmove_startPos.scrollTop = scrollTop;\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n\r\n            luckysheet_touchmove_startPos.vy_x = slideX;\r\n\r\n            luckysheet_touchmove_startPos.scrollLeft = scrollLeft;\r\n   \r\n\r\n        }\r\n        else if(luckysheet_touchhandle_status){//\u9009\u533A\r\n            let mouse = mouseposition(touch.pageX, touch.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y), \r\n                row = row_location[1], \r\n                row_pre = row_location[0], \r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x), \r\n                col = col_location[1], \r\n                col_pre = col_location[0], \r\n                col_index = col_location[2];\r\n\r\n            let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n\r\n            let top = 0, height = 0, rowseleted = [];\r\n            if (last.top > row_pre) {\r\n                top = row_pre;\r\n                height = last.top + last.height - row_pre;\r\n\r\n                if(last.row[1] > last.row_focus){\r\n                    last.row[1] = last.row_focus;\r\n                }\r\n\r\n                rowseleted = [row_index, last.row[1]];\r\n            }\r\n            else if (last.top == row_pre) {\r\n                top = row_pre;\r\n                height = last.top + last.height - row_pre;\r\n                rowseleted = [row_index, last.row[0]];\r\n            }\r\n            else {\r\n                top = last.top;\r\n                height = row - last.top - 1;\r\n\r\n                if(last.row[0] < last.row_focus){\r\n                    last.row[0] = last.row_focus;\r\n                }\r\n\r\n                rowseleted = [last.row[0], row_index];\r\n            }\r\n\r\n            let left = 0, width = 0, columnseleted = [];\r\n            if (last.left > col_pre) {\r\n                left = col_pre;\r\n                width = last.left + last.width - col_pre;\r\n\r\n                if(last.column[1] > last.column_focus){\r\n                    last.column[1] = last.column_focus;\r\n                }\r\n\r\n                columnseleted = [col_index, last.column[1]];\r\n            }\r\n            else if (last.left == col_pre) {\r\n                left = col_pre;\r\n                width = last.left + last.width - col_pre;\r\n                columnseleted = [col_index, last.column[0]];\r\n            }\r\n            else {\r\n                left = last.left;\r\n                width = col - last.left - 1;\r\n\r\n                if(last.column[0] < last.column_focus){\r\n                    last.column[0] = last.column_focus;\r\n                }\r\n\r\n                columnseleted = [last.column[0], col_index];\r\n            }\r\n\r\n            let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n            if(changeparam != null){\r\n                columnseleted = changeparam[0];\r\n                rowseleted= changeparam[1];\r\n                top = changeparam[2];\r\n                height = changeparam[3];\r\n                left = changeparam[4];\r\n                width = changeparam[5];\r\n            }\r\n\r\n            last[\"row\"] = rowseleted;\r\n            last[\"column\"] = columnseleted;\r\n\r\n            last[\"left_move\"] = left;\r\n            last[\"width_move\"] = width;\r\n            last[\"top_move\"] = top;\r\n            last[\"height_move\"] = height;\r\n\r\n            Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n            selectHightlightShow();\r\n            \r\n            luckysheetFreezen.scrollFreezen();\r\n        }\r\n\r\n        event.stopPropagation();\r\n    })\r\n    $(document).on(\"touchend\", function(event){\r\n        if(luckysheet_touchmove_status){\r\n            let vy_x = Math.abs(luckysheet_touchmove_startPos.vy_x), friction_x = ((vy_x >> 31) * 2 + 1) * 0.25;\r\n\r\n            let vy_y = Math.abs(luckysheet_touchmove_startPos.vy_y), friction_y = ((vy_y >> 31) * 2 + 1) * 0.25;\r\n            if(vy_x>0 || vy_y>0){\r\n                _scrollTimer = setInterval(function () {//\r\n                    vy_x -= friction_x;//\u529B\u5EA6\u6309 \u60EF\u6027\u7684\u5927\u5C0F\u9012\u51CF\r\n                    vy_y -= friction_y;//\u529B\u5EA6\u6309 \u60EF\u6027\u7684\u5927\u5C0F\u9012\u51CF\r\n\r\n                    if(vy_x<=0){\r\n                        vy_x = 0;\r\n                    }\r\n                    if(vy_y<=0){\r\n                        vy_y = 0;\r\n                    }\r\n         \r\n                    if(luckysheet_touchmove_startPos.vy_y>0){\r\n                        luckysheet_touchmove_startPos.scrollTop -= vy_y;\r\n                    }\r\n                    else{\r\n                        luckysheet_touchmove_startPos.scrollTop += vy_y;\r\n                    }\r\n            \r\n                    $(\"#luckysheet-scrollbar-y\").scrollTop(luckysheet_touchmove_startPos.scrollTop);\r\n            \r\n                    if(luckysheet_touchmove_startPos.vy_x>0){\r\n                        luckysheet_touchmove_startPos.scrollLeft -= vy_x;\r\n                    }\r\n                    else{\r\n                        luckysheet_touchmove_startPos.scrollLeft += vy_x;\r\n                    }\r\n            \r\n                    $(\"#luckysheet-scrollbar-x\").scrollLeft(luckysheet_touchmove_startPos.scrollLeft);\r\n         \r\n                    if(vy_x<=0 && vy_y<=0){\r\n                        clearInterval(_scrollTimer);\r\n                    }\r\n                }, 20); \r\n            }\r\n\r\n        }\r\n        luckysheet_touchmove_status = false;\r\n        // luckysheet_touchmove_startPos = {};\r\n\r\n        luckysheet_touchhandle_status = false;\r\n    })\r\n\r\n    //\u6ED1\u52A8\u9009\u62E9\u9009\u533A\r\n    $(document).on(\"touchstart\", \".luckysheet-cs-touchhandle\", function(event){\r\n        luckysheet_touchhandle_status = true;\r\n        luckysheet_touchmove_status = false;\r\n        // console.log(1111111111);\r\n        event.stopPropagation();\r\n    })  \r\n\r\n    //\u7981\u6B62\u5FAE\u4FE1\u4E0B\u62C9\u62D6\u51FA\u5FAE\u4FE1\u80CC\u666F\r\n    document.addEventListener(\"touchmove\", function(event){\r\n        event.preventDefault();\r\n    }, {\r\n        passive: false\r\n    })\r\n}", "import { replaceHtml } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//\u5206\u5217\r\nconst luckysheetSplitColumn = {\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_splitText = _locale.splitText;\r\n        const locale_punctuation = _locale.punctuation;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-splitColumn-dialog\").remove();\r\n\r\n        let content = '<div class=\"box\">' +\r\n                        '<div class=\"boxTitle\">'+locale_splitText.splitDelimiters+'</div>' +\r\n                        '<div class=\"boxMain\">' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_01\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_01\">'+ locale_punctuation.tab +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_02\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_02\">'+ locale_punctuation.semicolon +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_03\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_03\">'+ locale_punctuation.comma +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_04\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_04\">'+ locale_punctuation.space +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_05\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_05\">'+ locale_splitText.splitOther +'</label>' +\r\n                                '<input type=\"text\" class=\"formulaInputFocus\" maxlength=\"1\"/>' +\r\n                            '</div>' +\r\n                        '</div>' +\r\n                        '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                            '<input id=\"splitColumn_type_06\" type=\"checkbox\"/>' +\r\n                            '<label for=\"splitColumn_type_06\">'+ locale_splitText.splitContinueSymbol +'</label>' +\r\n                        '</div>' +\r\n                        '<div class=\"boxTitle\" style=\"margin-top: 10px;\">'+ locale_splitText.splitDataPreview +'</div>' +\r\n                        '<div class=\"boxMain\" id=\"splitColumnData\">' +\r\n\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-splitColumn-dialog\", \r\n            \"addclass\": \"luckysheet-splitColumn-dialog\", \r\n            \"title\": locale_splitText.splitTextTitle, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-splitColumn-dialog-confirm\" class=\"btn btn-primary\">'+ locale_button.confirm +'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+ locale_button.cancel +'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-splitColumn-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-splitColumn-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n\r\n        let dataArr = _this.getDataArr();\r\n        _this.dataPreview(dataArr);\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_splitText = _locale.splitText;\r\n\r\n        //\u6570\u636E\u9884\u89C8\r\n        $(document).off(\"change.SPCinpcheckbox\").on(\"change.SPCcheckbox\", \"#luckysheet-splitColumn-dialog .box input[type='checkbox']\", function(){\r\n            let regStr = _this.getRegStr();\r\n            let dataArr = _this.getDataArr(regStr);\r\n            _this.dataPreview(dataArr);\r\n        });\r\n        $(document).off(\"keyup.SPCinptext\").on(\"keyup.SPCinptext\", \"#luckysheet-splitColumn-dialog .box input[type='text']\", function(){\r\n            if($(this).siblings(\"input[type='checkbox']\").is(\":checked\")){\r\n                let regStr = _this.getRegStr();\r\n                let dataArr = _this.getDataArr(regStr);\r\n                _this.dataPreview(dataArr);\r\n            }\r\n        })\r\n\r\n        //\u786E\u5B9A\u6309\u94AE\r\n        $(document).off(\"click.SPCconfirm\").on(\"click.SPCconfirm\", \"#luckysheet-splitColumn-dialog #luckysheet-splitColumn-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-splitColumn-dialog\").hide();\r\n\r\n            let regStr = _this.getRegStr();\r\n            let dataArr = _this.getDataArr(regStr);\r\n\r\n            let r = Store.luckysheet_select_save[0].row[0];\r\n            let c = Store.luckysheet_select_save[0].column[0];\r\n\r\n            if(dataArr[0].length == 1){\r\n                return;\r\n            }\r\n\r\n            let dataCover = false;\r\n            for(let i = 0; i < dataArr.length; i++){\r\n                for(let j = 1; j < dataArr[0].length; j++){\r\n                    let cell = Store.flowdata[r + i][c + j];\r\n\r\n                    if(cell != null && cell.v != null){\r\n                        dataCover = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(dataCover){\r\n                let func1 = function(){\r\n                    _this.update(r, c, dataArr);\r\n                } \r\n\r\n                tooltip.confirm(\"\", locale_splitText.splitConfirmToExe, func1);\r\n            }\r\n            else{\r\n                _this.update(r, c, dataArr);\r\n            }\r\n        });\r\n    },\r\n    update: function(r, c, dataArr){\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            for(let j = 0; j < dataArr[0].length; j++){\r\n                let v = dataArr[i][j];\r\n                setcellvalue(r + i, c + j, d, v);\r\n            }\r\n        }\r\n\r\n        let st_r = Store.luckysheet_select_save[0].row[0], \r\n            st_c = Store.luckysheet_select_save[0].column[0];\r\n\r\n        let range = [{ \"row\": [st_r, st_r + dataArr.length - 1], \"column\": [st_c, st_c + dataArr[0].length - 1] }]\r\n\r\n        jfrefreshgrid(d, range);\r\n        selectHightlightShow();\r\n    },\r\n    dataPreview: function(dataArr){\r\n        $(\"#luckysheet-splitColumn-dialog #splitColumnData\").empty();\r\n\r\n        let trHtml = '';\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            let tdHtml = '';\r\n\r\n            for(let j = 0; j < dataArr[0].length; j++){\r\n                tdHtml += '<td>' + dataArr[i][j] + '</td>';\r\n            }\r\n\r\n            trHtml += '<tr>' + tdHtml + '</tr>';\r\n        }\r\n\r\n        let tableHtml = '<table>' + trHtml + '</table>';\r\n\r\n        $(\"#luckysheet-splitColumn-dialog #splitColumnData\").append(tableHtml);\r\n    },\r\n    getRegStr: function(){\r\n        let regStr = '', mark = 0;\r\n\r\n        $(\"#luckysheet-splitColumn-dialog .box input[type='checkbox']:checked\").each(function(i, e){\r\n            let $id = $(e).attr(\"id\");\r\n\r\n            if($id == \"splitColumn_type_01\"){ //Tab\u952E\r\n                regStr += \"\\\\t\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_02\"){ //\u5206\u53F7\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \";\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_03\"){ //\u9017\u53F7\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \",\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_04\"){ //\u7A7A\u683C\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \"\\\\s\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_05\"){ //\u5176\u5B83\r\n                let txt = $(e).siblings(\"input[type='text']\").val().trim();\r\n\r\n                if(txt != \"\"){\r\n                    if(mark > 0){\r\n                        regStr += \"|\";\r\n                    }\r\n\r\n                    regStr += txt;\r\n                }\r\n            }\r\n            else if($id == \"splitColumn_type_06\"){ //\u8FDE\u7EED\u5206\u9694\u7B26\u53F7\u89C6\u4E3A\u5355\u4E2A\u5904\u7406\r\n                regStr = \"[\" + regStr + \"]+\";\r\n            }\r\n        })\r\n\r\n        return regStr;\r\n    },\r\n    getDataArr: function(regStr){\r\n        let _this = this;\r\n\r\n        let arr = [];\r\n\r\n        let r1 = Store.luckysheet_select_save[0].row[0];\r\n        let r2 = Store.luckysheet_select_save[0].row[1];\r\n        let c = Store.luckysheet_select_save[0].column[0];\r\n\r\n        if(regStr != null && regStr != \"\"){\r\n            let reg = new RegExp(regStr, \"g\");\r\n\r\n            let dataArr = [];\r\n\r\n            for(let r = r1; r <= r2; r++){\r\n                let rowArr = [];\r\n\r\n                let cell = Store.flowdata[r][c];\r\n\r\n                let value;\r\n                if(cell != null && cell[\"m\"] != null){\r\n                    value = cell[\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(r, c, Store.flowdata);\r\n                }\r\n\r\n                if(value == null){\r\n                    value = \"\";\r\n                }\r\n\r\n                rowArr = value.toString().split(reg);\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n\r\n            let rlen = dataArr.length;\r\n            let clen = 0;\r\n\r\n            for(let i = 0; i < rlen; i++){\r\n                if(dataArr[i].length > clen){\r\n                    clen = dataArr[i].length;\r\n                }\r\n            }\r\n\r\n            arr = _this.getNullData(rlen, clen);\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                for(let j = 0; j < arr[0].length; j++){\r\n                    if(dataArr[i][j] != null){\r\n                        arr[i][j] = dataArr[i][j];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let r = r1; r <= r2; r++){\r\n                let rowArr = [];\r\n\r\n                let cell = Store.flowdata[r][c];\r\n\r\n                let value;\r\n                if(cell != null && cell[\"m\"] != null){\r\n                    value = cell[\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(r, c, Store.flowdata);\r\n                }\r\n\r\n                if(value == null){\r\n                    value = \"\";\r\n                }\r\n\r\n                rowArr.push(value);\r\n\r\n                arr.push(rowArr);\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    getNullData: function(rlen, clen){\r\n        let arr = [];\r\n\r\n        for(let r = 0; r < rlen; r++){\r\n            let rowArr = [];\r\n\r\n            for(let c = 0; c < clen; c++){\r\n                rowArr.push(\"\");\r\n            }\r\n\r\n            arr.push(rowArr);\r\n        }\r\n\r\n        return arr;\r\n    }\r\n}\r\n\r\nexport default luckysheetSplitColumn;", "import Store from '../store';\r\nimport { replaceHtml,transformRangeToAbsolute,openSelfModel } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport sheetmanage from './sheetmanage';\r\nimport menuButton from './menuButton';\r\nimport {checkProtectionNotEnable} from './protection';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport locale from '../locale/locale';\r\nimport { setcellvalue } from '../global/setdata';\r\n\r\n\r\nlet isInitialCellFormatModel = false;\r\n\r\nfunction initialCellFormatModelEvent(){\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n\r\n    $(\"#luckysheet-cellFormat-confirm\").click(function(){\r\n        let locked = $(\"#luckysheet-protection-check-locked\").is(':checked');\r\n        let hidden = $(\"#luckysheet-protection-check-hidden\").is(':checked');\r\n    \r\n        locked = locked==true?1:0;\r\n        hidden = hidden==true?1:0;\r\n\r\n        let d = recycleSeletion(\r\n            function(cell, r, c, data){\r\n                if(cell==null){\r\n                    setcellvalue(r, c, data, {\r\n                        lo:locked,\r\n                        hi:hidden\r\n                    });\r\n                }\r\n                else{\r\n                    cell.lo = locked;\r\n                    cell.hi = hidden;\r\n                }\r\n            },\r\n            function(){\r\n                alert(local_cellFormat.sheetDataIsNullAlert);\r\n            }\r\n        );\r\n\r\n        jfrefreshgrid(d, undefined, undefined, false);\r\n\r\n        $(\"#luckysheet-cellFormat-config\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n    });\r\n}\r\n\r\nfunction recycleSeletion(cycleFunction, dataIsNullFunction){\r\n    if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n        let sheetFile = sheetmanage.getSheetByIndex(), data=sheetFile.data;\r\n        if(data!=null){\r\n            \r\n            for(let i=0;i<Store.luckysheet_select_save.length;i++){\r\n                let selection = Store.luckysheet_select_save[i];\r\n                let row = selection.row, column = selection.column;\r\n                for(let r=row[0];r<=row[1];r++){\r\n                    for(let c=column[0];c<=column[1];c++){\r\n                        let cell;\r\n\r\n                        let margeset = menuButton.mergeborer(data, r, c);\r\n                        if (!!margeset) {\r\n                            // row = margeset.row[1];\r\n                            // row_pre = margeset.row[0];\r\n                            let row_index = margeset.row[2];\r\n                            // row_index_ed = margeset.row[3];\r\n\r\n                            // col = margeset.column[1];\r\n                            // col_pre = margeset.column[0];\r\n                            let col_index = margeset.column[2];\r\n                            // col_index_ed = margeset.column[3];\r\n\r\n                            cell = data[row_index][col_index];\r\n                        }\r\n                        else{\r\n                            cell = data[r][c];\r\n                        }\r\n\r\n                        // if(cell.lo==null || cell.lo==1){\r\n                        //     locked = true;\r\n                        //     lockedCount++;\r\n                        // }\r\n\r\n                        // if(cell.hi==1){\r\n                        //     hidden = true;\r\n                        //     hiddenCount++;\r\n                        // }\r\n\r\n                        // count++;\r\n\r\n                        cycleFunction(cell, r, c, data);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            // locked = true;\r\n            dataIsNullFunction();\r\n        }\r\n\r\n        return data;\r\n    }\r\n}\r\n\r\nfunction initialCellFormatModel(){\r\n    if(isInitialCellFormatModel){\r\n        return;\r\n    }\r\n\r\n    isInitialCellFormatModel = true;\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n    const locale_button = _locale.button;\r\n\r\n    //Password input initial\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-cellFormat-config\", \r\n        \"addclass\": \"luckysheet-cellFormat-config\", \r\n        \"title\": local_cellFormat.cellFormatTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-cellFormat-menu-c\">\r\n                <div class=\"luckysheet-cellFormat-menu luckysheet-cellFormat-menu-active\" id=\"luckysheet-cellFormat-protection\">\r\n                    ${local_cellFormat.protection}\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheet-cellFormat-protection-content\" class=\"luckysheet-cellFormat-content\">\r\n                <div class=\"luckysheet-cellFormat-protection\">\r\n                    <p>\r\n                        ${local_cellFormat.protectionTips}\r\n                    </p>\r\n                    <label for=\"luckysheet-protection-check-locked\"><input id=\"luckysheet-protection-check-locked\" name=\"luckysheet-protection-check-locked\" type=\"checkbox\">${local_cellFormat.locked}</label><span>\u90E8\u5206\u9009\u4E2D</span>\r\n                    <br/>\r\n                    <label for=\"luckysheet-protection-check-hidden\"><input id=\"luckysheet-protection-check-hidden\" name=\"luckysheet-protection-check-hidden\" type=\"checkbox\">${local_cellFormat.hidden}</label><span>\u5168\u90E8\u9009\u4E2D</span>\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-cellFormat-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n\r\n    initialCellFormatModelEvent();\r\n}\r\n\r\nexport function openCellFormatModel(){\r\n    initialCellFormatModel();\r\n\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n    const locale_button = _locale.button;\r\n\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n\r\n    if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n        return;\r\n    }\r\n\r\n    let locked =false, hidden=false;\r\n    let lockedCount=0, hiddenCount=0, count=0;\r\n    if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n        recycleSeletion(\r\n            function(cell){\r\n                // let cell = data[r][c];\r\n                if(cell==null || cell.lo==null || cell.lo==1){\r\n                    locked = true;\r\n                    lockedCount++;\r\n                }\r\n\r\n                if(cell!=null && cell.hi==1){\r\n                    hidden = true;\r\n                    hiddenCount++;\r\n                }\r\n\r\n                count++;\r\n            },\r\n            function(){\r\n                locked = true;\r\n            }\r\n        );\r\n    }\r\n    else{\r\n        alert(local_cellFormat.selectionIsNullAlert);\r\n        return;\r\n    }\r\n\r\n    let tipsLock=\"\", tipshidden=\"\";\r\n    if(locked){\r\n        tipsLock = lockedCount==count?local_cellFormat.tipsAll:local_cellFormat.tipsPart;\r\n    }\r\n\r\n    if(hidden){\r\n        tipshidden = hiddenCount==count?local_cellFormat.tipsAll:local_cellFormat.tipsPart;\r\n    }\r\n\r\n    $(\"#luckysheet-protection-check-locked\").prop('checked',locked).parent().next().html(tipsLock);\r\n    $(\"#luckysheet-protection-check-hidden\").prop('checked',hidden).parent().next().html(tipshidden);\r\n\r\n\r\n    openSelfModel(\"luckysheet-cellFormat-config\");\r\n}", "import luckysheetFreezen from '../controllers/freezen';\r\nimport { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport method from '../global/method'\r\n\r\nlet scrollRequestAnimationFrameIni = true,scrollRequestAnimationFrame = false, scrollTimeOutCancel=null;\r\n\r\nfunction execScroll(){\r\n    let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(), \r\n        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n    luckysheetrefreshgrid(scrollLeft, scrollTop);\r\n    scrollRequestAnimationFrame = window.requestAnimationFrame(execScroll);\r\n}\r\n\r\n//\u5168\u5C40\u6EDA\u52A8\u4E8B\u4EF6\r\nexport default function luckysheetscrollevent(isadjust) {\r\n    let $t = $(\"#luckysheet-cell-main\");\r\n    let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(), \r\n        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n        canvasHeight = $(\"#luckysheetTableContent\").height(); // canvas\u9AD8\u5EA6\r\n\r\n    // clearTimeout(scrollTimeOutCancel);\r\n\r\n    // scrollTimeOutCancel = setTimeout(() => {\r\n    //     scrollRequestAnimationFrameIni  = true;\r\n    //     window.cancelAnimationFrame(scrollRequestAnimationFrame);\r\n    // }, 500);\r\n\r\n    // if (!!isadjust) {\r\n    //     let scrollHeight = $t.get(0).scrollHeight;\r\n    //     let windowHeight = $t.height();\r\n    //     let scrollWidth = $t.get(0).scrollWidth;\r\n    //     let windowWidth = $t.width();\r\n\r\n    //     let maxScrollLeft = scrollWidth - windowWidth;\r\n    //     let maxScrollTop = scrollHeight - windowHeight;\r\n\r\n    //     let visibledatacolumn_c = Store.visibledatacolumn, visibledatarow_c = Store.visibledatarow;\r\n\r\n    //     if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n    //         visibledatarow_c = luckysheetFreezen.freezenhorizontaldata[3];\r\n    //     }\r\n\r\n    //     if (luckysheetFreezen.freezenverticaldata != null) {\r\n    //         visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3];\r\n    //     }\r\n\r\n    //     let col_ed = luckysheet_searcharray(visibledatacolumn_c, scrollLeft);\r\n    //     let row_ed = luckysheet_searcharray(visibledatarow_c, scrollTop);\r\n\r\n    //     let refreshLeft = scrollLeft , refreshTop = scrollTop;\r\n\r\n    //     if (col_ed <= 0) {\r\n    //         scrollLeft = 0;\r\n    //     }\r\n    //     else {\r\n    //         scrollLeft = visibledatacolumn_c[col_ed - 1];\r\n    //     }\r\n\r\n    //     if (row_ed <= 0) {\r\n    //         scrollTop = 0;\r\n    //     }\r\n    //     else {\r\n    //         scrollTop = visibledatarow_c[row_ed - 1];\r\n    //     }\r\n    // }\r\n\r\n    if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n        if (scrollTop < luckysheetFreezen.freezenhorizontaldata[2]) {\r\n            scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n            return;\r\n        }\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null) {\r\n        if (scrollLeft < luckysheetFreezen.freezenverticaldata[2]) {\r\n            scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n            return;\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-cols-h-c\").scrollLeft(scrollLeft);//\u5217\u6807\u9898\r\n    $(\"#luckysheet-rows-h\").scrollTop(scrollTop);//\u884C\u6807\u9898\r\n    \r\n    $t.scrollLeft(scrollLeft).scrollTop(scrollTop);\r\n\r\n    $(\"#luckysheet-input-box-index\").css({\r\n        \"left\": $(\"#luckysheet-input-box\").css(\"left\"), \r\n        \"top\": (parseInt($(\"#luckysheet-input-box\").css(\"top\")) - 20) + \"px\", \r\n        \"z-index\": $(\"#luckysheet-input-box\").css(\"z-index\")\r\n    }).show();\r\n\r\n    // if(scrollRequestAnimationFrameIni && Store.scrollRefreshSwitch){\r\n    //     execScroll();\r\n    //     scrollRequestAnimationFrameIni = false;\r\n    // }\r\n\r\n    luckysheetrefreshgrid(scrollLeft, scrollTop);\r\n    \r\n\r\n    $(\"#luckysheet-bottom-controll-row\").css(\"left\", scrollLeft);\r\n\r\n    //\u6709\u9009\u533A\u4E14\u6709\u51BB\u7ED3\u65F6\uFF0C\u6EDA\u52A8\u9002\u5E94\r\n    if(luckysheetFreezen.freezenhorizontaldata != null || luckysheetFreezen.freezenverticaldata != null){\r\n        luckysheetFreezen.scrollAdapt();\r\n    }\r\n\r\n    if(!method.createHookFunction(\"scroll\", {scrollLeft, scrollTop, canvasHeight})){ return; }\r\n\r\n}", "import mobileinit from './mobile';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport luckysheetFreezen from './freezen';\r\nimport pivotTable from './pivotTable';\r\nimport luckysheetDropCell from './dropCell';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport alternateformat from './alternateformat';\r\nimport ifFormulaGenerator from './ifFormulaGenerator';\r\nimport sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport { luckysheet_searcharray } from './sheetSearch';\r\nimport luckysheetsizeauto from './resize'; \r\nimport { \r\n    luckysheetMoveHighlightCell, \r\n} from './sheetMove';\r\nimport { selectHightlightShow, selectIsOverlap, selectionCopyShow, luckysheet_count_show,selectHelpboxFill } from './select';\r\nimport selection from './selection';\r\nimport controlHistory from './controlHistory';\r\nimport splitColumn from './splitColumn';\r\nimport {hideMenuByCancel} from '../global/cursorPos';\r\nimport { luckysheetdefaultstyle } from './constant';\r\nimport {checkProtectionLockedRangeList,checkProtectionAllSelected,checkProtectionSelectLockedOrUnLockedCells,checkProtectionNotEnable,checkProtectionAuthorityNormal} from './protection';\r\nimport { openCellFormatModel } from './cellFormat';\r\n\r\nimport { \r\n    replaceHtml,\r\n    getObjType, \r\n    chatatABC, \r\n    ArrayUnique,\r\n    showrightclickmenu, \r\n    luckysheetactiveCell,\r\n    luckysheetContainerFocus,\r\n    $$\r\n} from '../utils/util';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { \r\n    rowLocation, \r\n    colLocation, \r\n    mouseposition \r\n} from '../global/location';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport { isRealNull, hasPartMC, isEditMode } from '../global/validate';\r\nimport { countfunc } from '../global/count';\r\nimport browser from '../global/browser';\r\nimport formula from '../global/formula';\r\nimport { luckysheetextendtable } from '../global/extend';\r\nimport luckysheetscrollevent from '../global/scroll';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgrid_rhcw,\r\n    luckysheetrefreshgrid, \r\n} from '../global/refresh';\r\nimport { getdatabyselection, datagridgrowth } from '../global/getdata';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { genarate } from '../global/format';\r\nimport method from '../global/method';\r\nimport { getBorderInfoCompute } from '../global/border';\r\nimport { luckysheetDrawMain } from '../global/draw';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport { createLuckyChart, hideAllNeedRangeShow } from '../expendPlugins/chart/plugin'\r\n\r\n//, columeflowset, rowflowset\r\nexport default function luckysheetHandler() {\r\n\r\n    const os = browser.detectOS(), isMobile = browser.mobilecheck();\r\n\r\n    //\u79FB\u52A8\u7AEF\r\n    if(isMobile){\r\n        mobileinit();\r\n    }\r\n    if (!Date.now)\r\n    Date.now = function() { return new Date().getTime(); };\r\n    //requestAnimationFrame method\r\n    (function() {\r\n        'use strict';\r\n        \r\n        var vendors = ['webkit', 'moz'];\r\n        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\r\n            var vp = vendors[i];\r\n            window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];\r\n            window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']\r\n                                    || window[vp+'CancelRequestAnimationFrame']);\r\n        }\r\n        if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy\r\n            || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\r\n            var lastTime = 0;\r\n            window.requestAnimationFrame = function(callback) {\r\n                var now = Date.now();\r\n                var nextTime = Math.max(lastTime + 16, now);\r\n                return setTimeout(function() { callback(lastTime = nextTime); },\r\n                                nextTime - now);\r\n            };\r\n            window.cancelAnimationFrame = clearTimeout;\r\n        }\r\n    }());\r\n\r\n    \r\n\r\n    $(\"#luckysheet-sheet-container-c\").mousewheel(function (event, delta) {\r\n        let scrollNum = event.deltaFactor<40?1:(event.deltaFactor<80?2:3);\r\n        let scrollLeft = $(this).scrollLeft();\r\n        if(event.deltaY != 0){\r\n            if(event.deltaY <0){\r\n                scrollLeft = scrollLeft + 10*scrollNum;\r\n                \r\n            }\r\n            else{\r\n                scrollLeft = scrollLeft - 10*scrollNum;\r\n            \r\n            }\r\n        }\r\n        else if(event.deltaX != 0){\r\n\r\n            if(event.deltaX >0){\r\n                scrollLeft = scrollLeft + 10*scrollNum;\r\n                \r\n            }\r\n            else{\r\n                scrollLeft = scrollLeft - 10*scrollNum;\r\n            \r\n            }\r\n        }\r\n        $(this).scrollLeft(scrollLeft);\r\n        event.preventDefault();\r\n    });\r\n    \r\n    //\u6EDA\u52A8\u76D1\u542C\r\n    $(\"#luckysheet-cell-main\").scroll(function () {\r\n        \r\n    })\r\n    .mousewheel(function (event, delta) {\r\n        event.preventDefault();\r\n    });\r\n\r\n    const _locale = locale();\r\n    const locale_drag = _locale.drag;\r\n    const locale_info = _locale.info;\r\n    let prev, mousewheelArrayUniqueTimeout;\r\n    $(\"#luckysheet-grid-window-1\").mousewheel(function (event, delta) {\r\n        let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n        let visibledatacolumn_c = Store.visibledatacolumn, \r\n            visibledatarow_c = Store.visibledatarow;\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            visibledatarow_c = luckysheetFreezen.freezenhorizontaldata[3];\r\n        }\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3];\r\n        }\r\n\r\n        clearTimeout(mousewheelArrayUniqueTimeout);\r\n        \r\n        // if(Store.visibledatacolumn.length!=visibledatacolumn_c.length){\r\n            if(Store.visibledatacolumn_unique!=null){\r\n                visibledatacolumn_c = Store.visibledatacolumn_unique;\r\n            }\r\n            else{\r\n                visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);\r\n                Store.visibledatacolumn_unique = visibledatacolumn_c;\r\n            }\r\n        // }\r\n\r\n        // if(Store.visibledatarow.length!=visibledatarow_c.length){\r\n            if(Store.visibledatarow_unique!=null){\r\n                visibledatarow_c = Store.visibledatarow_unique;\r\n            }\r\n            else{\r\n                visibledatarow_c = ArrayUnique(visibledatarow_c);\r\n                Store.visibledatarow_unique = visibledatarow_c;\r\n            }\r\n        // }\r\n\r\n        // visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);\r\n        // visibledatarow_c = ArrayUnique(visibledatarow_c);\r\n\r\n        let col_st = luckysheet_searcharray(visibledatacolumn_c, scrollLeft);\r\n        let row_st = luckysheet_searcharray(visibledatarow_c, scrollTop);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            row_st = luckysheet_searcharray(visibledatarow_c, scrollTop + luckysheetFreezen.freezenhorizontaldata[0]);\r\n        }\r\n\r\n        let colscroll = 0;\r\n        let rowscroll = 0;\r\n\r\n        let scrollNum = event.deltaFactor<40?1:(event.deltaFactor<80?2:3);\r\n        //\u4E00\u6B21\u6EDA\u52A8\u4E09\u884C\u6216\u4E09\u5217\r\n        if(event.deltaY != 0){\r\n            let row_ed,step=Math.round(scrollNum/Store.zoomRatio);\r\n            step = step<1?1:step;\r\n            if(event.deltaY < 0){\r\n                row_ed = row_st + step;\r\n                \r\n                if(row_ed >= visibledatarow_c.length){\r\n                    row_ed = visibledatarow_c.length - 1;\r\n                }\r\n            }\r\n            else{\r\n                row_ed = row_st - step;\r\n                \r\n                if(row_ed < 0){\r\n                    row_ed = 0;\r\n                }\r\n            }\r\n\r\n            rowscroll = row_ed == 0 ? 0 : visibledatarow_c[row_ed - 1];\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                rowscroll -= luckysheetFreezen.freezenhorizontaldata[0];\r\n            }\r\n\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(rowscroll);\r\n        }\r\n        else if(event.deltaX != 0){\r\n            let col_ed;\r\n            \r\n            // if((isMac && event.deltaX >0 ) || (!isMac && event.deltaX < 0)){\r\n            if(event.deltaX >0){\r\n                scrollLeft = scrollLeft + 20*Store.zoomRatio;\r\n                \r\n                // if(col_ed >= visibledatacolumn_c.length){\r\n                //     col_ed = visibledatacolumn_c.length - 1;\r\n                // }\r\n            }\r\n            else{\r\n                scrollLeft = scrollLeft - 20*Store.zoomRatio;\r\n                \r\n                // if(col_ed < 0){\r\n                //     col_ed = 0;\r\n                // }\r\n            }\r\n\r\n            // colscroll = col_ed == 0 ? 0 : visibledatacolumn_c[col_ed - 1];\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n        }\r\n\r\n        mousewheelArrayUniqueTimeout = setTimeout(() => {\r\n            Store.visibledatacolumn_unique = null;\r\n            Store.visibledatarow_unique = null;\r\n        }, 500);\r\n    });\r\n\r\n    $(\"#luckysheet-scrollbar-x\").scroll(function(){\r\n        // setTimeout(function(){\r\n            luckysheetscrollevent();\r\n        // },10); \r\n    })\r\n    .mousewheel(function (event, delta) {\r\n        event.preventDefault();\r\n    });\r\n\r\n    $(\"#luckysheet-scrollbar-y\").scroll(function(){\r\n\t\t// setTimeout(function(){\r\n            luckysheetscrollevent();\r\n        // },10);\r\n    })\r\n    .mousewheel(function (event, delta) {\r\n        event.preventDefault();\r\n    });\r\n\r\n    //\u9875\u9762resize\r\n    $(window).resize(function () {\r\n        let luckysheetDocument = document.getElementById(Store.container);\r\n        if(luckysheetDocument){\r\n            luckysheetsizeauto();\r\n        }            \r\n    });\r\n\r\n    $(\"#luckysheet-rich-text-editor\").mouseup(function(e){\r\n        menuButton.inputMenuButtonFocus(e.target);\r\n    });\r\n\r\n    //\u8868\u683Cmousedown\r\n    $(\"#luckysheet-cell-main, #luckysheetTableContent\").mousedown(function (event) {\r\n        if($(event.target).hasClass('luckysheet-mousedown-cancel')){\r\n            return;\r\n        }\r\n\r\n        // \u534F\u540C\u7F16\u8F91\u5176\u4ED6\u7528\u6237\u4E0D\u5728\u64CD\u4F5C\u7684\u65F6\u5019\uFF0C\u7528\u6237\u540D\u6846\u9690\u85CF\r\n        hideUsername();\r\n\r\n        $(\"#luckysheet-cell-selected\").find(\".luckysheet-cs-fillhandle\")\r\n        .css(\"cursor\",\"default\")\r\n        .end()\r\n        .find(\".luckysheet-cs-draghandle\")\r\n        .css(\"cursor\",\"default\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\",\"default\");\r\n\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //\u56FE\u7247 active/cropping\r\n        if($(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") || $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")){\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n\r\n        //luckysheetautoadjustmousedown = 1;\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        if (mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize || mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize) {\r\n            return;\r\n        }\r\n\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            x = mouse[0] + luckysheetFreezen.freezenverticaldata[2];\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2];\r\n        }\r\n\r\n        let sheetFile = sheetmanage.getSheetByIndex();\r\n        let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n        \r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        let row_index_ed = row_index, col_index_ed = col_index;\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if (!!margeset) {\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            row_index = margeset.row[2];\r\n            row_index_ed = margeset.row[3];\r\n\r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n            col_index = margeset.column[2];\r\n            col_index_ed = margeset.column[3];\r\n        }\r\n\r\n\r\n        //\u5355\u5143\u683C\u5355\u51FB\u4E4B\u524D\r\n        if(!method.createHookFunction(\"cellMousedownBefore\", Store.flowdata[row_index][col_index], {\r\n            r:row_index,\r\n            c:col_index,\r\n            \"start_r\": row_pre,\r\n            \"start_c\": col_pre, \r\n            \"end_r\": row, \r\n            \"end_c\": col \r\n        }, sheetFile,luckysheetTableContent)){ return; }\r\n\r\n\r\n        //\u6570\u636E\u9A8C\u8BC1 \u5355\u5143\u683C\u805A\u7126\r\n        dataVerificationCtrl.cellFocus(row_index, col_index, true);\r\n\r\n        //\u82E5\u70B9\u51FB\u5355\u5143\u683C\u90E8\u5206\u4E0D\u5728\u89C6\u56FE\u5185\r\n        if (col_pre < $(\"#luckysheet-cell-main\").scrollLeft()) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n        }\r\n\r\n        if (row_pre < $(\"#luckysheet-cell-main\").scrollTop()) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n        }\r\n\r\n        //mousedown\u662F\u53F3\u952E\r\n        if (event.which == \"3\") {\r\n            $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n            let isright = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                if (Store.luckysheet_select_save[s][\"row\"] != null && (row_index >= Store.luckysheet_select_save[s][\"row\"][0] && row_index <= Store.luckysheet_select_save[s][\"row\"][1] && col_index >= Store.luckysheet_select_save[s][\"column\"][0] && col_index <= Store.luckysheet_select_save[s][\"column\"][1])) {\r\n                    isright = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (isright) {\r\n                return;\r\n            }\r\n        }\r\n\r\n        //\u5355\u5143\u683C\u6570\u636E\u4E0B\u94BB\r\n        if (Store.flowdata[row_index] != null && Store.flowdata[row_index][col_index] != null && Store.flowdata[row_index][col_index].dd != null) {\r\n            if (luckysheetConfigsetting.fireMousedown != null && getObjType(luckysheetConfigsetting.fireMousedown) == \"function\") {\r\n                luckysheetConfigsetting.fireMousedown(Store.flowdata[row_index][col_index].dd);\r\n                return;\r\n            }\r\n        }\r\n\r\n        //\u94FE\u63A5 \u5355\u5143\u683C\u805A\u7126\r\n        if(hyperlinkCtrl.hyperlink && hyperlinkCtrl.hyperlink[row_index + \"_\" + col_index] && event.which != \"3\"){\r\n            hyperlinkCtrl.cellFocus(row_index, col_index);\r\n            return;\r\n        }\r\n\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        //\u516C\u5F0F\u76F8\u5173\r\n        let $input = $(\"#luckysheet-input-box\");\r\n        if (parseInt($input.css(\"top\")) > 0) {\r\n            if (formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton()) {\r\n                //\u516C\u5F0F\u9009\u533A\r\n                let rowseleted = [row_index, row_index_ed];\r\n                let columnseleted = [col_index, col_index_ed];\r\n\r\n                let left = col_pre;\r\n                let width = col - col_pre - 1;\r\n                let top = row_pre;\r\n                let height = row - row_pre - 1;\r\n\r\n                if (event.shiftKey) {\r\n                    let last = formula.func_selectedrange;\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    formula.func_selectedrange = last;\r\n                }\r\n                else if (event.ctrlKey && $(\"#luckysheet-rich-text-editor\").find(\"span\").last().text() != \",\") {\r\n                    //\u6309\u4F4Fctrl \u9009\u62E9\u9009\u533A\u65F6  \u5148\u5904\u7406\u4E0A\u4E00\u4E2A\u9009\u533A\r\n                    let vText = $(\"#luckysheet-rich-text-editor\").text();\r\n                    \r\n                    if(vText[vText.length -1 ] === \")\"){\r\n                        vText = vText.substr(0,vText.length - 1); //\u5148\u5220\u9664\u6700\u540E\u4FA7\u7684\u5706\u62EC\u53F7) \r\n                    }\r\n                    \r\n\r\n                    if(vText.length > 0){\r\n                        let lastWord = vText.substr(vText.length-1,1);\r\n                        if(lastWord!=\",\" && lastWord!=\"=\" && lastWord!=\"(\"){\r\n                            vText += \",\";\r\n                        }\r\n                    }\r\n                    if (vText.length > 0 && vText.substr(0, 1) == \"=\") {\r\n                        vText = formula.functionHTMLGenerate(vText);\r\n\r\n                        if (window.getSelection) { // all browsers, except IE before version 9\r\n                            let currSelection = window.getSelection();\r\n                            formula.functionRangeIndex = [$(currSelection.anchorNode).parent().index(), currSelection.anchorOffset];\r\n                        }\r\n                        else { // Internet Explorer before version 9\r\n                            let textRange = document.selection.createRange();\r\n                            formula.functionRangeIndex = textRange;\r\n                        }\r\n\r\n                        /* \u5728\u663E\u793A\u524D\u91CD\u65B0 + \u53F3\u4FA7\u7684\u5706\u62EC\u53F7) */\r\n\r\n                        $(\"#luckysheet-rich-text-editor\").html(vText + \")\");\r\n\r\n                        formula.canceFunctionrangeSelected();\r\n                        formula.createRangeHightlight();\r\n                    }\r\n\r\n                    formula.rangestart = false;\r\n                    formula.rangedrag_column_start = false;\r\n                    formula.rangedrag_row_start = false;\r\n\r\n                    $(\"#luckysheet-functionbox-cell\").html(vText + \")\");\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                    //\u518D\u8FDB\u884C \u9009\u533A\u7684\u9009\u62E9\r\n                    formula.israngeseleciton();\r\n                    formula.func_selectedrange = {\r\n                        \"left\": left,\r\n                        \"width\": width,\r\n                        \"top\": top,\r\n                        \"height\": height,\r\n                        \"left_move\": left,\r\n                        \"width_move\": width,\r\n                        \"top_move\": top,\r\n                        \"height_move\": height,\r\n                        \"row\": rowseleted,\r\n                        \"column\": columnseleted,\r\n                        \"row_focus\": row_index,\r\n                        \"column_focus\": col_index\r\n                    };\r\n                }\r\n                else {\r\n                    formula.func_selectedrange = {\r\n                        \"left\": left,\r\n                        \"width\": width,\r\n                        \"top\": top,\r\n                        \"height\": height,\r\n                        \"left_move\": left,\r\n                        \"width_move\": width,\r\n                        \"top_move\": top,\r\n                        \"height_move\": height,\r\n                        \"row\": rowseleted,\r\n                        \"column\": columnseleted,\r\n                        \"row_focus\": row_index,\r\n                        \"column_focus\": col_index\r\n                    };\r\n                }\r\n                \r\n                formula.rangeSetValue({ \"row\": rowseleted, \"column\": columnseleted });\r\n\r\n                formula.rangestart = true;\r\n                formula.rangedrag_column_start = false;\r\n                formula.rangedrag_row_start = false;\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").css({\r\n                    \"left\": left,\r\n                    \"width\": width,\r\n                    \"top\": top,\r\n                    \"height\": height\r\n                }).show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n                luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n                setTimeout(function () {\r\n                    let currSelection = window.getSelection();\r\n                    let anchorOffset = currSelection.anchorNode;\r\n\r\n                    let $editor;\r\n                    if ($(\"#luckysheet-search-formula-parm\").is(\":visible\") || $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")) {\r\n                        $editor = $(\"#luckysheet-rich-text-editor\");\r\n                        formula.rangechangeindex = formula.data_parm_index;\r\n                    }\r\n                    else {\r\n                        $editor = $(anchorOffset).closest(\"div\");\r\n                    }\r\n\r\n                    let $span = $editor.find(\"span[rangeindex='\" + formula.rangechangeindex + \"']\");\r\n\r\n                    formula.setCaretPosition($span.get(0), 0, $span.html().length);\r\n                }, 1);\r\n                return;\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_select_status = true;\r\n\r\n                if ($(\"#luckysheet-info\").is(\":visible\")) {\r\n                    Store.luckysheet_select_status = false;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            if(checkProtectionSelectLockedOrUnLockedCells(row_index, col_index, Store.currentSheetIndex)){\r\n                Store.luckysheet_select_status = true;\r\n            }\r\n        }\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F \u5E94\u7528\u8303\u56F4\u53EF\u9009\u62E9\u591A\u4E2A\u5355\u5143\u683C\r\n        if ($(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n            conditionformat.selectStatus = true;\r\n            Store.luckysheet_select_status = false;\r\n\r\n            if (event.shiftKey) {\r\n                let last = conditionformat.selectRange[conditionformat.selectRange.length - 1];\r\n\r\n                let top = 0, height = 0, rowseleted = [];\r\n                if (last.top > row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n\r\n                    if (last.row[1] > last.row_focus) {\r\n                        last.row[1] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [row_index, last.row[1]];\r\n                }\r\n                else if (last.top == row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n                    rowseleted = [row_index, last.row[0]];\r\n                }\r\n                else {\r\n                    top = last.top;\r\n                    height = row - last.top - 1;\r\n\r\n                    if (last.row[0] < last.row_focus) {\r\n                        last.row[0] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [last.row[0], row_index];\r\n                }\r\n\r\n                let left = 0, width = 0, columnseleted = [];\r\n                if (last.left > col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n\r\n                    if (last.column[1] > last.column_focus) {\r\n                        last.column[1] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [col_index, last.column[1]];\r\n                }\r\n                else if (last.left == col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n                    columnseleted = [col_index, last.column[0]];\r\n                }\r\n                else {\r\n                    left = last.left;\r\n                    width = col - last.left - 1;\r\n\r\n                    if (last.column[0] < last.column_focus) {\r\n                        last.column[0] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [last.column[0], col_index];\r\n                }\r\n\r\n                let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                if (changeparam != null) {\r\n                    columnseleted = changeparam[0];\r\n                    rowseleted = changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n                }\r\n\r\n                last[\"row\"] = rowseleted;\r\n                last[\"column\"] = columnseleted;\r\n\r\n                last[\"left_move\"] = left;\r\n                last[\"width_move\"] = width;\r\n                last[\"top_move\"] = top;\r\n                last[\"height_move\"] = height;\r\n\r\n                conditionformat.selectRange[conditionformat.selectRange.length - 1] = last;\r\n            }\r\n            else if (event.ctrlKey) {\r\n                conditionformat.selectRange.push({\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [row_index, row_index_ed],\r\n                    \"column\": [col_index, col_index_ed],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": col_index\r\n                });\r\n            }\r\n            else {\r\n                conditionformat.selectRange = [];\r\n                conditionformat.selectRange.push({\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [row_index, row_index_ed],\r\n                    \"column\": [col_index, col_index_ed],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": col_index\r\n                });\r\n            }\r\n\r\n            selectionCopyShow(conditionformat.selectRange);\r\n\r\n            let range = conditionformat.getTxtByRange(conditionformat.selectRange);\r\n            $(\"#luckysheet-multiRange-dialog input\").val(range);\r\n\r\n            return;\r\n        }\r\n        else {\r\n            conditionformat.selectStatus = false;\r\n            conditionformat.selectRange = [];\r\n        }\r\n\r\n        //\u6761\u4EF6\u683C\u5F0F \u6761\u4EF6\u503C\u53EA\u80FD\u9009\u62E9\u5355\u4E2A\u5355\u5143\u683C\r\n        if ($(\"#luckysheet-singleRange-dialog\").is(\":visible\")) {\r\n            Store.luckysheet_select_status = false;\r\n\r\n            selectionCopyShow([{ \"row\": [row_index, row_index], \"column\": [col_index, col_index] }]);\r\n\r\n            let range = getRangetxt(\r\n                Store.currentSheetIndex,\r\n                { \"row\": [row_index, row_index], \"column\": [col_index, col_index] },\r\n                Store.currentSheetIndex\r\n            );\r\n            $(\"#luckysheet-singleRange-dialog input\").val(range);\r\n\r\n            return;\r\n        }\r\n\r\n        //\u6570\u636E\u9A8C\u8BC1 \u5355\u5143\u683C\u8303\u56F4\u9009\u62E9\r\n        if($(\"#luckysheet-dataVerificationRange-dialog\").is(\":visible\")){\r\n            dataVerificationCtrl.selectStatus = true;\r\n            Store.luckysheet_select_status = false;\r\n\r\n            if (event.shiftKey) {\r\n                let last = dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1];\r\n\r\n                let top = 0, height = 0, rowseleted = [];\r\n                if (last.top > row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n\r\n                    if (last.row[1] > last.row_focus) {\r\n                        last.row[1] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [row_index, last.row[1]];\r\n                }\r\n                else if (last.top == row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n                    rowseleted = [row_index, last.row[0]];\r\n                }\r\n                else {\r\n                    top = last.top;\r\n                    height = row - last.top - 1;\r\n\r\n                    if (last.row[0] < last.row_focus) {\r\n                        last.row[0] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [last.row[0], row_index];\r\n                }\r\n\r\n                let left = 0, width = 0, columnseleted = [];\r\n                if (last.left > col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n\r\n                    if (last.column[1] > last.column_focus) {\r\n                        last.column[1] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [col_index, last.column[1]];\r\n                }\r\n                else if (last.left == col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n                    columnseleted = [col_index, last.column[0]];\r\n                }\r\n                else {\r\n                    left = last.left;\r\n                    width = col - last.left - 1;\r\n\r\n                    if (last.column[0] < last.column_focus) {\r\n                        last.column[0] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [last.column[0], col_index];\r\n                }\r\n\r\n                let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                if (changeparam != null) {\r\n                    columnseleted = changeparam[0];\r\n                    rowseleted = changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n                }\r\n\r\n                last[\"row\"] = rowseleted;\r\n                last[\"column\"] = columnseleted;\r\n\r\n                last[\"left_move\"] = left;\r\n                last[\"width_move\"] = width;\r\n                last[\"top_move\"] = top;\r\n                last[\"height_move\"] = height;\r\n\r\n                dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1] = last;\r\n            }\r\n            else {\r\n                dataVerificationCtrl.selectRange = [];\r\n                dataVerificationCtrl.selectRange.push({\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [row_index, row_index_ed],\r\n                    \"column\": [col_index, col_index_ed],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": col_index\r\n                });\r\n            }\r\n\r\n            selectionCopyShow(dataVerificationCtrl.selectRange);\r\n\r\n            let range = dataVerificationCtrl.getTxtByRange(dataVerificationCtrl.selectRange);\r\n            if(formula.rangetosheet != Store.currentSheetIndex){\r\n                range = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '!' + range;\r\n            }\r\n            $(\"#luckysheet-dataVerificationRange-dialog input\").val(range);\r\n\r\n            return;\r\n        }\r\n        else{\r\n            dataVerificationCtrl.selectStatus = false;\r\n            dataVerificationCtrl.selectRange = [];\r\n        }\r\n\r\n        //if\u516C\u5F0F\u751F\u6210\u5668\r\n        if (ifFormulaGenerator.singleRangeFocus) {\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog .singRange\").click();\r\n        }\r\n        if ($(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").is(\":visible\")) {\r\n            //\u9009\u62E9\u5355\u4E2A\u5355\u5143\u683C\r\n            Store.luckysheet_select_status = false;\r\n            formula.rangestart = false;\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").css({\r\n                \"left\": col_pre,\r\n                \"width\": col - col_pre - 1,\r\n                \"top\": row_pre,\r\n                \"height\": row - row_pre - 1\r\n            }).show();\r\n            $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n            let range = getRangetxt(\r\n                Store.currentSheetIndex,\r\n                { \"row\": [row_index, row_index], \"column\": [col_index, col_index] },\r\n                Store.currentSheetIndex\r\n            );\r\n            $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog input\").val(range);\r\n\r\n            return;\r\n        }\r\n        if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n            //\u9009\u62E9\u8303\u56F4\r\n            Store.luckysheet_select_status = false;\r\n            formula.func_selectedrange = {\r\n                \"left\": col_pre,\r\n                \"width\": col - col_pre - 1,\r\n                \"top\": row_pre,\r\n                \"height\": row - row_pre - 1,\r\n                \"left_move\": col_pre,\r\n                \"width_move\": col - col_pre - 1,\r\n                \"top_move\": row_pre,\r\n                \"height_move\": row - row_pre - 1,\r\n                \"row\": [row_index, row_index],\r\n                \"column\": [col_index, col_index],\r\n                \"row_focus\": row_index,\r\n                \"column_focus\": col_index\r\n            };\r\n            formula.rangestart = true;\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").css({\r\n                \"left\": col_pre,\r\n                \"width\": col - col_pre - 1,\r\n                \"top\": row_pre,\r\n                \"height\": row - row_pre - 1\r\n            }).show();\r\n            $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n            let range = getRangetxt(\r\n                Store.currentSheetIndex,\r\n                { \"row\": [row_index, row_index], \"column\": [col_index, col_index] },\r\n                Store.currentSheetIndex\r\n            );\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_status) {\r\n            if (event.shiftKey) {\r\n                //\u6309\u4F4Fshift\u70B9\u51FB\uFF0C\u9009\u62E9\u8303\u56F4\r\n                let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]); //\u9009\u533A\u6700\u540E\u4E00\u4E2A\r\n\r\n                let top = 0, height = 0, rowseleted = [];\r\n                if (last.top > row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n\r\n                    if (last.row[1] > last.row_focus) {\r\n                        last.row[1] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [row_index, last.row[1]];\r\n                }\r\n                else if (last.top == row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n                    rowseleted = [row_index, last.row[0]];\r\n                }\r\n                else {\r\n                    top = last.top;\r\n                    height = row - last.top - 1;\r\n\r\n                    if (last.row[0] < last.row_focus) {\r\n                        last.row[0] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [last.row[0], row_index];\r\n                }\r\n\r\n                let left = 0, width = 0, columnseleted = [];\r\n                if (last.left > col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n\r\n                    if (last.column[1] > last.column_focus) {\r\n                        last.column[1] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [col_index, last.column[1]];\r\n                }\r\n                else if (last.left == col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n                    columnseleted = [col_index, last.column[0]];\r\n                }\r\n                else {\r\n                    left = last.left;\r\n                    width = col - last.left - 1;\r\n\r\n                    if (last.column[0] < last.column_focus) {\r\n                        last.column[0] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [last.column[0], col_index];\r\n                }\r\n\r\n                let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                if (changeparam != null) {\r\n                    columnseleted = changeparam[0];\r\n                    rowseleted = changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n                }\r\n\r\n                last[\"row\"] = rowseleted;\r\n                last[\"column\"] = columnseleted;\r\n\r\n                last[\"left_move\"] = left;\r\n                last[\"width_move\"] = width;\r\n                last[\"top_move\"] = top;\r\n                last[\"height_move\"] = height;\r\n\r\n                Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                //\u4EA4\u66FF\u989C\u8272\u9009\u62E9\u8303\u56F4\r\n                if ($(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")) {\r\n                    $(\"#luckysheet-alternateformat-rangeDialog input\").val(getRangetxt(Store.currentSheetIndex, Store.luckysheet_select_save));\r\n                }\r\n\r\n                if (pivotTable.luckysheet_pivotTable_select_state) {\r\n                    $(\"#luckysheet-pivotTable-range-selection-input\").val(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + \"!\" + chatatABC(Store.luckysheet_select_save[0][\"column\"][0]) + (Store.luckysheet_select_save[0][\"row\"][0] + 1) + \":\" + chatatABC(Store.luckysheet_select_save[0][\"column\"][1]) + (Store.luckysheet_select_save[0][\"row\"][1] + 1));\r\n                }\r\n            }\r\n            else if (event.ctrlKey) {\r\n                //\u9009\u533A\u6DFB\u52A0\r\n                Store.luckysheet_select_save.push({\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [row_index, row_index_ed],\r\n                    \"column\": [col_index, col_index_ed],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": col_index\r\n                });\r\n            }\r\n            else {\r\n                Store.luckysheet_select_save.length = 0;\r\n                Store.luckysheet_select_save.push({\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [row_index, row_index_ed],\r\n                    \"column\": [col_index, col_index_ed],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": col_index\r\n                });\r\n\r\n                //\u5355\u5143\u683C\u683C\u5F0Ficon\u5BF9\u5E94\r\n                menuButton.menuButtonFocus(Store.flowdata, row_index, col_index);\r\n                //\u51FD\u6570\u516C\u5F0F\u663E\u793A\u680F\r\n                formula.fucntionboxshow(row_index, col_index);\r\n            }\r\n\r\n            selectHightlightShow();\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata != null || luckysheetFreezen.freezenverticaldata != null) {\r\n                luckysheetFreezen.scrollAdaptOfselect();\r\n            }\r\n\r\n            if (!browser.mobilecheck()) { //\u975E\u79FB\u52A8\u7AEF\u805A\u7126\u8F93\u5165\u6846\r\n                luckysheetactiveCell();\r\n            }\r\n\r\n            //\u5141\u8BB8\u7F16\u8F91\u540E\u7684\u540E\u53F0\u66F4\u65B0\u65F6\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n        }\r\n\r\n        //\u4EA4\u66FF\u989C\u8272\r\n        if (alternateformat.rangefocus) {\r\n            alternateformat.rangefocus = false;\r\n            $(\"#luckysheet-alternateformat-range .fa-table\").click();\r\n        }\r\n\r\n        $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n\r\n        if (!isEditMode()) {\r\n            //chartMix \u9690\u85CF\u5F53\u524D\u9875\u7684\u6570\u636E\u9009\u62E9\u533A\u57DF\u9AD8\u4EAE\r\n            hideAllNeedRangeShow();\r\n        }\r\n\r\n        // selectHelpboxFill();\r\n\r\n        //\u6570\u636E\u900F\u89C6\u8868\r\n        pivotTable.pivotclick(row_index, col_index, Store.currentSheetIndex);\r\n\r\n        luckysheetContainerFocus();\r\n\r\n        method.createHookFunction(\"cellMousedown\", Store.flowdata[row_index][col_index], {\r\n            r:row_index,\r\n            c:col_index,\r\n            \"start_r\": row_pre,\r\n            \"start_c\": col_pre, \r\n            \"end_r\": row, \r\n            \"end_c\": col \r\n        }, sheetFile,luckysheetTableContent);\r\n\r\n        //$(\"#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-sel\").removeClass(\"luckysheet-cols-h-cell-sel\").addClass(\"luckysheet-cols-h-cell-nosel\");\r\n\r\n        //$(\"#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-sel\").removeClass(\"luckysheet-rows-h-cell-sel\").addClass(\"luckysheet-rows-h-cell-nosel\");\r\n\r\n\r\n        //$(\"#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-nosel\").eq(col_index).removeClass(\"luckysheet-cols-h-cell-nosel\").addClass(\"luckysheet-cols-h-cell-sel\");\r\n\r\n        //$(\"#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-nosel\").eq(row_index).removeClass(\"luckysheet-rows-h-cell-nosel\").addClass(\"luckysheet-rows-h-cell-sel\");\r\n\r\n        //event.stopImmediatePropagation();\r\n\r\n    }).mouseup(function (event) {\r\n        if (event.which == \"3\") {\r\n            //\u7981\u6B62\u524D\u53F0\u7F16\u8F91(\u53EA\u53EF \u6846\u9009\u5355\u5143\u683C\u3001\u6EDA\u52A8\u67E5\u770B\u8868\u683C)\r\n            if (!Store.allowEdit) {\r\n                return;\r\n            }\r\n\r\n            if (isEditMode()) { //\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u7981\u6B62\u53F3\u952E\u529F\u80FD\u6846\r\n                return;\r\n            }\r\n\r\n            let x = event.pageX;\r\n            let y = event.pageY;\r\n            let data = Store.flowdata;\r\n\r\n            let obj_s = Store.luckysheet_select_save[0];\r\n\r\n            const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n            $(\"#luckysheet-cols-rows-data\").show();\r\n            $(\"#luckysheet-cols-rows-handleincell\").show();\r\n            $(\"#luckysheet-cols-rows-add, #luckysheet-cols-rows-shift\").hide();\r\n\r\n            $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'block';\r\n            $$('#luckysheet-cols-rows-handleincell .luckysheet-menuseparator').style.display = 'block';\r\n\r\n            if (obj_s[\"row\"] != null && obj_s[\"row\"][0] == 0 && obj_s[\"row\"][1] == Store.flowdata.length - 1) {\r\n\r\n                // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth && !cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                    return;\r\n                }\r\n\r\n                Store.luckysheetRightHeadClickIs = \"column\";\r\n\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.width);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n                $(\"#luckysheet-cols-rows-add\").show();\r\n                // $(\"#luckysheet-cols-rows-data\").show();\r\n                $(\"#luckysheet-cols-rows-shift\").hide();\r\n                $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n                Store.luckysheet_cols_menu_status = true;\r\n\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'block';\r\n\r\n                // \u81EA\u5B9A\u4E49\u53F3\u952E\u83DC\u5355\uFF1A\u5411\u5DE6\u5411\u53F3\u589E\u52A0\u5217\uFF0C\u5220\u9664\u5217\uFF0C\u9690\u85CF\u663E\u793A\u5217\uFF0C\u8BBE\u7F6E\u5217\u5BBD\r\n                $$('#luckysheet-top-left-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n                $$('#luckysheet-bottom-right-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n                $$('#luckysheet-del-selected').style.display = cellRightClickConfig.deleteColumn ? 'block' : 'none';\r\n                $$('#luckysheet-hide-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n                $$('#luckysheet-show-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n                $$('#luckysheet-column-row-width-selected').style.display = cellRightClickConfig.columnWidth ? 'block' : 'none';\r\n\r\n                // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n                    $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n\r\n                    if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n                        $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n                    }\r\n\r\n                }\r\n\r\n                // 2.\u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n                if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n                    $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n                }\r\n\r\n                //\u5217\u5BBD\u9ED8\u8BA4\u503C\r\n                let cfg = $.extend(true, {}, Store.config);\r\n                if (cfg[\"columnlen\"] == null) {\r\n                    cfg[\"columnlen\"] = {};\r\n                }\r\n\r\n                let first_collen = cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]] == null ? Store.defaultcollen : cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]];\r\n                let isSame = true;\r\n\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let s = Store.luckysheet_select_save[i];\r\n                    let c1 = s.column[0], c2 = s.column[1];\r\n\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        let collen = cfg[\"columnlen\"][c] == null ? Store.defaultcollen : cfg[\"columnlen\"][c];\r\n\r\n                        if (collen != first_collen) {\r\n                            isSame = false;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isSame) {\r\n                    $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(first_collen);\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(\"\");\r\n                }\r\n            }\r\n            else if (obj_s[\"column\"] != null && obj_s[\"column\"][0] == 0 && obj_s[\"column\"][1] == Store.flowdata[0].length - 1) {\r\n\r\n                // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight && !cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                    return;\r\n                }\r\n\r\n                Store.luckysheetRightHeadClickIs = \"row\";\r\n\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.row);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.height);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.top);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.bottom);\r\n                $(\"#luckysheet-cols-rows-add\").show();\r\n                // $(\"#luckysheet-cols-rows-data\").show();\r\n                $(\"#luckysheet-cols-rows-shift\").hide();\r\n                $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n                Store.luckysheet_cols_menu_status = true;\r\n\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'block';\r\n\r\n                // \u81EA\u5B9A\u4E49\u53F3\u952E\u83DC\u5355\uFF1A\u5411\u4E0A\u5411\u4E0B\u589E\u52A0\u884C\uFF0C\u5220\u9664\u884C\uFF0C\u9690\u85CF\u663E\u793A\u884C\uFF0C\u8BBE\u7F6E\u884C\u9AD8\r\n                $$('#luckysheet-top-left-add-selected').style.display = cellRightClickConfig.insertRow ? 'block' : 'none';\r\n                $$('#luckysheet-bottom-right-add-selected').style.display = cellRightClickConfig.insertRow ? 'block' : 'none';\r\n                $$('#luckysheet-del-selected').style.display = cellRightClickConfig.deleteRow ? 'block' : 'none';\r\n                $$('#luckysheet-hide-selected').style.display = cellRightClickConfig.hideRow ? 'block' : 'none';\r\n                $$('#luckysheet-show-selected').style.display = cellRightClickConfig.hideRow ? 'block' : 'none';\r\n                $$('#luckysheet-column-row-width-selected').style.display = cellRightClickConfig.rowHeight ? 'block' : 'none';\r\n\r\n                // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n                    $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n\r\n                    if(!cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight){\r\n                        $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n                    }\r\n\r\n                }\r\n\r\n                // 2. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n                if(!cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight){\r\n                    $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n                }\r\n\r\n                //\u884C\u9AD8\u9ED8\u8BA4\u503C\r\n                let cfg = $.extend(true, {}, Store.config);\r\n                if (cfg[\"rowlen\"] == null) {\r\n                    cfg[\"rowlen\"] = {};\r\n                }\r\n\r\n                let first_rowlen = cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]] == null ? Store.defaultrowlen : cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]];\r\n                let isSame = true;\r\n\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let s = Store.luckysheet_select_save[i];\r\n                    let r1 = s.row[0], r2 = s.row[1];\r\n\r\n                    for (let r = r1; r <= r2; r++) {\r\n                        let rowlen = cfg[\"rowlen\"][r] == null ? Store.defaultrowlen : cfg[\"rowlen\"][r];\r\n\r\n                        if (rowlen != first_rowlen) {\r\n                            isSame = false;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isSame) {\r\n                    $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(first_rowlen);\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(\"\");\r\n                }\r\n            }else{\r\n                // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertRow && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteRow && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.deleteCell && !cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                    return;\r\n                }\r\n\r\n                // \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n                if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n                    $$('#luckysheet-cols-rows-handleincell .luckysheet-menuseparator').style.display = 'none';\r\n\r\n                    if(!cellRightClickConfig.insertRow && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteRow && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.deleteCell){\r\n                        $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n                    }\r\n\r\n                }\r\n\r\n                if(!cellRightClickConfig.insertRow && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteRow && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.deleteCell){\r\n                    $$('#luckysheet-cols-rows-handleincell .luckysheet-menuseparator').style.display = 'none';\r\n                }\r\n            }\r\n\r\n            // \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n            if(!cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                    $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n            \r\n            showrightclickmenu($(\"#luckysheet-rightclick-menu\"), x, y);\r\n        }\r\n\r\n        // \u5907\u6CE8\uFF1A\u5728mousedown\u4E2D\u53D1\u9001\u5149\u6807\u4FE1\u606F\u4F1A\u6F0F\u5904\u7406\u90E8\u5206(\u9009\u533A)\u8303\u56F4\r\n        server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n    }).dblclick(function (event) {\r\n        if($(event.target).hasClass('luckysheet-mousedown-cancel')){\r\n            return;\r\n        }\r\n        \r\n        //\u7981\u6B62\u524D\u53F0\u7F16\u8F91(\u53EA\u53EF \u6846\u9009\u5355\u5143\u683C\u3001\u6EDA\u52A8\u67E5\u770B\u8868\u683C)\r\n        if (!Store.allowEdit) {\r\n            return;\r\n        }\r\n\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        if (mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize || mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize) {\r\n            return;\r\n        }\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            x = mouse[0] + luckysheetFreezen.freezenverticaldata[2];\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2];\r\n        }\r\n\r\n        let row_location = rowLocation(y),\r\n\r\n            row_index = row_location[2];\r\n\r\n        let col_location = colLocation(x),\r\n\r\n            col_index = col_location[2];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if (!!margeset) {\r\n            row_index = margeset.row[2];\r\n            col_index = margeset.column[2];\r\n        }\r\n\r\n        if (pivotTable.isPivotRange(row_index, col_index)) {\r\n            //\u6570\u636E\u900F\u89C6\u8868\u6CA1\u6709 \u4EFB\u4F55\u6570\u636E\r\n            if ((pivotTable.filter == null || pivotTable.filter.length == 0) && (pivotTable.row == null || pivotTable.row.length == 0) && (pivotTable.column == null || pivotTable.column.length == 0) && (pivotTable.values == null || pivotTable.values.length == 0)) {\r\n                return;\r\n            }\r\n\r\n            //\u6570\u636E\u900F\u89C6\u8868\u6CA1\u6709 \u6570\u503C\u6570\u636E\r\n            if (pivotTable.values == null || pivotTable.values.length == 0) {\r\n                return;\r\n            }\r\n\r\n            //\u70B9\u51FB\u4F4D\u7F6E\u4E0D\u662F \u6570\u503C\u6570\u636E \u6240\u5728\u533A\u57DF\r\n            if (row_index == 0 || col_index == 0) {\r\n                return;\r\n            }\r\n\r\n            if (pivotTable.column != null && pivotTable.column.length > 0) {\r\n                if (pivotTable.values.length >= 2 && pivotTable.showType == \"column\") {\r\n                    if (row_index <= pivotTable.column.length || col_index >= pivotTable.pivotDatas[0].length - pivotTable.values.length) {\r\n                        return;\r\n                    }\r\n                }\r\n                else {\r\n                    if (row_index <= pivotTable.column.length - 1 || col_index >= pivotTable.pivotDatas[0].length - 1) {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (pivotTable.row != null && pivotTable.row.length > 0) {\r\n                if (pivotTable.values.length >= 2 && pivotTable.showType == \"row\") {\r\n                    if (col_index <= pivotTable.row.length || row_index >= pivotTable.pivotDatas.length - pivotTable.values.length) {\r\n                        return;\r\n                    }\r\n                }\r\n                else {\r\n                    if (col_index <= pivotTable.row.length - 1 || row_index >= pivotTable.pivotDatas.length - 1) {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            sheetmanage.addNewSheet(event);\r\n\r\n            pivotTable.drillDown(row_index, col_index);\r\n            return;\r\n        }\r\n\r\n        if ($(\"#luckysheet-search-formula-parm\").is(\":visible\") || $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")) {\r\n            //\u516C\u5F0F\u53C2\u6570\u680F\u663E\u793A\r\n            $(\"#luckysheet-cell-selected\").hide();\r\n        }\r\n        else if ($(\"#luckysheet-conditionformat-dialog\").is(\":visible\") || $(\"#luckysheet-administerRule-dialog\").is(\":visible\") || $(\"#luckysheet-newConditionRule-dialog\").is(\":visible\") || $(\"#luckysheet-editorConditionRule-dialog\").is(\":visible\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n            //\u6761\u4EF6\u683C\u5F0F\r\n            return;\r\n        }\r\n        else if ($(\"#luckysheet-modal-dialog-slider-alternateformat\").is(\":visible\") || $(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")) {\r\n            //\u4EA4\u66FF\u989C\u8272\r\n            return;\r\n        }\r\n        else {\r\n            if (menuButton.luckysheetPaintModelOn) {\r\n                menuButton.cancelPaintModel();\r\n            }\r\n\r\n            // \u68C0\u67E5\u5F53\u524D\u5750\u6807\u548C\u7126\u70B9\u5750\u6807\u662F\u5426\u4E00\u81F4\uFF0C\u5982\u679C\u4E0D\u4E00\u81F4\u90A3\u4E48\u8FDB\u884C\u4FEE\u6B63\r\n            let  column_focus = Store.luckysheet_select_save[0][\"column_focus\"];\r\n            let  row_focus    = Store.luckysheet_select_save[0][\"row_focus\"];\r\n            if(column_focus !== col_index || row_focus !==  row_index){\r\n                row_index = row_focus;\r\n                col_index = column_focus;\r\n            };\r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n            \r\n            /* \u8BBE\u7F6E\u9009\u533A\u9AD8\u4EAE */\r\n            selectHightlightShow();\r\n        }\r\n\r\n    });\r\n\r\n    //\u76D1\u542C\u62D6\u62FD \r\n    document.getElementById('luckysheet-cell-main').addEventListener('drop', function(e){\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n\r\n\r\n\r\n        let files = e.dataTransfer.files;\r\n\r\n        //\u62D6\u62FD\u63D2\u5165\u56FE\u7247\r\n        if(files.length == 1 && files[0].type.indexOf('image') > -1){        \r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n                return;\r\n            }\r\n            let render = new FileReader();\r\n            render.readAsDataURL(files[0]);\r\n\r\n            render.onload = function(event){\r\n                let src = event.target.result;\r\n                imageCtrl.inserImg(src);\r\n            }\r\n        }\r\n        handleCellDragStopEvent(e);\r\n    }, false);\r\n    document.getElementById('luckysheet-cell-main').addEventListener('dragover', function(e){\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n    }, false);\r\n\r\n    /**\r\n     * \u5904\u7406\u5355\u5143\u683C\u4E0A\u9F20\u6807\u62D6\u62FD\u505C\u6B62\u4E8B\u4EF6\r\n     * @param {DragEvent} event \r\n     */\r\n    function handleCellDragStopEvent(event) {\r\n        if (luckysheetConfigsetting && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.cellDragStop) {\r\n\t        let mouse = mouseposition(event.pageX, event.pageY);\r\n\t        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n\t        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\t  \r\n\t        let row_location = rowLocation(y),\r\n\t            row = row_location[1],\r\n\t            row_pre = row_location[0],\r\n\t            row_index = row_location[2];\r\n\t        let col_location = colLocation(x),\r\n\t            col = col_location[1],\r\n\t            col_pre = col_location[0],\r\n\t            col_index = col_location[2];\r\n\t  \r\n\t        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n\t        if (!!margeset) {\r\n\t            row = margeset.row[1];\r\n\t            row_pre = margeset.row[0];\r\n\t            row_index = margeset.row[2];\r\n\t  \r\n\t            col = margeset.column[1];\r\n\t            col_pre = margeset.column[0];\r\n\t            col_index = margeset.column[2];\r\n\t        }\r\n\t  \r\n\t        let sheetFile = sheetmanage.getSheetByIndex();\r\n\t  \r\n\t        let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n\t        method.createHookFunction(\"cellDragStop\", Store.flowdata[row_index][col_index], {\r\n\t            r: row_index,\r\n\t            c: col_index,\r\n\t            \"start_r\": row_pre,\r\n\t            \"start_c\": col_pre,\r\n\t            \"end_r\": row,\r\n\t            \"end_c\": col\r\n\t        }, sheetFile, luckysheetTableContent, event);\r\n        }\r\n    }\r\n\r\n    //\u8868\u683Cmousemove\r\n    $(document).on(\"mousemove.luckysheetEvent\",function (event) {\r\n        luckysheetPostil.overshow(event); //\u6709\u6279\u6CE8\u663E\u793A\r\n        hyperlinkCtrl.overshow(event); //\u94FE\u63A5\u63D0\u793A\u663E\u793A\r\n\r\n        window.cancelAnimationFrame(Store.jfautoscrollTimeout);\r\n\r\n        if(luckysheetConfigsetting  && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.sheetMousemove){\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n\r\n            // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){\r\n                let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n                let moveState = {\r\n                    functionResizeStatus:formula.functionResizeStatus,\r\n                    horizontalmoveState:!!luckysheetFreezen.horizontalmovestate,\r\n                    verticalmoveState:!!luckysheetFreezen.verticalmovestate,\r\n                    pivotTableMoveState:!!pivotTable && pivotTable.movestate,\r\n                    sheetMoveStatus:Store.luckysheet_sheet_move_status,\r\n                    scrollStatus:!!Store.luckysheet_scroll_status,\r\n                    selectStatus:!!Store.luckysheet_select_status,\r\n                    rowsSelectedStatus:!!Store.luckysheet_rows_selected_status,\r\n                    colsSelectedStatus:!!Store.luckysheet_cols_selected_status,\r\n                    cellSelectedMove:!!Store.luckysheet_cell_selected_move,\r\n                    cellSelectedExtend:!!Store.luckysheet_cell_selected_extend,\r\n                    colsChangeSize:!!Store.luckysheet_cols_change_size,\r\n                    rowsChangeSize:!!Store.luckysheet_rows_change_size,\r\n                    chartMove:!!Store.chartparam.luckysheetCurrentChartMove,\r\n                    chartResize:!!Store.chartparam.luckysheetCurrentChartResize,\r\n                    rangeResize:!!formula.rangeResize ,\r\n                    rangeMove:!!formula.rangeMove,\r\n                }\r\n    \r\n                let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n\r\n                if(Store.flowdata && Store.flowdata[row_index]){\r\n                    method.createHookFunction(\"sheetMousemove\", Store.flowdata[row_index][col_index], {\r\n                        r:row_index,\r\n                        c:col_index,\r\n                        \"start_r\": row_pre,\r\n                        \"start_c\": col_pre, \r\n                        \"end_r\": row, \r\n                        \"end_c\": col \r\n                    }, sheetFile,moveState,luckysheetTableContent);\r\n                }\r\n            // }\r\n        }\r\n        \r\n        if(formula.functionResizeStatus){\r\n            let y = event.pageY;\r\n            let movepx = y - formula.functionResizeData.y;\r\n            let mpx = formula.functionResizeData.calculatebarHeight + movepx;\r\n            let winh = Math.round($(window).height() / 2);\r\n\r\n            if (mpx <= 28) {\r\n                if (mpx <= 20) {\r\n                    return;\r\n                }\r\n                mpx = 28;\r\n            }\r\n            else if (mpx >= winh) {\r\n                if (mpx >= winh + 8) {\r\n                    return;\r\n                }\r\n                mpx = winh;\r\n            }\r\n\r\n            Store.calculatebarHeight = mpx;\r\n            $(\"#luckysheet-wa-calculate\").css(\"height\", Store.calculatebarHeight - 2);\r\n            $(\"#luckysheet-wa-calculate-size\").css({ \"background\": \"#5e5e5e\", \"cursor\": \"ns-resize\" });\r\n\r\n            clearTimeout(formula.functionResizeTimeout);\r\n            formula.functionResizeTimeout = setTimeout(function () {\r\n                luckysheetsizeauto();\r\n            }, 15);\r\n        }\r\n        else if (!!luckysheetFreezen.horizontalmovestate) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let top = mouse[1] + Store.columnHeaderHeight;\r\n\r\n            if (top < Store.columnHeaderHeight) {\r\n                top = Store.columnHeaderHeight;\r\n            }\r\n\r\n            if (top > luckysheetFreezen.windowHeight - 4) {\r\n                top = luckysheetFreezen.windowHeight - 4;\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css({ \"top\": top });\r\n\r\n            if (top + scrollTop - Store.columnHeaderHeight >= row_pre + (row - row_pre) / 2) {\r\n                top = row - 2 - scrollTop + Store.columnHeaderHeight;\r\n                luckysheetFreezen.freezenhorizontaldata = [row, row_index + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index + 1), top];\r\n            }\r\n            else {\r\n                top = row_pre - 2 - scrollTop + Store.columnHeaderHeight;\r\n                luckysheetFreezen.freezenhorizontaldata = [row_pre, row_index, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index), top];\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-drop\").css({ \"top\": top });\r\n            luckysheetFreezen.saveFreezen(luckysheetFreezen.freezenhorizontaldata, top, null, null);\r\n        }\r\n        else if (!!luckysheetFreezen.verticalmovestate) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let left = mouse[0] + Store.rowHeaderWidth;\r\n\r\n            if (left < Store.rowHeaderWidth) {\r\n                left = Store.rowHeaderWidth;\r\n            }\r\n\r\n            if (left > luckysheetFreezen.windowWidth - 4) {\r\n                left = luckysheetFreezen.windowWidth - 4;\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css({ \"left\": left });\r\n\r\n            if (left + scrollLeft - Store.rowHeaderWidth >= col_pre + (col - col_pre) / 2) {\r\n                left = col - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                luckysheetFreezen.freezenverticaldata = [col, col_index + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index + 1), left];\r\n            }\r\n            else {\r\n                left = col_pre - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                luckysheetFreezen.freezenverticaldata = [col_pre, col_index, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index), left];\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-drop\").css({ \"left\": left });\r\n            luckysheetFreezen.saveFreezen(null, null, luckysheetFreezen.freezenverticaldata, left);\r\n            luckysheetsizeauto();//\u8C03\u8282\u9009\u533A\u65F6\u4E0B\u90E8\u5355\u5143\u683C\u6EA2\u51FA\r\n        }\r\n        else if (!!pivotTable && pivotTable.movestate) {\r\n            let x = event.pageX, y = event.pageY;\r\n            $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({\r\n                \"left\": x - pivotTable.movesave.width / 2,\r\n                \"top\": y - pivotTable.movesave.height\r\n            });\r\n        }\r\n        else if (Store.luckysheet_sheet_move_status) {\r\n            let scrollLeft = $(\"#luckysheet-sheet-container-c\").scrollLeft();\r\n            let x = event.pageX + scrollLeft;\r\n\r\n            if (Math.abs(event.pageX - Store.luckysheet_sheet_move_data.pageX) < 3) {\r\n                return;\r\n            }\r\n\r\n            let winW = $(\"#luckysheet-sheet-container\").width();\r\n            let left = x - Store.luckysheet_sheet_move_data.curleft - $(\"#luckysheet-sheet-container\").offset().left;\r\n            Store.luckysheet_sheet_move_data.activeobject.css({ \"left\": left });\r\n\r\n            let row_index = luckysheet_searcharray(Store.luckysheet_sheet_move_data.widthlist, left + Store.luckysheet_sheet_move_data.curleft);\r\n            Store.luckysheet_sheet_move_data.cursorobject.css({ \"cursor\": \"move\" });\r\n\r\n            if (left - scrollLeft <= 6) {\r\n                $(\"#luckysheet-sheets-leftscroll\").click();\r\n            }\r\n\r\n            if (left - scrollLeft >= winW - 40) {\r\n                $(\"#luckysheet-sheets-rightscroll\").click();\r\n            }\r\n\r\n            if (row_index != Store.luckysheet_sheet_move_data.curindex) {\r\n                if (row_index == -1 && left > 0) {\r\n                    row_index = Store.luckysheet_sheet_move_data.widthlist.length - 1;\r\n                    $(\"#luckysheet-sheets-item-clone\").insertAfter($(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(row_index));\r\n                }\r\n                else if (row_index == -1 && left <= 0) {\r\n                    $(\"#luckysheet-sheets-item-clone\").insertBefore($(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(0));\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-sheets-item-clone\").insertAfter($(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(row_index));\r\n                }\r\n\r\n                Store.luckysheet_sheet_move_data.widthlist = [];\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").each(function (i) {\r\n                    if (i == 0) {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()));\r\n                    }\r\n                    else {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()) + Store.luckysheet_sheet_move_data.widthlist[i - 1]);\r\n                    }\r\n                });\r\n\r\n                Store.luckysheet_sheet_move_data.curindex = $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").index($(\"#luckysheet-sheets-item-clone\"));\r\n            }\r\n        }\r\n        else if (Store.luckysheet_model_move_state) {\r\n            let scrollTop = $(document).scrollTop(), scrollLeft = $(document).scrollLeft();\r\n            let y = event.pageY + scrollTop, x = event.pageX + scrollLeft;\r\n            let winH = $(window).height(), winW = $(window).width();\r\n            let myh = Store.luckysheet_model_move_obj.height(),\r\n                myw = Store.luckysheet_model_move_obj.width();\r\n            let top = y - Store.luckysheet_model_xy[1],\r\n                left = x - Store.luckysheet_model_xy[0];\r\n\r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n\r\n            if (top + myh + 62 > winH) {\r\n                top = winH - myh - 62;\r\n            }\r\n\r\n            if (left < 0) {\r\n                left = 0;\r\n            }\r\n\r\n            if (left + myw + 86 > winW) {\r\n                left = winW - myw - 86;\r\n            }\r\n\r\n            Store.luckysheet_model_move_obj.css({ \"top\": top, \"left\": left });\r\n            event.preventDefault();\r\n        }\r\n        else if (!!Store.luckysheet_scroll_status || !!Store.luckysheet_select_status || !!Store.luckysheet_rows_selected_status || !!Store.luckysheet_cols_selected_status || !!Store.luckysheet_cell_selected_move || !!Store.luckysheet_cell_selected_extend || !!Store.luckysheet_cols_change_size || !!Store.luckysheet_rows_change_size || !!Store.chartparam.luckysheetCurrentChartMove || !!Store.chartparam.luckysheetCurrentChartResize || !!formula.rangeResize || !!formula.rangeMove) {\r\n            if (Store.luckysheet_select_status) {\r\n                clearTimeout(Store.countfuncTimeout);\r\n                Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n            }\r\n            \r\n            function mouseRender() {\r\n                if (Store.luckysheet_scroll_status  && !Store.luckysheet_cols_change_size && !Store.luckysheet_rows_change_size) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let left = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                        top = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                    let x = mouse[0];\r\n                    let y = mouse[1];\r\n                    let winH = $(\"#luckysheet-cell-main\").height() - 20*Store.zoomRatio,\r\n                        winW = $(\"#luckysheet-cell-main\").width() - 60*Store.zoomRatio;\r\n\r\n                    if (y < 0 || y > winH) {\r\n                        let stop;\r\n                        if (y < 0) {\r\n                            stop = top + y / 2;\r\n                        }\r\n                        else {\r\n                            stop = top + (y - winH) / 2;\r\n                        }\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n                    }\r\n\r\n                    if (x < 0 || x > winW) {\r\n                        let sleft;\r\n                        if (x < 0) {\r\n                            sleft = left + x / 2;\r\n                        }\r\n                        else {\r\n                            sleft = left + (x - winW) / 2;\r\n                        }\r\n\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n                    }\r\n                }\r\n                if (Store.luckysheet_select_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n\r\n                    if(!checkProtectionSelectLockedOrUnLockedCells(row_index, col_index, Store.currentSheetIndex)){\r\n                        // Store.luckysheet_select_status = false;\r\n                        return;\r\n                    }\r\n\r\n                    let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    luckysheetFreezen.scrollFreezen();\r\n\r\n                    // selectHelpboxFill();\r\n\r\n                    //\u4EA4\u66FF\u989C\u8272\u9009\u62E9\u8303\u56F4\r\n                    if ($(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")) {\r\n                        $(\"#luckysheet-alternateformat-rangeDialog input\").val(getRangetxt(Store.currentSheetIndex, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]));\r\n                    }\r\n\r\n                    if (pivotTable.luckysheet_pivotTable_select_state) {\r\n                        $(\"#luckysheet-pivotTable-range-selection-input\").val(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + \"!\" + chatatABC(Store.luckysheet_select_save[0][\"column\"][0]) + (Store.luckysheet_select_save[0][\"row\"][0] + 1) + \":\" + chatatABC(Store.luckysheet_select_save[0][\"column\"][1]) + (Store.luckysheet_select_save[0][\"row\"][1] + 1));\r\n                    }\r\n                }\r\n                else if (conditionformat.selectStatus) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = conditionformat.selectRange[conditionformat.selectRange.length - 1];\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    conditionformat.selectRange[conditionformat.selectRange.length - 1] = last;\r\n\r\n                    selectionCopyShow(conditionformat.selectRange);\r\n\r\n                    let range = conditionformat.getTxtByRange(conditionformat.selectRange);\r\n                    $(\"#luckysheet-multiRange-dialog input\").val(range);\r\n                }\r\n                else if (dataVerificationCtrl.selectStatus) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1];\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1] = last;\r\n\r\n                    selectionCopyShow(dataVerificationCtrl.selectRange);\r\n\r\n                    let range = dataVerificationCtrl.getTxtByRange(dataVerificationCtrl.selectRange);\r\n                    if(formula.rangetosheet != Store.currentSheetIndex){\r\n                        range = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '!' + range;\r\n                    }\r\n                    $(\"#luckysheet-dataVerificationRange-dialog input\").val(range);\r\n                }\r\n                else if (formula.rangestart) {\r\n                    formula.rangedrag(event);\r\n                }\r\n                else if (formula.rangedrag_row_start) {\r\n                    formula.rangedrag_row(event);\r\n                }\r\n                else if (formula.rangedrag_column_start) {\r\n                    formula.rangedrag_column(event);\r\n                }\r\n                else if (Store.luckysheet_rows_selected_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n                    if (y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_index = Store.visibledatacolumn.length - 1,\r\n                        col = Store.visibledatacolumn[col_index],\r\n                        col_pre = 0;\r\n\r\n                    let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    clearTimeout(Store.countfuncTimeout);\r\n                    Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n                }\r\n                else if (Store.luckysheet_cols_selected_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n                    if (x < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let row_index = Store.visibledatarow.length - 1,\r\n                        row = Store.visibledatarow[row_index],\r\n                        row_pre = 0;\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    clearTimeout(Store.countfuncTimeout);\r\n                    Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n                }\r\n                else if (Store.luckysheet_cell_selected_move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                        winW = $(window).width() + scrollLeft;\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let row_index_original = Store.luckysheet_cell_selected_move_index[0],\r\n                        col_index_original = Store.luckysheet_cell_selected_move_index[1];\r\n\r\n                    let row_s = Store.luckysheet_select_save[0][\"row\"][0] - row_index_original + row_index,\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - row_index_original + row_index;\r\n\r\n                    let col_s = Store.luckysheet_select_save[0][\"column\"][0] - col_index_original + col_index,\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1] - col_index_original + col_index;\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - Store.luckysheet_select_save[0][\"row\"][0];\r\n                    }\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1] - Store.luckysheet_select_save[0][\"column\"][0];\r\n                    }\r\n\r\n                    if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                        row_s = Store.visibledatarow.length - 1 - Store.luckysheet_select_save[0][\"row\"][1] + Store.luckysheet_select_save[0][\"row\"][0];\r\n                        row_e = Store.visibledatarow.length - 1;\r\n                    }\r\n\r\n                    if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                        col_s = Store.visibledatacolumn.length - 1 - Store.luckysheet_select_save[0][\"column\"][1] + Store.luckysheet_select_save[0][\"column\"][0];\r\n                        col_e = Store.visibledatacolumn.length - 1;\r\n                    }\r\n\r\n                    col_pre = col_s - 1 == -1 ? 0 : Store.visibledatacolumn[col_s - 1];\r\n                    col = Store.visibledatacolumn[col_e];\r\n                    row_pre = row_s - 1 == -1 ? 0 : Store.visibledatarow[row_s - 1];\r\n                    row = Store.visibledatarow[row_e];\r\n\r\n                    $(\"#luckysheet-cell-selected-move\").css({\r\n                        \"left\": col_pre,\r\n                        \"width\": col - col_pre - 2,\r\n                        \"top\": row_pre,\r\n                        \"height\": row - row_pre - 2,\r\n                        \"display\": \"block\"\r\n                    });\r\n                }\r\n                else if (Store.luckysheet_cell_selected_extend) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft() - 5;\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop() - 5;\r\n\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                        winW = $(window).width() + scrollLeft;\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let row_index_original = Store.luckysheet_cell_selected_extend_index[0],\r\n                        col_index_original = Store.luckysheet_cell_selected_extend_index[1];\r\n\r\n                    let row_s = Store.luckysheet_select_save[0][\"row\"][0],\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1];\r\n                    let col_s = Store.luckysheet_select_save[0][\"column\"][0],\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1];\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - Store.luckysheet_select_save[0][\"row\"][0];\r\n                    }\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1] - Store.luckysheet_select_save[0][\"column\"][0];\r\n                    }\r\n\r\n                    if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                        row_s = Store.visibledatarow.length - 1 - Store.luckysheet_select_save[0][\"row\"][1] + Store.luckysheet_select_save[0][\"row\"][0];\r\n                        row_e = Store.visibledatarow.length - 1;\r\n                    }\r\n\r\n                    if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                        col_s = Store.visibledatacolumn.length - 1 - Store.luckysheet_select_save[0][\"column\"][1] + Store.luckysheet_select_save[0][\"column\"][0];\r\n                        col_e = Store.visibledatacolumn.length - 1;\r\n                    }\r\n\r\n                    let top = Store.luckysheet_select_save[0].top_move,\r\n                        height = Store.luckysheet_select_save[0].height_move;\r\n                    let left = Store.luckysheet_select_save[0].left_move,\r\n                        width = Store.luckysheet_select_save[0].width_move;\r\n\r\n                    if (Math.abs(row_index_original - row_index) > Math.abs(col_index_original - col_index)) {\r\n                        if (!(row_index >= row_s && row_index <= row_e)) {\r\n                            if (Store.luckysheet_select_save[0].top_move >= row_pre) {\r\n                                top = row_pre;\r\n                                height = Store.luckysheet_select_save[0].top_move + Store.luckysheet_select_save[0].height_move - row_pre;\r\n                            }\r\n                            else {\r\n                                top = Store.luckysheet_select_save[0].top_move;\r\n                                height = row - Store.luckysheet_select_save[0].top_move - 1;\r\n                            }\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (!(col_index >= col_s && col_index <= col_e)) {\r\n                            if (Store.luckysheet_select_save[0].left_move >= col_pre) {\r\n                                left = col_pre;\r\n                                width = Store.luckysheet_select_save[0].left_move + Store.luckysheet_select_save[0].width_move - col_pre;\r\n                            }\r\n                            else {\r\n                                left = Store.luckysheet_select_save[0].left_move;\r\n                                width = col - Store.luckysheet_select_save[0].left_move - 1;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-cell-selected-extend\").css({\r\n                        \"left\": left,\r\n                        \"width\": width,\r\n                        \"top\": top,\r\n                        \"height\": height,\r\n                        \"display\": \"block\"\r\n                    });\r\n                }\r\n                else if (Store.luckysheet_cols_change_size) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let winW = $(window).width();\r\n\r\n                    let row_index = Store.visibledatarow.length - 1,\r\n                        row = Store.visibledatarow[row_index],\r\n                        row_pre = 0;\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n                    \r\n                    if ((x + 3) - Store.luckysheet_cols_change_size_start[0] > 30 && x < winW + scrollLeft - 100) {\r\n                        $(\"#luckysheet-change-size-line\").css({ \"left\": x });\r\n                        $(\"#luckysheet-cols-change-size\").css({ \"left\": x - 2 });\r\n                    }\r\n                }\r\n                else if (Store.luckysheet_rows_change_size) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollTop = $(\"#luckysheet-rows-h\").scrollTop();\r\n                    let y = mouse[1] + scrollTop;\r\n                    let winH = $(window).height();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n\r\n                    if ((y + 3) - Store.luckysheet_rows_change_size_start[0] > 19 && y < winH + scrollTop - 200) {\r\n                        $(\"#luckysheet-change-size-line\").css({ \"top\": y });\r\n                        $(\"#luckysheet-rows-change-size\").css({ \"top\": y });\r\n                    }\r\n                }\r\n                // chart move\r\n                else if (!!Store.chartparam.luckysheetCurrentChartMove) {\r\n                    const mouse = mouseposition(event.pageX, event.pageY);\r\n                    const x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    const y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    const myh = Store.chartparam.luckysheetCurrentChartMoveObj.height(), myw = Store.chartparam.luckysheetCurrentChartMoveObj.width();\r\n                    let top = y - Store.chartparam.luckysheetCurrentChartMoveXy[1], left = x - Store.chartparam.luckysheetCurrentChartMoveXy[0];\r\n\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    if (top + myh + 42 + 6 > Store.chartparam.luckysheetCurrentChartMoveWinH) {\r\n                        top = Store.chartparam.luckysheetCurrentChartMoveWinH - myh - 42 - 6;\r\n                    }\r\n\r\n                    if (left < 0) {\r\n                        left = 0;\r\n                    }\r\n\r\n                    if (left + myw + 22 + 36 > Store.chartparam.luckysheetCurrentChartMoveWinW) {\r\n                        left = Store.chartparam.luckysheetCurrentChartMoveWinW - myw - 22 - 36;\r\n                    }\r\n\r\n                    Store.chartparam.luckysheetCurrentChartMoveObj.css({ \"top\": top, \"left\": left });\r\n\r\n                    if (luckysheetFreezen.freezenhorizontaldata != null || luckysheetFreezen.freezenverticaldata != null) {\r\n                        luckysheetFreezen.scrollAdapt();\r\n\r\n                        const toffset = Store.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n                        const tpsition = Store.chartparam.luckysheetCurrentChartMoveObj.position();\r\n                        Store.chartparam.luckysheetCurrentChartMoveXy = [event.pageX - toffset.left, event.pageY - toffset.top, tpsition.left, tpsition.top, $(\"#luckysheet-scrollbar-x\").scrollLeft(), $(\"#luckysheet-scrollbar-y\").scrollTop()];\r\n                    }\r\n                }\r\n                // chart resize\r\n                else if (!!Store.chartparam.luckysheetCurrentChartResize) {\r\n                    const scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    const mouse = mouseposition(event.pageX, event.pageY);\r\n                    const x = mouse[0] + scrollLeft;\r\n                    const y = mouse[1] + scrollTop;\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    const myh = Store.chartparam.luckysheetCurrentChartResizeObj.height(), myw = Store.chartparam.luckysheetCurrentChartResizeObj.width();\r\n                    const topchange = y - Store.chartparam.luckysheetCurrentChartResizeXy[1], leftchange = x - Store.chartparam.luckysheetCurrentChartResizeXy[0];\r\n\r\n                    let top = Store.chartparam.luckysheetCurrentChartResizeXy[5], height = Store.chartparam.luckysheetCurrentChartResizeXy[3], left = Store.chartparam.luckysheetCurrentChartResizeXy[4], width = Store.chartparam.luckysheetCurrentChartResizeXy[2];\r\n\r\n                    if (Store.chartparam.luckysheetCurrentChartResize == \"lm\" || Store.chartparam.luckysheetCurrentChartResize == \"lt\" || Store.chartparam.luckysheetCurrentChartResize == \"lb\") {\r\n                        left = x;\r\n                        width = Store.chartparam.luckysheetCurrentChartResizeXy[2] - leftchange;\r\n                        if (left > Store.chartparam.luckysheetCurrentChartResizeXy[2] + Store.chartparam.luckysheetCurrentChartResizeXy[4] - 60) {\r\n                            left = Store.chartparam.luckysheetCurrentChartResizeXy[2] + Store.chartparam.luckysheetCurrentChartResizeXy[4] - 60;\r\n                            width = Store.chartparam.luckysheetCurrentChartResizeXy[2] - (Store.chartparam.luckysheetCurrentChartResizeXy[2] + Store.chartparam.luckysheetCurrentChartResizeXy[4] - 60 - Store.chartparam.luckysheetCurrentChartResizeXy[0]);\r\n                        }\r\n                        else if (left <= 0) {\r\n                            left = 0;\r\n                            width = Store.chartparam.luckysheetCurrentChartResizeXy[2] + Store.chartparam.luckysheetCurrentChartResizeXy[0];\r\n                        }\r\n                    }\r\n\r\n                    if (Store.chartparam.luckysheetCurrentChartResize == \"rm\" || Store.chartparam.luckysheetCurrentChartResize == \"rt\" || Store.chartparam.luckysheetCurrentChartResize == \"rb\") {\r\n                        width = Store.chartparam.luckysheetCurrentChartResizeXy[2] + leftchange;\r\n                        if (width < 60) {\r\n                            width = 60;\r\n                        }\r\n                        else if (width >= Store.chartparam.luckysheetCurrentChartResizeWinW - Store.chartparam.luckysheetCurrentChartResizeXy[4] - 22 - 36) {\r\n                            width = Store.chartparam.luckysheetCurrentChartResizeWinW - Store.chartparam.luckysheetCurrentChartResizeXy[4] - 22 - 36;\r\n                        }\r\n                    }\r\n\r\n                    if (Store.chartparam.luckysheetCurrentChartResize == \"mt\" || Store.chartparam.luckysheetCurrentChartResize == \"lt\" || Store.chartparam.luckysheetCurrentChartResize == \"rt\") {\r\n                        top = y;\r\n                        height = Store.chartparam.luckysheetCurrentChartResizeXy[3] - topchange;\r\n                        if (top > Store.chartparam.luckysheetCurrentChartResizeXy[3] + Store.chartparam.luckysheetCurrentChartResizeXy[5] - 60) {\r\n                            top = Store.chartparam.luckysheetCurrentChartResizeXy[3] + Store.chartparam.luckysheetCurrentChartResizeXy[5] - 60;\r\n                            height = Store.chartparam.luckysheetCurrentChartResizeXy[3] - (Store.chartparam.luckysheetCurrentChartResizeXy[3] + Store.chartparam.luckysheetCurrentChartResizeXy[5] - 60 - Store.chartparam.luckysheetCurrentChartResizeXy[1]);\r\n                        }\r\n                        else if (top <= 0) {\r\n                            top = 0;\r\n                            height = Store.chartparam.luckysheetCurrentChartResizeXy[3] + Store.chartparam.luckysheetCurrentChartResizeXy[1];\r\n                        }\r\n                    }\r\n\r\n                    if (Store.chartparam.luckysheetCurrentChartResize == \"mb\" || Store.chartparam.luckysheetCurrentChartResize == \"lb\" || Store.chartparam.luckysheetCurrentChartResize == \"rb\") {\r\n                        height = Store.chartparam.luckysheetCurrentChartResizeXy[3] + topchange;\r\n                        if (height < 60) {\r\n                            height = 60;\r\n                        }\r\n                        else if (height >= Store.chartparam.luckysheetCurrentChartResizeWinH - Store.chartparam.luckysheetCurrentChartResizeXy[5] - 42 - 6) {\r\n                            height = Store.chartparam.luckysheetCurrentChartResizeWinH - Store.chartparam.luckysheetCurrentChartResizeXy[5] - 42 - 6;\r\n                        }\r\n                    }\r\n\r\n                    const resizedata = { \"top\": top, \"left\": left, \"height\": height, \"width\": width };\r\n                    Store.chartparam.luckysheetCurrentChartResizeObj.css(resizedata);\r\n                    // resize chart\r\n                    Store.resizeChart(Store.chartparam.luckysheetCurrentChart)\r\n                }\r\n                //image move\r\n                else if (imageCtrl.move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n                    if(imgItem.isFixedPos){\r\n                        x = event.pageX;\r\n                        y = event.pageY;\r\n                    }\r\n\r\n                    let myh = $(\"#luckysheet-modal-dialog-activeImage\").height(),\r\n                        myw = $(\"#luckysheet-modal-dialog-activeImage\").width();\r\n\r\n                    let top = y - imageCtrl.moveXY[1],\r\n                        left = x - imageCtrl.moveXY[0];\r\n\r\n                    let minTop = 0,\r\n                        maxTop = imageCtrl.currentWinH - myh - 42 - 6,\r\n                        minLeft = 0,\r\n                        maxLeft = imageCtrl.currentWinW - myw - 22 - 36;\r\n\r\n                    if(imgItem.isFixedPos){\r\n                        minTop = Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n                        maxTop = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - myh;\r\n                        minLeft = Store.rowHeaderWidth;\r\n                        maxLeft = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - myw;\r\n                    }\r\n\r\n                    if (top < minTop) {\r\n                        top = minTop;\r\n                    }\r\n\r\n                    if (top > maxTop) {\r\n                        top = maxTop;\r\n                    }\r\n\r\n                    if (left < minLeft) {\r\n                        left = minLeft;\r\n                    }\r\n\r\n                    if (left > maxLeft) {\r\n                        left = maxLeft;\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-activeImage\").css({ \"left\": left, \"top\": top });\r\n                }\r\n                //image resize\r\n                else if (!!imageCtrl.resize) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let resizeXY = imageCtrl.resizeXY;\r\n\r\n                    let topchange = y - resizeXY[1],\r\n                        leftchange = x - resizeXY[0];\r\n\r\n                    let top = resizeXY[5],\r\n                        height = resizeXY[3],\r\n                        left = resizeXY[4],\r\n                        width = resizeXY[2];\r\n\r\n                    let resize = imageCtrl.resize;\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n\r\n                    if(imgItem.isFixedPos){\r\n                        let minTop = Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n                        let minLeft = Store.rowHeaderWidth;\r\n\r\n                        if(resize == 'lt'){//\u5DE6\u4E0A\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if(left < minLeft){\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if(left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1){\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height;\r\n\r\n                            if(top < minTop){\r\n                                top = minTop;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n\r\n                            if(top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1){\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n                        }\r\n                        else if(resize == 'lm'){//\u5DE6\u4E2D\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if(left < minLeft){\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if(left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1){\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n                            height = resizeXY[3];\r\n                        }\r\n                        else if(resize == 'lb'){//\u5DE6\u4E0B\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if(left < minLeft){\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if(left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1){\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            if(height < 1){\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n\r\n                            if(height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top){\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n                                \r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n                        }\r\n                        else if(resize == 'rt'){//\u53F3\u4E0A\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if(width < 1){\r\n                                width = 1;\r\n                            }\r\n\r\n                            if(width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left){\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height;\r\n\r\n                            if(top < minTop){\r\n                                top = minTop;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n\r\n                            if(top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1){\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        }\r\n                        else if(resize == 'rm'){//\u53F3\u4E2D\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if(width < 1){\r\n                                width = 1;\r\n                            }\r\n\r\n                            if(width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left){\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n                            height = resizeXY[3];\r\n                        }\r\n                        else if(resize == 'rb'){//\u53F3\u4E0B\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if(width < 1){\r\n                                width = 1;\r\n                            }\r\n\r\n                            if(width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left){\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            if(height < 1){\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n\r\n                            if(height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top){\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n                            \r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        }\r\n                        else if(resize == 'mt'){//\u4E2D\u4E0A\r\n                            left = resizeXY[4] - resizeXY[6];\r\n                            width = resizeXY[2];\r\n\r\n                            top = resizeXY[5] - resizeXY[7] + topchange;\r\n\r\n                            if(top < minTop){\r\n                                top = minTop;\r\n                            }\r\n\r\n                            if(top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1){\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                            }\r\n\r\n                            height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n                        }\r\n                        else if(resize == 'mb'){//\u4E2D\u4E0B\r\n                            left = resizeXY[4] - resizeXY[6];\r\n                            width = resizeXY[2];\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            height = resizeXY[3] + topchange;\r\n\r\n                            if(height < 1){\r\n                                height = 1;\r\n                            }\r\n\r\n                            if(height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top){\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(resize == 'lt'){//\u5DE6\u4E0A\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n    \r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            }\r\n                            else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[3] + resizeXY[1] - height;\r\n    \r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                            else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                        }\r\n                        else if(resize == 'lm'){//\u5DE6\u4E2D\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n    \r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            }\r\n                            else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n                        }\r\n                        else if(resize == 'lb'){//\u5DE6\u4E0B\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n    \r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            }\r\n                            else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                            else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                        }\r\n                        else if(resize == 'rt'){//\u53F3\u4E0A\r\n                            width = resizeXY[2] + leftchange;\r\n    \r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n                            else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[3] + resizeXY[1] - height;\r\n    \r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                            else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        }\r\n                        else if(resize == 'rm'){//\u53F3\u4E2D\r\n                            width = resizeXY[2] + leftchange;\r\n    \r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n                            else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n                        }\r\n                        else if(resize == 'rb'){//\u53F3\u4E0B\r\n                            width = resizeXY[2] + leftchange;\r\n    \r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n                            else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n    \r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                            else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        }\r\n                        else if(resize == 'mt'){//\u4E2D\u4E0A\r\n                            top = y;\r\n                            height = resizeXY[3] - topchange;\r\n    \r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n                            }\r\n                            else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n                            }\r\n                        }\r\n                        else if(resize == 'mb'){//\u4E2D\u4E0B\r\n                            height = resizeXY[3] + topchange;\r\n    \r\n                            if (height < 1) {\r\n                                height = 1;\r\n                            }\r\n                            else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-activeImage\").css({ \r\n                        \"width\": width, \r\n                        \"height\": height, \r\n                        \"left\": left, \r\n                        \"top\": top \r\n                    });\r\n                    \r\n                    let scaleX = width / imgItem.crop.width;\r\n                    let scaleY = height / imgItem.crop.height;\r\n                    let defaultWidth = Math.round(imgItem.default.width * scaleX);\r\n                    let defaultHeight = Math.round(imgItem.default.height * scaleY);\r\n                    let offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                    let offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                    \r\n                    $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n                        \"background-size\": defaultWidth + \"px \" + defaultHeight + \"px\",\r\n                        \"background-position\": -offsetLeft + \"px \" + -offsetTop + \"px\"\r\n                    })\r\n                }\r\n                //image cropChange\r\n                else if (!!imageCtrl.cropChange) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let cropChangeXY = imageCtrl.cropChangeXY;\r\n\r\n                    let topchange = y - cropChangeXY[1],\r\n                        leftchange = x - cropChangeXY[0];\r\n\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n                    let cropChange = imageCtrl.cropChange;\r\n                    let width, height, offsetLeft, offsetTop;\r\n\r\n                    if(cropChange == 'lt'){//\u5DE6\u4E0A\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if(offsetLeft < 0){\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if(offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1){\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if(offsetTop < 0){\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if(offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1){\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    }\r\n                    else if(cropChange == 'lm'){//\u5DE6\u4E2D\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if(offsetLeft < 0){\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if(offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1){\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n                        height = imgItem.crop.height;\r\n                    }\r\n                    else if(cropChange == 'lb'){//\u5DE6\u4E0B\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if(offsetLeft < 0){\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if(offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1){\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n                        \r\n                        if(height < 1){\r\n                            height = 1;\r\n                        }\r\n\r\n                        if(height > imgItem.default.height - offsetTop){\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    }\r\n                    else if(cropChange == 'rt'){//\u53F3\u4E0A\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if(width < 1){\r\n                            width = 1;\r\n                        }\r\n\r\n                        if(width > imgItem.default.width - offsetLeft){\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if(offsetTop < 0){\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if(offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1){\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    }\r\n                    else if(cropChange == 'rm'){//\u53F3\u4E2D\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if(width < 1){\r\n                            width = 1;\r\n                        }\r\n\r\n                        if(width > imgItem.default.width - offsetLeft){\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n                        height = imgItem.crop.height;\r\n                    }\r\n                    else if(cropChange == 'rb'){//\u53F3\u4E0B\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if(width < 1){\r\n                            width = 1;\r\n                        }\r\n\r\n                        if(width > imgItem.default.width - offsetLeft){\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n\r\n                        if(height < 1){\r\n                            height = 1;\r\n                        }\r\n\r\n                        if(height > imgItem.default.height - offsetTop){\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    }\r\n                    else if(cropChange == 'mt'){//\u4E2D\u4E0A\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n                        width = imgItem.crop.width;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if(offsetTop < 0){\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if(offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1){\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    }\r\n                    else if(cropChange == 'mb'){//\u4E2D\u4E0B\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n                        width = imgItem.crop.width;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n\r\n                        if(height < 1){\r\n                            height = 1;\r\n                        }\r\n\r\n                        if(height > imgItem.default.height - offsetTop){\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    }\r\n\r\n                    let left = imgItem.default.left + offsetLeft;\r\n                    let top = imgItem.default.top + offsetTop;\r\n\r\n                    if(imgItem.isFixedPos){\r\n                        left = imgItem.fixedLeft + offsetLeft;\r\n                        top = imgItem.fixedTop + offsetTop;\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-cropping\").show().css({\r\n                        \"width\": width,\r\n                        \"height\": height,\r\n                        \"left\": left,\r\n                        \"top\": top\r\n                    });\r\n        \r\n                    $(\"#luckysheet-modal-dialog-cropping .cropping-mask\").css({\r\n                        \"width\": imgItem.default.width,\r\n                        \"height\": imgItem.default.height,\r\n                        \"background-image\": \"url(\" + imgItem.src + \")\",\r\n                        \"left\": -offsetLeft,\r\n                        \"top\": -offsetTop\r\n                    })\r\n        \r\n                    $(\"#luckysheet-modal-dialog-cropping .cropping-content\").css({\r\n                        \"background-image\": \"url(\" + imgItem.src + \")\",\r\n                        \"background-size\": imgItem.default.width + \"px \" + imgItem.default.height + \"px\",\r\n                        \"background-position\": -offsetLeft + \"px \" + -offsetTop + \"px\"\r\n                    })\r\n\r\n                    imageCtrl.cropChangeObj = {\r\n                        width: width,\r\n                        height: height,\r\n                        offsetLeft: offsetLeft,\r\n                        offsetTop: offsetTop\r\n                    }\r\n                }\r\n                else if (luckysheetPostil.move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let myh = luckysheetPostil.currentObj.outerHeight(),\r\n                        myw = luckysheetPostil.currentObj.outerWidth();\r\n\r\n                    let top = y - luckysheetPostil.moveXY[1],\r\n                        left = x - luckysheetPostil.moveXY[0];\r\n\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    if (top + myh + 42 + 6 > luckysheetPostil.currentWinH) {\r\n                        top = luckysheetPostil.currentWinH - myh - 42 - 6;\r\n                    }\r\n\r\n                    if (left < 0) {\r\n                        left = 0;\r\n                    }\r\n\r\n                    if (left + myw + 22 + 36 > luckysheetPostil.currentWinW) {\r\n                        left = luckysheetPostil.currentWinW - myw - 22 - 36;\r\n                    }\r\n\r\n                    luckysheetPostil.currentObj.css({ \"left\": left, \"top\": top });\r\n                }\r\n                else if (!!luckysheetPostil.resize) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let resizeXY = luckysheetPostil.resizeXY;\r\n\r\n                    let topchange = y - resizeXY[1],\r\n                        leftchange = x - resizeXY[0];\r\n\r\n                    let top = resizeXY[5],\r\n                        height = resizeXY[3],\r\n                        left = resizeXY[4],\r\n                        width = resizeXY[2];\r\n\r\n                    let resize = luckysheetPostil.resize;\r\n\r\n                    if (resize == \"lm\" || resize == \"lt\" || resize == \"lb\") {\r\n                        left = x;\r\n                        width = resizeXY[2] - leftchange;\r\n\r\n                        if (left > resizeXY[2] + resizeXY[4] - 60) {\r\n                            left = resizeXY[2] + resizeXY[4] - 60;\r\n                            width = resizeXY[2] - (resizeXY[2] + resizeXY[4] - 60 - resizeXY[0]);\r\n                        }\r\n                        else if (left <= 0) {\r\n                            left = 0;\r\n                            width = resizeXY[2] + resizeXY[0];\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"rm\" || resize == \"rt\" || resize == \"rb\") {\r\n                        width = resizeXY[2] + leftchange;\r\n\r\n                        if (width < 60) {\r\n                            width = 60;\r\n                        }\r\n                        else if (width >= luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36) {\r\n                            width = luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36;\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"mt\" || resize == \"lt\" || resize == \"rt\") {\r\n                        top = y;\r\n                        height = resizeXY[3] - topchange;\r\n\r\n                        if (top > resizeXY[3] + resizeXY[5] - 60) {\r\n                            top = resizeXY[3] + resizeXY[5] - 60;\r\n                            height = resizeXY[3] - (resizeXY[3] + resizeXY[5] - 60 - resizeXY[1]);\r\n                        }\r\n                        else if (top <= 0) {\r\n                            top = 0;\r\n                            height = resizeXY[3] + resizeXY[1];\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"mb\" || resize == \"lb\" || resize == \"rb\") {\r\n                        height = resizeXY[3] + topchange;\r\n\r\n                        if (height < 60) {\r\n                            height = 60;\r\n                        }\r\n                        else if (height >= luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6) {\r\n                            height = luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6;\r\n                        }\r\n                    }\r\n\r\n                    luckysheetPostil.currentObj.css({ \"width\": width, \"height\": height, \"left\": left, \"top\": top });\r\n                }\r\n                else if (!!formula.rangeResize) {\r\n                    formula.rangeResizeDraging(event, formula.rangeResizeObj, formula.rangeResizexy, formula.rangeResize, formula.rangeResizeWinW, formula.rangeResizeWinH, Store.ch_width, Store.rh_height);\r\n                }\r\n                else if (!!formula.rangeMove) {\r\n                    formula.rangeMoveDraging(event, formula.rangeMovexy, formula.rangeMoveObj.data(\"range\"), formula.rangeMoveObj, Store.sheetBarHeight, Store.statisticBarHeight);\r\n                } \r\n                else if (!!Store.chart_selection.rangeResize) {\r\n                    Store.chart_selection.rangeResizeDraging(event, Store.sheetBarHeight, Store.statisticBarHeight);\r\n                }\r\n                else if (!!Store.chart_selection.rangeMove) {\r\n                    Store.chart_selection.rangeMoveDraging(event, Store.sheetBarHeight, Store.statisticBarHeight);\r\n                }\r\n\r\n                Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender);\r\n            }\r\n\r\n            Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender);\r\n        }\r\n    });\r\n    //\u8868\u683Cmouseup\r\n    $(document).on(\"mouseup.luckysheetEvent\",function (event) {\r\n        if(luckysheetConfigsetting  && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.sheetMouseup){\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n\r\n            // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){\r\n                let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n                let moveState = {\r\n                    functionResizeStatus:formula.functionResizeStatus,\r\n                    horizontalmoveState:!!luckysheetFreezen.horizontalmovestate,\r\n                    verticalmoveState:!!luckysheetFreezen.verticalmovestate,\r\n                    pivotTableMoveState:!!pivotTable && pivotTable.movestate,\r\n                    sheetMoveStatus:Store.luckysheet_sheet_move_status,\r\n                    scrollStatus:!!Store.luckysheet_scroll_status,\r\n                    selectStatus:!!Store.luckysheet_select_status,\r\n                    rowsSelectedStatus:!!Store.luckysheet_rows_selected_status,\r\n                    colsSelectedStatus:!!Store.luckysheet_cols_selected_status,\r\n                    cellSelectedMove:!!Store.luckysheet_cell_selected_move,\r\n                    cellSelectedExtend:!!Store.luckysheet_cell_selected_extend,\r\n                    colsChangeSize:!!Store.luckysheet_cols_change_size,\r\n                    rowsChangeSize:!!Store.luckysheet_rows_change_size,\r\n                    chartMove:!!Store.chartparam.luckysheetCurrentChartMove,\r\n                    chartResize:!!Store.chartparam.luckysheetCurrentChartResize,\r\n                    rangeResize:!!formula.rangeResize ,\r\n                    rangeMove:!!formula.rangeMove,\r\n                }\r\n    \r\n                let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n                \r\n                method.createHookFunction(\"sheetMouseup\", Store.flowdata[row_index][col_index], {\r\n                    r:row_index,\r\n                    c:col_index,\r\n                    \"start_r\": row_pre,\r\n                    \"start_c\": col_pre, \r\n                    \"end_r\": row, \r\n                    \"end_c\": col \r\n                }, sheetFile,moveState,luckysheetTableContent);\r\n            // }\r\n        }\r\n\r\n        //\u6570\u636E\u7A97\u683C\u4E3B\u4F53\r\n        if (Store.luckysheet_select_status) {\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function () {\r\n                countfunc();\r\n            }, 0);\r\n\r\n            //\u683C\u5F0F\u5237\r\n            if (menuButton.luckysheetPaintModelOn) {\r\n                selection.pasteHandlerOfPaintModel(Store.luckysheet_copy_save);\r\n\r\n                if (menuButton.luckysheetPaintSingle) {\r\n                    //\u5355\u6B21 \u683C\u5F0F\u5237\r\n                    menuButton.cancelPaintModel();\r\n                }\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_select_status = false;\r\n        window.cancelAnimationFrame(Store.jfautoscrollTimeout);\r\n        Store.luckysheet_scroll_status = false;\r\n\r\n        $(\"#luckysheet-cell-selected\").find(\".luckysheet-cs-fillhandle\").css(\"cursor\", \"crosshair\").end().find(\".luckysheet-cs-draghandle\").css(\"cursor\", \"move\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"default\");\r\n\r\n        //\u884C\u6807\u9898\u7A97\u683C\u4E3B\u4F53\r\n        Store.luckysheet_rows_selected_status = false;\r\n\r\n        //\u5217\u6807\u9898\u7A97\u683C\u4E3B\u4F53\r\n        Store.luckysheet_cols_selected_status = false;\r\n\r\n        Store.luckysheet_model_move_state = false;\r\n\r\n        if (formula.functionResizeStatus) {\r\n            formula.functionResizeStatus = false;\r\n            $(\"#luckysheet-wa-calculate-size\").removeAttr(\"style\");\r\n        }\r\n\r\n        if (!!luckysheetFreezen.horizontalmovestate) {\r\n            luckysheetFreezen.horizontalmovestate = false;\r\n            $(\"#luckysheet-freezebar-horizontal\").removeClass(\"luckysheet-freezebar-active\");\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css(\"cursor\", \"-webkit-grab\");\r\n            if (luckysheetFreezen.freezenhorizontaldata[4] <= Store.columnHeaderHeight) {\r\n                luckysheetFreezen.cancelFreezenHorizontal();\r\n            }\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        if (!!luckysheetFreezen.verticalmovestate) {\r\n            luckysheetFreezen.verticalmovestate = false;\r\n            $(\"#luckysheet-freezebar-vertical\").removeClass(\"luckysheet-freezebar-active\");\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css(\"cursor\", \"-webkit-grab\");\r\n            if (luckysheetFreezen.freezenverticaldata[4] <= Store.rowHeaderWidth) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n            }\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        if (!!pivotTable && pivotTable.movestate) {\r\n            $(\"#luckysheet-modal-dialog-slider-pivot-move\").remove();\r\n            pivotTable.movestate = false;\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").css(\"cursor\", \"default\");\r\n            if (pivotTable.movesave.containerid != \"luckysheet-modal-dialog-pivotTable-list\") {\r\n                let $cur = $(event.target).closest(\".luckysheet-modal-dialog-slider-config-list\");\r\n                if ($cur.length == 0) {\r\n                    if (pivotTable.movesave.containerid == \"luckysheet-modal-dialog-config-value\") {\r\n                        pivotTable.resetOrderby(pivotTable.movesave.obj);\r\n                    }\r\n\r\n                    pivotTable.movesave.obj.remove();\r\n                    pivotTable.showvaluecolrow();\r\n                    $(\"#luckysheet-modal-dialog-pivotTable-list\").find(\".luckysheet-modal-dialog-slider-list-item\").each(function () {\r\n                        $(this).find(\".luckysheet-slider-list-item-selected\").find(\"i\").remove();\r\n                    });\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\").find(\".luckysheet-modal-dialog-slider-config-item\").each(function () {\r\n                        let index = $(this).data(\"index\");\r\n\r\n                        $(\"#luckysheet-modal-dialog-pivotTable-list\").find(\".luckysheet-modal-dialog-slider-list-item\").each(function () {\r\n                            let $seleted = $(this).find(\".luckysheet-slider-list-item-selected\");\r\n                            if ($(this).data(\"index\") == index && $seleted.find(\"i\").length == 0) {\r\n                                $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                            }\r\n                        });\r\n\r\n                    });\r\n\r\n                    pivotTable.refreshPivotTable();\r\n                }\r\n            }\r\n        }\r\n\r\n        if (Store.luckysheet_sheet_move_status) {\r\n            Store.luckysheet_sheet_move_status = false;\r\n            Store.luckysheet_sheet_move_data.activeobject.insertBefore($(\"#luckysheet-sheets-item-clone\"));\r\n            Store.luckysheet_sheet_move_data.activeobject.removeAttr(\"style\");\r\n            $(\"#luckysheet-sheets-item-clone\").remove();\r\n            Store.luckysheet_sheet_move_data.cursorobject.css({ \"cursor\": \"pointer\" });\r\n            Store.luckysheet_sheet_move_data = {};\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n\r\n        // chart move debounce timer clear\r\n        clearTimeout(Store.chartparam.luckysheetCurrentChartMoveTimeout);\r\n\r\n        //\u56FE\u8868\u62D6\u52A8 chartMix\r\n        if (!!Store.chartparam.luckysheetCurrentChartMove) {\r\n            Store.chartparam.luckysheetCurrentChartMove = false;\r\n            if (Store.chartparam.luckysheetInsertChartTosheetChange) {\r\n\r\n                //myTop, myLeft: \u672C\u6B21\u7684chart\u6846\u4F4D\u7F6E\uFF0CscrollLeft,scrollTop: \u4E0A\u4E00\u6B21\u7684\u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n                var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"top\"), myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"left\"), scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                //\u70B9\u51FB\u65F6\u5019\u5B58\u50A8\u7684\u4FE1\u606F\uFF0C\u5373\u4E0A\u4E00\u6B21\u64CD\u4F5C\u7ED3\u675F\u7684\u56FE\u8868\u4FE1\u606F\uFF0Cx,y: chart\u6846\u4F4D\u7F6E\uFF0CscrollLeft1,scrollTop1: \u6EDA\u52A8\u6761\u4F4D\u7F6E\r\n                var x = Store.chartparam.luckysheetCurrentChartMoveXy[2];\r\n                var y = Store.chartparam.luckysheetCurrentChartMoveXy[3];\r\n\r\n                var scrollLeft1 = Store.chartparam.luckysheetCurrentChartMoveXy[4];\r\n                var scrollTop1 = Store.chartparam.luckysheetCurrentChartMoveXy[5];\r\n\r\n                var chart_id = Store.chartparam.luckysheetCurrentChartMoveObj.find(\".luckysheet-modal-dialog-content\").attr(\"id\");\r\n\r\n                //\u53BB\u9664chartobj,\u6539\u7528chart_id\u4EE3\u66FF\u5373\u53EF\u5B9A\u4F4D\u5230\u6B64\u56FE\u8868\r\n                Store.jfredo.push({ \"type\": \"moveChart\", \"chart_id\": chart_id, \"sheetIndex\": Store.currentSheetIndex, \"myTop\": myTop, \"myLeft\": myLeft, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft, \"x\": x, \"y\": y, \"scrollTop1\": scrollTop1, \"scrollLeft1\": scrollLeft1 });\r\n\r\n                // luckysheet.sheetmanage.saveChart({ \"chart_id\": chart_id, \"sheetIndex\": sheetIndex, \"top\": myTop, \"left\": myLeft });\r\n                //\u5B58\u50A8\u6EDA\u52A8\u6761\u4F4D\u7F6E//\u534F\u540C\u7F16\u8F91\u65F6\u53EF\u80FD\u5F71\u54CD\u7528\u6237\u64CD\u4F5C\uFF0C\u53EF\u4EE5\u8003\u8651\u4E0D\u5B58\u50A8\u6EDA\u52A8\u6761\u4F4D\u7F6E,\u6216\u8005\u6EDA\u52A8\u6761\u4FE1\u606F\u4EC5\u4EC5\u4FDD\u5B58\u5230\u540E\u53F0\uFF0C\u4F46\u662F\u4E0D\u5206\u53D1\u5230\u5176\u4ED6\u8BBE\u5907\uFF08google sheet\u6CA1\u6709\u5B58\u50A8\u6EDA\u52A8\u6761\u4F4D\u7F6E\uFF09\r\n                // Store.server.saveParam(\"c\", sheetIndex, { \"left\":myLeft, \"top\":myTop,\"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft }, { \"op\":\"xy\", \"cid\": chart_id});\r\n            }\r\n        }\r\n\r\n        //\u56FE\u8868\u6539\u53D8\u5927\u5C0F chartMix\r\n        if (!!Store.chartparam.luckysheetCurrentChartResize) {\r\n            Store.chartparam.luckysheetCurrentChartResize = null;\r\n            if (Store.chartparam.luckysheetInsertChartTosheetChange) {\r\n                var myHeight = Store.chartparam.luckysheetCurrentChartResizeObj.height(), myWidth = Store.chartparam.luckysheetCurrentChartResizeObj.width(), scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"top\"),\r\n                    myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"left\");\r\n\r\n                var chart_id = Store.chartparam.luckysheetCurrentChartResizeObj.find(\".luckysheet-modal-dialog-content\").attr(\"id\");\r\n\r\n                var myWidth1 = Store.chartparam.luckysheetCurrentChartResizeXy[2];\r\n                var myHeight1 = Store.chartparam.luckysheetCurrentChartResizeXy[3];\r\n                var x = Store.chartparam.luckysheetCurrentChartResizeXy[4];//\u589E\u52A0\u4E0A\u4E00\u6B21\u7684\u4F4D\u7F6Ex\uFF0Cy\r\n                var y = Store.chartparam.luckysheetCurrentChartResizeXy[5];\r\n                var scrollLeft1 = Store.chartparam.luckysheetCurrentChartResizeXy[6];\r\n                var scrollTop1 = Store.chartparam.luckysheetCurrentChartResizeXy[7];\r\n\r\n                Store.jfredo.push({ \"type\": \"resizeChart\", \"chart_id\": chart_id, \"sheetIndex\": Store.currentSheetIndex, \"myTop\": myTop, \"myLeft\": myLeft, \"myHeight\": myHeight, \"myWidth\": myWidth, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft, \"x\": x, \"y\": y, \"myWidth1\": myWidth1, \"myHeight1\": myHeight1, \"scrollTop1\": scrollTop1, \"scrollLeft1\": scrollLeft1 });\r\n\r\n                //\u52A0\u4E0A\u6EDA\u52A8\u6761\u7684\u4F4D\u7F6E\r\n                // luckysheet.sheetmanage.saveChart({ \"chart_id\": chart_id, \"sheetIndex\": sheetIndex, \"height\": myHeight, \"width\": myWidth, \"top\": myTop, \"left\": myLeft, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft });\r\n\r\n                // Store.server.saveParam(\"c\", sheetIndex, { \"width\":myWidth, \"height\":myHeight, \"top\": myTop, \"left\": myLeft, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft}, { \"op\":\"wh\", \"cid\": chart_id});\r\n            }\r\n        }\r\n\r\n        if (!!formula.rangeResize) {\r\n            formula.rangeResizeDragged(event, formula.rangeResizeObj, formula.rangeResize, formula.rangeResizexy, formula.rangeResizeWinW, formula.rangeResizeWinH);\r\n        }\r\n\r\n        //image move\r\n        if (imageCtrl.move) {\r\n            imageCtrl.moveImgItem();\r\n        }\r\n\r\n        //image resize\r\n        if (imageCtrl.resize) {\r\n            imageCtrl.resizeImgItem();\r\n        }\r\n\r\n        //image cropChange\r\n        if (imageCtrl.cropChange) {\r\n            imageCtrl.cropChangeImgItem();\r\n        }\r\n\r\n        //\u6279\u6CE8\u6846 \u79FB\u52A8\r\n        if (luckysheetPostil.move) {\r\n            luckysheetPostil.move = false;\r\n\r\n            let ps_id = luckysheetPostil.currentObj.closest(\".luckysheet-postil-show\").attr(\"id\");\r\n\r\n            let ps_r = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let ps_c = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left;\r\n            d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top;\r\n            d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj.find(\".formulaInputFocus\").text();\r\n\r\n            rc.push(ps_r + \"_\" + ps_c);\r\n\r\n            luckysheetPostil.ref(d, rc);\r\n\r\n            $(\"#\" + ps_id).remove();\r\n\r\n            if (d[ps_r][ps_c].ps.isshow) {\r\n                luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps);\r\n                $(\"#\" + ps_id).addClass(\"luckysheet-postil-show-active\");\r\n                $(\"#\" + ps_id).find(\".luckysheet-postil-dialog-resize\").show();\r\n            }\r\n            else {\r\n                luckysheetPostil.editPs(ps_r, ps_c);\r\n            }\r\n        }\r\n\r\n        //\u6279\u6CE8\u6846 \u6539\u53D8\u5927\u5C0F\r\n        if (!!luckysheetPostil.resize) {\r\n            luckysheetPostil.resize = null;\r\n\r\n            let ps_id = luckysheetPostil.currentObj.closest(\".luckysheet-postil-show\").attr(\"id\");\r\n\r\n            let ps_r = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let ps_c = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left;\r\n            d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top;\r\n            d[ps_r][ps_c].ps.width = luckysheetPostil.currentObj.outerWidth();\r\n            d[ps_r][ps_c].ps.height = luckysheetPostil.currentObj.outerHeight();\r\n            d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj.find(\".formulaInputFocus\").text();\r\n\r\n            rc.push(ps_r + \"_\" + ps_c);\r\n\r\n            luckysheetPostil.ref(d, rc);\r\n\r\n            $(\"#\" + ps_id).remove();\r\n\r\n            if (d[ps_r][ps_c].ps.isshow) {\r\n                luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps);\r\n                $(\"#\" + ps_id).addClass(\"luckysheet-postil-show-active\");\r\n                $(\"#\" + ps_id).find(\".luckysheet-postil-dialog-resize\").show();\r\n            }\r\n            else {\r\n                luckysheetPostil.editPs(ps_r, ps_c);\r\n            }\r\n        }\r\n\r\n        //\u6539\u53D8\u884C\u9AD8\r\n        if (Store.luckysheet_rows_change_size) {\r\n            Store.luckysheet_rows_change_size = false;\r\n\r\n            $(\"#luckysheet-change-size-line\").hide();\r\n            $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n            $(\"#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas\").css(\"cursor\", \"default\");\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollTop = $(\"#luckysheet-rows-h\").scrollTop();\r\n            let y = mouse[1] + scrollTop;\r\n            let winH = $(window).height();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n\r\n            let size = (y + 3) - Store.luckysheet_rows_change_size_start[0];\r\n\r\n            if ((y + 3) - Store.luckysheet_rows_change_size_start[0] < 19) {\r\n                size = 19;\r\n            }\r\n\r\n            if (y >= winH - 200 + scrollTop) {\r\n                size = winH - 200 - Store.luckysheet_rows_change_size_start[0] + scrollTop;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            if (cfg[\"customHeight\"] == null) {\r\n                cfg[\"customHeight\"] = {};\r\n            }\r\n\r\n            cfg[\"customHeight\"][Store.luckysheet_rows_change_size_start[1]] = 1;\r\n\r\n            const changeRowIndex = Store.luckysheet_rows_change_size_start[1];\r\n            let changeRowSelected = false;\r\n            if(Store[\"luckysheet_select_save\"].length > 0) {\r\n                Store[\"luckysheet_select_save\"].filter(select => select.row_select).some((select) => {\r\n                    if(changeRowIndex >= select.row[0] && changeRowIndex <= select.row[1]) {\r\n                        changeRowSelected = true;\r\n                    }\r\n                    return changeRowSelected;\r\n                });\r\n            }\r\n            if(changeRowSelected) {\r\n                Store[\"luckysheet_select_save\"].filter(select => select.row_select).forEach(select => {\r\n                    for(let r = select.row[0]; r <= select.row[1]; r++) {\r\n                        cfg[\"rowlen\"][r] = Math.ceil(size/Store.zoomRatio);  \r\n                    }\r\n                })\r\n            } \r\n            else {\r\n                cfg[\"rowlen\"][Store.luckysheet_rows_change_size_start[1]] = Math.ceil(size/Store.zoomRatio);\r\n            }\r\n\r\n            let images = imageCtrl.moveChangeSize(\"row\", Store.luckysheet_rows_change_size_start[1], size);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length  = 0;\r\n\r\n                Store.jfredo.push({\r\n                    \"type\": \"resize\",\r\n                    \"ctrlType\": \"resizeR\",\r\n                    \"sheetIndex\": Store.currentSheetIndex,\r\n                    \"config\": $.extend(true, {}, Store.config),\r\n                    \"curconfig\": $.extend(true, {}, cfg),\r\n                    \"images\": $.extend(true, {}, imageCtrl.images),\r\n                    \"curImages\": $.extend(true, {}, images) \r\n                });\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowlen\"], { \"k\": \"rowlen\" });\r\n\r\n            //images\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, null);\r\n        }\r\n        \r\n        //\u6539\u53D8\u5217\u5BBD\r\n        if (Store.luckysheet_cols_change_size) {\r\n            Store.luckysheet_cols_change_size = false;\r\n            $(\"#luckysheet-change-size-line\").hide();\r\n            $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n            $(\"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\").css(\"cursor\", \"default\");\r\n            \r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n            let x = mouse[0] + scrollLeft;\r\n            let winW = $(window).width();\r\n\r\n            let row_index = Store.visibledatarow.length - 1,\r\n                row = Store.visibledatarow[row_index],\r\n                row_pre = 0;\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n            let size = (x + 3) - Store.luckysheet_cols_change_size_start[0];\r\n\r\n            \r\n            let firstcolumnlen = Store.defaultcollen;\r\n            if (Store.config[\"columnlen\"] != null && Store.config[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]] != null) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]];\r\n            }\r\n\r\n            if (Math.abs(size - firstcolumnlen) < 3) {\r\n                return;\r\n            }\r\n            if ((x + 3) - Store.luckysheet_cols_change_size_start[0] < 30) {\r\n                size = 30;\r\n            }\r\n\r\n            if (x >= winW - 100 + scrollLeft) {\r\n                size = winW - 100 - Store.luckysheet_cols_change_size_start[0] + scrollLeft;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"columnlen\"] == null) {\r\n                cfg[\"columnlen\"] = {};\r\n            }\r\n\r\n            if (cfg[\"customWidth\"] == null) {\r\n                cfg[\"customWidth\"] = {};\r\n            }\r\n\r\n            cfg[\"customWidth\"][Store.luckysheet_cols_change_size_start[1]] = 1;\r\n\r\n            const changeColumnIndex = Store.luckysheet_cols_change_size_start[1];\r\n            let changeColumnSelected = false;\r\n            if(Store[\"luckysheet_select_save\"].length > 0) {\r\n                Store[\"luckysheet_select_save\"].filter(select => select.column_select).some((select) => {\r\n                    if(changeColumnIndex >= select.column[0] && changeColumnIndex <= select.column[1]) {\r\n                        changeColumnSelected = true;\r\n                    }\r\n                    return changeColumnSelected;\r\n                });\r\n            }\r\n            if(changeColumnSelected) {\r\n                Store[\"luckysheet_select_save\"].filter(select => select.column_select).forEach(select => {\r\n                    for(let r = select.column[0]; r <= select.column[1]; r++) {\r\n                        cfg[\"columnlen\"][r] = Math.ceil(size/Store.zoomRatio);  \r\n                    }\r\n                })\r\n            } \r\n            else {\r\n                cfg[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]] = Math.ceil(size/Store.zoomRatio);\r\n            }\r\n            \r\n\r\n            let images = imageCtrl.moveChangeSize(\"column\", Store.luckysheet_cols_change_size_start[1], size);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length  = 0;\r\n\r\n                Store.jfredo.push({\r\n                    \"type\": \"resize\",\r\n                    \"ctrlType\": \"resizeC\",\r\n                    \"sheetIndex\": Store.currentSheetIndex,\r\n                    \"config\": $.extend(true, {}, Store.config),\r\n                    \"curconfig\": $.extend(true, {}, cfg),\r\n                    \"images\": $.extend(true, {}, imageCtrl.images),\r\n                    \"curImages\": $.extend(true, {}, images) \r\n                });\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"columnlen\"], { \"k\": \"columnlen\" });\r\n\r\n            //images\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(null, Store.flowdata[0].length);\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n\r\n        if (formula.rangeMove) {\r\n            formula.rangeMoveDragged(formula.rangeMoveObj);\r\n        }\r\n\r\n        //\u6539\u53D8\u9009\u62E9\u6846\u7684\u4F4D\u7F6E\u5E76\u66FF\u6362\u76EE\u6807\u5355\u5143\u683C\r\n        if (Store.luckysheet_cell_selected_move) {\r\n            $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n            Store.luckysheet_cell_selected_move = false;\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n            if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            let row_index = rowLocation(y)[2];\r\n            let col_index = colLocation(x)[2];\r\n\r\n            let row_index_original = Store.luckysheet_cell_selected_move_index[0],\r\n                col_index_original = Store.luckysheet_cell_selected_move_index[1];\r\n\r\n            if (row_index == row_index_original && col_index == col_index_original) {\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let data = getdatabyselection(last);\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"merge\"] == null) {\r\n                cfg[\"merge\"] = {};\r\n            }\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            //\u9009\u533A\u5305\u542B\u90E8\u5206\u5355\u5143\u683C\r\n            if (hasPartMC(cfg, last[\"row\"][0], last[\"row\"][1], last[\"column\"][0], last[\"column\"][1])) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMerge);\r\n                }\r\n                else {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', locale_drag.noMerge);\r\n                }\r\n                return;\r\n            }\r\n\r\n            let row_s = last[\"row\"][0] - row_index_original + row_index,\r\n                row_e = last[\"row\"][1] - row_index_original + row_index;\r\n            let col_s = last[\"column\"][0] - col_index_original + col_index,\r\n                col_e = last[\"column\"][1] - col_index_original + col_index;\r\n\r\n            if(!checkProtectionLockedRangeList([{row:[row_s, row_e], column:[col_s, col_e]}], Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            if (row_s < 0 || y < 0) {\r\n                row_s = 0;\r\n                row_e = last[\"row\"][1] - last[\"row\"][0];\r\n            }\r\n\r\n            if (col_s < 0 || x < 0) {\r\n                col_s = 0;\r\n                col_e = last[\"column\"][1] - last[\"column\"][0];\r\n            }\r\n\r\n            if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                row_s = Store.visibledatarow.length - 1 - last[\"row\"][1] + last[\"row\"][0];\r\n                row_e = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                col_s = Store.visibledatacolumn.length - 1 - last[\"column\"][1] + last[\"column\"][0];\r\n                col_e = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            //\u66FF\u6362\u7684\u4F4D\u7F6E\u5305\u542B\u90E8\u5206\u5355\u5143\u683C\r\n            if (hasPartMC(cfg, row_s, row_e, col_s, col_e)) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMerge);\r\n                }\r\n                else {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', locale_drag.noMerge);\r\n                }\r\n                return;\r\n            }\r\n\r\n            let borderInfoCompute = getBorderInfoCompute(Store.currentSheetIndex);\r\n\r\n            //\u5220\u9664\u539F\u672C\u4F4D\u7F6E\u7684\u6570\u636E\r\n            let RowlChange = null;\r\n            for (let r = last[\"row\"][0]; r <= last[\"row\"][1]; r++) {\r\n                if (r in cfg[\"rowlen\"]) {\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for (let c = last[\"column\"][0]; c <= last[\"column\"][1]; c++) {\r\n                    let cell = d[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && (\"mc\" in cell)) {\r\n                        if ((cell[\"mc\"].r + \"_\" + cell[\"mc\"].c) in cfg[\"merge\"]) {\r\n                            delete cfg[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                    }\r\n\r\n                    d[r][c] = null;\r\n                }\r\n            }\r\n\r\n            //\u8FB9\u6846\r\n            if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n                let borderInfo = [];\r\n\r\n                for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                    let bd_rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                    if (bd_rangeType == \"range\") {\r\n                        let bd_range = cfg[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for (let j = 0; j < bd_range.length; j++) {\r\n                            bd_emptyRange = bd_emptyRange.concat(conditionformat.CFSplitRange(bd_range[j], { \"row\": last[\"row\"], \"column\": last[\"column\"] }, { \"row\": [row_s, row_e], \"column\": [col_s, col_e] }, \"restPart\"));\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                    else if (bd_rangeType == \"cell\") {\r\n                        let bd_r = cfg[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if (!(bd_r >= last[\"row\"][0] && bd_r <= last[\"row\"][1] && bd_c >= last[\"column\"][0] && bd_c <= last[\"column\"][1])) {\r\n                            borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                cfg[\"borderInfo\"] = borderInfo;\r\n            }\r\n            //\u66FF\u6362\u4F4D\u7F6E\u6570\u636E\u66F4\u65B0\r\n            let offsetMC = {};\r\n            for (let r = 0; r < data.length; r++) {\r\n                for (let c = 0; c < data[0].length; c++) {\r\n                    if (borderInfoCompute[(r + last[\"row\"][0]) + \"_\" + (c + last[\"column\"][0])]) {\r\n                        let bd_obj = {\r\n                            \"rangeType\": \"cell\",\r\n                            \"value\": {\r\n                                \"row_index\": r + row_s,\r\n                                \"col_index\": c + col_s,\r\n                                \"l\": borderInfoCompute[(r + last[\"row\"][0]) + \"_\" + (c + last[\"column\"][0])].l,\r\n                                \"r\": borderInfoCompute[(r + last[\"row\"][0]) + \"_\" + (c + last[\"column\"][0])].r,\r\n                                \"t\": borderInfoCompute[(r + last[\"row\"][0]) + \"_\" + (c + last[\"column\"][0])].t,\r\n                                \"b\": borderInfoCompute[(r + last[\"row\"][0]) + \"_\" + (c + last[\"column\"][0])].b\r\n                            }\r\n                        }\r\n\r\n                        if (cfg[\"borderInfo\"] == null) {\r\n                            cfg[\"borderInfo\"] = [];\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"].push(bd_obj);\r\n                    }\r\n\r\n                    let value = \"\";\r\n                    if (data[r] != null && data[r][c] != null) {\r\n                        value = data[r][c];\r\n                    }\r\n\r\n                    if (getObjType(value) == \"object\" && (\"mc\" in value)) {\r\n                        let mc = $.extend(true, {}, value[\"mc\"]);\r\n                        if (\"rs\" in value[\"mc\"]) {\r\n                            offsetMC[mc.r + \"_\" + mc.c] = [r + row_s, c + col_s];\r\n\r\n                            value[\"mc\"].r = r + row_s;\r\n                            value[\"mc\"].c = c + col_s;\r\n\r\n                            cfg[\"merge\"][(r + row_s) + \"_\" + (c + col_s)] = value[\"mc\"];\r\n                        }\r\n                        else {\r\n                            value[\"mc\"].r = offsetMC[mc.r + \"_\" + mc.c][0];\r\n                            value[\"mc\"].c = offsetMC[mc.r + \"_\" + mc.c][1];\r\n                        }\r\n                    }\r\n                    d[r + row_s][c + col_s] = value;\r\n                }\r\n            }\r\n\r\n            if (RowlChange) {\r\n                cfg = rowlenByRange(d, last[\"row\"][0], last[\"row\"][1], cfg);\r\n                cfg = rowlenByRange(d, row_s, row_e, cfg);\r\n            }\r\n\r\n            //\u6761\u4EF6\u683C\u5F0F\r\n            let cdformat = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n            if (cdformat != null && cdformat.length > 0) {\r\n                for (let i = 0; i < cdformat.length; i++) {\r\n                    let cdformat_cellrange = cdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n                    for (let j = 0; j < cdformat_cellrange.length; j++) {\r\n                        let range = conditionformat.CFSplitRange(cdformat_cellrange[j], { \"row\": last[\"row\"], \"column\": last[\"column\"] }, { \"row\": [row_s, row_e], \"column\": [col_s, col_e] }, \"allPart\");\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                    cdformat[i].cellrange = emptyRange;\r\n                }\r\n            }\r\n\r\n            let rf;\r\n            if (Store.luckysheet_select_save[0].row_focus == Store.luckysheet_select_save[0].row[0]) {\r\n                rf = row_s;\r\n            }\r\n            else {\r\n                rf = row_e;\r\n            }\r\n\r\n            let cf;\r\n            if (Store.luckysheet_select_save[0].column_focus == Store.luckysheet_select_save[0].column[0]) {\r\n                cf = col_s;\r\n            }\r\n            else {\r\n                cf = col_e;\r\n            }\r\n\r\n            let range = [];\r\n            range.push({ \"row\": last[\"row\"], \"column\": last[\"column\"] });\r\n            range.push({ \"row\": [row_s, row_e], \"column\": [col_s, col_e] });\r\n\r\n            last[\"row\"] = [row_s, row_e];\r\n            last[\"column\"] = [col_s, col_e];\r\n            last[\"row_focus\"] = rf;\r\n            last[\"column_focus\"] = cf;\r\n\r\n            let allParam = {\r\n                \"cfg\": cfg,\r\n                \"RowlChange\": RowlChange,\r\n                \"cdformat\": cdformat\r\n            }\r\n\r\n            jfrefreshgrid(d, range, allParam);\r\n\r\n            selectHightlightShow();\r\n\r\n            $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n        }\r\n\r\n        //\u56FE\u8868\u9009\u533A\u62D6\u62FD\u79FB\u52A8\r\n        if (Store.chart_selection.rangeMove) {\r\n            Store.chart_selection.rangeMoveDragged();\r\n        }\r\n\r\n        //\u56FE\u8868\u9009\u533A\u62D6\u62FD\u62C9\u4F38\r\n        if (!!Store.chart_selection.rangeResize) {\r\n            Store.chart_selection.rangeResizeDragged();\r\n        }\r\n\r\n        //\u9009\u533A\u4E0B\u62C9\r\n        if (Store.luckysheet_cell_selected_extend) {\r\n\r\n            \r\n            Store.luckysheet_cell_selected_extend = false;\r\n            $(\"#luckysheet-cell-selected-extend\").hide();\r\n\r\n            if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let x = mouse[0] + scrollLeft - 5;\r\n            let y = mouse[1] + scrollTop - 5;\r\n\r\n            let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let row_index_original = Store.luckysheet_cell_selected_extend_index[0],\r\n                col_index_original = Store.luckysheet_cell_selected_extend_index[1];\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_s = last[\"row\"][0], row_e = last[\"row\"][1];\r\n            let col_s = last[\"column\"][0], col_e = last[\"column\"][1];\r\n\r\n            if (row_s < 0 || y < 0) {\r\n                row_s = 0;\r\n                row_e = last[\"row\"][1] - last[\"row\"][0];\r\n            }\r\n\r\n            if (col_s < 0 || x < 0) {\r\n                col_s = 0;\r\n                col_e = last[\"column\"][1] - last[\"column\"][0];\r\n            }\r\n\r\n            if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                row_s = Store.visibledatarow.length - 1 - last[\"row\"][1] + last[\"row\"][0];\r\n                row_e = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                col_s = Store.visibledatacolumn.length - 1 - last[\"column\"][1] + last[\"column\"][0];\r\n                col_e = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            //\u590D\u5236\u8303\u56F4\r\n            luckysheetDropCell.copyRange = { \"row\": $.extend(true, [], last[\"row\"]), \"column\": $.extend(true, [], last[\"column\"]) };\r\n            //applyType\r\n            let typeItemHide = luckysheetDropCell.typeItemHide();\r\n\r\n            if (!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]) {\r\n                luckysheetDropCell.applyType = \"0\";\r\n            }\r\n            else {\r\n                luckysheetDropCell.applyType = \"1\";\r\n            }\r\n\r\n            if (Math.abs(row_index_original - row_index) > Math.abs(col_index_original - col_index)) {\r\n                if (!(row_index >= row_s && row_index <= row_e)) {\r\n                    if (Store.luckysheet_select_save[0].top_move >= row_pre) {//\u5F53\u5F80\u4E0A\u62D6\u62FD\u65F6\r\n                        luckysheetDropCell.applyRange = { \"row\": [row_index, last[\"row\"][0] - 1], \"column\": last[\"column\"] };\r\n                        luckysheetDropCell.direction = \"up\";\r\n\r\n                        row_s -= last[\"row\"][0] - row_index;\r\n\r\n                        //\u662F\u5426\u6709\u6570\u636E\u900F\u89C6\u8868\u8303\u56F4\r\n                        if (pivotTable.isPivotRange(row_s, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                    else {//\u5F53\u5F80\u4E0B\u62D6\u62FD\u65F6\r\n                        luckysheetDropCell.applyRange = { \"row\": [last[\"row\"][1] + 1, row_index], \"column\": last[\"column\"] };\r\n                        luckysheetDropCell.direction = \"down\";\r\n\r\n                        row_e += row_index - last[\"row\"][1];\r\n\r\n                        //\u662F\u5426\u6709\u6570\u636E\u900F\u89C6\u8868\u8303\u56F4\r\n                        if (pivotTable.isPivotRange(row_e, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    return;\r\n                }\r\n            }\r\n            else {\r\n                if (!(col_index >= col_s && col_index <= col_e)) {\r\n                    if (Store.luckysheet_select_save[0].left_move >= col_pre) {//\u5F53\u5F80\u5DE6\u62D6\u62FD\u65F6\r\n                        luckysheetDropCell.applyRange = { \"row\": last[\"row\"], \"column\": [col_index, last[\"column\"][0] - 1] };\r\n                        luckysheetDropCell.direction = \"left\";\r\n\r\n                        col_s -= last[\"column\"][0] - col_index;\r\n\r\n                        //\u662F\u5426\u6709\u6570\u636E\u900F\u89C6\u8868\u8303\u56F4\r\n                        if (pivotTable.isPivotRange(row_e, col_s)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                    else {//\u5F53\u5F80\u53F3\u62D6\u62FD\u65F6\r\n                        luckysheetDropCell.applyRange = { \"row\": last[\"row\"], \"column\": [last[\"column\"][1] + 1, col_index] };\r\n                        luckysheetDropCell.direction = \"right\";\r\n\r\n                        col_e += col_index - last[\"column\"][1];\r\n\r\n                        //\u662F\u5426\u6709\u6570\u636E\u900F\u89C6\u8868\u8303\u56F4\r\n                        if (pivotTable.isPivotRange(row_e, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (Store.config[\"merge\"] != null) {\r\n                let hasMc = false;\r\n\r\n                for (let r = last[\"row\"][0]; r <= last[\"row\"][1]; r++) {\r\n                    for (let c = last[\"column\"][0]; c <= last[\"column\"][1]; c++) {\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if (cell != null && cell.mc != null) {\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (hasMc) {\r\n                    if (isEditMode()) {\r\n                        alert(locale_drag.noMerge);\r\n                    }\r\n                    else {\r\n                        tooltip.info(locale_drag.noMerge, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                for (let r = row_s; r <= row_e; r++) {\r\n                    for (let c = col_s; c <= col_e; c++) {\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if (cell != null && cell.mc != null) {\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (hasMc) {\r\n                    if (isEditMode()) {\r\n                        alert(locale_drag.noMerge);\r\n                    }\r\n                    else {\r\n                        tooltip.info(locale_drag.noMerge, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n            }\r\n\r\n            last[\"row\"] = [row_s, row_e];\r\n            last[\"column\"] = [col_s, col_e];\r\n\r\n            luckysheetDropCell.update();\r\n            luckysheetDropCell.createIcon();\r\n\r\n            $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n            $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n        }\r\n    });\r\n\r\n    //\u7981\u6B62\u6D4F\u89C8\u5668 \u53F3\u952E\u9ED8\u8BA4\u83DC\u5355\r\n    $(\".luckysheet-grid-container, #luckysheet-rightclick-menu\").on(\"contextmenu\", function (e) {\r\n        e.preventDefault();\r\n    });\r\n\r\n    // //\u7981\u6B62\u524D\u53F0\u7F16\u8F91(\u53EA\u53EF \u6846\u9009\u5355\u5143\u683C\u3001\u6EDA\u52A8\u67E5\u770B\u8868\u683C)\r\n    // if(!Store.allowEdit){\r\n    //     return;\r\n    // }\r\n\r\n    //\u9009\u533A\u62D6\u52A8\u66FF\u6362\r\n    $(\"#luckysheet-cell-main div.luckysheet-cs-draghandle\").mousedown(function (event) {\r\n        if(isEditMode() || Store.allowEdit===false){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u9009\u533A\u62D6\u52A8\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-cell-selected\").find(\".luckysheet-cs-fillhandle\")\r\n            .css(\"cursor\", \"move\")\r\n            .end()\r\n            .find(\".luckysheet-cs-draghandle\")\r\n            .css(\"cursor\", \"move\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"move\");\r\n\r\n        Store.luckysheet_cell_selected_move = true;\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row_pre = row_location[0],\r\n            row = row_location[1],\r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x),\r\n            col_pre = col_location[0],\r\n            col = col_location[1],\r\n            col_index = col_location[2];\r\n\r\n        Store.luckysheet_cell_selected_move_index = [row_index, col_index];\r\n\r\n        $(\"#luckysheet-cell-selected-move\").css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1,\r\n            \"display\": \"block\"\r\n        });\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //\u9009\u533A\u4E0B\u62C9\r\n    $(\"#luckysheet-cell-main div.luckysheet-cs-fillhandle\").mousedown(function (event) {\r\n        if(isEditMode() || Store.allowEdit===false){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u9009\u533A\u4E0B\u62C9\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-cell-selected\").find(\".luckysheet-cs-fillhandle\")\r\n            .css(\"cursor\", \"crosshair\")\r\n            .end()\r\n            .find(\".luckysheet-cs-draghandle\")\r\n            .css(\"cursor\", \"crosshair\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"crosshair\");\r\n\r\n        Store.luckysheet_cell_selected_extend_time = setTimeout(function () {\r\n            Store.luckysheet_cell_selected_extend = true;\r\n            Store.luckysheet_scroll_status = true;\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft() - 5;\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop() - 5;\r\n\r\n            let row_location = rowLocation(y),\r\n                row_pre = row_location[0],\r\n                row = row_location[1],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col_pre = col_location[0],\r\n                col = col_location[1],\r\n                col_index = col_location[2];\r\n\r\n            Store.luckysheet_cell_selected_extend_index = [row_index, col_index];\r\n\r\n            $(\"#luckysheet-cell-selected-extend\").css({\r\n                \"left\": col_pre,\r\n                \"width\": col - col_pre - 1,\r\n                \"top\": row_pre,\r\n                \"height\": row - row_pre - 1,\r\n                \"display\": \"block\"\r\n            });\r\n        }, 100);\r\n\r\n        event.stopPropagation();\r\n    }).click(function () {\r\n        clearTimeout(Store.luckysheet_cell_selected_extend_time);\r\n        event.stopPropagation();\r\n    }).dblclick(function () {\r\n        let last = Store.luckysheet_select_save[0];\r\n\r\n        let r0 = last.row[0],\r\n            r1 = last.row[1],\r\n            c0 = last.column[0],\r\n            c1 = last.column[1];\r\n\r\n        if (pivotTable.isPivotRange(r0, c0)) {\r\n            return;\r\n        }\r\n\r\n        let dropCellState = false;\r\n        let step = 0;\r\n\r\n        for (let r = r1 + 1; r < Store.flowdata.length; r++) {\r\n            if (c0 - 1 >= 0 && c1 + 1 < Store.flowdata[0].length) {\r\n                let cell1 = Store.flowdata[r][c0 - 1];\r\n                let cell2 = Store.flowdata[r][c1 + 1];\r\n\r\n                if (r == r1 + 1) {\r\n                    if ((cell1 == null || isRealNull(cell1.v)) && (cell2 == null || isRealNull(cell2.v))) {\r\n                        dropCellState = false;\r\n                        break;\r\n                    }\r\n                    else {\r\n                        dropCellState = true;\r\n                        step++;\r\n                    }\r\n                }\r\n                else {\r\n                    if ((cell1 == null || isRealNull(cell1.v)) && (cell2 == null || isRealNull(cell2.v))) {\r\n                        break;\r\n                    }\r\n\r\n                    step++;\r\n                }\r\n            }\r\n            else if (c0 - 1 >= 0) {\r\n                let cell = Store.flowdata[r][c0 - 1];\r\n\r\n                if (r == r1 + 1) {\r\n                    if (cell == null || isRealNull(cell.v)) {\r\n                        dropCellState = false;\r\n                        break;\r\n                    }\r\n                    else {\r\n                        dropCellState = true;\r\n                        step++;\r\n                    }\r\n                }\r\n                else {\r\n                    if (cell == null || isRealNull(cell.v)) {\r\n                        break;\r\n                    }\r\n\r\n                    step++;\r\n                }\r\n            }\r\n            else if (c1 + 1 < Store.flowdata[0].length) {\r\n                let cell = Store.flowdata[r][c1 + 1];\r\n\r\n                if (r == r1 + 1) {\r\n                    if (cell == null || isRealNull(cell.v)) {\r\n                        dropCellState = false;\r\n                        break;\r\n                    }\r\n                    else {\r\n                        dropCellState = true;\r\n                        step++;\r\n                    }\r\n                }\r\n                else {\r\n                    if (cell == null || isRealNull(cell.v)) {\r\n                        break;\r\n                    }\r\n\r\n                    step++;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (!dropCellState || step == 0) {\r\n            event.stopPropagation();\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\r\n        luckysheetDropCell.copyRange = { \"row\": [r0, r1], \"column\": [c0, c1] };\r\n\r\n        //applyType\r\n        let typeItemHide = luckysheetDropCell.typeItemHide();\r\n\r\n        if (!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]) {\r\n            luckysheetDropCell.applyType = \"0\";\r\n        }\r\n        else {\r\n            luckysheetDropCell.applyType = \"1\";\r\n        }\r\n\r\n        luckysheetDropCell.applyRange = { \"row\": [r1 + 1, r1 + step], \"column\": [c0, c1] };\r\n        luckysheetDropCell.direction = \"down\";\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [r0, r1 + step], \"column\": [c0, c1] }];\r\n\r\n        luckysheetDropCell.update();\r\n        luckysheetDropCell.createIcon();\r\n\r\n        $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n        $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n        clearTimeout(Store.countfuncTimeout);\r\n        Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //\r\n    $(\"#luckysheet-bottom-add-row, #luckysheet-bottom-add-row-input, #luckysheet-bottom-return-top\").on(\"mousedown dblclick mouseup\", function (e) {\r\n        e.stopPropagation();\r\n    });\r\n\r\n    //\u5E95\u90E8\u6DFB\u52A0\u884C\u6309\u94AE\r\n    $(\"#luckysheet-bottom-add-row\").on(\"click\", function (e) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        let $t = $(this), value = $(\"#luckysheet-bottom-add-row-input\").val();\r\n\r\n        if (value == \"\") {            \r\n            value = luckysheetConfigsetting.addRowCount || 100;\r\n        }\r\n\r\n        if (isNaN(parseInt(value))) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumber);\r\n            }\r\n            else {\r\n                tooltip.info(\"error\", locale_info.tipInputNumber);\r\n            }\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n        if (value < 1 || value > 100) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumberLimit);\r\n            }\r\n            else {\r\n                tooltip.info(\"error\", locale_info.tipInputNumberLimit);\r\n            }\r\n            return;\r\n        }\r\n\r\n        luckysheetextendtable(\"row\", Store.flowdata.length - 1, value);\r\n    });\r\n\r\n    $(\"#luckysheet-bottom-return-top\").on(\"click\", function (e) {\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n    });\r\n\r\n    //\u53F3\u952E\u83DC\u5355 \u590D\u5236\u6309\u94AE\r\n    $(\"#luckysheet-copy-btn, #luckysheet-cols-copy-btn, #luckysheet-paste-btn-title\").click(function (event) {\r\n        $(this).parent().hide();\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if (Store.config[\"merge\"] != null) {\r\n            let has_PartMC = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if (has_PartMC) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else {\r\n                    tooltip.info(locale_drag.noPartMerge, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        //\u591A\u91CD\u9009\u533A \u6709\u6761\u4EF6\u683C\u5F0F\u65F6 \u63D0\u793A\r\n        let cdformat = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_conditionformat_save;\r\n        if (Store.luckysheet_select_save.length > 1 && cdformat != null && cdformat.length > 0) {\r\n            let hasCF = false;\r\n\r\n            let cf_compute = conditionformat.getComputeMap();\r\n\r\n            label:\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                if (hasCF) {\r\n                    break;\r\n                }\r\n\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        if (conditionformat.checksCF(r, c, cf_compute) != null) {\r\n                            hasCF = true;\r\n                            continue label;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (hasCF) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        //\u591A\u91CD\u9009\u533A \u884C\u4E0D\u4E00\u6837\u4E14\u5217\u4E0D\u4E00\u6837\u65F6 \u63D0\u793A       \r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            let isSameRow = true,\r\n                str_r = Store.luckysheet_select_save[0].row[0],\r\n                end_r = Store.luckysheet_select_save[0].row[1];\r\n            let isSameCol = true,\r\n                str_c = Store.luckysheet_select_save[0].column[0],\r\n                end_c = Store.luckysheet_select_save[0].column[1];\r\n\r\n            for (let s = 1; s < Store.luckysheet_select_save.length; s++) {\r\n                if (Store.luckysheet_select_save[s].row[0] != str_r || Store.luckysheet_select_save[s].row[1] != end_r) {\r\n                    isSameRow = false;\r\n                }\r\n                if (Store.luckysheet_select_save[s].column[0] != str_c || Store.luckysheet_select_save[s].column[1] != end_c) {\r\n                    isSameCol = false;\r\n                }\r\n            }\r\n\r\n            if ((!isSameRow && !isSameCol) || selectIsOverlap()) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        selection.copy(event);\r\n    });\r\n\r\n    //\u53F3\u952E\u83DC\u5355 \u7C98\u8D34\u6309\u94AE\r\n    $(\"#luckysheet-copy-paste, #luckysheet-cols-paste-btn, #luckysheet-paste-btn-title\").click(function (event) {\r\n        selection.paste(event, \"btn\");\r\n        $(this).parent().hide();\r\n    });\r\n\r\n    //Menu bar, Chart button\r\n    $(\"#luckysheet-chart-btn-title\").click(function () {\r\n        createLuckyChart();\r\n    });\r\n\r\n    // Right-click the menu, chart generation\r\n    $(\"#luckysheetdatavisual\").click(function () {\r\n        createLuckyChart();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n\r\n\r\n    //\u83DC\u5355\u680F \u6570\u636E\u900F\u89C6\u8868\r\n    $(\"#luckysheet-pivot-btn-title\").click(function (e) {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"usePivotTablereports\")){\r\n            return;\r\n        }\r\n        pivotTable.createPivotTable(e);\r\n    });\r\n\r\n    //\u83DC\u5355\u680F \u622A\u56FE\u6309\u94AE\r\n    $(\"#luckysheet-chart-btn-screenshot\").click(function () {\r\n        const locale_screenshot = _locale.screenshot;\r\n        if (Store.luckysheet_select_save.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_screenshot.screenshotTipNoSelection);\r\n            }\r\n            else {\r\n                tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipNoSelection);\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_screenshot.screenshotTipHasMulti);\r\n            }\r\n            else {\r\n                tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipHasMulti);\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //\u622A\u56FE\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if (Store.config[\"merge\"] != null) {\r\n            let has_PartMC = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if (has_PartMC) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_screenshot.screenshotTipHasMerge);\r\n                }\r\n                else {\r\n                    tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipHasMerge);\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        let st_r = Store.luckysheet_select_save[0].row[0],\r\n            ed_r = Store.luckysheet_select_save[0].row[1];\r\n        let st_c = Store.luckysheet_select_save[0].column[0],\r\n            ed_c = Store.luckysheet_select_save[0].column[1];\r\n\r\n        let scrollHeight, rh_height;\r\n        if (st_r - 1 < 0) {\r\n            scrollHeight = 0;\r\n            rh_height = Store.visibledatarow[ed_r];\r\n        }\r\n        else {\r\n            scrollHeight = Store.visibledatarow[st_r - 1];\r\n            rh_height = Store.visibledatarow[ed_r] - Store.visibledatarow[st_r - 1];\r\n        }\r\n\r\n        let scrollWidth, ch_width;\r\n        if (st_c - 1 < 0) {\r\n            scrollWidth = 0;\r\n            ch_width = Store.visibledatacolumn[ed_c];\r\n        }\r\n        else {\r\n            scrollWidth = Store.visibledatacolumn[st_c - 1];\r\n            ch_width = Store.visibledatacolumn[ed_c] - Store.visibledatacolumn[st_c - 1];\r\n        }\r\n\r\n        let newCanvas = $(\"<canvas>\").attr({\r\n            width: Math.ceil(ch_width * devicePixelRatio),\r\n            height: Math.ceil(rh_height * devicePixelRatio)\r\n        }).css({ width: ch_width, height: rh_height });\r\n\r\n        luckysheetDrawMain(scrollWidth, scrollHeight, ch_width, rh_height, 1, 1, null, null, newCanvas);\r\n        let ctx_newCanvas = newCanvas.get(0).getContext(\"2d\");\r\n\r\n        //\u8865\u4E0A \u5DE6\u8FB9\u6846\u548C\u4E0A\u8FB9\u6846\r\n        ctx_newCanvas.beginPath();\r\n        ctx_newCanvas.moveTo(\r\n            0, \r\n            0\r\n        );\r\n        ctx_newCanvas.lineTo(\r\n            0, \r\n            Store.devicePixelRatio * rh_height\r\n        );\r\n        ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n        ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;        \r\n        ctx_newCanvas.stroke();\r\n        ctx_newCanvas.closePath();\r\n\r\n        ctx_newCanvas.beginPath();\r\n        ctx_newCanvas.moveTo(\r\n            0, \r\n            0\r\n        );\r\n        ctx_newCanvas.lineTo(\r\n            Store.devicePixelRatio * ch_width, \r\n            0\r\n        );\r\n        ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n        ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;        \r\n        ctx_newCanvas.stroke();\r\n        ctx_newCanvas.closePath();\r\n\r\n        let image = new Image();\r\n        let url = newCanvas.get(0).toDataURL(\"image/png\");\r\n        image.src = url;\r\n\r\n        if (ch_width > rh_height) {\r\n            image.style.width = \"100%\";\r\n        }\r\n        else {\r\n            image.style.height = \"100%\";\r\n        }\r\n\r\n        let maxHeight = $(window).height() - 200;\r\n        tooltip.screenshot(locale_screenshot.screenshotTipSuccess, '<div id=\"luckysheet-confirm-screenshot-save\" style=\"height:' + maxHeight + 'px;overflow:auto;\"></div>', url);\r\n        $(\"#luckysheet-confirm-screenshot-save\").append(image);\r\n        newCanvas.remove();\r\n    });\r\n\r\n    //\u622A\u56FE\u4E0B\u8F7D\r\n    $(document).on(\"click.luckysheetEvent\", \"a.download\", function () {\r\n        let dataURI = $(\"#luckysheet-confirm-screenshot-save img\").attr(\"src\");\r\n        const locale_screenshot = _locale.screenshot;\r\n        let binStr = atob(dataURI.split(\",\")[1]),\r\n            len = binStr.length,\r\n            arr = new Uint8Array(len);\r\n\r\n        for (let i = 0; i < len; i++) {\r\n            arr[i] = binStr.charCodeAt(i);\r\n        }\r\n\r\n        let blob = new Blob([arr]);\r\n\r\n        let element = document.createElement('a');\r\n        element.setAttribute('href', URL.createObjectURL(blob));\r\n        element.setAttribute('download', locale_screenshot.screenshotImageName + '.png');\r\n\r\n        element.style.display = 'none';\r\n        document.body.appendChild(element);\r\n\r\n        element.click();\r\n\r\n        let clickHandler;\r\n        element.addEventListener('click', clickHandler = function () {\r\n            requestAnimationFrame(function () {\r\n                URL.revokeObjectURL(element.href);\r\n            });\r\n\r\n            element.removeAttribute('href');\r\n            element.removeEventListener('click', clickHandler);\r\n        })\r\n\r\n        document.body.removeChild(element);\r\n    })\r\n\r\n    //\u83DC\u5355\u680F \u5206\u5217\u6309\u94AE\r\n    $(\"#luckysheet-splitColumn-btn-title\").click(function () {\r\n        if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            return;\r\n        }\r\n\r\n        const locale_splitText = _locale.splitText;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            tooltip.info(locale_splitText.tipNoMulti, \"\");\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save[0].column[0] != Store.luckysheet_select_save[0].column[1]) {\r\n            tooltip.info(locale_splitText.tipNoMultiColumn, \"\");\r\n            return;\r\n        }\r\n\r\n        splitColumn.createDialog();\r\n        splitColumn.init();\r\n    });\r\n\r\n    //\u83DC\u5355\u680F \u63D2\u5165\u56FE\u7247\u6309\u94AE\r\n    $(\"#luckysheet-insertImg-btn-title\").click(function () {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n        $(\"#luckysheet-imgUpload\").click();    \r\n    });\r\n    $(\"#luckysheetInsertImage\").click(function () {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n        $(\"#luckysheet-imgUpload\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    })\r\n    $(\"#luckysheet-imgUpload\").click(function (e) {\r\n        e.stopPropagation();\r\n    });\r\n    $(\"#luckysheet-imgUpload\").on(\"change\", function(e){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n            return;\r\n        }\r\n        let file = e.currentTarget.files[0];\r\n        let render = new FileReader();\r\n        render.readAsDataURL(file);\r\n\r\n        render.onload = function(event){\r\n            let src = event.target.result;\r\n            imageCtrl.inserImg(src);\r\n            $(\"#luckysheet-imgUpload\").val(\"\");\r\n        }\r\n    });\r\n\r\n    //\u83DC\u5355\u680F \u63D2\u5165\u94FE\u63A5\u6309\u94AE\r\n    $(\"#luckysheet-insertLink-btn-title\").click(function () {\r\n        if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            return;\r\n        }\r\n\r\n        hyperlinkCtrl.createDialog();\r\n        hyperlinkCtrl.init();\r\n    })\r\n    $(\"#luckysheetInsertLink\").click(function () {\r\n        $(\"#luckysheet-insertLink-btn-title\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    })\r\n\r\n    //\u83DC\u5355\u680F \u6570\u636E\u9A8C\u8BC1\u6309\u94AE\r\n    $(\"#luckysheet-dataVerification-btn-title\").click(function () {\r\n        if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            return;\r\n        }\r\n\r\n        dataVerificationCtrl.createDialog();\r\n        dataVerificationCtrl.init();\r\n    });\r\n    $(\"#luckysheetDataVerification\").click(function () {\r\n        $(\"#luckysheet-dataVerification-btn-title\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n\r\n    //Cell format\r\n    $(\"#luckysheetCellFormatRightClickMenu\").click(function () {\r\n        openCellFormatModel();\r\n    });\r\n\r\n    //\u51BB\u7ED3\u884C\u5217\r\n    $(\"#luckysheet-freezen-btn-horizontal\").click(function () {\r\n        if ($.trim($(this).text()) == locale().freezen.freezenCancel) {\r\n\r\n            luckysheetFreezen.saveFrozen(\"freezenCancel\");\r\n\r\n            if (luckysheetFreezen.freezenverticaldata != null) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                luckysheetFreezen.cancelFreezenHorizontal();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            luckysheetFreezen.scrollAdapt();\r\n        }\r\n        else {\r\n\r\n            luckysheetFreezen.saveFrozen(\"freezenRow\");\r\n\r\n            if (luckysheetFreezen.freezenverticaldata != null) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata == null) {\r\n                luckysheetFreezen.createFreezenHorizontal();\r\n                luckysheetFreezen.createAssistCanvas();\r\n            }\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheet-freezen-btn-vertical\").click(function () {\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n\r\n            luckysheetFreezen.saveFrozen(\"freezenCancel\");\r\n\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetrefreshgrid();\r\n        }\r\n        else {\r\n\r\n            luckysheetFreezen.saveFrozen(\"freezenColumn\");\r\n\r\n            luckysheetFreezen.createFreezenVertical();\r\n        }\r\n        luckysheetFreezen.createAssistCanvas();\r\n    });\r\n\r\n    $(\"#luckysheet-rightclick-menu input\").on(\"keydown\", function (e) {\r\n        e.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-modal-dialog-mask\").on(\"click dbclick mousedown mousemove mouseup\", function (e) {\r\n        e.stopPropagation();\r\n        e.preventDefault();\r\n    });\r\n\r\n    let copychange = function () {\r\n        if (document.hidden || document.webkitHidden || document.msHidden) {\r\n            Store.iscopyself = false;\r\n        }\r\n    }\r\n\r\n    $(document).on(\"visibilitychange.luckysheetEvent webkitvisibilitychange.luckysheetEvent msvisibilitychange.luckysheetEvent\", copychange).on(\"mouseleave.luckysheetEvent\", function () {\r\n        Store.iscopyself = false;\r\n    }).on(\"mousedown.luckysheetEvent\", function (event) {\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        hideMenuByCancel(event);\r\n\r\n        //\u70B9\u51FB\u529F\u80FD\u680F\u65F6 \u5982\u679C\u662F\u5355\u5143\u683C\u7F16\u8F91\u6A21\u5F0F \u5219\u9000\u51FA\u7F16\u8F91\u6A21\u5F0F \r\n        if ($(event.target).closest(\"#luckysheet-wa-editor\").length > 0 && parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            \r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n        }\r\n    });\r\n\r\n    //\u8868\u683C\u5DE6\u4E0A\u89D2\u70B9\u51FB \u5168\u9009\u8868\u683C\r\n    $(\"#luckysheet-left-top\").click(function (event) {\r\n        if(!checkProtectionAllSelected(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        Store.luckysheet_select_status = false;\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1], \"row_focus\": 0, \"column_focus\": 0, row_select: true, column_select: true }];\r\n        selectHightlightShow();\r\n\r\n        clearTimeout(Store.countfuncTimeout);\r\n        Store.countfuncTimeout = setTimeout(function () { countfunc() }, 500);\r\n\r\n        /* \u9009\u4E2D\u533A\u57DF\uFF1A\u53D1\u9001\u7F51\u7EDC\u8BF7\u6C42 */\r\n        server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n\r\n    //\u56DE\u9000 \u91CD\u505A \u6309\u94AE\r\n    $(\"#luckysheet-icon-undo\").click(function (event) {\r\n        if ($(this).hasClass('disabled')) {\r\n            return;\r\n        }\r\n        controlHistory.redo(event);\r\n    });\r\n    $(\"#luckysheet-icon-redo\").click(function (event) {\r\n        if ($(this).hasClass('disabled')) {\r\n            return;\r\n        }\r\n        controlHistory.undo(event);\r\n    });\r\n\r\n\r\n    //\u6A21\u6001\u6846\u62D6\u52A8\r\n    $(document).on(\"mousedown.luckysheetEvent\", \"div.luckysheet-modal-dialog\", function (e) {\r\n        if (!$(e.target).is(\".luckysheet-modal-dialog\")) {\r\n            return;\r\n        }\r\n\r\n        Store.luckysheet_model_move_state = true;\r\n\r\n        Store.luckysheet_model_move_obj = $(e.currentTarget);\r\n        let toffset = Store.luckysheet_model_move_obj.offset();\r\n        Store.luckysheet_model_xy = [e.pageX - toffset.left, e.pageY - toffset.top];\r\n    });\r\n\r\n    //\u6A21\u6001\u6846\u5173\u95ED\r\n    $(document).on(\"click.luckysheetEvent\", \".luckysheet-modal-dialog-title-close, .luckysheet-model-close-btn\", function (e) {\r\n        //\u9009\u62E9\u6587\u672C\u989C\u8272\u548C\u5355\u5143\u683C\u989C\u8272\u5F39\u51FA\u6846\u53D6\u6D88\r\n        if ($(\"#textcolorselect\").is(\":visible\") || $(\"#cellcolorselect\").is(\":visible\")) {\r\n            $(\"#luckysheet-conditionformat-dialog\").show();\r\n        }\r\n        $(e.currentTarget).parents(\".luckysheet-modal-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n        //\u51FD\u6570\u67E5\u627E\u529F\u80FD\u6240\u6709\u5F39\u51FA\u6846\u5173\u95ED\u548C\u53D6\u6D88\r\n        if ($(this).parents(\".luckysheet-modal-dialog\").hasClass(\"luckysheet-search-formula\")) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n        }\r\n        if ($(this).parents(\".luckysheet-modal-dialog\").hasClass(\"luckysheet-search-formula-parm\")) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n        }\r\n        if ($(this).parents(\".luckysheet-modal-dialog\").hasClass(\"luckysheet-search-formula-parm-select\")) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n        }\r\n\r\n        luckysheetContainerFocus();\r\n    });\r\n\r\n    //\u5DE6\u4E0A\u89D2\u8FD4\u56DE\u6309\u94AE\r\n    $(\"#luckysheet_info_detail_title\").click(function () {\r\n        window.open(luckysheetConfigsetting.myFolderUrl, \"_self\");\r\n    });\r\n\r\n    //\u56FE\u8868\u9009\u533Amousedown\r\n    $(\"#luckysheet-chart-rangeShow\").on(\"mousedown.chartRangeShowMove\", \".luckysheet-chart-rangeShow-move\", function (event) {\r\n        Store.chart_selection.rangeMove = true;\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        Store.chart_selection.rangeMoveObj = $(this).parent();\r\n\r\n        let chart_json = Store.currentChart\r\n\r\n        let $id = $(this).parent().attr(\"id\");\r\n        if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        }\r\n        else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        }\r\n        else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n        let type = $(this).data(\"type\");\r\n        if (type == \"top\") {\r\n            y += 3;\r\n        }\r\n        else if (type == \"right\") {\r\n            x -= 3;\r\n        }\r\n        else if (type == \"bottom\") {\r\n            y -= 3;\r\n        }\r\n        else if (type == \"left\") {\r\n            x += 3;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        Store.chart_selection.rangeMovexy = [row_index, col_index];\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-chart-rangeShow\").on(\"mousedown.chartRangeShowResize\", \".luckysheet-chart-rangeShow-resize\", function (event) {\r\n        Store.chart_selection.rangeResize = $(this).data(\"type\");//\u5F00\u59CB\u72B6\u6001resize\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        Store.chart_selection.rangeResizeObj = $(this).parent();\r\n\r\n        let chart_json = Store.currentChart\r\n        let row_s\r\n        let row_e\r\n        let col_s\r\n        let col_e\r\n\r\n        let $id = $(this).parent().attr(\"id\");\r\n        if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n            if (chart_json.rangeRowCheck.exits) {\r\n                 row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[0];\r\n                 row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[1];\r\n            }\r\n            else {\r\n                 row_s = chart_json.rangeSplitArray.content.row[0];\r\n                 row_e = chart_json.rangeSplitArray.content.row[0];\r\n            }\r\n\r\n            if (chart_json.rangeColCheck.exits) {\r\n                 col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[0];\r\n                 col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[1];\r\n            }\r\n            else {\r\n                 col_s = chart_json.rangeSplitArray.content.column[0];\r\n                 col_e = chart_json.rangeSplitArray.content.column[1];\r\n            }\r\n\r\n            Store.chart_selection.rangeResizeIndex = { \"row\": [row_s, row_e], \"column\": [col_s, col_e] };\r\n        }\r\n        else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[0];\r\n            let row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[1];\r\n\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[0];\r\n            let col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[1];\r\n\r\n            Store.chart_selection.rangeResizeIndex = { \"row\": [row_s, row_e], \"column\": [col_s, col_e] };\r\n        }\r\n        else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[0];\r\n            let row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[1];\r\n\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[0];\r\n            let col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[1];\r\n\r\n            Store.chart_selection.rangeResizeIndex = { \"row\": [row_s, row_e], \"column\": [col_s, col_e] };\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        if (Store.chart_selection.rangeResize == \"lt\") {\r\n            x += 3;\r\n            y += 3;\r\n        }\r\n        else if (Store.chart_selection.rangeResize == \"lb\") {\r\n            x += 3;\r\n            y -= 3;\r\n        }\r\n        else if (Store.chart_selection.rangeResize == \"rt\") {\r\n            x -= 3;\r\n            y += 3;\r\n        }\r\n        else if (Store.chart_selection.rangeResize == \"rb\") {\r\n            x -= 3;\r\n            y -= 3;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        Store.chart_selection.rangeResizexy = [row_index, col_index];\r\n\r\n        event.stopPropagation();\r\n    })\r\n\r\n    $(\"#luckysheet-wa-calculate-size\").mousedown(function (e) {\r\n        let y = e.pageY;\r\n        formula.functionResizeData.y = y;\r\n        formula.functionResizeStatus = true;\r\n        formula.functionResizeData.calculatebarHeight = Store.calculatebarHeight;\r\n        if (formula.rangetosheet != null) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n    });\r\n\r\n    // \u70B9\u51FB\u8BBE\u7F6E\u5B57\u4F53\u5927\u5C0F\u7684\u4E0B\u62C9\u7BAD\u5934\uFF0C\u628A\u81EA\u52A8\u805A\u7126\u8F93\u5165\u6846\u53BB\u9664\uFF08\u8BA4\u4E3A\u4E0B\u62C9\u8BBE\u7F6E\u5B57\u4F53\u5927\u5C0F\uFF0C\u4E0D\u9700\u8981\u805A\u7126\u8F93\u5165\u6846\uFF09\r\n    // //toolbar\u83DC\u5355\r\n    // $(\"#\" + Store.container + \" .luckysheet-wa-editor\").on(\"click\", \".luckysheet-toolbar-zoom-combobox\", function (e) {\r\n    //     $(e.currentTarget).addClass(\"luckysheet-toolbar-combo-button-open\");\r\n    //     $(e.currentTarget).find(\".luckysheet-toolbar-combo-button-input\").focus();\r\n    // });\r\n\r\n    // $(\"#\" + Store.container + \" .luckysheet-wa-editor\").on(\"blur\", \".luckysheet-toolbar-combo-button-input\", function (e) {\r\n    //     $(e.currentTarget).closest(\".luckysheet-toolbar-zoom-combobox\").removeClass(\"luckysheet-toolbar-combo-button-open\");\r\n    // });\r\n\r\n    //\u8868\u683C\u683C\u5F0F\u5904\u7406\r\n    menuButton.initialMenuButton();\r\n\r\n    let dpi_x = document.getElementById('testdpidiv').offsetWidth * Store.devicePixelRatio;\r\n    let dpi_y = document.getElementById('testdpidiv').offsetHeight * Store.devicePixelRatio;\r\n\r\n    //\u7C98\u8D34\u4E8B\u4EF6\u5904\u7406\r\n    $(document).on(\"paste.luckysheetEvent\", function (e) {\r\n        if (isEditMode()) {//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u7C98\u8D34\r\n            return;\r\n        }\r\n\r\n        if (selection.isPasteAction) {\r\n            $(\"#luckysheet-rich-text-editor\").blur();\r\n            selection.isPasteAction = false;\r\n\r\n            let clipboardData = window.clipboardData; //for IE\r\n            if (!clipboardData) { // for chrome\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n\r\n            let txtdata = clipboardData.getData(\"text/html\") || clipboardData.getData(\"text/plain\");\r\n\r\n            //\u5982\u679C\u6807\u793A\u662Fqksheet\u590D\u5236\u7684\u5185\u5BB9\uFF0C\u5224\u65AD\u526A\u8D34\u677F\u5185\u5BB9\u662F\u5426\u662F\u5F53\u524D\u9875\u9762\u590D\u5236\u7684\u5185\u5BB9\r\n            let isEqual = true;\r\n            if (txtdata.indexOf(\"luckysheet_copy_action_table\") > - 1 && Store.luckysheet_copy_save[\"copyRange\"] != null && Store.luckysheet_copy_save[\"copyRange\"].length > 0) {\r\n                //\u526A\u8D34\u677F\u5185\u5BB9\u89E3\u6790\r\n                let cpDataArr = [];\r\n\r\n                let reg = new RegExp('<tr.*?>(.*?)</tr>', 'g');\r\n                let reg2 = new RegExp('<td.*?>(.*?)</td>', 'g');\r\n\r\n                let regArr = txtdata.match(reg) || [];\r\n\r\n                for (let i = 0; i < regArr.length; i++) {\r\n                    let cpRowArr = [];\r\n\r\n                    let reg2Arr = regArr[i].match(reg2);\r\n\r\n                    if (reg2Arr != null) {\r\n                        for (let j = 0; j < reg2Arr.length; j++) {\r\n                            let cpValue = reg2Arr[j].replace(/<td.*?>/g, \"\").replace(/<\\/td>/g, \"\");\r\n                            cpRowArr.push(cpValue);\r\n                        }\r\n                    }\r\n\r\n                    cpDataArr.push(cpRowArr);\r\n                }\r\n\r\n                //\u5F53\u524D\u9875\u9762\u590D\u5236\u533A\u5185\u5BB9\r\n                let copy_r1 = Store.luckysheet_copy_save[\"copyRange\"][0].row[0],\r\n                    copy_r2 = Store.luckysheet_copy_save[\"copyRange\"][0].row[1],\r\n                    copy_c1 = Store.luckysheet_copy_save[\"copyRange\"][0].column[0],\r\n                    copy_c2 = Store.luckysheet_copy_save[\"copyRange\"][0].column[1];\r\n\r\n                let copy_index = Store.luckysheet_copy_save[\"dataSheetIndex\"];\r\n\r\n                let d;\r\n                if(copy_index == Store.currentSheetIndex){\r\n                    d = editor.deepCopyFlowData(Store.flowdata);\r\n                }\r\n                else{\r\n                    d = Store.luckysheetfile[getSheetIndex(copy_index)].data;\r\n                }\r\n\r\n                for(let r = copy_r1; r <= copy_r2; r++){\r\n                    if(r - copy_r1 > cpDataArr.length - 1){\r\n                        break;\r\n                    }\r\n\r\n                    for(let c = copy_c1; c <= copy_c2; c++){\r\n                        let cell = d[r][c];\r\n                        let isInlineStr = false\r\n                        if(cell != null && cell.mc != null && cell.mc.rs == null){\r\n                            continue;\r\n                        }\r\n\r\n                        let v;\r\n                        if(cell != null){\r\n                            if(cell.ct != null && cell.ct.fa.indexOf(\"w\") > -1){\r\n                                v = d[r][c].v;\r\n                            }\r\n                            else{\r\n                                v = d[r][c].m;\r\n                            }\r\n                        }\r\n                        else{\r\n                            v = \"\";\r\n                        }\r\n\r\n                        \r\n                        if(v == null && d[r][c] && d[r][c].ct && d[r][c].ct.t == 'inlineStr') {\r\n                          v = d[r][c].ct.s.map(val=>val.v).join('');\r\n                          isInlineStr = true;\r\n                        }\r\n                        if(v == null){\r\n                          v = \"\";\r\n                        }\r\n                        if(isInlineStr){\r\n                          const cpData = $(cpDataArr[r - copy_r1][c - copy_c1]).text().replace(/\\s|\\n/g,' ')\r\n                          const storeValue = v.replace(/\\n/g,'').replace(/\\s/g,' ')\r\n                          if(cpData != storeValue){\r\n                            isEqual = false;\r\n                            break;\r\n                          }\r\n                        }\r\n                        else{\r\n                          if(cpDataArr[r - copy_r1][c - copy_c1] != v){\r\n                            isEqual = false;\r\n                            break;\r\n                          }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            const locale_fontjson = locale().fontjson;\r\n\r\n            \r\n            // hook\r\n            if(!method.createHookFunction('rangePasteBefore',Store.luckysheet_select_save,txtdata)){\r\n                return;\r\n            }\r\n\r\n            if (txtdata.indexOf(\"luckysheet_copy_action_table\") > - 1 && Store.luckysheet_copy_save[\"copyRange\"] != null && Store.luckysheet_copy_save[\"copyRange\"].length > 0 && isEqual) {\r\n                //\u526A\u5207\u677F\u5185\u5BB9 \u548C luckysheet\u672C\u8EAB\u590D\u5236\u7684\u5185\u5BB9 \u4E00\u81F4\r\n                if (Store.luckysheet_paste_iscut) {\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    selection.pasteHandlerOfCutPaste(Store.luckysheet_copy_save);\r\n                    selection.clearcopy(e);\r\n                }\r\n                else {\r\n                    selection.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save);\r\n                }\r\n            }\r\n            else if(txtdata.indexOf(\"luckysheet_copy_action_image\") > - 1){\r\n                imageCtrl.pasteImgItem();\r\n            }\r\n            else {\r\n                if (txtdata.indexOf(\"table\") > -1) {\r\n                    $(\"#luckysheet-copy-content\").html(txtdata);\r\n\r\n                    let data = new Array($(\"#luckysheet-copy-content\").find(\"table tr\").length);\r\n                    let colLen = 0;\r\n                    $(\"#luckysheet-copy-content\").find(\"table tr\").eq(0).find(\"td\").each(function () {\r\n                        let colspan = parseInt($(this).attr(\"colspan\"));\r\n                        if (isNaN(colspan)) {\r\n                            colspan = 1;\r\n                        }\r\n                        colLen += colspan;\r\n                    });\r\n\r\n                    for (let i = 0; i < data.length; i++) {\r\n                        data[i] = new Array(colLen);\r\n                    }\r\n\r\n                    let r = 0;\r\n                    let borderInfo = {};\r\n                    $(\"#luckysheet-copy-content\").find(\"table tr\").each(function () {\r\n                        let $tr = $(this);\r\n                        let c = 0;\r\n                        $tr.find(\"td\").each(function () {\r\n                            let $td = $(this);\r\n                            let cell = {};\r\n                            let txt = $td.text();\r\n                            if ($.trim(txt).length == 0) {\r\n                                cell.v = null;\r\n                                cell.m = \"\";\r\n                            }\r\n                            else {\r\n                                let mask = genarate($td.text());\r\n                                cell.v = mask[2];\r\n                                cell.ct = mask[1];\r\n                                cell.m = mask[0];\r\n                            }\r\n\r\n                            let bg = $td.css(\"background-color\");\r\n                            if (bg == \"rgba(0, 0, 0, 0)\") {\r\n                                bg = null;\r\n                            }\r\n\r\n                            cell.bg = bg;\r\n\r\n                            let bl = $td.css(\"font-weight\");\r\n                            if (bl == 400 || bl == \"normal\") {\r\n                                cell.bl = 0;\r\n                            }\r\n                            else {\r\n                                cell.bl = 1;\r\n                            }\r\n\r\n                            let it = $td.css(\"font-style\");\r\n                            if (it == \"normal\") {\r\n                                cell.it = 0;\r\n                            }\r\n                            else {\r\n                                cell.it = 1;\r\n                            }\r\n\r\n                            let ff = $td.css(\"font-family\");\r\n                            let ffs = ff.split(\",\");\r\n                            for (let i = 0; i < ffs.length; i++) {\r\n                                let fa = $.trim(ffs[i].toLowerCase());\r\n                                fa = locale_fontjson[fa];\r\n                                if (fa == null) {\r\n                                    cell.ff = 0;\r\n                                }\r\n                                else {\r\n                                    cell.ff = fa;\r\n                                    break;\r\n                                }\r\n                            }\r\n                            let fs = Math.round(parseInt($td.css(\"font-size\")) * 72 / 96);\r\n                            cell.fs = fs;\r\n\r\n                            let fc = $td.css(\"color\");\r\n                            cell.fc = fc;\r\n\r\n                            let ht = $td.css(\"text-align\");\r\n                            if (ht == \"center\") {\r\n                                cell.ht = 0;\r\n                            }\r\n                            else if (ht == \"right\") {\r\n                                cell.ht = 2;\r\n                            }\r\n                            else {\r\n                                cell.ht = 1;\r\n                            }\r\n\r\n                            let vt = $td.css(\"vertical-align\");\r\n                            if (vt == \"middle\") {\r\n                                cell.vt = 0;\r\n                            }\r\n                            else if (vt == \"top\" || vt == \"text-top\") {\r\n                                cell.vt = 1;\r\n                            }\r\n                            else {\r\n                                cell.vt = 2;\r\n                            }\r\n\r\n                            while (c < colLen && data[r][c] != null) {\r\n                                c++;\r\n                            }\r\n\r\n                            if (c == colLen) {\r\n                                return true;\r\n                            }\r\n\r\n                            if (data[r][c] == null) {\r\n                                data[r][c] = cell;\r\n                                let rowspan = parseInt($td.attr(\"rowspan\"));\r\n                                let colspan = parseInt($td.attr(\"colspan\"));\r\n\r\n                                if (isNaN(rowspan)) {\r\n                                    rowspan = 1;\r\n                                }\r\n\r\n                                if (isNaN(colspan)) {\r\n                                    colspan = 1;\r\n                                }\r\n\r\n                                let r_ab = Store.luckysheet_select_save[0][\"row\"][0] + r;\r\n                                let c_ab = Store.luckysheet_select_save[0][\"column\"][0] + c;\r\n\r\n                                for (let rp = 0; rp < rowspan; rp++) {\r\n                                    for (let cp = 0; cp < colspan; cp++) {\r\n                                        if (rp == 0) {\r\n                                            let bt = $td.css(\"border-top\");\r\n                                            if (bt != null && bt.length > 0 && bt.substr(0, 3).toLowerCase() != \"0px\") {\r\n                                                let width = $td.css(\"border-top-width\");\r\n                                                let type = $td.css(\"border-top-style\");\r\n                                                let color = $td.css(\"border-top-color\");\r\n                                                let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                if (borderInfo[(r + rp) + \"_\" + (c + cp)] == null) {\r\n                                                    borderInfo[(r + rp) + \"_\" + (c + cp)] = {};\r\n                                                }\r\n\r\n                                                borderInfo[(r + rp) + \"_\" + (c + cp)].t = { \"style\": borderconfig[0], \"color\": borderconfig[1] };\r\n                                            }\r\n                                        }\r\n\r\n                                        if (rp == rowspan - 1) {\r\n                                            let bb = $td.css(\"border-bottom\");\r\n                                            if (bb != null && bb.length > 0 && bb.substr(0, 3).toLowerCase() != \"0px\") {\r\n                                                let width = $td.css(\"border-bottom-width\");\r\n                                                let type = $td.css(\"border-bottom-style\");\r\n                                                let color = $td.css(\"border-bottom-color\");\r\n                                                let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                if (borderInfo[(r + rp) + \"_\" + (c + cp)] == null) {\r\n                                                    borderInfo[(r + rp) + \"_\" + (c + cp)] = {};\r\n                                                }\r\n\r\n                                                borderInfo[(r + rp) + \"_\" + (c + cp)].b = { \"style\": borderconfig[0], \"color\": borderconfig[1] };\r\n                                            }\r\n                                        }\r\n\r\n                                        if (cp == 0) {\r\n                                            let bl = $td.css(\"border-left\");\r\n                                            if (bl != null && bl.length > 0 && bl.substr(0, 3).toLowerCase() != \"0px\") {\r\n                                                let width = $td.css(\"border-left-width\");\r\n                                                let type = $td.css(\"border-left-style\");\r\n                                                let color = $td.css(\"border-left-color\");\r\n                                                let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                if (borderInfo[(r + rp) + \"_\" + (c + cp)] == null) {\r\n                                                    borderInfo[(r + rp) + \"_\" + (c + cp)] = {};\r\n                                                }\r\n\r\n                                                borderInfo[(r + rp) + \"_\" + (c + cp)].l = { \"style\": borderconfig[0], \"color\": borderconfig[1] };\r\n                                            }\r\n                                        }\r\n\r\n                                        if (cp == colspan - 1) {\r\n                                            let br = $td.css(\"border-right\");\r\n                                            if (br != null && br.length > 0 && br.substr(0, 3).toLowerCase() != \"0px\") {\r\n                                                let width = $td.css(\"border-right-width\");\r\n                                                let type = $td.css(\"border-right-style\");\r\n                                                let color = $td.css(\"border-right-color\");\r\n                                                let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                if (borderInfo[(r + rp) + \"_\" + (c + cp)] == null) {\r\n                                                    borderInfo[(r + rp) + \"_\" + (c + cp)] = {};\r\n                                                }\r\n\r\n                                                borderInfo[(r + rp) + \"_\" + (c + cp)].r = { \"style\": borderconfig[0], \"color\": borderconfig[1] };\r\n                                            }\r\n                                        }\r\n\r\n                                        if (rp == 0 && cp == 0) {\r\n                                            continue;\r\n                                        }\r\n\r\n                                        data[r + rp][c + cp] = { \"mc\": { \"r\": r_ab, \"c\": c_ab } };\r\n                                    }\r\n                                }\r\n\r\n                                if (rowspan > 1 || colspan > 1) {\r\n                                    let first = { \"rs\": rowspan, \"cs\": colspan, \"r\": r_ab, \"c\": c_ab };\r\n                                    data[r][c].mc = first;\r\n                                }\r\n                            }\r\n\r\n                            c++;\r\n\r\n                            if (c == colLen) {\r\n                                return true;\r\n                            }\r\n                        });\r\n\r\n                        r++;\r\n                    });\r\n\r\n                    Store.luckysheet_selection_range = [];\r\n                    selection.pasteHandler(data, borderInfo);\r\n                    $(\"#luckysheet-copy-content\").empty();\r\n                }\r\n                //\u590D\u5236\u7684\u662F\u56FE\u7247\r\n                else if(clipboardData.files.length == 1 && clipboardData.files[0].type.indexOf('image') > -1){\r\n                    let render = new FileReader();\r\n                    render.readAsDataURL(clipboardData.files[0]);\r\n                    render.onload = function(event){\r\n                        let src = event.target.result;\r\n                        imageCtrl.inserImg(src);\r\n                    }\r\n\r\n                    return;\r\n                }\r\n                else {\r\n                    txtdata = clipboardData.getData(\"text/plain\");\r\n                    selection.pasteHandler(txtdata);\r\n                }\r\n            }\r\n        }\r\n        else if($(e.target).closest('#luckysheet-rich-text-editor').length > 0) {\r\n            \r\n            // \u963B\u6B62\u9ED8\u8BA4\u7C98\u8D34\r\n            e.preventDefault();\r\n\r\n            let clipboardData = window.clipboardData; //for IE\r\n            if (!clipboardData) { // for chrome\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n            let text =  clipboardData.getData('text/plain');\r\n            // \u63D2\u5165\r\n            document.execCommand(\"insertText\", false, text);\r\n        }\r\n    });\r\n\r\n    //\u662F\u5426\u5141\u8BB8\u52A0\u8F7D\u4E0B\u4E00\u9875\r\n    if (luckysheetConfigsetting.enablePage) {\r\n        $(\"#luckysheet-bottom-page-next\").click(function () {\r\n            let queryExps = luckysheetConfigsetting.pageInfo.queryExps;\r\n            let reportId = luckysheetConfigsetting.pageInfo.reportId;\r\n            let fields = luckysheetConfigsetting.pageInfo.fields;\r\n            let mobile = luckysheetConfigsetting.pageInfo.mobile;\r\n            let frezon = luckysheetConfigsetting.pageInfo.frezon;\r\n            let currentPage = luckysheetConfigsetting.pageInfo.currentPage;\r\n            let totalPage = luckysheetConfigsetting.pageInfo.totalPage;\r\n            let pageUrl = luckysheetConfigsetting.pageInfo.pageUrl;\r\n\r\n            \r\n            method.addDataAjax({\r\n                \"queryExps\": queryExps,\r\n                \"reportId\": reportId,\r\n                \"fields\": fields,\r\n                \"mobile\": mobile,\r\n                \"frezon\": frezon,\r\n                \"pageIndex\": currentPage,\r\n                \"currentPage\": currentPage\r\n            }, Store.currentSheetIndex, pageUrl, function () {\r\n                luckysheetConfigsetting.pageInfo.currentPage++;\r\n                if (luckysheetConfigsetting.pageInfo.totalPage == (luckysheetConfigsetting.pageInfo.currentPage)) {\r\n                    $(\"#luckysheet-bottom-page-next\").hide();\r\n                    let pageInfoFull = replaceHtml(locale_info.pageInfoFull, {\r\n                        total: luckysheetConfigsetting.total,\r\n                        totalPage: luckysheetConfigsetting.pageInfo.totalPage,\r\n                    });\r\n                    $(\"#luckysheet-bottom-page-info\").html(pageInfoFull);\r\n                }\r\n                else {\r\n                    let pageInfo = replaceHtml(locale_info.pageInfo, {\r\n                        total: luckysheetConfigsetting.total,\r\n                        totalPage: luckysheetConfigsetting.pageInfo.totalPage,\r\n                        currentPage: luckysheetConfigsetting.pageInfo.currentPage\r\n\r\n                    });\r\n                    $(\"#luckysheet-bottom-page-info\").html(pageInfo);\r\n                }\r\n            });\r\n        }).mousedown(function (e) {\r\n            e.stopPropagation();\r\n        });\r\n    }\r\n\r\n    //\u56DE\u5230\u9876\u90E8\r\n    $(\"#luckysheet-bottom-bottom-top\").click(function () {\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n    }).mousedown(function (e) {\r\n        e.stopPropagation();\r\n    });\r\n\r\n    $('#luckysheet-wa-editor,#luckysheet-icon-morebtn-div,.luckysheet-toolbar-button').click(function(e){\r\n        if(this.id != 'luckysheet-icon-paintformat' && menuButton.luckysheetPaintModelOn){\r\n            menuButton.cancelPaintModel();\r\n        }\r\n    })\r\n}\r\n\r\n// \u534F\u540C\u7F16\u8F91\u5176\u4ED6\u7528\u6237\u4E0D\u5728\u64CD\u4F5C\u7684\u65F6\u5019\uFF0C\u4E14\u5DF2\u7ECF\u5C55\u793A\u4E86\u7528\u6237\u540D10\u79D2\uFF0C\u5219\u7528\u6237\u540D\u6846\u9690\u85CF\r\nfunction hideUsername(){\r\n    let $showEle = $$('.luckysheet-multipleRange-show');\r\n\r\n    if($showEle.length === undefined){\r\n        $showEle = [$showEle];\r\n    }\r\n\r\n    $showEle.forEach((ele)=>{\r\n        const id = ele.id.replace('luckysheet-multipleRange-show-','');\r\n        \r\n        if(Store.cooperativeEdit.usernameTimeout['user' + id] === null){\r\n            $$('.username',ele).style.display = 'none';\r\n        }\r\n    })\r\n}", "import selection from './selection';\r\nimport { \r\n    getObjType,\r\n    chatatABC,\r\n    numFormat,\r\n    luckysheetContainerFocus,\r\n} from '../utils/util';\r\nimport { hasPartMC, isEditMode } from '../global/validate';\r\nimport { getdatabyselection, getcellvalue } from '../global/getdata';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport function initialMatrixOperation(){\r\n    const locale_drag = locale().drag;\r\n\r\n    //\u53F3\u952E\u529F\u80FD\u952E\r\n    //\u590D\u5236\u4E3Ajson\u683C\u5F0F\u5B57\u7B26\u4E32\uFF0C\u9996\u884C\u4E3A\u6807\u9898\r\n    $(\"#luckysheet-copy-json-head\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");   \r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        if (getdata.length == 1) {\r\n            let obj = {};\r\n            for (let i = 0; i < getdata[0].length; i++) {\r\n                obj[getcellvalue(0, i, getdata)] = \"\";\r\n            }\r\n            arr.push(obj);\r\n        }\r\n        else {\r\n            for (let r = 1; r < getdata.length; r++) {\r\n                let obj = {};\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    if(getcellvalue(0, c, getdata) == undefined){\r\n                        obj[\"\"] = getcellvalue(r, c, getdata);\r\n                    }else{\r\n                        obj[getcellvalue(0, c, getdata)] = getcellvalue(r, c, getdata);\r\n                    }\r\n                }\r\n                arr.push(obj);\r\n            }\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3Ajson\u683C\u5F0F\u5B57\u7B26\u4E32\uFF0C\u65E0\u6807\u9898\uFF0C\u91C7\u7528ABCD\u4F5C\u4E3A\u6807\u9898\r\n    $(\"#luckysheet-copy-json-nohead\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        let st = Store.luckysheet_select_save[0][\"column\"][0];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let obj = {};\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                obj[chatatABC(c + st)] = getcellvalue(r, c, getdata);\r\n            }\r\n            arr.push(obj);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u4E00\u7EF4\u6570\u7EC4\r\n    $(\"#luckysheet-copy-array1\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                arr.push(getcellvalue(r, c, getdata));\r\n            }\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u4E8C\u7EF4\u6570\u7EC4\r\n    $(\"#luckysheet-copy-array2\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                a.push(getcellvalue(r, c, getdata));\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u591A\u7EF4\u6570\u7EC4\r\n    $(\"#luckysheet-copy-arraymore-confirm\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                arr.push(getdata[r][c]);\r\n            }\r\n        }\r\n\r\n        let row = $(\"#luckysheet-copy-arraymore-row\").val(), col = $(\"#luckysheet-copy-arraymore-col\").val();\r\n\r\n        if (row == \"\" && col == \"\") {\r\n            selection.copybyformat(event, JSON.stringify(arr));\r\n            $(\"body .luckysheet-cols-menu\").hide();\r\n            return;\r\n        }\r\n\r\n        if (row == \"\") {\r\n            row = 1;\r\n        }\r\n        else {\r\n            row = parseInt(row);\r\n            if (row == null) {\r\n                row = 1;\r\n            }\r\n        }\r\n\r\n        if (col == \"\") {\r\n            col = 1;\r\n        }\r\n        else {\r\n            col = parseInt(col);\r\n            if (col == null) {\r\n                col = 1;\r\n            }\r\n        }\r\n\r\n        if(row.toString() == \"NaN\" || col.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if(row < 1 || col < 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.notLessOne);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.notLessOne, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let arrlen = arr.length, i = 0, ret = [];\r\n        for (let r = 0; r < row; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < col; c++) {\r\n                a.push(arr[i++]);\r\n                if (i >= arrlen) {\r\n                    selection.copybyformat(event, JSON.stringify(ret));\r\n                    $(\"body .luckysheet-cols-menu\").hide();\r\n                    return;\r\n                }\r\n            }\r\n            ret.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(ret));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u5BF9\u89D2\u7EBF\r\n    $(\"#luckysheet-copy-diagonal\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][r]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u53CD\u5BF9\u89D2\u7EBF\r\n    $(\"#luckysheet-copy-antidiagonal\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][clen - r - 1]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u5BF9\u89D2\u504F\u79FBn\u5217\r\n    $(\"#luckysheet-copy-diagonaloffset\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n        \r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length, \r\n            offset = parseInt($(\"#luckysheet-copy-diagonaloffset-value\").val());\r\n\r\n        if(offset.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if(offset < 0){\r\n            if(isEditMode()){\r\n                alert(locale_drag.offsetColumnLessZero);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.offsetColumnLessZero, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (offset == null) {\r\n            offset = 1;\r\n        }\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r + offset >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][r + offset]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u590D\u5236\u4E3A\u5E03\u5C14\u503C\r\n    $(\"#luckysheet-copy-boolvalue\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let bool = false;\r\n\r\n                let v;\r\n                if(getObjType(getdata[r][c]) == \"object\"){\r\n                    v = getdata[r][c].v;\r\n                }\r\n                else{\r\n                    v = getdata[r][c];\r\n                }\r\n\r\n                if (v == null || v == \"\") {\r\n                    bool = false;\r\n                }\r\n                else {\r\n                    v = parseInt(v);\r\n                    if (v == null || v > 0) {\r\n                        bool = true;\r\n                    }\r\n                    else {\r\n                        bool = false;\r\n                    }\r\n                }\r\n                a.push(bool);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u7FFB\u8F6C \u4E0A\u4E0B\r\n    $(\"#luckysheet-matrix-turn-up\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let r = getdata.length - 1; r >= 0; r--) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u7FFB\u8F6C \u5DE6\u53F3\r\n    $(\"#luckysheet-matrix-turn-left\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u7FFB\u8F6C \u987A\u65F6\u9488\r\n    $(\"#luckysheet-matrix-turn-cw\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = getdata.length - 1; r >= 0; r--) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u7FFB\u8F6C \u9006\u65F6\u9488\r\n    $(\"#luckysheet-matrix-turn-anticw\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        \r\n        let arr = [];\r\n        for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u8F6C\u7F6E\r\n    $(\"#luckysheet-matrix-turn-trans\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    let jfnqrt = function (x, p) {\r\n        if (x == 0)\r\n            return 0;\r\n        let x0, x1;\r\n        x0 = x;\r\n        x1 = ((p - 1) * x0 / p) + (x / (Math.pow(x0, p - 1) * p));//\u5229\u7528\u8FED\u4EE3\u6CD5\u6C42\u89E3\r\n        while (Math.abs(x1 - x0) > 0.000001) {\r\n            x0 = x1;\r\n            x1 = ((p - 1) * x0 / p) + (x / (Math.pow(x0, p - 1) * p));\r\n        }\r\n        return x1;\r\n    }\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u77E9\u9635\u8BA1\u7B97\r\n    $(\"#luckysheet-matrix-cal-confirm\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT' || event.target.nodeName === 'SELECT'){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let caltype = $(\"#luckysheet-matrix-cal-type\").val(), \r\n            calvalue = parseInt($(\"#luckysheet-matrix-cal-value\").val());\r\n\r\n        if(calvalue.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (calvalue == null) {\r\n            calvalue = 2;\r\n        }\r\n\r\n        let arr = [];\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if (parseInt(value) != null && getdata[r][c].ct != undefined && getdata[r][c].ct.t == \"n\") {\r\n                        if (caltype == \"minus\") {\r\n                            value.v = value.v - calvalue;\r\n                        }\r\n                        else if (caltype == \"multiply\") {\r\n                            value.v = value.v * calvalue;\r\n                        }\r\n                        else if (caltype == \"divided\") {\r\n                            value.v = numFormat(value.v / calvalue, 4);\r\n                        }\r\n                        else if (caltype == \"power\") {\r\n                            value.v = Math.pow(value.v, calvalue);\r\n                        }\r\n                        else if (caltype == \"root\") {\r\n                            if (calvalue == 2) {\r\n                                value.v = numFormat(Math.sqrt(value.v), 4);\r\n                            }\r\n                            else if (calvalue == 3 && Math.cbrt) {\r\n                                value.v = numFormat(Math.cbrt(value.v), 4);\r\n                            }\r\n                            else {\r\n                                value.v = numFormat(jfnqrt(value.v, calvalue), 4);\r\n                            }\r\n                        }\r\n                        else if (caltype == \"log\") {\r\n                            value.v = numFormat(Math.log(value.v) * 10000 / Math.log(Math.abs(calvalue)), 4);\r\n                        }\r\n                        else {\r\n                            value.v = value.v + calvalue;\r\n                        }\r\n\r\n                        if(value.v == null){\r\n                            value.m = \"\";\r\n                        }\r\n                        else{\r\n                            value.m = value.v.toString();\r\n                        }\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u5220\u9664\u4E24\u7AEF0\u503C \u6309\u884C\r\n    $(\"#luckysheet-matrix-delezero-row\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        \r\n        let arr = [];\r\n        let getdatalen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [], stdel = true, eddel = true;\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                        continue;\r\n                    }\r\n                    else {\r\n                        stdel = false;\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n\r\n            let a1 = [];\r\n            if (a.length == getdatalen) {\r\n                a1 = a;\r\n            }\r\n            else {\r\n                for (let c = a.length - 1; c >= 0; c--) {\r\n                    let value = \"\";\r\n                    if (a[c] != null) {\r\n                        value = a[c];\r\n                        if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            eddel = false;\r\n                        }\r\n                    }\r\n                    a1.unshift(value);\r\n                }\r\n\r\n                let l = getdatalen - a1.length;\r\n                for (let c1 = 0; c1 < l; c1++) {\r\n                    a1.push(\"\");\r\n                }\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u5220\u9664\u4E24\u7AEF0\u503C \u6309\u5217\r\n    $(\"#luckysheet-matrix-delezero-column\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata.length, collen = getdata[0].length;\r\n        for (let c = 0; c < collen; c++) {\r\n            let a = [], stdel = true, eddel = true;\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                        continue;\r\n                    }\r\n                    else {\r\n                        stdel = false;\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n\r\n            let a1 = [];\r\n            if (a.length == getdatalen) {\r\n                a1 = a;\r\n            }\r\n            else {\r\n                for (let r = a.length - 1; r >= 0; r--) {\r\n                    let value = \"\";\r\n                    if (a[r] != null) {\r\n                        value = a[r];\r\n                        if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            eddel = false;\r\n                        }\r\n                    }\r\n                    a1.unshift(value);\r\n                }\r\n\r\n                let l = getdatalen - a1.length;\r\n                for (let r1 = 0; r1 < l; r1++) {\r\n                    a1.push(\"\");\r\n                }\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        let arr1 = [];\r\n        for (let c = 0; c < arr[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < arr.length; r++) {\r\n                let value = \"\";\r\n                if (arr[r] != null && arr[r][c] != null) {\r\n                    value = arr[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr1.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr1);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u5220\u9664\u91CD\u590D\u503C \u6309\u884C\r\n    $(\"#luckysheet-matrix-delerpt-row\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [], repeat = {};\r\n\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(value.v in repeat){\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                    else{\r\n                        repeat[value.v] = [];\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(repeat[value.v].length == 1){\r\n                        a.push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            let l = getdatalen - a.length;\r\n            for (let c1 = 0; c1 < l; c1++) {\r\n                a.push(null);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //\u77E9\u9635\u64CD\u4F5C\u9009\u533A \u5220\u9664\u91CD\u590D\u503C \u6309\u5217\r\n    $(\"#luckysheet-matrix-delerpt-column\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata.length, collen = getdata[0].length;\r\n        for (let c = 0; c < collen; c++) {\r\n            let a = [], repeat = {};\r\n\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(value.v in repeat){\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                    else{\r\n                        repeat[value.v] = [];\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(repeat[value.v].length == 1){\r\n                        a.push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            a1 = a;\r\n            let l = getdatalen - a1.length;\r\n            for (let r1 = 0; r1 < l; r1++) {\r\n                a1.push(null);\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        let arr1 = [];\r\n        for (let c = 0; c < arr[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < arr.length; r++) {\r\n                let value = null;\r\n                if (arr[r] != null && arr[r][c] != null) {\r\n                    value = arr[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr1.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr1);\r\n    });\r\n}", "\r\nimport sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport { sheetselectlistitemHTML, sheetselectlistHTML, keycode } from './constant';\r\nimport {\r\n    replaceHtml,\r\n    mouseclickposition,\r\n} from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { isEditMode } from '../global/validate';\r\nimport formula from '../global/formula';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport tooltip from '../global/tooltip';\r\n    selectTextDom\r\nimport {selectTextDom} from '../global/cursorPos';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport {pagerInit} from '../global/api'\r\nimport method from '../global/method';\r\n\r\n\r\n//\u8868\u683C\u5E95\u90E8\u540D\u79F0\u680F\u533A\u57DF \u76F8\u5173\u4E8B\u4EF6\uFF08\u589E\u3001\u5220\u3001\u6539\u3001\u9690\u85CF\u663E\u793A\u3001\u989C\u8272\u7B49\u7B49\uFF09\r\nlet isInitialSheetConfig = false, luckysheetcurrentSheetitem = null, jfdbclicklagTimeout = null,oldSheetFileName = \"\";\r\nfunction showsheetconfigmenu() {\r\n    if (!isInitialSheetConfig) {\r\n        isInitialSheetConfig = true;\r\n        const _locale = locale();\r\n        let locale_toolbar = _locale.toolbar;\r\n        $(\"#luckysheetsheetconfigcolorur\").spectrum({\r\n            showPalette: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: false,\r\n            showSelectionPalette: true,\r\n            maxPaletteSize: 10,\r\n            cancelText: _locale.sheetconfig.cancelText,\r\n            chooseText: _locale.sheetconfig.chooseText,\r\n            togglePaletteMoreText: locale_toolbar.toolMore,\r\n            togglePaletteLessText: locale_toolbar.toolLess,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            palette: [[\"rgb(0, 0, 0)\", \"rgb(67, 67, 67)\", \"rgb(102, 102, 102)\", \"rgb(204, 204, 204)\", \"rgb(217, 217, 217)\", \"rgb(255, 255, 255)\"], [\"rgb(152, 0, 0)\", \"rgb(255, 0, 0)\", \"rgb(255, 153, 0)\", \"rgb(255, 255, 0)\", \"rgb(0, 255, 0)\", \"rgb(0, 255, 255)\", \"rgb(74, 134, 232)\", \"rgb(0, 0, 255)\", \"rgb(153, 0, 255)\", \"rgb(255, 0, 255)\"], [\"rgb(230, 184, 175)\", \"rgb(244, 204, 204)\", \"rgb(252, 229, 205)\", \"rgb(255, 242, 204)\", \"rgb(217, 234, 211)\", \"rgb(208, 224, 227)\", \"rgb(201, 218, 248)\", \"rgb(207, 226, 243)\", \"rgb(217, 210, 233)\", \"rgb(234, 209, 220)\"], [\"rgb(221, 126, 107)\", \"rgb(234, 153, 153)\", \"rgb(249, 203, 156)\", \"rgb(255, 229, 153)\", \"rgb(182, 215, 168)\", \"rgb(162, 196, 201)\", \"rgb(164, 194, 244)\", \"rgb(159, 197, 232)\", \"rgb(180, 167, 214)\", \"rgb(213, 166, 189)\"], [\"rgb(204, 65, 37)\", \"rgb(224, 102, 102)\", \"rgb(246, 178, 107)\", \"rgb(255, 217, 102)\", \"rgb(147, 196, 125)\", \"rgb(118, 165, 175)\", \"rgb(109, 158, 235)\", \"rgb(111, 168, 220)\", \"rgb(142, 124, 195)\", \"rgb(194, 123, 160)\"], [\"rgb(166, 28, 0)\", \"rgb(204, 0, 0)\", \"rgb(230, 145, 56)\", \"rgb(241, 194, 50)\", \"rgb(106, 168, 79)\", \"rgb(69, 129, 142)\", \"rgb(60, 120, 216)\", \"rgb(61, 133, 198)\", \"rgb(103, 78, 167)\", \"rgb(166, 77, 121)\"], [\"rgb(91, 15, 0)\", \"rgb(102, 0, 0)\", \"rgb(120, 63, 4)\", \"rgb(127, 96, 0)\", \"rgb(39, 78, 19)\", \"rgb(12, 52, 61)\", \"rgb(28, 69, 135)\", \"rgb(7, 55, 99)\", \"rgb(32, 18, 77)\", \"rgb(76, 17, 48)\"], [\"#c1232b\", \"#27727b\", \"#fcce10\", \"#e87c25\", \"#b5c334\", \"#fe8463\", \"#9bca63\", \"#fad860\", \"#f3a43b\", \"#60c0dd\", \"#d7504b\", \"#c6e579\", \"#f4e001\", \"#f0805a\", \"#26c0c0\", \"#c12e34\", \"#e6b600\", \"#0098d9\", \"#2b821d\", \"#005eaa\", \"#339ca8\", \"#cda819\", \"#32a487\", \"#3fb1e3\", \"#6be6c1\", \"#626c91\", \"#a0a7e6\", \"#c4ebad\", \"#96dee8\"]],\r\n            change: function (color) {\r\n                let $input = $(this);\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"rgb(0, 0, 0)\";\r\n                }\r\n\r\n                let oldcolor = null;\r\n                if(luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").length>0){\r\n                    oldcolor = luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").css(\"background-color\");\r\n                }\r\n\r\n                luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + color + ';\"></div>');\r\n                let index = getSheetIndex(Store.currentSheetIndex);\r\n                Store.luckysheetfile[index].color = color;\r\n                server.saveParam(\"all\", Store.currentSheetIndex, color, { \"k\": \"color\" });\r\n\r\n                if (Store.clearjfundo) {\r\n                    let redo = {};\r\n                    redo[\"type\"] = \"sheetColor\";\r\n                    redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                    redo[\"oldcolor\"] = oldcolor;\r\n                    redo[\"color\"] = color;\r\n\r\n                    Store.jfundo.length = 0;\r\n                    Store.jfredo.push(redo);\r\n                }\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheetsheetconfigcolorreset\").click(function () {\r\n            let oldcolor = null;\r\n            if(luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").length>0){\r\n                oldcolor = luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").css(\"background-color\");\r\n            }\r\n\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            Store.luckysheetfile[index].color = null;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, null, { \"k\": \"color\" } );\r\n\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"sheetColor\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                redo[\"oldcolor\"] = oldcolor;\r\n                redo[\"color\"] = null;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        });\r\n    }\r\n\r\n    let index = getSheetIndex(Store.currentSheetIndex);\r\n    if (Store.luckysheetfile[index].color != null && Store.luckysheetfile[index].color.length > 0) {\r\n        $(\"#luckysheetsheetconfigcolorur\").spectrum(\"set\", Store.luckysheetfile[index].color);\r\n\r\n    }\r\n\r\n    $(\"#luckysheetsheetconfigcolorur\").parent().find(\"span, div, button, input, a\").addClass(\"luckysheet-mousedown-cancel\");\r\n\r\n    // \u5982\u679C\u5168\u90E8\u6309\u94AE\u8BBE\u7F6E\u4E86\u9690\u85CF\uFF0C\u5219\u4E0D\u663E\u793A\r\n    const config = luckysheetConfigsetting.sheetRightClickConfig;\r\n    // if(!config.delete && !config.copy && !config.rename && !config.color && !config.hide && !config.move){\r\n    if(Object.values(config).every(ele=> !ele)){\r\n        return;\r\n    }\r\n\r\n    setTimeout(function(){\r\n        mouseclickposition($(\"#luckysheet-rightclick-sheet-menu\"), luckysheetcurrentSheetitem.offset().left + luckysheetcurrentSheetitem.width(), luckysheetcurrentSheetitem.offset().top - 18, \"leftbottom\");\r\n    },1);\r\n}\r\n\r\nlet luckysheetsheetrightclick = function ($t, $cur, e) {\r\n    clearTimeout(jfdbclicklagTimeout);\r\n    if ($cur.hasClass(\"luckysheet-sheets-item-name\") && $cur.attr(\"contenteditable\") == \"true\") {\r\n        return;\r\n    }\r\n    if (formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton()) {\r\n        setTimeout(function () {\r\n            formula.setCaretPosition(formula.rangeSetValueTo.get(0), 0, formula.rangeSetValueTo.text().length);\r\n            formula.createRangeHightlight();\r\n            $(\"#luckysheet-input-box-index\").find(\".luckysheet-input-box-index-sheettxt\").remove().end().prepend(\"<span class='luckysheet-input-box-index-sheettxt'>\" + sheetmanage.getSheetName(formula.rangetosheet) + \"!</span>\").show();\r\n            $(\"#luckysheet-input-box-index\").css({\"left\": $(\"#luckysheet-input-box\").css(\"left\"), \"top\": (parseInt($(\"#luckysheet-input-box\").css(\"top\")) - 20) + \"px\", \"z-index\": $(\"#luckysheet-input-box\").css(\"z-index\")});\r\n        }, 1);\r\n    }\r\n    else {\r\n        //\u4FDD\u5B58\u6B63\u5728\u7F16\u8F91\u7684\u5355\u5143\u683C\u5185\u5BB9\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $t.addClass(\"luckysheet-sheets-item-active\");\r\n    cleargridelement(e);\r\n    sheetmanage.changeSheet($t.data(\"index\"));\r\n\r\n    $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n    if ($cur.hasClass(\"luckysheet-sheets-item-menu\") || $cur.hasClass(\"fa-sort-desc\") || e.which == \"3\") {\r\n        luckysheetcurrentSheetitem = $cur.closest(\".luckysheet-sheets-item\");\r\n        showsheetconfigmenu();\r\n    }\r\n}\r\n\r\n\r\nexport function initialSheetBar(){\r\n    const _locale = locale();\r\n    const locale_sheetconfig = _locale.sheetconfig;\r\n    isInitialSheetConfig = false\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"mousedown\", \"div.luckysheet-sheets-item\", function (e) {\r\n        if(isEditMode()){\r\n            // alert(\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n            return;\r\n        }\r\n\r\n        let $t = $(this), $cur = $(e.target), $item = $cur.closest(\".luckysheet-sheets-item\");\r\n\r\n        if (e.which == \"3\") {\r\n            luckysheetsheetrightclick($t, $cur, e);\r\n            luckysheetcurrentSheetitem = $item;\r\n            showsheetconfigmenu();\r\n            return;\r\n        }\r\n\r\n        if ($item.hasClass(\"luckysheet-sheets-item-active\") && $item.find(\".luckysheet-sheets-item-name\").attr(\"contenteditable\") == \"false\") {\r\n            jfdbclicklagTimeout = setTimeout(function () {\r\n                Store.luckysheet_sheet_move_status = true;\r\n                Store.luckysheet_sheet_move_data = {};\r\n                Store.luckysheet_sheet_move_data.widthlist = [];\r\n\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").each(function (i) {\r\n                    if (i == 0) {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()));\r\n                    }\r\n                    else {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()) + Store.luckysheet_sheet_move_data.widthlist[i - 1]);\r\n                    }\r\n                });\r\n\r\n                Store.luckysheet_sheet_move_data.curindex = $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").index($item);\r\n                let x = e.pageX;\r\n                Store.luckysheet_sheet_move_data.curleft = x - $item.offset().left;\r\n                Store.luckysheet_sheet_move_data.pageX = x;\r\n                Store.luckysheet_sheet_move_data.activeobject = $item;\r\n                Store.luckysheet_sheet_move_data.cursorobject = $cur;\r\n                let $itemclone = $item.clone().css(\"visibility\", \"hidden\").attr(\"id\", \"luckysheet-sheets-item-clone\");\r\n                $item.after($itemclone);\r\n                $item.css({ \"position\": \"absolute\", \"opacity\": 0.8, \"cursor\": \"move\", \"transition\": \"initial\", \"z-index\": 10 });\r\n            }, 200);\r\n        }\r\n    }).on(\"click\", \"div.luckysheet-sheets-item\", function (e) {\r\n\r\n        if(isEditMode()){\r\n            // alert(\"\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n            return;\r\n        }\r\n\r\n        let $t = $(this), $cur = $(e.target);\r\n        luckysheetsheetrightclick($t, $cur, e);\r\n        server.keepHighLightBox()\r\n    });\r\n\r\n    let luckysheetsheetnameeditor = function ($t) {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n        $t.attr(\"contenteditable\", \"true\").addClass(\"luckysheet-mousedown-cancel\").data(\"oldtxt\", $t.text());\r\n\r\n        setTimeout(function () {\r\n            selectTextDom($t.get(0));\r\n        }, 1);\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"dblclick\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        luckysheetsheetnameeditor($(this));\r\n    });\r\n\r\n    let compositionFlag = true;\r\n    $(\"#luckysheet-sheet-area\").on(\"compositionstart\", \"span.luckysheet-sheets-item-name\",  ()=> compositionFlag = false);\r\n    $(\"#luckysheet-sheet-area\").on(\"compositionend\", \"span.luckysheet-sheets-item-name\", ()=> compositionFlag = true);\r\n    $(\"#luckysheet-sheet-area\").on(\"input\", \"span.luckysheet-sheets-item-name\", function () {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        if(Store.limitSheetNameLength === false){\r\n            return\r\n        }\r\n\r\n        let maxLength = Store.defaultSheetNameMaxLength;\r\n        if(maxLength  === 0){\r\n            return\r\n        }\r\n\r\n        setTimeout( ()=> {\r\n            if (compositionFlag) {\r\n\r\n                if ($(this).text().length >= maxLength) {  /* \u68C0\u67E5\uFF1A\u503C\u662F\u5426\u8D8A\u754C */\r\n                    setTimeout(() => {\r\n                        $(this).text($(this).text().substring(0, maxLength));\r\n\r\n                        let range = window.getSelection();\r\n                        range.selectAllChildren(this);\r\n                        range.collapseToEnd();\r\n                    }, 0);\r\n                 }\r\n            }\r\n        }, 0);\r\n    });\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"blur\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        if(0 === $(this).text().length){\r\n\r\n            tooltip.info(\"\", locale_sheetconfig.sheetNamecannotIsEmptyError);\r\n\r\n            setTimeout(()=>{\r\n                $(this).text(oldSheetFileName);\r\n                luckysheetsheetnameeditor($(this));\r\n                $(this).focus();\r\n            }, 1);\r\n            return;\r\n        }\r\n\r\n        let $t = $(this);\r\n        let txt = $t.text(), oldtxt = $t.data(\"oldtxt\");\r\n        if(txt.length>31 || txt.charAt(0)==\"'\" || txt.charAt(txt.length-1)==\"'\" || /[\uFF1A\\:\\\\\\/\uFF1F\\?\\*\\[\\]]+/.test(txt)){\r\n            alert(locale_sheetconfig.sheetNameSpecCharError);\r\n            setTimeout(()=>{\r\n                luckysheetsheetnameeditor($(this));\r\n                $(this).focus();\r\n            }, 1);\r\n            return;\r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (index != i && Store.luckysheetfile[i].name == txt) {\r\n                if(isEditMode()){\r\n                    alert(locale_sheetconfig.tipNameRepeat);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_sheetconfig.tipNameRepeat);\r\n                }\r\n                $t.text(oldtxt).attr(\"contenteditable\", \"false\");\r\n                return;\r\n            }\r\n        }\r\n\r\n        sheetmanage.sheetArrowShowAndHide();\r\n\r\n        Store.luckysheetfile[index].name = txt;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, txt, { \"k\": \"name\" });\r\n\r\n        $t.attr(\"contenteditable\", \"false\").removeClass(\"luckysheet-mousedown-cancel\");\r\n\r\n        if (Store.clearjfundo) {\r\n            let redo = {};\r\n            redo[\"type\"] = \"sheetName\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n            redo[\"oldtxt\"] = oldtxt;\r\n            redo[\"txt\"] = txt;\r\n\r\n            Store.jfundo.length = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n        // \u94A9\u5B50\uFF1A sheetEditNameAfter\r\n        method.createHookFunction('sheetEditNameAfter', {\r\n            i: Store.luckysheetfile[index].index,\r\n            oldName: oldtxt, newName: txt \r\n        });\r\n    });\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"keydown\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n        let kcode = e.keyCode;\r\n        let $t = $(this);\r\n        if (kcode == keycode.ENTER) {\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            oldSheetFileName = Store.luckysheetfile[index].name || oldSheetFileName;\r\n            Store.luckysheetfile[index].name = $t.text();\r\n            $t.attr(\"contenteditable\", \"false\");\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigrename\").click(function () {\r\n        var $name = luckysheetcurrentSheetitem.find(\"span.luckysheet-sheets-item-name\")\r\n        // \u94A9\u5B50 sheetEditNameBefore\r\n        if (!method.createHookFunction('sheetEditNameBefore', { i: luckysheetcurrentSheetitem.data('index') , name: $name.text() })){\r\n            return;\r\n        }\r\n        luckysheetsheetnameeditor(luckysheetcurrentSheetitem.find(\"span.luckysheet-sheets-item-name\"));\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigshow\").click(function () {\r\n        $(\"#luckysheet-sheets-m\").click();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigmoveleft\").click(function () {\r\n        if (luckysheetcurrentSheetitem.prevAll(\":visible\").length > 0) {\r\n            luckysheetcurrentSheetitem.insertBefore(luckysheetcurrentSheetitem.prevAll(\":visible\").eq(0));\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigmoveright\").click(function () {\r\n        if (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n            luckysheetcurrentSheetitem.insertAfter(luckysheetcurrentSheetitem.nextAll(\":visible\").eq(0));\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigdelete\").click(function (e) {\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n        if($(\"#luckysheet-sheet-container-c .luckysheet-sheets-item:visible\").length <= 1){\r\n            if(isEditMode()){\r\n                alert(locale_sheetconfig.noMoreSheet);\r\n            }\r\n            else{\r\n                tooltip.info(locale_sheetconfig.noMoreSheet, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        tooltip.confirm(locale_sheetconfig.confirmDelete+\"\u3010\" + Store.luckysheetfile[index].name + \"\u3011\uFF1F\", \"<span style='color:#9e9e9e;font-size:12px;'>\"+locale_sheetconfig.redoDelete+\"</span>\", function () {\r\n            sheetmanage.deleteSheet(luckysheetcurrentSheetitem.data(\"index\"));\r\n        }, null);\r\n\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigcopy\").click(function (e) {\r\n        sheetmanage.copySheet(luckysheetcurrentSheetitem.data(\"index\"), e);\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfighide\").click(function () {\r\n        if ($(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").length == 1) {\r\n            if(isEditMode()){\r\n                alert(locale_sheetconfig.noHide);\r\n            }\r\n            else{\r\n                tooltip.info(\"\", locale_sheetconfig.noHide);\r\n            }\r\n            return;\r\n        }\r\n        sheetmanage.setSheetHide(luckysheetcurrentSheetitem.data(\"index\"));\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheet-sheets-add\").click(function (e) {\r\n        //\u4FDD\u5B58\u6B63\u5728\u7F16\u8F91\u7684\u5355\u5143\u683C\u5185\u5BB9\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        sheetmanage.addNewSheet(e);\r\n        sheetmanage.locationSheet();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    let sheetscrollani = null, sheetscrollstart = 0, sheetscrollend = 0, sheetscrollstep = 150;\r\n    $(\"#luckysheet-sheets-leftscroll\").click(function () {\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n        sheetscrollstart = $c.scrollLeft();\r\n        sheetscrollend = $c.scrollLeft() - sheetscrollstep;\r\n\r\n        if (sheetscrollend <= 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        }\r\n        $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").show();\r\n\r\n        clearInterval(sheetscrollani);\r\n        sheetscrollani = setInterval(function () {\r\n            sheetscrollstart -= 4;\r\n            $c.scrollLeft(sheetscrollstart);\r\n            if (sheetscrollstart <= sheetscrollend) {\r\n                clearInterval(sheetscrollani);\r\n            }\r\n        }, 1);\r\n    });\r\n\r\n    $(\"#luckysheet-sheets-rightscroll\").click(function () {\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n        sheetscrollstart = $c.scrollLeft();\r\n        sheetscrollend = $c.scrollLeft() + sheetscrollstep;\r\n\r\n        if (sheetscrollstart > 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").hide();\r\n        }\r\n        $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n\r\n        clearInterval(sheetscrollani);\r\n        sheetscrollani = setInterval(function () {\r\n            sheetscrollstart += 4;\r\n            $c.scrollLeft(sheetscrollstart);\r\n            if (sheetscrollstart >= sheetscrollend) {\r\n                clearInterval(sheetscrollani);\r\n            }\r\n        }, 1);\r\n    });\r\n\r\n    let initialOpenSheet = true;\r\n    $(\"#luckysheet-sheets-m\").click(function (e) {\r\n        //\u4FDD\u5B58\u6B63\u5728\u7F16\u8F91\u7684\u5355\u5143\u683C\u5185\u5BB9\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-list\").html(\"\");\r\n\r\n        let item = \"\";\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let f = Store.luckysheetfile[i], icon = '', style = \"\";\r\n            if (f[\"status\"] == 1) {\r\n                icon = '<i class=\"fa fa-check\" aria-hidden=\"true\"></i>';\r\n            }\r\n\r\n            if (f[\"hide\"] == 1) {\r\n                icon = '<i class=\"fa fa-low-vision\" aria-hidden=\"true\"></i>';\r\n                style += \"color:#BBBBBB;\";\r\n            }\r\n\r\n            if (f[\"color\"] != null && f[\"color\"].length > 0) {\r\n                style += \"border-right:4px solid \" + f[\"color\"] + \";\";\r\n            }\r\n\r\n            item += replaceHtml(sheetselectlistitemHTML, { \"index\": f[\"index\"], \"name\": f[\"name\"], \"icon\": icon, \"style\": style });\r\n        }\r\n\r\n        if (initialOpenSheet) {\r\n            $(\"#\" + Store.container).append(replaceHtml(sheetselectlistHTML, { \"item\": item }));\r\n            $(\"#luckysheet-sheet-list\").on(\"click\", \".luckysheet-cols-menuitem\", function (e) {\r\n                if(isEditMode()){\r\n                    // tooltip.info(\"\u63D0\u793A\", \"\u56FE\u8868\u7F16\u8F91\u6A21\u5F0F\u4E0B\u4E0D\u5141\u8BB8\u8BE5\u64CD\u4F5C\uFF01\");\r\n                    alert(locale_sheetconfig.chartEditNoOpt);\r\n                    return;\r\n                }\r\n\r\n                let $item = $(this), index = $item.data(\"index\");\r\n\r\n                if ($item.data(\"index\") != Store.currentSheetIndex) {\r\n                    sheetmanage.setSheetShow(index);\r\n                    sheetmanage.locationSheet();\r\n                }\r\n                server.keepHighLightBox()\r\n            });\r\n\r\n            initialOpenSheet = false;\r\n        }\r\n        else {\r\n            $(\"#luckysheet-sheet-list\").html(item);\r\n        }\r\n\r\n        let $t = $(\"#luckysheet-sheet-list\");\r\n\r\n        let left = $(this).offset().left - $('#' + Store.container).offset().left;\r\n        let bottom = $(this).height() + $('#luckysheet-sta-content').height() + 12;\r\n        $t.css({left: left + 'px', bottom: bottom + 'px'}).show();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    // \u521D\u59CB\u5316\u5206\u9875\u5668\r\n    if (luckysheetConfigsetting.pager) {\r\n        pagerInit(luckysheetConfigsetting.pager)\r\n    }\r\n\r\n}\r\n", "import menuButton from './menuButton';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport { keycode } from './constant';\r\nimport { \r\n    luckysheetMoveHighlightCell,\r\n} from './sheetMove';\r\n\r\nimport insertFormula from './insertFormula';\r\nimport { \r\n    rowLocation, \r\n    colLocation, \r\n    mouseposition \r\n} from '../global/location';\r\nimport { isEditMode } from '../global/validate';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport function formulaBarInitial(){\r\n    //\u516C\u5F0F\u680F\u5904\u7406\r\n\r\n    const _locale = locale();\r\n    const locale_formula= _locale.formula;\r\n\r\n    $(\"#luckysheet-functionbox-cell\").focus(function () {\r\n        if(isEditMode()){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u516C\u5F0F\u680F\r\n            return;\r\n        }\r\n\r\n        if(Store.luckysheet_select_save.length > 0){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n            \r\n            // let $input = $(\"#luckysheet-rich-text-editor\"),value = $input.text();\r\n            // if(value) {\r\n            //     formula.updatecell(row_index, col_index);\r\n            // }\r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata, null, true);\r\n            formula.rangeResizeTo = $(\"#luckysheet-functionbox-cell\");\r\n        }\r\n    }).keydown(function (event) {\r\n        if(isEditMode()){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u516C\u5F0F\u680F\r\n            return;\r\n        }\r\n\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n\r\n        if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_select_save = [{ \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]], \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]], \"row_focus\": Store.luckysheetCellUpdate[0], \"column_focus\": Store.luckysheetCellUpdate[1] }];\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n                //$(\"#luckysheet-functionbox-cell\").blur();\r\n                $(\"#luckysheet-rich-text-editor\").focus();\r\n            }\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ESC && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            //$(\"#luckysheet-functionbox-cell\").blur();\r\n            $(\"#luckysheet-rich-text-editor\").focus();\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.UP && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\")) {\r\n                let $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").prev();\r\n                if ($up.length == 0) {\r\n                    $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").last();\r\n                }\r\n                $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n                $up.addClass(\"luckysheet-formula-search-item-active\");\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if (kcode == keycode.DOWN && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\")) {\r\n                let $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").next();\r\n                if ($up.length == 0) {\r\n                    $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").first();\r\n                }\r\n                $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n                $up.addClass(\"luckysheet-formula-search-item-active\");\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if (kcode == keycode.LEFT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n        }\r\n        else if (kcode == keycode.RIGHT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n        }\r\n        else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40))) || kcode == 8 || kcode == 32 || kcode == 46 || (event.ctrlKey && kcode == 86)) {\r\n            formula.functionInputHanddler($(\"#luckysheet-rich-text-editor\"), $(\"#luckysheet-functionbox-cell\"), kcode);\r\n        }\r\n    }).click(function () {\r\n        if(isEditMode()){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u516C\u5F0F\u680F\r\n            return;\r\n        }\r\n\r\n        formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n    });\r\n\r\n    //\u516C\u5F0F\u680F \u53D6\u6D88\uFF08X\uFF09\u6309\u94AE\r\n    $(\"#luckysheet-wa-functionbox-cancel\").click(function () {\r\n        if (!$(this).hasClass(\"luckysheet-wa-calculate-active\")) {\r\n            return;\r\n        }\r\n        //\u82E5\u6709\u53C2\u6570\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //\u82E5\u6709\u53C2\u6570\u9009\u53D6\u8303\u56F4\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n        formula.dontupdate();\r\n        luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n    });\r\n\r\n    //\u516C\u5F0F\u680F \u786E\u8BA4\uFF08\uFF09\u6309\u94AE\r\n    $(\"#luckysheet-wa-functionbox-confirm\").click(function () {\r\n        if (!$(this).hasClass(\"luckysheet-wa-calculate-active\")) {\r\n            return;\r\n        }\r\n        //\u82E5\u6709\u53C2\u6570\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //\u82E5\u6709\u53C2\u6570\u9009\u53D6\u8303\u56F4\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n        formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n    });\r\n\r\n    //\u516C\u5F0F\u680F fx\u6309\u94AE\r\n    $(\"#luckysheet-wa-functionbox-fx\").click(function () {\r\n        //\u70B9\u51FB\u51FD\u6570\u67E5\u627E\u5F39\u51FA\u6846\r\n        if(Store.luckysheet_select_save.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_formula.tipSelectCell);\r\n            }\r\n            else{\r\n                tooltip.info(locale_formula.tipSelectCell,\"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n        \r\n        let cell = Store.flowdata[row_index][col_index];\r\n        if(cell != null && cell.f != null){\r\n            //\u5355\u5143\u683C\u6709\u8BA1\u7B97\r\n            let functionStr = formula.getfunctionParam(cell.f);\r\n            if(functionStr.fn != null){\r\n                //\u6709\u51FD\u6570\u516C\u5F0F\r\n                insertFormula.formulaParmDialog(functionStr.fn, functionStr.param);\r\n            }\r\n            else{\r\n                //\u65E0\u51FD\u6570\u516C\u5F0F\r\n                insertFormula.formulaListDialog();\r\n            }\r\n        }\r\n        else{\r\n            //\u5355\u5143\u683C\u65E0\u8BA1\u7B97\r\n            $(\"#luckysheet-rich-text-editor\").html('<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>');\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n            insertFormula.formulaListDialog();\r\n        }\r\n\r\n        insertFormula.init();\r\n    });\r\n\r\n    //\u516C\u5F0F\u9009\u533A\u64CD\u4F5C\r\n    $(\"#luckysheet-formula-functionrange\").on(\"mousedown\", \".luckysheet-copy\", function (event) {\r\n        formula.rangeMove = true;\r\n        Store.luckysheet_scroll_status = true;\r\n        formula.rangeMoveObj = $(this).parent();\r\n        formula.rangeMoveIndex = $(this).parent().attr(\"rangeindex\");\r\n        \r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + formula.rangeMoveIndex).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.13);\r\n        \r\n        let type = $(this).data(\"type\");\r\n        if (type == \"top\") {\r\n            y += 3;\r\n        }\r\n        else if (type == \"right\") {\r\n            x -= 3;\r\n        }\r\n        else if (type == \"bottom\") {\r\n            y -= 3;\r\n        }\r\n        else if (type == \"left\") {\r\n            x += 3;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        formula.rangeMovexy = [row_index, col_index];\r\n        $(\"#luckysheet-sheettable\").css(\"cursor\", \"move\");\r\n        event.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-formula-functionrange\").on(\"mousedown\", \".luckysheet-highlight\", function (event) {\r\n        formula.rangeResize = $(this).data(\"type\");//\u5F00\u59CB\u72B6\u6001resize\r\n        formula.rangeResizeIndex = $(this).parent().attr(\"rangeindex\");\r\n        \r\n        let mouse = mouseposition(event.pageX, event.pageY), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n        formula.rangeResizeObj = $(this).parent();\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + formula.rangeResizeIndex).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.13);\r\n        \r\n        if (formula.rangeResize == \"lt\") {\r\n            x += 3;\r\n            y += 3;\r\n        }\r\n        else if (formula.rangeResize == \"lb\") {\r\n            x += 3;\r\n            y -= 3;\r\n        }\r\n        else if (formula.rangeResize == \"rt\") {\r\n            x -= 3;\r\n            y += 3;\r\n        }\r\n        else if (formula.rangeResize == \"rb\") {\r\n            x -= 3;\r\n            y -= 3;\r\n        }\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        let position = formula.rangeResizeObj.position();\r\n        formula.rangeResizexy = [\r\n            col_pre, \r\n            row_pre, \r\n            formula.rangeResizeObj.width(), \r\n            formula.rangeResizeObj.height(), \r\n            position.left + scrollLeft, \r\n            position.top + scrollTop, col, row\r\n        ];\r\n        formula.rangeResizeWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n        formula.rangeResizeWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n        Store.luckysheet_scroll_status = true;\r\n        event.stopPropagation();\r\n    });\r\n}", "\r\nimport pivotTable from './pivotTable';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport menuButton from './menuButton';\r\nimport server from './server';\r\nimport method from '../global/method';\r\nimport { selectHightlightShow, luckysheet_count_show,selectHelpboxFill } from './select';\r\nimport { \r\n    getObjType, \r\n    showrightclickmenu,\r\n    luckysheetContainerFocus, \r\n    luckysheetfontformat,\r\n    $$\r\n} from '../utils/util';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { \r\n    rowLocation, \r\n    rowLocationByIndex, \r\n    colLocation, \r\n    colLocationByIndex, \r\n    mouseposition \r\n} from '../global/location';\r\nimport { isRealNull, isRealNum, hasPartMC, isEditMode } from '../global/validate';\r\nimport { countfunc } from '../global/count';\r\nimport formula from '../global/formula';\r\nimport { luckysheetextendtable, luckysheetdeletetable, luckysheetDeleteCell } from '../global/extend';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgridall, \r\n    jfrefreshgrid_rhcw,\r\n} from '../global/refresh';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport locale from '../locale/locale';\r\nimport {getMeasureText,getCellTextInfo} from '../global/getRowlen';\r\nimport { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport {isInlineStringCell} from './inlineString';\r\nimport {checkProtectionLockedRangeList, checkProtectionAllSelected,checkProtectionAuthorityNormal  } from './protection';\r\nimport Store from '../store';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\n\r\nexport function rowColumnOperationInitial(){\r\n\r\n    //\u8868\u683C\u884C\u6807\u9898 mouse\u4E8B\u4EF6\r\n    $(\"#luckysheet-rows-h\").mousedown(function (event) {\r\n        if(!checkProtectionAllSelected(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //\u56FE\u7247 active/cropping\r\n        if($(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") || $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")){\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n        let col_index = Store.visibledatacolumn.length - 1, \r\n            col = Store.visibledatacolumn[col_index], col_pre = 0;\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n        //mousedown\u662F\u53F3\u952E\r\n        if (event.which == \"3\") {\r\n            let isright = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj_s = Store.luckysheet_select_save[s];\r\n\r\n                if(obj_s[\"row\"] != null && (row_index >= obj_s[\"row\"][0] && row_index <= obj_s[\"row\"][1]) && (obj_s[\"column\"][0] == 0 && obj_s[\"column\"][1] == Store.flowdata[0].length - 1)){\r\n                    isright = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(isright){\r\n                return;\r\n            }\r\n        }\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let rowseleted = [row_index, row_index];\r\n\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        //\u516C\u5F0F\u76F8\u5173\r\n        let $input = $(\"#luckysheet-input-box\");\r\n        if (parseInt($input.css(\"top\")) > 0) {\r\n            if (formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton() || $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n                //\u516C\u5F0F\u9009\u533A\r\n                let changeparam = menuButton.mergeMoveMain([0, col_index], rowseleted, {\"row_focus\": row_index, \"column_focus\": 0}, top, height, col_pre, col);\r\n                if(changeparam != null){\r\n                    //columnseleted = changeparam[0];\r\n                    rowseleted = changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    //left = changeparam[4];\r\n                    //width = changeparam[5];\r\n                }\r\n\r\n                if(event.shiftKey){\r\n                    let last = formula.func_selectedrange;\r\n\r\n                    let top = 0, height = 0, rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if(last.row[1] > last.row_focus){\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    }\r\n                    else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    }\r\n                    else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if(last.row[0] < last.row_focus){\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain([0, col_index], rowseleted, {\"row_focus\": row_index, \"column_focus\": 0}, top, height, col_pre, col);\r\n                    if(changeparam != null){\r\n                        // columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        // left = changeparam[4];\r\n                        // width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    formula.func_selectedrange = last;\r\n                }\r\n                else if(event.ctrlKey && $(\"#luckysheet-rich-text-editor\").find(\"span\").last().text() != \",\"){\r\n                    //\u6309\u4F4Fctrl \u9009\u62E9\u9009\u533A\u65F6  \u5148\u5904\u7406\u4E0A\u4E00\u4E2A\u9009\u533A\r\n                    let vText = $(\"#luckysheet-rich-text-editor\").text() + \",\";\r\n                    if(vText.length > 0 && vText.substr(0, 1) == \"=\"){\r\n                        vText = formula.functionHTMLGenerate(vText);\r\n\r\n                        if (window.getSelection) { // all browsers, except IE before version 9\r\n                            let currSelection = window.getSelection();\r\n                            formula.functionRangeIndex = [$(currSelection.anchorNode).parent().index(), currSelection.anchorOffset];\r\n                        } \r\n                        else { // Internet Explorer before version 9\r\n                            let textRange = document.selection.createRange();\r\n                            formula.functionRangeIndex = textRange;\r\n                        }\r\n\r\n                        $(\"#luckysheet-rich-text-editor\").html(vText);\r\n\r\n                        formula.canceFunctionrangeSelected();\r\n                        formula.createRangeHightlight();\r\n                    }\r\n\r\n                    formula.rangestart = false;\r\n                    formula.rangedrag_column_start = false;\r\n                    formula.rangedrag_row_start = false;\r\n\r\n                    $(\"#luckysheet-functionbox-cell\").html(vText);\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                    //\u518D\u8FDB\u884C \u9009\u533A\u7684\u9009\u62E9\r\n                    formula.israngeseleciton();\r\n                    formula.func_selectedrange = {\r\n                        \"left\": colLocationByIndex(0)[0],\r\n                        \"width\": colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                        \"top\": top,\r\n                        \"height\": height,\r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": top, \r\n                        \"height_move\": height, \r\n                        \"row\": rowseleted, \r\n                        \"column\": [0, col_index], \r\n                        \"row_focus\": row_index, \r\n                        \"column_focus\": 0\r\n                    }\r\n                }\r\n                else{\r\n                    formula.func_selectedrange = {\r\n                        \"left\": colLocationByIndex(0)[0],\r\n                        \"width\": colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                        \"top\": top,\r\n                        \"height\": height,\r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": top, \r\n                        \"height_move\": height, \r\n                        \"row\": rowseleted, \r\n                        \"column\": [0, col_index], \r\n                        \"row_focus\": row_index, \r\n                        \"column_focus\": 0\r\n                    }\r\n                }\r\n\r\n                if(formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton()){\r\n                    formula.rangeSetValue({ \"row\": rowseleted, \"column\": [null, null] });\r\n                }\r\n                else if($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")){//if\u516C\u5F0F\u751F\u6210\u5668\r\n                    let range = getRangetxt(Store.currentSheetIndex, { \"row\": rowseleted, \"column\": [0, col_index] }, Store.currentSheetIndex);\r\n                    $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n                }\r\n\r\n                formula.rangedrag_row_start = true;\r\n                formula.rangestart = false;\r\n                formula.rangedrag_column_start = false;\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": top, \r\n                    \"height\": height \r\n                }).show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                luckysheet_count_show(col_pre, top, col - col_pre - 1, height, rowseleted, [0, col_index]);\r\n\r\n                setTimeout(function(){\r\n                    let currSelection = window.getSelection();\r\n                    let anchorOffset = currSelection.anchorNode;\r\n                    \r\n                    let $editor;\r\n                    if($(\"#luckysheet-search-formula-parm\").is(\":visible\")||$(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n                        $editor = $(\"#luckysheet-rich-text-editor\");\r\n                        formula.rangechangeindex = formula.data_parm_index;\r\n                    }\r\n                    else{\r\n                        $editor = $(anchorOffset).closest(\"div\");\r\n                    }\r\n\r\n                    let $span = $editor.find(\"span[rangeindex='\" + formula.rangechangeindex + \"']\");\r\n\r\n                    formula.setCaretPosition($span.get(0), 0, $span.html().length);\r\n                }, 1);\r\n\r\n                return;\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_rows_selected_status = true;\r\n            }\r\n        }\r\n        else {\r\n            Store.luckysheet_rows_selected_status = true;\r\n        }\r\n\r\n        if (Store.luckysheet_rows_selected_status) {\r\n            if(event.shiftKey){\r\n                //\u6309\u4F4Fshift\u70B9\u51FB\u884C\u7D22\u5F15\u9009\u53D6\u8303\u56F4\r\n                let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]); //\u9009\u533A\u6700\u540E\u4E00\u4E2A\r\n\r\n                let top = 0, height = 0, rowseleted = [];\r\n                if (last.top > row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n\r\n                    if(last.row[1] > last.row_focus){\r\n                        last.row[1] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [row_index, last.row[1]];\r\n                }\r\n                else if (last.top == row_pre) {\r\n                    top = row_pre;\r\n                    height = last.top + last.height - row_pre;\r\n                    rowseleted = [row_index, last.row[0]];\r\n                }\r\n                else {\r\n                    top = last.top;\r\n                    height = row - last.top - 1;\r\n\r\n                    if(last.row[0] < last.row_focus){\r\n                        last.row[0] = last.row_focus;\r\n                    }\r\n\r\n                    rowseleted = [last.row[0], row_index];\r\n                }\r\n\r\n                last[\"row\"] = rowseleted;\r\n\r\n                last[\"top_move\"] = top;\r\n                last[\"height_move\"] = height;\r\n\r\n                Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n            }\r\n            else if(event.ctrlKey){\r\n                Store.luckysheet_select_save.push({ \r\n                    \"left\": colLocationByIndex(0)[0],\r\n                    \"width\": colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                    \"top\": top,\r\n                    \"height\": height,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": top,\r\n                    \"height_move\": height,\r\n                    \"row\": rowseleted,\r\n                    \"column\": [0, col_index],\r\n                    \"row_focus\": row_index,\r\n                    \"column_focus\": 0,\r\n                    \"row_select\": true\r\n                });\r\n            }\r\n            else{\r\n                Store.luckysheet_select_save.length = 0;\r\n                Store.luckysheet_select_save.push({ \r\n                    \"left\": colLocationByIndex(0)[0],\r\n                    \"width\": colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                    \"top\": top,\r\n                    \"height\": height,\r\n                    \"left_move\": col_pre, \r\n                    \"width_move\": col - col_pre - 1, \r\n                    \"top_move\": top, \r\n                    \"height_move\": height, \r\n                    \"row\": rowseleted, \r\n                    \"column\": [0, col_index], \r\n                    \"row_focus\": row_index, \r\n                    \"column_focus\": 0,\r\n                    \"row_select\": true\r\n                });\r\n            }\r\n\r\n            selectHightlightShow();\r\n\r\n            //\u5141\u8BB8\u7F16\u8F91\u540E\u7684\u540E\u53F0\u66F4\u65B0\u65F6\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n        }\r\n\r\n        selectHelpboxFill();\r\n\r\n        setTimeout(function () {\r\n            clearTimeout(Store.countfuncTimeout);\r\n            countfunc();\r\n        }, 101);\r\n    }).mousemove(function (event) {\r\n        if (Store.luckysheet_rows_selected_status || Store.luckysheet_rows_change_size || Store.luckysheet_select_status) {\r\n            $(\"#luckysheet-rows-h-hover\").hide();\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n\r\n        $(\"#luckysheet-rows-h-hover\").css({ \"top\": row_pre, \"height\": row - row_pre - 1, \"display\": \"block\" });\r\n\r\n        if (y < row - 1 && y >= row - 5) {\r\n            $(\"#luckysheet-rows-change-size\").css({ \"top\": row - 3, \"opacity\": 0 });\r\n        }\r\n        else {\r\n            $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n        }\r\n    }).mouseleave(function (event) {\r\n        $(\"#luckysheet-rows-h-hover\").hide();\r\n        $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n    }).mouseup(function (event) {\r\n        if (event.which == 3) {\r\n            if(isEditMode()){ //\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u7981\u6B62\u53F3\u952E\u529F\u80FD\u6846\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-cols-rows-shift\").hide();\r\n            Store.luckysheetRightHeadClickIs = \"row\";\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.row);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.height);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.top);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.bottom);\r\n\r\n            $(\"#luckysheet-cols-rows-add\").show();\r\n            $(\"#luckysheet-cols-rows-data\").show();\r\n            $(\"#luckysheet-cols-rows-shift\").hide();\r\n            $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n            $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'block';\r\n            $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'block';\r\n\r\n            // \u81EA\u5B9A\u4E49\u53F3\u952E\u83DC\u5355\uFF1A\u5411\u4E0A\u5411\u4E0B\u589E\u52A0\u884C\uFF0C\u5220\u9664\u884C\uFF0C\u9690\u85CF\u663E\u793A\u884C\uFF0C\u8BBE\u7F6E\u884C\u9AD8\r\n            const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n            // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n            if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight && !cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                return;\r\n            }\r\n\r\n            $$('#luckysheet-top-left-add-selected').style.display = cellRightClickConfig.insertRow ? 'block' : 'none';\r\n            $$('#luckysheet-bottom-right-add-selected').style.display = cellRightClickConfig.insertRow ? 'block' : 'none';\r\n            $$('#luckysheet-del-selected').style.display = cellRightClickConfig.deleteRow ? 'block' : 'none';\r\n            $$('#luckysheet-hide-selected').style.display = cellRightClickConfig.hideRow ? 'block' : 'none';\r\n            $$('#luckysheet-show-selected').style.display = cellRightClickConfig.hideRow ? 'block' : 'none';\r\n            $$('#luckysheet-column-row-width-selected').style.display = cellRightClickConfig.rowHeight ? 'block' : 'none';\r\n\r\n            // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n            if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n\r\n                if(!cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight){\r\n                    $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n                }\r\n\r\n            }\r\n\r\n            // 2. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n            if(!cellRightClickConfig.insertRow && !cellRightClickConfig.deleteRow && !cellRightClickConfig.hideRow && !cellRightClickConfig.rowHeight){\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n\r\n            if(!cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n            \r\n            showrightclickmenu($(\"#luckysheet-rightclick-menu\"), $(this).offset().left + 46, event.pageY);\r\n            Store.luckysheet_cols_menu_status = true;\r\n\r\n            //\u884C\u9AD8\u9ED8\u8BA4\u503C\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"rowlen\"] == null){\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            let first_rowlen = cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]] == null ? Store.defaultrowlen : cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]];\r\n            let isSame = true;\r\n\r\n            for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                let s = Store.luckysheet_select_save[i];\r\n                let r1 = s.row[0], r2 = s.row[1];\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    let rowlen = cfg[\"rowlen\"][r] == null ? Store.defaultrowlen : cfg[\"rowlen\"][r];\r\n\r\n                    if(rowlen != first_rowlen){\r\n                        isSame = false;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(isSame){\r\n                $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(first_rowlen);\r\n            }\r\n            else{\r\n                $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(\"\");\r\n            }\r\n        }\r\n    });\r\n    \r\n    //\u8868\u683C\u5217\u6807\u9898 mouse\u4E8B\u4EF6\r\n    $(\"#luckysheet-cols-h-c\").mousedown(function (event) {\r\n        if(!checkProtectionAllSelected(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //\u56FE\u7247 active/cropping\r\n        if($(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") || $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")){\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(this).scrollLeft();\r\n\r\n        let row_index = Store.visibledatarow.length - 1, \r\n            row = Store.visibledatarow[row_index], row_pre = 0;\r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        Store.orderbyindex = col_index;//\u6392\u5E8F\u5168\u5C40\u51FD\u6570\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n        //mousedown\u662F\u53F3\u952E\r\n        if (event.which == \"3\") {\r\n            let isright = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj_s = Store.luckysheet_select_save[s];\r\n\r\n                if(obj_s[\"column\"] != null && (col_index >= obj_s[\"column\"][0] && col_index <= obj_s[\"column\"][1]) && (obj_s[\"row\"][0] == 0 && obj_s[\"row\"][1] == Store.flowdata.length - 1)){\r\n                    isright = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(isright){\r\n                return;\r\n            }\r\n        }\r\n\r\n        let left = col_pre, width = col - col_pre - 1;\r\n        let columnseleted = [col_index, col_index];\r\n\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        //\u516C\u5F0F\u76F8\u5173\r\n        let $input = $(\"#luckysheet-input-box\");\r\n        if (parseInt($input.css(\"top\")) > 0) {\r\n            if (formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton() || $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n                //\u516C\u5F0F\u9009\u533A\r\n                let changeparam = menuButton.mergeMoveMain(columnseleted, [0, row_index], {\"row_focus\": 0, \"column_focus\": col_index}, row_pre, row, left, width);\r\n                if(changeparam != null){\r\n                    columnseleted = changeparam[0];\r\n                    //rowseleted= changeparam[1];\r\n                    //top = changeparam[2];\r\n                    //height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n                }\r\n\r\n                if(event.shiftKey){\r\n                    let last = formula.func_selectedrange;\r\n\r\n                    let left = 0, width = 0, columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if(last.column[1] > last.column_focus){\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    }\r\n                    else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    }\r\n                    else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if(last.column[0] < last.column_focus){\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(columnseleted , [0, row_index], {\"row_focus\": 0, \"column_focus\": col_index}, row_pre, row, left, width);\r\n                    if(changeparam != null){\r\n                        columnseleted = changeparam[0];\r\n                        //rowseleted= changeparam[1];\r\n                        //top = changeparam[2];\r\n                        //height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n\r\n                    formula.func_selectedrange = last;\r\n                }\r\n                else if(event.ctrlKey && $(\"#luckysheet-rich-text-editor\").find(\"span\").last().text() != \",\"){\r\n                    //\u6309\u4F4Fctrl \u9009\u62E9\u9009\u533A\u65F6  \u5148\u5904\u7406\u4E0A\u4E00\u4E2A\u9009\u533A\r\n                    let vText = $(\"#luckysheet-rich-text-editor\").text() + \",\";\r\n                    if(vText.length > 0 && vText.substr(0, 1) == \"=\"){\r\n                        vText = formula.functionHTMLGenerate(vText);\r\n\r\n                        if (window.getSelection) { // all browsers, except IE before version 9\r\n                            let currSelection = window.getSelection();\r\n                            formula.functionRangeIndex = [$(currSelection.anchorNode).parent().index(), currSelection.anchorOffset];\r\n                        } \r\n                        else { // Internet Explorer before version 9\r\n                            let textRange = document.selection.createRange();\r\n                            formula.functionRangeIndex = textRange;\r\n                        }\r\n\r\n                        $(\"#luckysheet-rich-text-editor\").html(vText);\r\n\r\n                        formula.canceFunctionrangeSelected();\r\n                        formula.createRangeHightlight();\r\n                    }\r\n\r\n                    formula.rangestart = false;\r\n                    formula.rangedrag_column_start = false;\r\n                    formula.rangedrag_row_start = false;\r\n\r\n                    $(\"#luckysheet-functionbox-cell\").html(vText);\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                    //\u518D\u8FDB\u884C \u9009\u533A\u7684\u9009\u62E9\r\n                    formula.israngeseleciton();\r\n                    formula.func_selectedrange = {\r\n                        \"left\": left, \r\n                        \"width\": width, \r\n                        \"top\": rowLocationByIndex(0)[0], \r\n                        \"height\": rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1, \r\n                        \"left_move\": left, \r\n                        \"width_move\": width, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [0, row_index], \r\n                        \"column\": columnseleted,\r\n                        \"row_focus\": 0, \r\n                        \"column_focus\": col_index \r\n                    }\r\n                }\r\n                else{\r\n                    formula.func_selectedrange = {\r\n                        \"left\": left, \r\n                        \"width\": width, \r\n                        \"top\": rowLocationByIndex(0)[0], \r\n                        \"height\": rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1, \r\n                        \"left_move\": left, \r\n                        \"width_move\": width, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [0, row_index], \r\n                        \"column\": columnseleted,\r\n                        \"row_focus\": 0, \r\n                        \"column_focus\": col_index \r\n                    }\r\n                }\r\n\r\n                if(formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton()){\r\n                    formula.rangeSetValue({ \"row\": [null, null], \"column\": columnseleted });\r\n                }\r\n                else if($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")){//if\u516C\u5F0F\u751F\u6210\u5668\r\n                    let range = getRangetxt(Store.currentSheetIndex, { \"row\": [0, row_index], \"column\": columnseleted }, Store.currentSheetIndex);\r\n                    $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n                }\r\n\r\n                formula.rangedrag_column_start = true;\r\n                formula.rangestart = false;\r\n                formula.rangedrag_row_start = false;\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                    \"left\": left, \r\n                    \"width\": width, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1 \r\n                }).show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                luckysheet_count_show(left, row_pre, width, row - row_pre - 1, [0, row_index], columnseleted);\r\n\r\n                return;\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_cols_selected_status = true;\r\n            }\r\n        }\r\n        else {\r\n            Store.luckysheet_cols_selected_status = true;\r\n        }\r\n\r\n        if (Store.luckysheet_cols_selected_status) {\r\n            if(event.shiftKey){\r\n                //\u6309\u4F4Fshift\u70B9\u51FB\u5217\u7D22\u5F15\u9009\u53D6\u8303\u56F4\r\n                let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]); //\u9009\u533A\u6700\u540E\u4E00\u4E2A\r\n\r\n                let left = 0, width = 0, columnseleted = [];\r\n                if (last.left > col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n\r\n                    if(last.column[1] > last.column_focus){\r\n                        last.column[1] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [col_index, last.column[1]];\r\n                }\r\n                else if (last.left == col_pre) {\r\n                    left = col_pre;\r\n                    width = last.left + last.width - col_pre;\r\n                    columnseleted = [col_index, last.column[0]];\r\n                }\r\n                else {\r\n                    left = last.left;\r\n                    width = col - last.left - 1;\r\n\r\n                    if(last.column[0] < last.column_focus){\r\n                        last.column[0] = last.column_focus;\r\n                    }\r\n\r\n                    columnseleted = [last.column[0], col_index];\r\n                }\r\n\r\n                last[\"column\"] = columnseleted;\r\n\r\n                last[\"left_move\"] = left;\r\n                last[\"width_move\"] = width;\r\n\r\n                Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n            }\r\n            else if(event.ctrlKey){\r\n                //\u9009\u533A\u6DFB\u52A0\r\n                Store.luckysheet_select_save.push({ \r\n                    \"left\": left, \r\n                    \"width\": width, \r\n                    \"top\": rowLocationByIndex(0)[0], \r\n                    \"height\": rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1, \r\n                    \"left_move\": left, \r\n                    \"width_move\": width, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [0, row_index], \r\n                    \"column\": columnseleted,\r\n                    \"row_focus\": 0,  \r\n                    \"column_focus\": col_index,\r\n                    \"column_select\": true\r\n                });\r\n            }\r\n            else{\r\n                Store.luckysheet_select_save.length = 0;\r\n                Store.luckysheet_select_save.push({ \r\n                    \"left\": left, \r\n                    \"width\": width, \r\n                    \"top\": rowLocationByIndex(0)[0], \r\n                    \"height\": rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1, \r\n                    \"left_move\": left, \r\n                    \"width_move\": width, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [0, row_index], \r\n                    \"column\": columnseleted,\r\n                    \"row_focus\": 0, \r\n                    \"column_focus\": col_index,\r\n                    \"column_select\": true\r\n                });\r\n            }\r\n\r\n            selectHightlightShow();\r\n\r\n            //\u5141\u8BB8\u7F16\u8F91\u540E\u7684\u540E\u53F0\u66F4\u65B0\u65F6\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n        }\r\n        \r\n        selectHelpboxFill();\r\n\r\n        setTimeout(function () {\r\n            clearTimeout(Store.countfuncTimeout);\r\n            countfunc();\r\n        }, 101);\r\n\r\n        if (Store.luckysheet_cols_menu_status) {\r\n            $(\"#luckysheet-rightclick-menu\").hide();\r\n            $(\"#luckysheet-cols-h-hover\").hide();\r\n            $(\"#luckysheet-cols-menu-btn\").hide();\r\n            Store.luckysheet_cols_menu_status = false;\r\n        }\r\n        event.stopPropagation();\r\n    }).mousemove(function (event) {\r\n        if (Store.luckysheet_cols_selected_status || Store.luckysheet_select_status) {\r\n            $(\"#luckysheet-cols-h-hover\").hide();\r\n            $(\"#luckysheet-cols-menu-btn\").hide();\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_cols_menu_status || Store.luckysheet_cols_change_size) {\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n\r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        $(\"#luckysheet-cols-h-hover\").css({ \"left\": col_pre, \"width\": col - col_pre - 1, \"display\": \"block\" });\r\n        $(\"#luckysheet-cols-menu-btn\").css({ \"left\": col - 19, \"display\": \"block\" });\r\n\r\n        $(\"#luckysheet-cols-change-size\").css({ \"left\": col - 5 });\r\n        if (x < col && x >= col - 5) {\r\n            $(\"#luckysheet-cols-change-size\").css({ \"opacity\": 0 });\r\n            $(\"#luckysheet-cols-menu-btn\").hide();\r\n        }\r\n        else {\r\n            $(\"#luckysheet-change-size-line\").hide();\r\n            $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n        }\r\n    }).mouseleave(function (event) {\r\n        if (Store.luckysheet_cols_menu_status || Store.luckysheet_cols_change_size) {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-cols-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n    }).mouseup(function (event) {\r\n        if (event.which == 3) {\r\n            if(isEditMode()){ //\u975E\u7F16\u8F91\u6A21\u5F0F\u4E0B\u7981\u6B62\u53F3\u952E\u529F\u80FD\u6846\r\n                return;\r\n            }\r\n\r\n            Store.luckysheetRightHeadClickIs = \"column\";\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.width);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n            $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n            $(\"#luckysheet-cols-rows-add\").show();\r\n            $(\"#luckysheet-cols-rows-data\").show();\r\n            $(\"#luckysheet-cols-rows-shift\").hide();\r\n            $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n            $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'block';\r\n            $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'block';\r\n\r\n            // \u81EA\u5B9A\u4E49\u53F3\u952E\u83DC\u5355\uFF1A\u5411\u5DE6\u5411\u53F3\u589E\u52A0\u5217\uFF0C\u5220\u9664\u5217\uFF0C\u9690\u85CF\u663E\u793A\u5217\uFF0C\u8BBE\u7F6E\u5217\u5BBD\r\n            const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n            // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n            if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth && !cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                return;\r\n            }\r\n\r\n            $$('#luckysheet-top-left-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n            $$('#luckysheet-bottom-right-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n            $$('#luckysheet-del-selected').style.display = cellRightClickConfig.deleteColumn ? 'block' : 'none';\r\n            $$('#luckysheet-hide-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n            $$('#luckysheet-show-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n            $$('#luckysheet-column-row-width-selected').style.display = cellRightClickConfig.columnWidth ? 'block' : 'none';\r\n\r\n            // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n            if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n\r\n                if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n                    $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n                }\r\n\r\n            }\r\n\r\n            // 2. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n            if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n                $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n\r\n            if(!cellRightClickConfig.clear && !cellRightClickConfig.matrix && !cellRightClickConfig.sort && !cellRightClickConfig.filter && !cellRightClickConfig.chart && !cellRightClickConfig.image && !cellRightClickConfig.link && !cellRightClickConfig.data && !cellRightClickConfig.cellFormat){\r\n                $$('#luckysheet-cols-rows-data .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n            \r\n            showrightclickmenu($(\"#luckysheet-rightclick-menu\"), event.pageX, $(this).offset().top + 18);\r\n            Store.luckysheet_cols_menu_status = true;\r\n\r\n            //\u5217\u5BBD\u9ED8\u8BA4\u503C\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"columnlen\"] == null){\r\n                cfg[\"columnlen\"] = {};\r\n            }\r\n\r\n            let first_collen = cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]] == null ? Store.defaultcollen : cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]];\r\n            let isSame = true;\r\n\r\n            for(let i = 0; i < Store.luckysheet_select_save.length; i++){\r\n                let s = Store.luckysheet_select_save[i];\r\n                let c1 = s.column[0], c2 = s.column[1];\r\n\r\n                for(let c = c1; c <= c2; c++){\r\n                    let collen = cfg[\"columnlen\"][c] == null ? Store.defaultcollen : cfg[\"columnlen\"][c];\r\n\r\n                    if(collen != first_collen){\r\n                        isSame = false;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(isSame){\r\n                $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(first_collen);\r\n            }\r\n            else{\r\n                $(\"#luckysheet-cols-rows-add\").find(\"input[type='number'].rcsize\").val(\"\");\r\n            }\r\n        }\r\n    });\r\n\r\n    //\u8868\u683C\u884C\u6807\u9898 \u6539\u53D8\u884C\u9AD8\u6309\u94AE\r\n    $(\"#luckysheet-rows-change-size\").mousedown(function (event) {\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //\u56FE\u7247 active/cropping\r\n        if($(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") || $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")){\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n        \r\n        $(\"#luckysheet-input-box\").hide();\r\n        $(\"#luckysheet-rows-change-size\").css({ \"opacity\": 1 });\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n\r\n        Store.luckysheet_rows_change_size = true;\r\n        Store.luckysheet_scroll_status = true;\r\n        $(\"#luckysheet-change-size-line\").css({ \r\n            \"height\": \"1px\", \r\n            \"border-width\": \r\n            \"0 0px 1px 0\", \r\n            \"top\": row - 3, \r\n            \"left\": 0, \r\n            \"width\": scrollLeft + winW, \r\n            \"display\": \"block\", \r\n            \"cursor\": \"ns-resize\" \r\n        });\r\n        $(\"#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas\").css(\"cursor\", \"ns-resize\");\r\n        Store.luckysheet_rows_change_size_start = [row_pre, row_index];\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-rows-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //\u8868\u683C\u5217\u6807\u9898 \u6539\u53D8\u5217\u5BBD\u6309\u94AE\r\n    $(\"#luckysheet-cols-change-size\").mousedown(function (event) {\r\n        //\u6709\u6279\u6CE8\u5728\u7F16\u8F91\u65F6\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //\u56FE\u7247 active/cropping\r\n        if($(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") || $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")){\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n\r\n        $(\"#luckysheet-input-box\").hide();\r\n        $(\"#luckysheet-cols-change-size\").css({ \"opacity\": 1 });\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height();\r\n        let x = mouse[0] + scrollLeft;\r\n\r\n        let row_index = Store.visibledatarow.length - 1, \r\n            row = Store.visibledatarow[row_index], row_pre = 0;\r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        Store.luckysheet_cols_change_size = true;\r\n        Store.luckysheet_scroll_status = true;\r\n        $(\"#luckysheet-change-size-line\").css({ \r\n            \"height\": winH + scrollTop, \r\n            \"border-width\": \"0 1px 0 0\", \r\n            \"top\": 0, \r\n            \"left\": col - 3, \r\n            \"width\": \"1px\", \r\n            \"display\": \"block\", \r\n            \"cursor\": \"ew-resize\" \r\n        });\r\n        $(\"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\").css(\"cursor\", \"ew-resize\");\r\n        Store.luckysheet_cols_change_size_start = [col_pre, col_index];\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-cols-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        Store.luckysheet_cols_dbclick_times = 0;\r\n        event.stopPropagation();\r\n    }).dblclick(function () {\r\n        luckysheetcolsdbclick();\r\n    });\r\n\r\n    // \u5217\u6807\u9898\u7684\u4E0B\u62C9\u7BAD\u5934\r\n    $(\"#luckysheet-cols-menu-btn\").click(function (event) {\r\n        let $menu = $(\"#luckysheet-rightclick-menu\");\r\n        let offset = $(this).offset();\r\n        $(\"#luckysheet-cols-rows-shift\").show();\r\n        Store.luckysheetRightHeadClickIs = \"column\";\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n        $(\"#luckysheet-cols-rows-add\").show();\r\n        $(\"#luckysheet-cols-rows-data\").hide();\r\n        $(\"#luckysheet-cols-rows-shift\").show();\r\n        $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n        $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'block';\r\n        $$('#luckysheet-cols-rows-shift .luckysheet-menuseparator').style.display = 'block';\r\n\r\n        // \u81EA\u5B9A\u4E49\u53F3\u952E\u83DC\u5355\uFF1A\u5411\u5DE6\u5411\u53F3\u589E\u52A0\u5217\uFF0C\u5220\u9664\u5217\uFF0C\u9690\u85CF\u663E\u793A\u5217\uFF0C\u8BBE\u7F6E\u5217\u5BBD\r\n        const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n        // \u5982\u679C\u5168\u90E8\u6309\u94AE\u90FD\u9690\u85CF\uFF0C\u5219\u6574\u4E2A\u83DC\u5355\u5BB9\u5668\u4E5F\u8981\u9690\u85CF\r\n        if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste && !cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth && !cellRightClickConfig.sort){\r\n            return;\r\n        }\r\n\r\n        $$('#luckysheet-top-left-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n        $$('#luckysheet-bottom-right-add-selected').style.display = cellRightClickConfig.insertColumn ? 'block' : 'none';\r\n        $$('#luckysheet-del-selected').style.display = cellRightClickConfig.deleteColumn ? 'block' : 'none';\r\n        $$('#luckysheet-hide-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n        $$('#luckysheet-show-selected').style.display = cellRightClickConfig.hideColumn ? 'block' : 'none';\r\n        $$('#luckysheet-column-row-width-selected').style.display = cellRightClickConfig.columnWidth ? 'block' : 'none';\r\n\r\n        // 1. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u4E0A\u65B9\u7684\u529F\u80FD\u5757\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u4E0B\u65B9\u7684\u529F\u80FD\u5757\u7684\u9876\u90E8\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\r\n        if(!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste){\r\n            $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n\r\n            if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n                $$('#luckysheet-cols-rows-shift .luckysheet-menuseparator').style.display = 'none';\r\n            }\r\n\r\n        }\r\n\r\n        // 2. \u5F53\u4E00\u4E2A\u529F\u80FD\u83DC\u5355\u5757\u5185\u6240\u6709\u7684\u6309\u94AE\u90FD\u9690\u85CF\u7684\u65F6\u5019\uFF0C\u5B83\u9876\u90E8\u7684\u5206\u5272\u7EBF\u4E5F\u9700\u8981\u9690\u85CF\u6389\r\n        if(!cellRightClickConfig.insertColumn && !cellRightClickConfig.deleteColumn && !cellRightClickConfig.hideColumn && !cellRightClickConfig.columnWidth){\r\n            $$('#luckysheet-cols-rows-add .luckysheet-menuseparator').style.display = 'none';\r\n        }\r\n\r\n        if(!cellRightClickConfig.sort){\r\n            $$('#luckysheet-cols-rows-shift .luckysheet-menuseparator').style.display = 'none';\r\n        }\r\n\r\n        showrightclickmenu($menu, offset.left, offset.top + 18);\r\n        Store.luckysheet_cols_menu_status = true;\r\n    });\r\n\r\n    //\u5411\u5DE6\u589E\u52A0\u5217\uFF0C\u5411\u4E0A\u589E\u52A0\u884C\r\n    // $(\"#luckysheet-add-lefttop, #luckysheet-add-lefttop_t\").click(function (event) {\r\n    $(\"#luckysheet-top-left-add-selected\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n        \r\n        const _locale = locale();\r\n        const locale_drag = _locale.drag;\r\n        const locale_info = _locale.info;\r\n        \r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        \r\n\r\n        let $t = $(this), value = $t.find(\"input\").val();\r\n        if (!isRealNum(value)) {\r\n            if(isEditMode()){\r\n                alert(locale_info.tipInputNumber);\r\n            }\r\n            else{\r\n                tooltip.info(locale_info.tipInputNumber, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n\r\n        if (value < 1 || value > 100) {\r\n            if(isEditMode()){\r\n                alert(locale_info.tipInputNumberLimit);\r\n            }\r\n            else{\r\n                tooltip.info(locale_info.tipInputNumberLimit, \"\"); \r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0];\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, value, \"lefttop\")){ \r\n\t\t\treturn; \r\n\t\t}\r\n\t\tluckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, \"lefttop\");\r\n    });\r\n\r\n\r\n    // When you right-click a cell, a row is inserted before the row by default\r\n    $(\"#luckysheetColsRowsHandleAdd_row\").click(function (event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].row[0];\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, 1, \"lefttop\")){ \r\n\t\t\treturn; \r\n\t\t}\r\n        luckysheetextendtable('row', st_index, 1, \"lefttop\");\r\n\r\n\r\n    })\r\n    $(\"#luckysheetColsRowsHandleAdd_column\").click(function (event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].column[0];\r\n        luckysheetextendtable('column', st_index, 1, \"lefttop\");\r\n\r\n\r\n    })\r\n\r\n    // custom right-click a cell buttton click\r\n    $(\".luckysheetColsRowsHandleAdd_custom\").click(function (clickEvent) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        const cellRightClickConfig =\r\n          luckysheetConfigsetting.cellRightClickConfig;\r\n        const rowIndex = Store.luckysheet_select_save[0].row[0];\r\n        const columnIndex = Store.luckysheet_select_save[0].column[0];\r\n        if (\r\n          cellRightClickConfig.customs[\r\n            Number(clickEvent.currentTarget.dataset.index)\r\n          ]\r\n        ) {\r\n          try {\r\n            cellRightClickConfig.customs[\r\n              Number(clickEvent.currentTarget.dataset.index)\r\n            ].onClick(clickEvent, event, { rowIndex, columnIndex });\r\n          } catch (e) {\r\n            console.error(\"custom click error\", e);\r\n          }\r\n        }\r\n        \r\n    });\r\n    // Add the row up, and click the text area to trigger the confirmation instead of clicking the confirmation button to enhance the experience\r\n    // $(\"#luckysheet-addTopRows\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:first-child\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm \r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n        \r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\"); \r\n    //         }\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].row[0];\r\n    //     luckysheetextendtable('row', st_index, value, \"lefttop\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n    // })\r\n\r\n    // // input\u8F93\u5165\u65F6\u963B\u6B62\u5192\u6CE1\uFF0C\u7981\u6B62\u7236\u7EA7\u5143\u7D20\u7684\u786E\u8BA4\u4E8B\u4EF6\u89E6\u53D1\r\n    // $(\"input.luckysheet-mousedown-cancel\").click(function(event) {\r\n    //     event.stopPropagation;\r\n    // })\r\n\r\n\r\n    // $(\"#luckysheet-addLeftCols\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(3)\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm \r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n        \r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\"); \r\n    //         }\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].column[0];\r\n    //     luckysheetextendtable('column', st_index, value, \"lefttop\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n        \r\n    // })\r\n\r\n    //\u5411\u53F3\u589E\u52A0\u5217\uFF0C\u5411\u4E0B\u589E\u52A0\u884C\r\n    // $(\"#luckysheet-add-rightbottom, #luckysheet-add-rightbottom_t\").click(function (event) {\r\n    $(\"#luckysheet-bottom-right-add-selected\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const _locale = locale();\r\n        const locale_drag = _locale.drag;\r\n        const locale_info = _locale.info;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let $t = $(this), value = $t.find(\"input\").val();\r\n        if (!isRealNum(value)) {\r\n            if(isEditMode()){\r\n                alert(locale_info.tipInputNumber);\r\n            }\r\n            else{\r\n                tooltip.info(locale_info.tipInputNumber, \"\"); \r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n\r\n        if (value < 1 || value > 100) {\r\n            if(isEditMode()){\r\n                alert(locale_info.tipInputNumberLimit);\r\n            }\r\n            else{\r\n                tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, value, \"rightbottom\")){\r\n\t\t\treturn; \r\n\t\t}\r\n        luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, \"rightbottom\");\r\n    });\r\n\r\n    // $(\"#luckysheet-addBottomRows\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(2)\").click(function (event) {\r\n\r\n    //      // Click input element, don't comfirm \r\n    //      if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\"); \r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].row[1];\r\n    //     luckysheetextendtable('row', st_index, value, \"rightbottom\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n\r\n    // });\r\n    // $(\"#luckysheet-addRightCols\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(4)\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm \r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\"); \r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].column[1];\r\n    //     luckysheetextendtable('column', st_index, value, \"rightbottom\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n\r\n    // });\r\n    \r\n    //\u5220\u9664\u9009\u4E2D\u884C\u5217\r\n    $(\"#luckysheet-del-selected, #luckysheet-del-selected_t\").click(function (event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\"); \r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0], \r\n            ed_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];\r\n        if(!method.createHookFunction(\"rowDeleteBefore\", st_index, ed_index)){\r\n        \treturn; \r\n        }\r\n\t\tluckysheetdeletetable(Store.luckysheetRightHeadClickIs, st_index, ed_index);\r\n    });\r\n    $(\"#luckysheet-delRows\").click(function (event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\"); \r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].row[0], \r\n            ed_index = Store.luckysheet_select_save[0].row[1];\r\n\t\tif(!method.createHookFunction(\"rowDeleteBefore\", st_index, ed_index)){\r\n\t\t\treturn; \r\n\t\t}\r\n        luckysheetdeletetable('row', st_index, ed_index);\r\n    })\r\n    $(\"#luckysheet-delCols\").click(function (event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\"); \r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].column[0], \r\n            ed_index = Store.luckysheet_select_save[0].column[1];\r\n        luckysheetdeletetable('column', st_index, ed_index);\r\n    })\r\n\r\n    //\u9690\u85CF\u9009\u4E2D\u884C\u5217\r\n    $(\"#luckysheet-hide-selected\").click(function (event) {\r\n\r\n       \r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\"); \r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        // \u9690\u85CF\u884C\r\n        if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n            \r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n                return;\r\n            }\r\n            \r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"rowhidden\"] == null){\r\n                cfg[\"rowhidden\"] = {};\r\n            }\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    cfg[\"rowhidden\"][r] = 0;\r\n                }\r\n            }\r\n        \r\n            //\u4FDD\u5B58\u64A4\u9500\r\n            if(Store.clearjfundo){\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidRows\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n        \r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        \r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n        \r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n        }\r\n        // \u9690\u85CF\u5217\r\n        else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n                return;\r\n            }\r\n            \r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"colhidden\"] == null){\r\n                cfg[\"colhidden\"] = {};\r\n            }\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for(let c = c1; c <= c2; c++){\r\n                    cfg[\"colhidden\"][c] = 0;\r\n                }\r\n            }\r\n        \r\n            //\u4FDD\u5B58\u64A4\u9500\r\n            if(Store.clearjfundo){\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidCols\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n        \r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        \r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n        \r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        \r\n    });\r\n\r\n     //\u53D6\u6D88\u9690\u85CF\u9009\u4E2D\u884C\u5217\r\n     $(\"#luckysheet-show-selected\").click(function (event) {\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noMulti);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noMulti, \"\"); \r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        // \u53D6\u6D88\u9690\u85CF\u884C\r\n        if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n                return;\r\n            }\r\n    \r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"rowhidden\"] == null){\r\n                return;\r\n            }\r\n    \r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n    \r\n                for(let r = r1; r <= r2; r++){\r\n                    delete cfg[\"rowhidden\"][r];\r\n                }\r\n            }\r\n        \r\n            //\u4FDD\u5B58\u64A4\u9500\r\n            if(Store.clearjfundo){\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidRows\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n        \r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        \r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n        \r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n                return;\r\n            }\r\n    \r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if(cfg[\"colhidden\"] == null){\r\n                return;\r\n            }\r\n    \r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n    \r\n                for(let c = c1; c <= c2; c++){\r\n                    delete cfg[\"colhidden\"][c];\r\n                }\r\n            }\r\n        \r\n            //\u4FDD\u5B58\u64A4\u9500\r\n            if(Store.clearjfundo){\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidCols\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n        \r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        \r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n        \r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n\r\n     })\r\n    //\u9690\u85CF\u3001\u663E\u793A\u884C\r\n    // $(\"#luckysheet-hidRows\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"rowhidden\"] == null){\r\n    //         cfg[\"rowhidden\"] = {};\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let r1 = Store.luckysheet_select_save[s].row[0],\r\n    //             r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n    //         for(let r = r1; r <= r2; r++){\r\n    //             cfg[\"rowhidden\"][r] = 0;\r\n    //         }\r\n    //     }\r\n    \r\n    //     //\u4FDD\u5B58\u64A4\u9500\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidRows\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n    \r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n    \r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n    \r\n    //     //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n    // $(\"#luckysheet-showHidRows\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"rowhidden\"] == null){\r\n    //         return;\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let r1 = Store.luckysheet_select_save[s].row[0],\r\n    //             r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n    //         for(let r = r1; r <= r2; r++){\r\n    //             delete cfg[\"rowhidden\"][r];\r\n    //         }\r\n    //     }\r\n    \r\n    //     //\u4FDD\u5B58\u64A4\u9500\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidRows\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n    \r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n    \r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n    \r\n    //     //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n\r\n    //\u9690\u85CF\u3001\u663E\u793A\u5217\r\n    // $(\"#luckysheet-hidCols\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"colhidden\"] == null){\r\n    //         cfg[\"colhidden\"] = {};\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let c1 = Store.luckysheet_select_save[s].column[0],\r\n    //             c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n    //         for(let c = c1; c <= c2; c++){\r\n    //             cfg[\"colhidden\"][c] = 0;\r\n    //         }\r\n    //     }\r\n    \r\n    //     //\u4FDD\u5B58\u64A4\u9500\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidCols\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n    \r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n    \r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n    \r\n    //     //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n    // $(\"#luckysheet-showHidCols\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"colhidden\"] == null){\r\n    //         return;\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let c1 = Store.luckysheet_select_save[s].column[0],\r\n    //             c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n    //         for(let c = c1; c <= c2; c++){\r\n    //             delete cfg[\"colhidden\"][c];\r\n    //         }\r\n    //     }\r\n    \r\n    //     //\u4FDD\u5B58\u64A4\u9500\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidCols\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n    \r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n    \r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n    \r\n    //     //\u884C\u9AD8\u3001\u5217\u5BBD \u5237\u65B0  \r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n\r\n    //\u5220\u9664\u5355\u5143\u683C\uFF08\u5DE6\u79FB\u3001\u4E0A\u79FB\uFF09\r\n    $(\"#luckysheet-delCellsMoveLeft\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\"); \r\n            }\r\n            return;\r\n        }\r\n\r\n        let str = Store.luckysheet_select_save[0].row[0],\r\n            edr = Store.luckysheet_select_save[0].row[1],\r\n            stc = Store.luckysheet_select_save[0].column[0],\r\n            edc = Store.luckysheet_select_save[0].column[1];\r\n\r\n        luckysheetDeleteCell('moveLeft', str, edr, stc, edc);\r\n    });\r\n    $(\"#luckysheet-delCellsMoveUp\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\"); \r\n            }\r\n            return;\r\n        }\r\n\r\n        let str = Store.luckysheet_select_save[0].row[0],\r\n            edr = Store.luckysheet_select_save[0].row[1],\r\n            stc = Store.luckysheet_select_save[0].column[0],\r\n            edc = Store.luckysheet_select_save[0].column[1];\r\n\r\n        luckysheetDeleteCell('moveUp', str, edr, stc, edc);\r\n    });\r\n\r\n    //\u6E05\u9664\u5355\u5143\u683C\u5185\u5BB9\r\n    $(\"#luckysheet-delete-text\").click(function(){\r\n\r\n        if(!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        if(Store.luckysheet_select_save.length > 0){\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                if(hasPartMC(Store.config, r1, r2, c1, c2)){\r\n                    has_PartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                const locale_drag = locale().drag;\r\n\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\");\r\n                }\r\n\r\n                return;\r\n            }\r\n            const hyperlinkMap = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].hyperlink;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        if(pivotTable.isPivotRange(r, c)){\r\n                            continue;\r\n                        }\r\n\r\n                        if(getObjType(d[r][c]) == \"object\"){\r\n                            delete d[r][c][\"m\"];\r\n                            delete d[r][c][\"v\"];\r\n\r\n                            if(d[r][c][\"f\"] != null){\r\n                                delete d[r][c][\"f\"];\r\n                                formula.delFunctionGroup(r, c, Store.currentSheetIndex);\r\n\r\n                                delete d[r][c][\"spl\"];\r\n                            }\r\n\r\n                            if(d[r][c][\"ct\"] != null && d[r][c][\"ct\"].t == 'inlineStr'){\r\n                                delete d[r][c][\"ct\"];\r\n                            }\r\n                        }\r\n                        else{\r\n                            d[r][c] = null;\r\n                        }\r\n                        // \u540C\u6B65\u6E05\u9664 hyperlink\r\n                        if (hyperlinkMap && hyperlinkMap[`${r}_${c}`]) {\r\n                            delete hyperlinkMap[`${r}_${c}`];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            jfrefreshgrid(d, Store.luckysheet_select_save);\r\n\r\n            // \u6E05\u7A7A\u7F16\u8F91\u6846\u7684\u5185\u5BB9\r\n            // \u5907\u6CE8\uFF1A\u5728functionInputHanddler\u65B9\u6CD5\u4E2D\u4F1A\u628A\u8BE5\u6807\u7B7E\u7684\u5185\u5BB9\u62F7\u8D1D\u5230 #luckysheet-functionbox-cell\r\n            $(\"#luckysheet-rich-text-editor\").html(\"\");\r\n        }\r\n    });\r\n\r\n    //\u884C\u9AD8\u5217\u5BBD\u8BBE\u7F6E\r\n    // $(\"#luckysheet-rows-cols-changesize\").click(function(){\r\n    $(\"#luckysheet-column-row-width-selected\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n        \r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        // let size = parseInt($(this).siblings(\"input[type='number']\").val().trim());\r\n        let size = parseInt($(this).closest('.luckysheet-cols-menuitem').find(\"input[type='number']\").val().trim());\r\n        \r\n        const locale_info = locale().info;\r\n\r\n          /* \u5BF9\u5F02\u5E38\u60C5\u51B5\u8FDB\u884C\u5224\u65AD\uFF1ANaN */\r\n        if(isNaN(size)){\r\n            tooltip.info(\"\u53EA\u5141\u8BB8\u4F7F\u7528\u6570\u5B57\u6765\u8BBE\u7F6E\u884C\u5217\u7684\u5BBD\u9AD8!\", \"\");\r\n            return;\r\n        }\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        let type;\r\n        let images = null;\r\n\r\n        if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n                return;\r\n            }\r\n\r\n            if(size < 0 || size > 545){\r\n                if(isEditMode()){\r\n                    alert(locale_info.tipRowHeightLimit);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_info.tipRowHeightLimit, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            type = \"resizeR\";\r\n\r\n            if(cfg[\"rowlen\"] == null){\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0];\r\n                let r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    cfg[\"rowlen\"][r] = size;\r\n\r\n                    images = imageCtrl.moveChangeSize(\"row\", r, size);\r\n                }\r\n            }\r\n        }\r\n        else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n                return;\r\n            }\r\n\r\n            if(size < 0 || size > 2038){\r\n                if(isEditMode()){\r\n                    alert(locale_info.tipColumnWidthLimit);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_info.tipColumnWidthLimit, \"\");\r\n                }\r\n                return;\r\n            }\r\n            \r\n            type = \"resizeC\";\r\n\r\n            if(cfg[\"columnlen\"] == null){\r\n                cfg[\"columnlen\"] = {};\r\n            }\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let c1 = Store.luckysheet_select_save[s].column[0];\r\n                let c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for(let c = c1; c <= c2; c++){\r\n                    cfg[\"columnlen\"][c] = size;\r\n\r\n                    images = imageCtrl.moveChangeSize(\"column\", c, size);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push({\r\n                \"type\": \"resize\",\r\n                \"ctrlType\": type,\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"config\": $.extend(true, {}, Store.config),\r\n                \"curconfig\": $.extend(true, {}, cfg),\r\n                \"images\": $.extend(true, {}, imageCtrl.images),\r\n                \"curImages\": $.extend(true, {}, images) \r\n            });\r\n        }\r\n\r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        //images\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, images, { \"k\": \"images\" });\r\n        imageCtrl.images = images;\r\n        imageCtrl.allImagesShow();\r\n\r\n        if(Store.luckysheetRightHeadClickIs == \"row\"){\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowlen\"], { \"k\": \"rowlen\" });\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, null);\r\n        }\r\n        else if(Store.luckysheetRightHeadClickIs == \"column\"){\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"columnlen\"], { \"k\": \"columnlen\" });\r\n            jfrefreshgrid_rhcw(null, Store.flowdata[0].length);\r\n        }\r\n    });\r\n}\r\n\r\n\r\nfunction luckysheetcolsdbclick() {\r\n    Store.luckysheet_cols_change_size = false;\r\n\r\n    $(\"#luckysheet-change-size-line\").hide();\r\n    $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n    $(\"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\").css(\"cursor\", \"default\");\r\n\r\n    let mouse = mouseposition(event.pageX, event.pageY);\r\n    let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n    let x = mouse[0] + scrollLeft;\r\n    \r\n    let colIndex = colLocation(x)[2];\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n\r\n    let cfg = $.extend(true, {}, Store.config);\r\n    if (cfg[\"columnlen\"] == null) {\r\n        cfg[\"columnlen\"] = {};\r\n    }\r\n\r\n    let matchColumn = {};\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), drawHeight = Store.luckysheetTableContentHW[1];\r\n    let dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n    let dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollTop + drawHeight);\r\n    dataset_row_ed += dataset_row_ed - dataset_row_st;\r\n    if(dataset_row_ed>=d.length){\r\n        dataset_row_ed = d.length-1;\r\n    }\r\n\r\n    for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n        let c1 = Store.luckysheet_select_save[s].column[0], \r\n            c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n        if (colIndex < c1 || colIndex > c2) {\r\n            if(colIndex in matchColumn){//\u6B64\u5217\u5DF2\u8BA1\u7B97\u8FC7\r\n                continue;\r\n            }\r\n\r\n            let currentColLen = Store.defaultcollen;\r\n            \r\n            for(let r = dataset_row_st; r <= dataset_row_ed; r++){\r\n                let cell = d[r][colIndex];\r\n                \r\n                if(cell == null || (isRealNull(cell.v) && !isInlineStringCell(cell)) ){\r\n                    continue;\r\n                }\r\n\r\n                // let fontset = luckysheetfontformat(cell);\r\n                // canvas.font = fontset;\r\n\r\n                // let value = getcellvalue(r, colIndex, d, \"m\").toString(); //\u5355\u5143\u683C\u6587\u672C\r\n                // let textMetrics = getMeasureText(value, canvas).width; //\u6587\u672C\u5BBD\u5EA6\r\n                let cellWidth = colLocationByIndex(colIndex)[1] - colLocationByIndex(colIndex)[0] - 2;\r\n                let textInfo = getCellTextInfo(cell, canvas,{\r\n                    r:r,\r\n                    c:colIndex,\r\n                    cellWidth:cellWidth\r\n                });\r\n\r\n                let computeRowlen = 0;\r\n                // console.log(\"rowlen\", textInfo);\r\n                if(textInfo!=null){\r\n                    computeRowlen = textInfo.textWidthAll;\r\n                }\r\n\r\n                if(computeRowlen + 6 > currentColLen){\r\n                    currentColLen = computeRowlen + 6;\r\n                }\r\n\r\n            }\r\n\r\n            if(currentColLen != Store.defaultcollen){\r\n                cfg[\"columnlen\"][colIndex] = currentColLen;\r\n                if(cfg[\"customWidth\"]){\r\n                    delete cfg[\"customWidth\"][colIndex];\r\n                }\r\n            }\r\n\r\n            matchColumn[colIndex] = 1;\r\n        }\r\n        else {\r\n            for (let c = c1; c <= c2; c++) {\r\n                if(c in matchColumn){//\u6B64\u5217\u5DF2\u8BA1\u7B97\u8FC7\r\n                    continue;\r\n                }\r\n\r\n                let currentColLen = Store.defaultcollen;\r\n\r\n                for(let r = dataset_row_st; r <= dataset_row_ed; r++){\r\n                    let cell = d[r][c];\r\n                    \r\n                    if(cell == null || (isRealNull(cell.v) && !isInlineStringCell(cell)) ){\r\n                        continue;\r\n                    }\r\n\r\n                    // let fontset = luckysheetfontformat(cell);\r\n                    // canvas.font = fontset;\r\n\r\n                    // let value = getcellvalue(r, c, d, \"m\").toString(); //\u5355\u5143\u683C\u6587\u672C\r\n                    // let textMetrics = getMeasureText(value, canvas).width; //\u6587\u672C\u5BBD\u5EA6\r\n\r\n                    // if(textMetrics + 6 > currentColLen){\r\n                    //     currentColLen = textMetrics + 6;\r\n                    // }\r\n\r\n                    let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n                    let textInfo = getCellTextInfo(cell, canvas,{\r\n                        r:r,\r\n                        c:c,\r\n                        cellWidth:cellWidth\r\n                    });\r\n\r\n                    let computeRowlen = 0;\r\n                    // console.log(\"rowlen\", textInfo);\r\n                    if(textInfo!=null){\r\n                        computeRowlen = textInfo.textWidthAll;\r\n                    }\r\n\r\n                    if(computeRowlen + 6 > currentColLen){\r\n                        currentColLen = computeRowlen + 6;\r\n                    }\r\n\r\n                }\r\n\r\n                if(currentColLen != Store.defaultcollen){\r\n                    cfg[\"columnlen\"][c] = currentColLen;\r\n                    if(cfg[\"customWidth\"]){\r\n                        delete cfg[\"customWidth\"][c];\r\n                    }\r\n                }\r\n\r\n                matchColumn[c] = 1;\r\n            }\r\n        }\r\n    }\r\n   \r\n    jfrefreshgridall(Store.flowdata[0].length, Store.flowdata.length, Store.flowdata, cfg, Store.luckysheet_select_save, \"resizeC\", \"columnlen\");\r\n}\r\n\r\n/**\r\n * \r\n * @param {String} type:delete type, \r\n * @param {*} st_index \r\n * @param {*} ed_index \r\n */\r\n// Delete row api\r\nexport function deleteRows(type, st_index, ed_index){\r\n    Store.luckysheetRightHeadClickIs = \"column\";\r\n}\r\n\r\n// Delete column api\r\nexport function deleteColumns(){\r\n\r\n}", "import luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport server from './server';\r\nimport {luckysheetupdateCell,setCenterInputPosition} from './updateCell';\r\nimport { keycode } from './constant';\r\nimport { \r\n    luckysheetMoveHighlightCell, \r\n    luckysheetMoveHighlightCell2, \r\n    luckysheetMoveHighlightRange, \r\n    luckysheetMoveHighlightRange2 \r\n} from './sheetMove';\r\nimport { selectHightlightShow, selectIsOverlap } from './select';\r\nimport selection from './selection';\r\nimport searchReplace from './searchReplace';\r\nimport controlHistory from './controlHistory';\r\nimport imageCtrl from './imageCtrl';\r\n\r\nimport { \r\n    getByteLen,\r\n    getNowDateTime,\r\n    luckysheetactiveCell,\r\n} from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { hasPartMC, isEditMode } from '../global/validate';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport formula from '../global/formula';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport tooltip from '../global/tooltip';\r\nimport locale from '../locale/locale';\r\nimport {enterKeyControll} from './inlineString';\r\nimport Store from '../store';\r\n\r\n\r\nlet luckysheet_shiftkeydown = false;\r\n\r\nfunction formulaMoveEvent(dir, ctrlKey, shiftKey, event){\r\n    if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && (dir==\"up\" || dir==\"down\") ) {\r\n        let $obj;\r\n        if(dir==\"down\"){\r\n            $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").next();\r\n            if ($obj.length == 0) {\r\n                $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").first();\r\n            }\r\n        }\r\n        else if(dir==\"up\"){\r\n            $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").prev();\r\n            if ($obj.length == 0) {\r\n                $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").last();\r\n            }\r\n        }\r\n        \r\n\r\n        $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n        $obj.addClass(\"luckysheet-formula-search-item-active\");\r\n\r\n        event.preventDefault();\r\n    }\r\n    else{\r\n        if($(\"#luckysheet-formula-functionrange-select\").is(\":visible\")){\r\n            if(ctrlKey && shiftKey){\r\n                luckysheetMoveHighlightRange2(dir, \"rangeOfFormula\");\r\n            }\r\n            else if(ctrlKey){\r\n                luckysheetMoveHighlightCell2(dir, \"rangeOfFormula\");\r\n            }\r\n            else if(shiftKey){\r\n                let dir_n = dir, step = 1;\r\n                if(dir == 'up'){\r\n                    dir_n = 'down';\r\n                    step = -1;\r\n                }\r\n                if(dir == 'left'){\r\n                    dir_n = 'right';\r\n                    step = -1;\r\n                }\r\n\r\n                luckysheetMoveHighlightRange(dir_n, step, \"rangeOfFormula\");\r\n            }\r\n            else{\r\n                let dir_n = dir, step = 1;\r\n                if(dir == 'up'){\r\n                    dir_n = 'down';\r\n                    step = -1;\r\n                }\r\n                if(dir == 'left'){\r\n                    dir_n = 'right';\r\n                    step = -1;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(dir_n, step, \"rangeOfFormula\");\r\n            }   \r\n            event.preventDefault();\r\n        }\r\n        else if(formula.israngeseleciton()){\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            // console.log(anchor.parent().next().text());\r\n            if(anchor.parent().next().text() == null || anchor.parent().next().text() == \"\"){\r\n                let vText = $(\"#luckysheet-input-box #luckysheet-input-box-index\").text();\r\n                let range = formula.getcellrange(vText);\r\n\r\n                if(range == null){\r\n                    range = formula.getcellrange($(\"#luckysheet-input-box-index\").text());\r\n                }\r\n\r\n                let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                formula.func_selectedrange = {\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [r1, r2],\r\n                    \"column\": [c1, c2],\r\n                    \"row_focus\": r1,\r\n                    \"column_focus\": c1\r\n                };\r\n\r\n                formula.rangeSetValue({ \"row\": [r1, r2], \"column\": [c1, c2] });\r\n\r\n                formula.rangestart = true;\r\n                formula.rangedrag_column_start = false;\r\n                formula.rangedrag_row_start = false;\r\n                \r\n                if(ctrlKey && shiftKey){\r\n                    luckysheetMoveHighlightRange2(dir, \"rangeOfFormula\");\r\n                }\r\n                else if(ctrlKey){\r\n                    luckysheetMoveHighlightCell2(dir, \"rangeOfFormula\");\r\n                }\r\n                else if(shiftKey){\r\n                    let dir_n = dir, step = 1;\r\n                    if(dir == 'up'){\r\n                        dir_n = 'down';\r\n                        step = -1;\r\n                    }\r\n                    if(dir == 'left'){\r\n                        dir_n = 'right';\r\n                        step = -1;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightRange(dir_n, step, \"rangeOfFormula\");\r\n                }\r\n                else{\r\n                    let dir_n = dir, step = 1;\r\n                    if(dir == 'up'){\r\n                        dir_n = 'down';\r\n                        step = -1;\r\n                    }\r\n                    if(dir == 'left'){\r\n                        dir_n = 'right';\r\n                        step = -1;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightCell(dir_n, step, \"rangeOfFormula\");\r\n                } \r\n\r\n                event.preventDefault();\r\n            }\r\n\r\n        }\r\n        else if(!ctrlKey && !shiftKey){\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            let anchorOffset = window.getSelection().anchorOffset;\r\n\r\n            if(dir == 'up'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n            }\r\n            else if(dir == 'down'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n            }\r\n            else if(dir == 'left'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().prev().length == 0 && anchorOffset == 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchorOffset == 1){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchorOffset == 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else{\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n                }\r\n            }\r\n            else if(dir == 'right'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else{\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport function keyboardInitial(){\r\n    const _locale = locale();\r\n    const locale_drag = _locale.drag;\r\n\r\n    //\u5355\u5143\u683C\u7F16\u8F91\u8F93\u5165\r\n    $(\"#luckysheet-input-box\").click(function () {\r\n        formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n    }).add(\"#\" + Store.container).on(\"keydown\", function (event) {\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"sp-input\") || (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && $(event.target).closest(\".luckysheet-input-box\").length > 0 && kcode != keycode.ENTER && kcode != keycode.TAB && kcode != keycode.UP && kcode != keycode.DOWN && kcode != keycode.LEFT && kcode != keycode.RIGHT)) {\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            \r\n            if(anchor.parent().is(\"#luckysheet-helpbox-cell\") || anchor.is(\"#luckysheet-helpbox-cell\")){\r\n                if(kcode == keycode.ENTER){\r\n                    let helpboxValue = $(\"#luckysheet-helpbox-cell\").text();\r\n\r\n                    if(formula.iscelldata(helpboxValue)){\r\n                        let cellrange = formula.getcellrange(helpboxValue);\r\n                        \r\n                        Store.luckysheet_select_save = [{ \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"], \"row_focus\": cellrange[\"row\"][0], \"column_focus\": cellrange[\"column\"][0] }];\r\n                        selectHightlightShow();\r\n                        \r\n                        $(\"#luckysheet-helpbox-cell\").blur();\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n                            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let winH = $(\"#luckysheet-cell-main\").height(), \r\n                            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n                        let row = Store.visibledatarow[cellrange[\"row\"][1]], \r\n                            row_pre = cellrange[\"row\"][0] - 1 == -1 ? 0 : Store.visibledatarow[cellrange[\"row\"][0] - 1];\r\n                        let col = Store.visibledatacolumn[cellrange[\"column\"][1]], \r\n                            col_pre = cellrange[\"column\"][0] - 1 == -1 ? 0 : Store.visibledatacolumn[cellrange[\"column\"][0] - 1];\r\n\r\n                        if (col - scrollLeft - winW + 20 > 0) {\r\n                            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n                        }\r\n                        else if (col_pre - scrollLeft - 20 < 0) {\r\n                            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n                        }\r\n\r\n                        if (row - scrollTop - winH + 20 > 0) {\r\n                            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n                        }\r\n                        else if (row_pre - scrollTop - 20 < 0) {\r\n                            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            \r\n            return;\r\n        }\r\n\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n            return;\r\n        }\r\n        \r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n        \r\n        if((altKey || event.metaKey) && kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n            enterKeyControll(Store.flowdata[row_index][col_index]);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_select_save = [{ \r\n                    \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]], \r\n                    \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]], \r\n                    \"row_focus\": Store.luckysheetCellUpdate[0], \r\n                    \"column_focus\": Store.luckysheetCellUpdate[1] \r\n                }];\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n            }\r\n\r\n            //\u82E5\u6709\u53C2\u6570\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n            if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n                $(\"#luckysheet-search-formula-parm\").hide();\r\n            }\r\n            //\u82E5\u6709\u53C2\u6570\u9009\u53D6\u8303\u56F4\u5F39\u51FA\u6846\uFF0C\u9690\u85CF\r\n            if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n                $(\"#luckysheet-search-formula-parm-select\").hide();\r\n            }\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.TAB) {\r\n            if (parseInt($inputbox.css(\"top\")) > 0) {\r\n                return;\r\n            }\r\n\r\n            luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if(kcode == keycode.F2){\r\n            if (parseInt($inputbox.css(\"top\")) > 0) {\r\n                return;\r\n            }\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ESC && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER) {\r\n            if($(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-conditionformat-dialog\").is(\":visible\")){\r\n                return;\r\n            }\r\n            else if (String.fromCharCode(kcode) != null && $(\"#luckysheet-cell-selected\").is(\":visible\")) {\r\n                let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n                luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else {\r\n            if (ctrlKey || event.metaKey) {\r\n                if (shiftKey) {\r\n                    if (!luckysheet_shiftkeydown) {\r\n                        Store.luckysheet_shiftpositon = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n                        Store.luckysheet_shiftkeydown = true;\r\n                    }\r\n\r\n                    //Ctrl + shift + \u65B9\u5411\u952E  \u8C03\u6574\u9009\u533A\r\n                    if (kcode == keycode.UP) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"up\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.DOWN) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"down\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.LEFT) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"left\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.RIGHT) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"right\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == 186 || kcode == 222) {\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_index = last[\"row_focus\"], \r\n                            col_index = last[\"column_focus\"];\r\n                        luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                        let value = getNowDateTime(2);\r\n                        $(\"#luckysheet-rich-text-editor\").html(value);\r\n                        luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                        formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                    }\r\n                }\r\n                else if (kcode == 66) {//Ctrl + B  \u52A0\u7C97\r\n                    $(\"#luckysheet-icon-bold\").click();\r\n                }\r\n                else if (kcode == 67) {//Ctrl + C  \u590D\u5236\r\n                    if(imageCtrl.currentImgId != null){\r\n                        imageCtrl.copyImgItem(event);\r\n                        return;\r\n                    }\r\n\r\n                    //\u590D\u5236\u65F6\u5B58\u5728\u683C\u5F0F\u5237\u72B6\u6001\uFF0C\u53D6\u6D88\u683C\u5F0F\u5237\r\n                    if(menuButton.luckysheetPaintModelOn){\r\n                        menuButton.cancelPaintModel();\r\n                    }\r\n                    \r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        return;\r\n                    }\r\n\r\n                    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n                    if(Store.config[\"merge\"] != null){\r\n                        let has_PartMC = false;\r\n\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if(has_PartMC){\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(has_PartMC){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMerge);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMerge, \"\"); \r\n                            }\r\n                            return;    \r\n                        }\r\n                    }\r\n\r\n                    //\u591A\u91CD\u9009\u533A \u6709\u6761\u4EF6\u683C\u5F0F\u65F6 \u63D0\u793A\r\n                    let cdformat = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_conditionformat_save;\r\n                    if(Store.luckysheet_select_save.length > 1 && cdformat != null && cdformat.length > 0){\r\n                        let hasCF = false;\r\n\r\n                        let cf_compute = conditionformat.getComputeMap();\r\n\r\n                        label:\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            if(hasCF){\r\n                                break;\r\n                            }\r\n                            \r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            for(let r = r1; r <= r2; r++){\r\n                                for(let c = c1; c <= c2; c++){\r\n                                    if(conditionformat.checksCF(r, c, cf_compute) != null){\r\n                                        hasCF = true;\r\n                                        continue label;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if(hasCF){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMulti);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMulti, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    //\u591A\u91CD\u9009\u533A \u884C\u4E0D\u4E00\u6837\u4E14\u5217\u4E0D\u4E00\u6837\u65F6 \u63D0\u793A\r\n                    if(Store.luckysheet_select_save.length > 1){ \r\n                        let isSameRow = true, \r\n                            str_r = Store.luckysheet_select_save[0].row[0], \r\n                            end_r = Store.luckysheet_select_save[0].row[1];\r\n                        let isSameCol = true, \r\n                            str_c = Store.luckysheet_select_save[0].column[0], \r\n                            end_c = Store.luckysheet_select_save[0].column[1];\r\n                        \r\n                        for(let s = 1; s < Store.luckysheet_select_save.length; s++){\r\n                            if(Store.luckysheet_select_save[s].row[0] != str_r || Store.luckysheet_select_save[s].row[1] != end_r){\r\n                                isSameRow = false;\r\n                            }\r\n                            if(Store.luckysheet_select_save[s].column[0] != str_c || Store.luckysheet_select_save[s].column[1] != end_c){\r\n                                isSameCol = false;\r\n                            }\r\n                        }\r\n\r\n                        if((!isSameRow && !isSameCol) || selectIsOverlap()){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMulti);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMulti, \"\"); \r\n                            }\r\n                            return;\r\n                        }    \r\n                    }\r\n\r\n                    selection.copy(event);\r\n\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    luckysheetactiveCell();\r\n\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 70) {//Ctrl + F  \u67E5\u627E\r\n                    searchReplace.createDialog(0);\r\n                    searchReplace.init();\r\n\r\n                    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                }\r\n                else if (kcode == 72) {//Ctrl + H  \u66FF\u6362\r\n                    searchReplace.createDialog(1);\r\n                    searchReplace.init();\r\n\r\n                    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                }\r\n                else if (kcode == 73) {//Ctrl + I  \u659C\u4F53\r\n                    $(\"#luckysheet-icon-italic\").click();\r\n                }\r\n                else if (kcode == 86) {//Ctrl + V  \u7C98\u8D34\r\n                    if(isEditMode()){//\u6B64\u6A21\u5F0F\u4E0B\u7981\u7528\u7C98\u8D34\r\n                        return;\r\n                    }\r\n\r\n                    if($(event.target).hasClass(\"formulaInputFocus\")){\r\n                        return;\r\n                    }\r\n\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_drag.noPaste);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_drag.noPaste, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    selection.isPasteAction = true;\r\n                    luckysheetactiveCell();\r\n\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 88) {//Ctrl + X  \u526A\u5207\r\n                    //\u590D\u5236\u65F6\u5B58\u5728\u683C\u5F0F\u5237\u72B6\u6001\uFF0C\u53D6\u6D88\u683C\u5F0F\u5237\r\n                    if(menuButton.luckysheetPaintModelOn){\r\n                        menuButton.cancelPaintModel();\r\n                    }\r\n\r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        return;\r\n                    }\r\n\r\n                    //\u590D\u5236\u8303\u56F4\u5185\u5305\u542B\u90E8\u5206\u5408\u5E76\u5355\u5143\u683C\uFF0C\u63D0\u793A\r\n                    if(Store.config[\"merge\"] != null){\r\n                        let has_PartMC = false;\r\n\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if(has_PartMC){\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(has_PartMC){\r\n                            if(luckysheetConfigsetting.editMode){\r\n                                alert(_locale_drag.noMerge);\r\n                            }\r\n                            else{\r\n                                tooltip.info(_locale_drag.noMerge, \"\"); \r\n                            }\r\n                            return;    \r\n                        }\r\n                    }\r\n\r\n                    //\u591A\u91CD\u9009\u533A\u65F6 \u63D0\u793A\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_drag.noMulti);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_drag.noMulti, \"\"); \r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    selection.copy(event);\r\n\r\n                    Store.luckysheet_paste_iscut = true;\r\n                    luckysheetactiveCell();\r\n                    \r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 90) {//Ctrl + Z  \u64A4\u9500\r\n                    controlHistory.redo(event);\r\n                    luckysheetactiveCell();\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 89) {//Ctrl + Y  \u91CD\u505A\r\n                    controlHistory.undo(event);\r\n                    luckysheetactiveCell();\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == keycode.UP) {//Ctrl + up  \u8C03\u6574\u5355\u5143\u683C\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"up\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.DOWN) {//Ctrl + down  \u8C03\u6574\u5355\u5143\u683C\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"down\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.LEFT) {//Ctrl + top  \u8C03\u6574\u5355\u5143\u683C\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"left\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.RIGHT) {//Ctrl + right  \u8C03\u6574\u5355\u5143\u683C\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"right\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == 186) {//Ctrl + ; \u586B\u5145\u7CFB\u7EDF\u65E5\u671F\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                    let row_index = last[\"row_focus\"], \r\n                        col_index = last[\"column_focus\"];\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                    let value = getNowDateTime(1);\r\n                    $(\"#luckysheet-rich-text-editor\").html(value);\r\n                    luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n                else if (kcode == 222) {//Ctrl + ' \u586B\u5145\u7CFB\u7EDF\u65F6\u95F4\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                    let row_index = last[\"row_focus\"], \r\n                        col_index = last[\"column_focus\"];\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                    let value = getNowDateTime(2);\r\n                    $(\"#luckysheet-rich-text-editor\").html(value);\r\n                    luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n                else if (String.fromCharCode(kcode).toLocaleUpperCase() == \"A\") {//Ctrl + A  \u5168\u9009\r\n                    // $(\"#luckysheet-left-top\").trigger(\"mousedown\");\r\n                    // $(document).trigger(\"mouseup\");\r\n                    $(\"#luckysheet-left-top\").click()\r\n                }\r\n\r\n                event.preventDefault();\r\n                return;\r\n            }\r\n            else if (shiftKey && (kcode == keycode.UP || kcode == keycode.DOWN || kcode == keycode.LEFT || kcode == keycode.RIGHT || (altKey && (kcode == 53 || kcode == 101)))) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n                    return;\r\n                }\r\n\r\n                if (!luckysheet_shiftkeydown) {\r\n                    Store.luckysheet_shiftpositon = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n                    Store.luckysheet_shiftkeydown = true;\r\n                }\r\n\r\n                //shift + \u65B9\u5411\u952E \u8C03\u6574\u9009\u533A\r\n                if (kcode == keycode.UP) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    } \r\n\r\n                    luckysheetMoveHighlightRange(\"down\", -1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.DOWN) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightRange(\"down\", 1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.LEFT) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightRange(\"right\", -1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.RIGHT) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightRange(\"right\", 1, \"rangeOfSelect\");\r\n                }\r\n                else if (altKey && (kcode == 53 || kcode == 101)) {\r\n                    //Alt + Shift + 5\uFF08\u5220\u9664\u7EBF\uFF09\r\n                    $(\"#luckysheet-icon-strikethrough\").click();\r\n                }\r\n                // else if (altKey && (kcode == 54 || kcode == 102)) {\r\n                //     //Alt + Shift + 6\uFF08\u5220\u9664\u7EBF\uFF09\r\n                //     $(\"#luckysheet-icon-underline\").click();\r\n                // }\r\n\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.ESC) {\r\n                if(menuButton.luckysheetPaintModelOn){\r\n                    menuButton.cancelPaintModel();\r\n                }\r\n                else{\r\n                    cleargridelement(event);\r\n                    event.preventDefault(); \r\n                }\r\n\r\n                selectHightlightShow();\r\n            }\r\n            else if (kcode == keycode.DELETE || kcode == keycode.BACKSPACE) {\r\n                if(imageCtrl.currentImgId != null){\r\n                    imageCtrl.removeImgItem();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-delete-text\").click();\r\n                }\r\n\r\n                event.preventDefault();\r\n            }\r\n            else if(kcode == 8 && imageCtrl.currentImgId != null){\r\n                imageCtrl.removeImgItem();\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.UP) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.DOWN) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.LEFT) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.RIGHT) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40))) || kcode == 8 || kcode == 32 || kcode == 46 || kcode == 0 || (event.ctrlKey && kcode == 86)) {\r\n                if (String.fromCharCode(kcode) != null && $(\"#luckysheet-cell-selected\").is(\":visible\") && (kcode != keycode.CAPSLOCK && kcode != keycode.WIN && kcode != 18)) {\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                    let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n                    if(kcode == 8){\r\n                        $(\"#luckysheet-rich-text-editor\").html(\"<br/>\");\r\n                    }\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n            }\r\n        }\r\n        \r\n        luckysheetactiveCell();\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //\u5355\u5143\u683C\u7F16\u8F91 keydown (\u516C\u5F0F \u4E0A\u4E0B\u5DE6\u53F3\u952E\u79FB\u52A8)\r\n    $(\"#\" + Store.container).add(\"#luckysheet-input-box\").keydown(function (event) {\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n            return;\r\n        }\r\n\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n\r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n        if (kcode == keycode.ESC && parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if(kcode == keycode.TAB && parseInt($inputbox.css(\"top\")) > 0){\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else{\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n            }\r\n\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.UP && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"up\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.DOWN && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"down\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.LEFT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"left\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.RIGHT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"right\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40 || kcode == keycode.WIN || kcode == keycode.WIN_R || kcode == keycode.MENU))) || kcode == 8 || kcode == 32 || kcode == 46 || (event.ctrlKey && kcode == 86)) {\r\n            // if(event.target.id!=\"luckysheet-input-box\" && event.target.id!=\"luckysheet-rich-text-editor\"){\r\n                formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                setCenterInputPosition(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1], Store.flowdata);\r\n            // }\r\n            \r\n        }\r\n    }).keyup(function (e) {\r\n        let kcode = e.keyCode;\r\n        \r\n        if (!e.shiftKey && kcode == 16) {\r\n            Store.luckysheet_shiftkeydown = false;\r\n            Store.luckysheet_shiftpositon = null;\r\n        }\r\n\r\n        //\u8F93\u5165\u6846\u4E2D\u6587\u8F93\u5165\u540E shift \u548C \u7A7A\u683C \u5904\u7406\r\n        if(parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && (kcode == 13 || kcode == 16 || kcode == 32)){\r\n            // if(event.target.id==\"luckysheet-input-box\" || event.target.id==\"luckysheet-rich-text-editor\"){\r\n            //     formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n            // }\r\n        }\r\n\r\n        e.preventDefault();\r\n    });\r\n\r\n    //top workBook rename\r\n    $(\"#luckysheet_info_detail_input\").val(server.title).css(\"width\", getByteLen(server.title) * 10).keydown(function(){\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n        let $t = $(this);\r\n        if(kcode == keycode.ENTER){\r\n            $t.blur().change();\r\n        }\r\n    }).bind('input propertychange', function() { \r\n        let $t = $(this);\r\n        let inputlen = getByteLen($t.val())*10;\r\n        let updatelen = $(\"#luckysheet_info_detail_update\").outerWidth();\r\n        let savelen = $(\"#luckysheet_info_detail_save\").outerWidth();\r\n        let userlen = $(\"#luckysheet_info_detail_user\").parent().outerWidth()+60;\r\n        let containerlen = $(\"#\" + Store.container).outerWidth();\r\n        let otherlen = 100;\r\n\r\n        let minuslen = containerlen- savelen - updatelen - userlen - otherlen;\r\n        if(inputlen > minuslen){\r\n            $(\"#luckysheet_info_detail_input\").css(\"width\", minuslen);\r\n        }\r\n        else{\r\n            $(\"#luckysheet_info_detail_input\").css(\"width\", inputlen);\r\n        }\r\n    }).change(function(){\r\n        server.saveParam(\"na\", null, $(this).val());\r\n    });\r\n\r\n\r\n    // \u53F3\u51FB\u83DC\u5355\u7684input\u8F93\u5165\u6846 \u6572\u51FBEnter\u4E00\u6837\u751F\u6548\r\n    $(\"#\" + Store.container).add(\"input.luckysheet-mousedown-cancel\").keydown(function (event) {\r\n\r\n        const element =  event.target.closest('.luckysheet-cols-menuitem');\r\n        if (typeof(element) != 'undefined' && element != null && event.keyCode === 13){\r\n            $(element).trigger('click');\r\n        }\r\n\r\n    })\r\n}", "\r\nimport { modelHTML } from './constant';\r\n\r\nimport { selectHightlightShow } from './select';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { \r\n    replaceHtml,\r\n    chatatABC, \r\n} from '../utils/util';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport {  isEditMode } from '../global/validate';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n} from '../global/refresh';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { orderbydata,  sortColumnSeletion } from '../global/sort';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { isdatatype } from '../global/datecontroll';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n\r\nexport function orderByInitial(){\r\n    const _locale = locale();\r\n    //\u83DC\u5355\u680F \u6392\u5E8F\u6309\u94AE\r\n    $(\"#luckysheetorderbyasc, #luckysheetorderbyasc_t\").mousedown(function (event) {\r\n        cleargridelement(event);\r\n        sortColumnSeletion(Store.orderbyindex, true);\r\n        selectHightlightShow();\r\n    });\r\n\r\n    $(\"#luckysheetorderbydesc, #luckysheetorderbydesc_t\").click(function (event) {\r\n        cleargridelement(event);\r\n        sortColumnSeletion(Store.orderbyindex, false);\r\n        selectHightlightShow();\r\n    }); \r\n\r\n    //\u6392\u5E8F\u4E8B\u4EF6\r\n    let luckysheet_sort_initial = true;\r\n    $(\"#luckysheetorderby\").click(function () {\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        const locale_sort = _locale.sort;\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_sort.noRangeError);\r\n            }\r\n            else{\r\n                tooltip.info(locale_sort.noRangeError, \"\"); \r\n            }\r\n            return;\r\n        }\r\n\r\n        let last = Store.luckysheet_select_save[0];\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if (luckysheet_sort_initial) {\r\n            luckysheet_sort_initial = false;\r\n            \r\n            let content = `<div style=\"overflow: hidden;\" class=\"luckysheet-sort-modal\"><div><label><input type=\"checkbox\" id=\"luckysheet-sort-haveheader\"/><span>${locale_sort.hasTitle}</span></label></div><div style=\"overflow-y:auto;\" id=\"luckysheet-sort-dialog-tablec\"><table data-itemcount=\"0\" cellspacing=\"0\"> <tr><td>${locale_sort.hasTitle} <select name=\"sort_0\"> <option value=\"1\">1</option> <option value=\"2\">2</option> <option value=\"3\">3</option> <option value=\"4\">4</option> </select> </td> <td> <div><label><input value=\"asc\" type=\"radio\" checked=\"checked\" name=\"sort_0\"><span>${locale_sort.asc}A-Z</span></label></div> <div><label><input value=\"desc\" type=\"radio\" name=\"sort_0\"><span>${locale_sort.desc}Z-A</span></label></div></td></tr></table></div><div style=\"background: #e5e5e5;border-top: 1px solid #f5f5f5; height: 1px; width: 100%;margin:2px 0px;margin-bottom:10px;\"></div> <div> <span style=\"font-weight: bold; text-decoration: underline;text-align:center;color: blue;cursor: pointer;\" class=\"luckysheet-sort-dialog-additem\">+ ${locale_sort.addOthers}</span> </div> </div>`;\r\n\r\n            $(\"body\").append(replaceHtml(modelHTML, { \"id\": \"luckysheet-sort-dialog\", \"addclass\": \"\", \"title\": _locale.sort.sortTitle, \"content\": content, \"botton\": `<button id=\"luckysheet-sort-modal-confirm\" class=\"btn btn-primary\">${locale_sort.confirm}</button><button class=\"btn btn-default luckysheet-model-close-btn\">${locale_sort.close}</button>`}));\r\n\r\n            $(\"#luckysheet-sort-dialog .luckysheet-sort-dialog-additem\").click(function () {\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                let option = \"\", i = $(\"#luckysheet-sort-dialog table\").data(\"itemcount\") + 1;\r\n                let t = $(\"#luckysheet-sort-haveheader\").is(':checked');\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (t) {\r\n                        let v = getcellvalue(r1, c, Store.flowdata, \"m\");\r\n\r\n                        if(v == null){\r\n                            v = locale_sort.columnOperation + (c - c1 + 1); \r\n                        }\r\n\r\n                        option += '<option value=\"' + c + '\">' + v + '</option>';\r\n                    }\r\n                    else {\r\n                        option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n                    }\r\n                }\r\n\r\n                $(\"#luckysheet-sort-dialog table\").append(`\r\n                    <tr class=\"luckysheet-sort-dialog-tr\">\r\n                        <td><span class=\"luckysheet-sort-item-close\" onclick=\"$(this).parent().parent().remove();\"><i class=\"fa fa-times\"\r\n                                    aria-hidden=\"true\"></i></span>${locale_sort.secondaryTitle} <select\r\n                                name=\"sort_${i}\">${option}</select> </td>\r\n                        <td>\r\n                            <div><label><input value=\"asc\" type=\"radio\" checked=\"checked\"\r\n                                        name=\"sort_${i}\"><span>${locale_sort.asc}A-Z</span></label></div>\r\n                            <div><label><input value=\"desc\" type=\"radio\" name=\"sort_${i}\"><span>${locale_sort.desc}Z-A</span></label>\r\n                            </div>\r\n                        </td>\r\n                    </tr>\r\n                `);\r\n                $(\"#luckysheet-sort-dialog table\").data(\"itemcount\", i);\r\n            });\r\n\r\n            $(\"#luckysheet-sort-haveheader\").change(function () {\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                let t = $(this).is(':checked');\r\n                let option = \"\";\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (t) {\r\n                        let v = getcellvalue(r1, c, Store.flowdata, \"m\");\r\n                        \r\n                        if(v == null){\r\n                            v = locale_sort.columnOperation + (c - c1 + 1); \r\n                        }\r\n\r\n                        option += '<option value=\"' + c + '\">' + v + '</option>';\r\n                    }\r\n                    else {\r\n                        option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n                    }\r\n                }\r\n\r\n                $(\"#luckysheet-sort-dialog tr select\").each(function () {\r\n                    $(this).html(option);\r\n                });\r\n            });\r\n\r\n            //Custom sort\r\n            $(\"#luckysheet-sort-modal-confirm\").click(function () {\r\n                if(Store.luckysheet_select_save.length > 1){\r\n                    if(isEditMode()){\r\n                        alert(locale_sort.noRangeError);\r\n                    }\r\n                    else{\r\n                        tooltip.info(locale_sort.noRangeError, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                //Data has header row\r\n                let t = $(\"#luckysheet-sort-haveheader\").is(':checked');\r\n\r\n                let str;\r\n                if(t){\r\n                    str = r1 + 1;\r\n                }\r\n                else{\r\n                    str = r1;\r\n                }\r\n\r\n                let hasMc = false; //Whether the sort selection has merged cells\r\n\r\n                let data = [];\r\n\r\n                for(let r = str; r <= r2; r++){\r\n                    let data_row = [];\r\n\r\n                    for(let c = c1; c <= c2; c++){\r\n                        if(d[r][c] != null && d[r][c].mc != null){\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n\r\n                        data_row.push(d[r][c]);\r\n                    }\r\n\r\n                    data.push(data_row);\r\n                }\r\n\r\n                if(hasMc){\r\n                    if(isEditMode()){\r\n                        alert(locale_sort.mergeError);\r\n                    }\r\n                    else{\r\n                        tooltip.info(locale_sort.mergeError, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n                \r\n                $($(\"#luckysheet-sort-dialog table tr\").toArray().reverse()).each(function () {\r\n                    let i = $(this).find(\"select\").val(), \r\n                        asc = $(this).find('input:radio:checked').val();\r\n                    \r\n                    i -= c1;\r\n                    \r\n                    if (asc == \"asc\") {\r\n                        asc = true;\r\n                    }\r\n                    else {\r\n                        asc = false;\r\n                    }\r\n\r\n                    data = orderbydata([].concat(data), i, asc);\r\n                });\r\n\r\n                for(let r = str; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        d[r][c] = data[r - str][c - c1];\r\n                    }\r\n                }\r\n\r\n                let allParam = {};\r\n                if(Store.config[\"rowlen\"] != null){\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    cfg = rowlenByRange(d, str, r2, cfg);\r\n\r\n                    allParam = {\r\n                        \"cfg\": cfg,\r\n                        \"RowlChange\": true\r\n                    }\r\n                }\r\n\r\n                jfrefreshgrid(d, [{ \"row\": [str, r2], \"column\": [c1, c2] }], allParam);\r\n\r\n                $(\"#luckysheet-sort-dialog\").hide();\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            });\r\n        }\r\n\r\n        let option = \"\";\r\n        for (let c = c1; c <= c2; c++) {\r\n            option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n        }\r\n\r\n        $(\"#luckysheet-sort-dialog select\").html(option);\r\n\r\n        $(\"#luckysheet-sort-dialog .luckysheet-sort-dialog-tr\").remove();\r\n\r\n        $(\"#luckysheet-sort-haveheader\").prop(\"checked\", false);\r\n        $(\"#luckysheet-sort-dialog input:radio:first\").prop(\"checked\", \"checked\");\r\n\r\n        $(\"#luckysheet-sort-dialog .luckysheet-modal-dialog-title-text\").html(locale_sort.sortRangeTitle+\"<span>\" + chatatABC(c1) + (r1 + 1) + \"</span>\"+ locale_sort.sortRangeTitleTo +\"<span>\" + chatatABC(c2) + (r2 + 1) + \"</span>\");\r\n\r\n        let $t = $(\"#luckysheet-sort-dialog\"), myh = $t.outerHeight(), myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n\r\n        $(\"#luckysheet-sort-dialog-tablec\").css(\"max-height\", (winh - myh) / 2);\r\n        $(\"#luckysheet-sort-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 2 }).show();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n        if (r1 < r2) {\r\n            setTimeout(function () {\r\n                let flowrowdata1 = Store.flowdata[r1], \r\n                    flowrowdata2 = Store.flowdata[r1 + 1], \r\n                    hastitle = false;\r\n                \r\n                for (let i = c1; i <= c2; i++) {\r\n                    let isdatatype_r1 = isdatatype(flowrowdata1[i]), \r\n                        isdatatype_r2 = isdatatype(flowrowdata2[i]);\r\n                    \r\n                    if (isdatatype_r1 != isdatatype_r2) {\r\n                        hastitle = true;\r\n                    }\r\n                }\r\n\r\n                if (hastitle) {\r\n                    $(\"#luckysheet-sort-haveheader\").prop(\"checked\", true).change();\r\n                }\r\n            }, 10);\r\n        }\r\n    });\r\n}", "import { seriesLoadScripts, loadLinks, $$ } from '../../utils/util'\r\n\r\n\r\n// Dynamically load dependent scripts and styles\r\nconst dependScripts = [\r\n    // 'expendPlugins/chart/chartmix.umd.min.js',\r\n    'http://localhost:8080/luckysheetPluginPrint.umd.js',\r\n]\r\n\r\nconst dependLinks = [\r\n    // 'expendPlugins/chart/chartmix.css',\r\n    'http://localhost:8080/luckysheetPluginPrint.css',\r\n]\r\n\r\n// Initialize the chart component\r\nfunction print(data, isDemo) {\r\n    loadLinks(dependLinks);\r\n\r\n    seriesLoadScripts(dependScripts, null, function () {\r\n        \r\n    });\r\n}\r\n\r\n\r\n\r\nexport { print }\r\n", "import { chart } from '../expendPlugins/chart/plugin'\r\nimport { print } from '../expendPlugins/print/plugin'\r\n\r\nconst pluginsObj = {\r\n    'chart':chart,\r\n    'print':print\r\n}\r\n\r\nconst isDemo = true\r\n\r\n/**\r\n * Register plugins\r\n */\r\nfunction initPlugins(plugins , data){\r\n    if(plugins.length){\r\n        plugins.forEach(plugin => {\r\n            pluginsObj[plugin](data , isDemo)\r\n        });\r\n    }\r\n}\r\n\r\nexport {\r\n    initPlugins\r\n}", "import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport { luckysheet_getcelldata, luckysheet_parseData, luckysheet_getValue } from './func';\r\nimport { inverse } from './matrix_methods';\r\nimport { getSheetIndex, getluckysheetfile,getRangetxt } from '../methods/get';\r\nimport menuButton from '../controllers/menuButton';\r\nimport luckysheetSparkline from '../controllers/sparkline';\r\nimport formula from '../global/formula';\r\nimport func_methods from '../global/func_methods';\r\nimport editor from '../global/editor';\r\nimport { isdatetime, diff, isdatatype } from '../global/datecontroll';\r\nimport { isRealNum, isRealNull, valueIsError,error } from '../global/validate';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport { genarate, update } from '../global/format';\r\nimport { orderbydata } from '../global/sort';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { getObjType, ABCatNum, chatatABC, numFormat } from '../utils/util';\r\nimport Store from '../store';\r\nimport dayjs from 'dayjs';\r\nimport numeral from 'numeral';\r\n\r\n//\u516C\u5F0F\u51FD\u6570\u8BA1\u7B97\r\nconst functionImplementation = {\r\n    \"SUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        if(getObjType(data) == \"boolean\"){\r\n                            if(data.toString().toLowerCase() == \"true\"){\r\n                                dataArr.push(1);\r\n                            }\r\n                            else if(data.toString().toLowerCase() == \"false\"){\r\n                                dataArr.push(0);\r\n                            }\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            if(dataArr.length > 0){\r\n                for(var i = 0; i < dataArr.length; i++){\r\n                    if(valueIsError(dataArr[i])){\r\n                        return dataArr[i];\r\n                    }\r\n\r\n                    if(!isRealNum(dataArr[i])){\r\n                        continue;\r\n                    }\r\n\r\n                    sum = luckysheet_calcADPMM(sum, \"+\", dataArr[i]);// parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0, count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n                else if(!isRealNum(dataArr[i])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sum = luckysheet_calcADPMM(sum, \"+\", dataArr[i]);// parseFloat(dataArr[i]);\r\n                count++;\r\n            }\r\n\r\n            if(count == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return luckysheet_calcADPMM(sum, \"/\", count);// sum / count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    if(getObjType(data) == \"boolean\"){\r\n                        if(data.toString().toLowerCase() == \"true\"){\r\n                            dataArr.push(1);\r\n                        }\r\n                        else if(data.toString().toLowerCase() == \"false\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(isRealNum(dataArr[i])){\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            return count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return dataArr.length;\r\n        }\r\n        catch (err) {\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MAX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var max = null;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n\r\n                if(!isRealNum(dataArr[i])){\r\n                    continue;\r\n                }\r\n\r\n                if(max == null || parseFloat(dataArr[i]) > max){\r\n                    max = parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return max == null ? 0 : max;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var min = null;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n\r\n                if(!isRealNum(dataArr[i])){\r\n                    continue;\r\n                }\r\n\r\n                if(min == null || parseFloat(dataArr[i]) < min){\r\n                    min = parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return min == null ? 0 : min;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AGE_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = dayjs(birthday);\r\n\r\n            var cuurentdate = dayjs();\r\n            if(arguments.length == 2){\r\n                cuurentdate = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cuurentdate)){\r\n                    return cuurentdate;\r\n                }\r\n\r\n                cuurentdate = dayjs(cuurentdate);\r\n            }\r\n\r\n            var age = cuurentdate.diff(birthday, \"years\");\r\n\r\n            if(age < 0 || age.toString() == \"NaN\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return age;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEX_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) {\r\n                return \"\u7537\";\r\n            }\r\n            else {\r\n                return \"\u5973\";\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIRTHDAY_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = \"\";\r\n            if (UUserCard.length == 15) {\r\n                var year = \"19\" + UUserCard.substring(6, 8) + \"/\" + UUserCard.substring(8, 10) + \"/\" + UUserCard.substring(10, 12);\r\n                birthday = year;\r\n            }\r\n            else if (UUserCard.length == 18) {\r\n                var year = UUserCard.substring(6, 10) + \"/\" + UUserCard.substring(10, 12) + \"/\" + UUserCard.substring(12, 14);\r\n                birthday = year;\r\n            }\r\n\r\n            //\u751F\u65E5\u683C\u5F0F\r\n            var datetype = 0;\r\n            if (arguments[1] != null) {\r\n                datetype = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(datetype)){\r\n                    return datetype;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(datetype)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            datetype = parseInt(datetype);\r\n\r\n            if(datetype < 0 || datetype > 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(parseInt(datetype) == 0){\r\n                return birthday;\r\n            }\r\n            else if(parseInt(datetype) == 1){\r\n                return dayjs(birthday).format(\"YYYY-MM-DD\");\r\n            }\r\n            else if(parseInt(datetype) == 2){\r\n                return dayjs(birthday).format(\"YYYY\u5E74M\u6708D\u65E5\");\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROVINCE_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var native = \"\u672A\u77E5\";\r\n            var provinceArray = formula.classlist.province;\r\n\r\n            if (UUserCard.substring(0, 2) in provinceArray) {\r\n                native = provinceArray[UUserCard.substring(0, 2)];\r\n            }\r\n\r\n            return native;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CITY_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var dataNum = cityData.length,\r\n                native = \"\u672A\u77E5\";\r\n\r\n            for (var i = 0; i < dataNum; i++) {\r\n                if (UUserCard.substring(0, 6) == cityData[i].code) {\r\n                    native = cityData[i].title;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return native;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STAR_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = new Date(birthday);\r\n\r\n            var month = birthday.getMonth(),\r\n                day = birthday.getDate();\r\n\r\n            var d = new Date(1999, month, day, 0, 0, 0);\r\n            var arr = [];\r\n            arr.push([\"\u9B54\u7FAF\u5EA7\", new Date(1999, 0, 1, 0, 0, 0)]);\r\n            arr.push([\"\u6C34\u74F6\u5EA7\", new Date(1999, 0, 20, 0, 0, 0)]);\r\n            arr.push([\"\u53CC\u9C7C\u5EA7\", new Date(1999, 1, 19, 0, 0, 0)]);\r\n            arr.push([\"\u767D\u7F8A\u5EA7\", new Date(1999, 2, 21, 0, 0, 0)]);\r\n            arr.push([\"\u91D1\u725B\u5EA7\", new Date(1999, 3, 21, 0, 0, 0)]);\r\n            arr.push([\"\u53CC\u5B50\u5EA7\", new Date(1999, 4, 21, 0, 0, 0)]);\r\n            arr.push([\"\u5DE8\u87F9\u5EA7\", new Date(1999, 5, 22, 0, 0, 0)]);\r\n            arr.push([\"\u72EE\u5B50\u5EA7\", new Date(1999, 6, 23, 0, 0, 0)]);\r\n            arr.push([\"\u5904\u5973\u5EA7\", new Date(1999, 7, 23, 0, 0, 0)]);\r\n            arr.push([\"\u5929\u79E4\u5EA7\", new Date(1999, 8, 23, 0, 0, 0)]);\r\n            arr.push([\"\u5929\u874E\u5EA7\", new Date(1999, 9, 23, 0, 0, 0)]);\r\n            arr.push([\"\u5C04\u624B\u5EA7\", new Date(1999, 10, 22, 0, 0, 0)]);\r\n            arr.push([\"\u9B54\u7FAF\u5EA7\", new Date(1999, 11, 22, 0, 0, 0)]);\r\n            //console.log(birthday, arr, i);\r\n            for (var i = arr.length - 1; i >= 0; i--) {\r\n                if (d >= arr[i][1]) {\r\n                    return arr[i][0];\r\n                }\r\n            }\r\n\r\n            return \"\u672A\u627E\u5230\u5339\u914D\u661F\u5EA7\u4FE1\u606F\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ANIMAL_BY_IDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8EAB\u4EFD\u8BC1\u53F7\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = new Date(birthday);\r\n\r\n            var list = new Array(\"\u732A\", \"\u9F20\", \"\u725B\", \"\u864E\", \"\u5154\", \"\u9F99\", \"\u86C7\", \"\u9A6C\", \"\u7F8A\", \"\u7334\", \"\u9E21\", \"\u72D7\");\r\n            var index = (parseInt(birthday.getFullYear()) + 9) % 12;\r\n\r\n            if (index != null && !isNaN(index)) {\r\n                return list[index];\r\n            }\r\n            else {\r\n                return \"\u672A\u627E\u5230\u5339\u914D\u751F\u8096\u4FE1\u606F\";\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISIDCARD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var idcard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(idcard)){\r\n                return idcard;\r\n            }\r\n\r\n            var reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\r\n\r\n            if(reg.test(idcard)){\r\n                return true\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_CUTWORD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u5206\u8BCD\u6A21\u5F0F\r\n            var datetype = 0;\r\n            if (arguments[1] != null) {\r\n                datetype = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(datetype)){\r\n                    return datetype;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(datetype)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            datetype = parseInt(datetype);\r\n\r\n            if(datetype != 0 &&\u3000datetype != 1 && datetype != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/cutword\", {\r\n                \"text\": text,\r\n                \"type\": datetype\r\n            }, function(data) {\r\n                var d = [].concat(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_TFIDF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u5173\u952E\u8BCD\u4E2A\u6570\r\n            var count = 20;\r\n            if (arguments[1] != null) {\r\n                count = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(count)){\r\n                    return count;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(count)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            count = parseInt(count);\r\n\r\n            //\u8BED\u6599\u5E93\r\n            var set = 0;\r\n            if (arguments[2] != null) {\r\n                set = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(set)){\r\n                    return set;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(set)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            set = parseInt(set);\r\n\r\n            if(count < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(set != 0 && set != 1 && set != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/tfidf\", {\r\n                \"text\": text,\r\n                \"count\": count,\r\n                \"set\": set\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_TEXTRANK\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u4EFB\u610F\u9700\u8981\u5206\u8BCD\u7684\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u5173\u952E\u8BCD\u4E2A\u6570\r\n            var count = 20;\r\n            if (arguments[1] != null) {\r\n                count = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(count)){\r\n                    return count;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(count)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            count = parseInt(count);\r\n\r\n            //\u8BED\u6599\u5E93\r\n            var set = 0;\r\n            if (arguments[2] != null) {\r\n                set = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(set)){\r\n                    return set;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(set)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            set = parseInt(set);\r\n\r\n            if(count < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(set != 0 && set != 1 && set != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/tfidf\", {\r\n                \"text\": text,\r\n                \"count\": count,\r\n                \"set\": set\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_CLOSE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"0\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                var v = numFormat(data);\r\n                if (v == null) {\r\n                    v = data;\r\n                }\r\n                formula.execFunctionGroup(cell_r, cell_c, v);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": v,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_OPEN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"1\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_MAX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"2\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_MIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"3\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_VOLUMN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"4\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_AMOUNT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //\u80A1\u7968\u4EE3\u7801\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //\u65E5\u671F\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"\u65E5\u671F\u9519\u8BEF\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //\u590D\u6743\u9664\u6743\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"5\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISDATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u65E5\u671F\r\n            var date = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(date)){\r\n                return date;\r\n            }\r\n\r\n            return isdatetime(date);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMIF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //=SUMIF(A2:A5,\">1600000\",B2:B5)\r\n            //=SUMIF(A2:A5,\">1600000\")\r\n            //=SUMIF(A2:A5,3000000,B2:B5)\r\n            //\u627E\u51FArange\u4E2D\u5339\u914D\u7684\u5B57\u7B26\u4E32\r\n            var sum = 0;\r\n\r\n            var rangeData = arguments[0].data;\r\n            var rangeRow = arguments[0].rowl;\r\n            var rangeCol = arguments[0].coll;\r\n\r\n            var criteria = luckysheet_parseData(arguments[1]);\r\n\r\n            rangeData = formula.getRangeArray(rangeData)[0];\r\n\r\n            //\u5982\u679C\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\r\n            if(arguments[2]){\r\n                var sumRangeData = [];\r\n                //\u6839\u636E\u9009\u62E9\u7684\u76EE\u6807\u7684\u533A\u57DF\u786E\u5B9A\u5B9E\u9645\u76EE\u6807\u533A\u57DF\r\n                //\u521D\u59CB\u4F4D\u7F6E\r\n                var sumRangeStart = arguments[2].startCell;\r\n                var sumRangeRow = arguments[2].rowl;\r\n                var sumRangeCol = arguments[2].coll;\r\n                var sumRangeSheet = arguments[2].sheetName;\r\n\r\n                if(rangeRow == sumRangeRow && rangeCol == sumRangeCol){\r\n                    sumRangeData = arguments[2].data;\r\n                }\r\n                else{\r\n                    var row=[],col=[];\r\n                    var sumRangeEnd = \"\";\r\n                    var realSumRange = \"\";\r\n                    //console.log(\"\u5F00\u59CB\u4F4D\u7F6E\uFF01\uFF01\uFF01\",sumRangeStart,typeof(sumRangeStart));\r\n                    row[0] = parseInt(sumRangeStart.replace(/[^0-9]/g,\"\")) - 1;\r\n                    col[0] = ABCatNum(sumRangeStart.replace(/[^A-Za-z]/g,\"\"));\r\n\r\n                    //\u6839\u636E\u7B2C\u4E00\u4E2A\u8303\u56F4\u7684\u957F\u5BBD\u786E\u5B9A\u76EE\u6807\u8303\u56F4\u7684\u672B\u5C3E\u4F4D\u7F6E\r\n                    row[1] = row[0] + rangeRow - 1;\r\n                    col[1] = col[0] + rangeCol - 1;\r\n\r\n                    //console.log(row[0],col[0],row[1],col[1]);\r\n                    //\u672B\u5C3E\u4F4D\u7F6E\u8F6C\u5316\u4E3Asheet\u683C\u5F0F\uFF1A\u5982 F4\r\n                    var real_ABC = chatatABC(col[1]);\r\n                    var real_Num = row[1] + 1;\r\n                    sumRangeEnd = real_ABC + real_Num;\r\n                    //console.log(\"\u5408\u6210\u65B0\u7684\u672B\u5C3E\u4F4D\u7F6E\uFF1A\" + sumRangeEnd);\r\n\r\n                    realSumRange = sumRangeSheet + \"!\" +sumRangeStart + \":\" + sumRangeEnd;\r\n                    sumRangeData = luckysheet_getcelldata(realSumRange).data;\r\n                    //console.log(\"\u6700\u7EC8\u7684\u76EE\u6807\u8303\u56F4\uFF1A\",sumRangeData);\r\n                }\r\n\r\n                sumRangeData = formula.getRangeArray(sumRangeData)[0];\r\n\r\n                //\u5FAA\u73AF\u904D\u5386\u67E5\u627E\u5339\u914D\u9879\r\n                for(var i = 0; i < rangeData.length;i++){\r\n                    var v = rangeData[i];\r\n\r\n                    if(!!v && formula.acompareb(v, criteria)){\r\n                        if(!isRealNum(sumRangeData[i])){\r\n                            continue;\r\n                        }\r\n\r\n                        sum = luckysheet_calcADPMM(sum, \"+\", sumRangeData[i]);// parseFloat(sumRangeData[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                //\u5FAA\u73AF\u904D\u5386\u67E5\u627E\u5339\u914D\u9879\r\n                for(var i = 0; i < rangeData.length;i++){\r\n                    var v = rangeData[i];\r\n\r\n                    if(!!v && formula.acompareb(v, criteria)){\r\n                        if(!isRealNum(v)){\r\n                            continue;\r\n                        }\r\n\r\n                        sum = luckysheet_calcADPMM(sum, \"\", v);// parseFloat(v);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.tan(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TANH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var e2 = Math.exp(2 * number);\r\n\r\n            return (e2 - 1) / (e2 + 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CEILING\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //number\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //significance\r\n            var significance = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(significance)){\r\n                return significance;\r\n            }\r\n\r\n            if(!isRealNum(significance)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            significance = parseFloat(significance);\r\n\r\n            if(significance == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(number > 0 && significance < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.ceil(number / significance) * significance;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.atan(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ASINH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.log(number + Math.sqrt(number * number + 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ABS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.abs(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACOS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < -1 || number > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.acos(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACOSH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number + Math.sqrt(number * number - 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MULTINOMIAL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0, divisor = 1;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number < 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                sum += number;\r\n                divisor *= func_methods.factorial(number);\r\n            }\r\n\r\n            return func_methods.factorial(sum) / divisor;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATANH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= -1 ||\u3000number >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log((1 + number) / (1 - number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATAN2\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8BA1\u7B97\u5176\u4E0Ex\u8F74\u5939\u89D2\u5927\u5C0F\u7684\u7EBF\u6BB5\u7684\u7EC8\u70B9x\u5750\u6807\r\n            var number_x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_x)){\r\n                return number_x;\r\n            }\r\n\r\n            if(!isRealNum(number_x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_x = parseFloat(number_x);\r\n\r\n            //\u8981\u8BA1\u7B97\u5176\u4E0Ex\u8F74\u5939\u89D2\u5927\u5C0F\u7684\u7EBF\u6BB5\u7684\u7EC8\u70B9y\u5750\u6807\r\n            var number_y = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_y)){\r\n                return number_y;\r\n            }\r\n\r\n            if(!isRealNum(number_y)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_y = parseFloat(number_y);\r\n\r\n            if(number_x == 0 && number_y == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return Math.atan2(number_y, number_x);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTBLANK\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data = arguments[0];\r\n            var sum = 0;\r\n\r\n            if(getObjType(data) == \"object\" && data.startCell != null){\r\n                if(data.data == null){\r\n                    return 1;\r\n                }\r\n\r\n                if(getObjType(data.data) == \"array\"){\r\n                    for(var r = 0; r < data.data.length; r++){\r\n                        for(var c = 0; c < data.data[r].length; c++){\r\n                            if(data.data[r][c] == null || isRealNull(data.data[r][c].v)){\r\n                                sum++;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(isRealNull(data.data.v)){\r\n                        sum++;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COSH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return (Math.exp(number) + Math.exp(-number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data = arguments[0];\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                if(getObjType(data[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(!isRealNum(data[0][0])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return Math.floor(parseFloat(data[0][0]));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data[0])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return Math.floor(parseFloat(data[0]));\r\n                }\r\n            }\r\n            else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                if(data.coll > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                if(data.rowl > 1){\r\n                    var cellrange = formula.getcellrange(data.startCell);\r\n                    var str = cellrange.row[0];\r\n\r\n                    if(window.luckysheetCurrentRow < str || window.luckysheetCurrentRow > str + data.rowl - 1){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var cell = data.data[window.luckysheetCurrentRow - str][0];\r\n                }\r\n                else{\r\n                    var cell = data.data;\r\n                }\r\n\r\n                if(cell == null || isRealNull(cell.v)){\r\n                    return 0;\r\n                }\r\n\r\n                if(!isRealNum(cell.v)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return Math.floor(parseFloat(cell.v));\r\n            }\r\n            else{\r\n                if(getObjType(data) == \"boolean\"){\r\n                    if(data.toString().toLowerCase() == \"true\"){\r\n                        return 1;\r\n                    }\r\n\r\n                    if(data.toString().toLowerCase() == \"false\"){\r\n                        return 0;\r\n                    }\r\n                }\r\n\r\n                if(!isRealNum(data)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return Math.floor(parseFloat(data));\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISEVEN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            return Math.abs(number) & 1 ? false : true;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISODD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            return Math.abs(number) & 1 ? true : false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LCM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var o = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        o = o.concat(func_methods.getDataArr(data));\r\n                    }\r\n                    else{\r\n                        o = o.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    o = o.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    o.push(data);\r\n                }\r\n            }\r\n\r\n            for(var y = 0; y < o.length; y++){\r\n                var number = o[y];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseInt(number);\r\n\r\n                if(number < 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                o[y] = number;\r\n            }\r\n\r\n            for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined;) {\r\n                if(n == 0){\r\n                    r = 0;\r\n                }\r\n\r\n                while (n > 1) {\r\n                    if (n % 2) {\r\n                        for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\r\n                            //empty\r\n                        }\r\n\r\n                        d = (i <= j) ? i : n;\r\n                    }\r\n                    else {\r\n                        d = 2;\r\n                    }\r\n\r\n                    for (n /= d, r *= d, i = o.length; i; (o[--i] % d) === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\r\n                        //empty\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r >= Math.pow(2, 53)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return r;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOG\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(arguments.length == 2){\r\n                var base = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(base)){\r\n                    return base;\r\n                }\r\n\r\n                if(!isRealNum(base)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                base = parseFloat(base);\r\n\r\n                if(base <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n            }\r\n            else{\r\n                var base = 10;\r\n            }\r\n\r\n            return Math.log(number) / Math.log(base);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOG10\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number) / Math.log(10);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MOD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u88AB\u9664\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u9664\u6570\r\n            var divisor = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(divisor)){\r\n                return divisor;\r\n            }\r\n\r\n            if(!isRealNum(divisor)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            divisor = parseFloat(divisor);\r\n\r\n            if(divisor == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            var modulus = Math.abs(number % divisor);\r\n            return (divisor > 0) ? modulus : -modulus;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MROUND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u820D\u5165\u7684\u503C\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u8981\u820D\u5165\u5230\u7684\u500D\u6570\r\n            var multiple = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(multiple)){\r\n                return multiple;\r\n            }\r\n\r\n            if(!isRealNum(multiple)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            multiple = parseFloat(multiple);\r\n\r\n            if (number * multiple < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            return Math.round(number / multiple) * multiple;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ODD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var temp = Math.ceil(Math.abs(number));\r\n            temp = (temp & 1) ? temp : temp + 1;\r\n            return (number >= 0) ? temp : -temp;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMSQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            if(dataArr.length > 0){\r\n                for(var i = 0; i < dataArr.length; i++){\r\n                    var number = dataArr[i];\r\n\r\n                    if(!isRealNum(number)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    number = parseFloat(number);\r\n\r\n                    sum += number * number;\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COMBIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u9879\u76EE\u7684\u6570\u91CF\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            //\u6BCF\u4E00\u7EC4\u5408\u4E2D\u9879\u76EE\u7684\u6570\u91CF\r\n            var number_chosen = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_chosen)){\r\n                return number_chosen;\r\n            }\r\n\r\n            if(!isRealNum(number_chosen)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_chosen = parseInt(number_chosen);\r\n\r\n            if (number < 0 || number_chosen < 0 || number < number_chosen){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            return func_methods.factorial(number) / (func_methods.factorial(number_chosen) * func_methods.factorial(number - number_chosen))\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUBTOTAL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57 1-11 \u6216 101-111\uFF0C\u7528\u4E8E\u6307\u5B9A\u8981\u4E3A\u5206\u7C7B\u6C47\u603B\u4F7F\u7528\u7684\u51FD\u6570\r\n            var data_function_num = arguments[0];\r\n            var function_num;\r\n\r\n            if(getObjType(data_function_num) == \"array\"){\r\n                if(getObjType(data_function_num[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_function_num)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    function_num = [];\r\n\r\n                    for(var i = 0; i < data_function_num.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_function_num[i].length; j++){\r\n                            rowArr.push(data_function_num[i][j]);\r\n                        }\r\n\r\n                        function_num.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    function_num = [];\r\n\r\n                    for(var i = 0; i < data_function_num.length; i++){\r\n                        function_num.push(data_function_num[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_function_num) == \"object\" && data_function_num.startCell != null){\r\n                function_num = func_methods.getFirstValue(data_function_num);\r\n            }\r\n            else{\r\n                function_num = data_function_num;\r\n            }\r\n\r\n            var arr = Array.prototype.slice.apply(arguments);\r\n            arr.shift();\r\n\r\n            //\u8BA1\u7B97\u7ED3\u679C\r\n            if(getObjType(function_num) == \"array\"){\r\n                var result = [];\r\n\r\n                if(getObjType(function_num[0]) == \"array\"){\r\n                    for(var i = 0; i < function_num.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < function_num[i].length; j++){\r\n                            var value = function_num[i][j];\r\n\r\n                            if(valueIsError(value)){\r\n                                rowArr.push(value);\r\n                            }\r\n                            else if(!isRealNum(value)){\r\n                                rowArr.push(formula.error.v);\r\n                            }\r\n                            else{\r\n                                value = parseInt(value);\r\n\r\n                                if(value < 1 || value > 111 || (value > 11 && value < 101)){\r\n                                    rowArr.push(formula.error.v);\r\n                                }\r\n                                else{\r\n                                    rowArr.push(compute(value));\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < function_num.length; i++){\r\n                        var value = function_num[i];\r\n\r\n                        if(valueIsError(value)){\r\n                            result.push(value);\r\n                        }\r\n                        else if(!isRealNum(value)){\r\n                            result.push(formula.error.v);\r\n                        }\r\n                        else{\r\n                            value = parseInt(value);\r\n\r\n                            if(value < 1 || value > 111 || (value > 11 && value < 101)){\r\n                                result.push(formula.error.v);\r\n                            }\r\n                            else{\r\n                                result.push(compute(value));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                if(valueIsError(function_num)){\r\n                    return function_num;\r\n                }\r\n\r\n                if(!isRealNum(function_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                function_num = parseInt(function_num);\r\n\r\n                if(function_num < 1 || function_num > 111 || (function_num > 11 && function_num < 101)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return compute(function_num);\r\n            }\r\n\r\n\r\n            function compute(function_num){\r\n                switch(function_num){\r\n                    case 1:    //AVERAGE\r\n                    case 101:\r\n                        return window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, arr);\r\n                        break;\r\n                    case 2:    //COUNT\r\n                    case 102:\r\n                        return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, arr);\r\n                        break;\r\n                    case 3:    //COUNTA\r\n                    case 103:\r\n                        return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, arr);\r\n                        break;\r\n                    case 4:    //MAX\r\n                    case 104:\r\n                        return window.luckysheet_function.MAX.f.apply(window.luckysheet_function.MAX, arr);\r\n                        break;\r\n                    case 5:    //MIN\r\n                    case 105:\r\n                        return window.luckysheet_function.MIN.f.apply(window.luckysheet_function.MIN, arr);\r\n                        break;\r\n                    case 6:    //PRODUCT\r\n                    case 106:\r\n                        return window.luckysheet_function.PRODUCT.f.apply(window.luckysheet_function.PRODUCT, arr);\r\n                        break;\r\n                    case 7:    //STDEV\r\n                    case 107:\r\n                        return window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, arr);\r\n                        break;\r\n                    case 8:    //STDEVP\r\n                    case 108:\r\n                        return window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, arr);\r\n                        break;\r\n                    case 9:    //SUM\r\n                    case 109:\r\n                        return window.luckysheet_function.SUM.f.apply(window.luckysheet_function.SUM, arr);\r\n                        break;\r\n                    case 10:   //VAR\r\n                    case 110:\r\n                        return window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, arr);\r\n                        break;\r\n                    case 11:   //VARP\r\n                    case 111:\r\n                        return window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, arr);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ASIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < -1 || number > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.asin(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTIF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8303\u56F4\r\n            var data_range = arguments[0];\r\n            var range;\r\n\r\n            if(getObjType(data_range) == \"object\" && data_range.startCell != null){\r\n                range = data_range.data;\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\r\n            var data_criteria = arguments[1];\r\n            var criteria;\r\n\r\n            if(getObjType(data_criteria) == \"array\"){\r\n                criteria = [];\r\n\r\n                if(getObjType(data_criteria[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_criteria)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_criteria.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_criteria[i].length; j++){\r\n                            rowArr.push(data_criteria[i][j]);\r\n                        }\r\n\r\n                        criteria.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_criteria.length; i++){\r\n                        criteria.push(data_criteria[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.rowl > 1 || data_criteria.coll > 1){\r\n                    return 0;\r\n                }\r\n\r\n                criteria = data_criteria.data.v;\r\n            }\r\n            else{\r\n                criteria = data_criteria;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(getObjType(criteria) == \"array\"){\r\n                var result = [];\r\n\r\n                if(getObjType(criteria[0]) == \"array\"){\r\n                    for(var i = 0; i < criteria.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < criteria[i].length; j++){\r\n                            rowArr.push(getCriteriaResult(range, criteria[i][j]));\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < criteria.length; i++){\r\n                        result.push(getCriteriaResult(range, criteria[i]));\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                return getCriteriaResult(range, criteria);\r\n            }\r\n\r\n            function getCriteriaResult(range, criter){\r\n                if (!/[<>=!*?]/.test(criter)) {\r\n                    criter = '==\"' + criter + '\"';\r\n                }\r\n\r\n                criter = criter.replace(\"<>\", \"!=\");\r\n\r\n                var matches = 0;\r\n\r\n                if(getObjType(range) == \"array\"){\r\n                    for (var i = 0; i < range.length; i++) {\r\n                        for(var j = 0; j < range[i].length; j++){\r\n                            if(range[i][j] != null && !isRealNull(range[i][j].v)){\r\n                                var value = range[i][j].v;\r\n\r\n                                if(criter.indexOf(\"*\") > -1 || criter.indexOf(\"?\") > -1){\r\n                                    if(formula.isWildcard(value, criter)){\r\n                                        matches++;\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if (typeof value !== 'string') {\r\n                                        if (new Function(\"return \" + value + criter)()) {\r\n                                            matches++;\r\n                                        }\r\n                                    }\r\n                                    else {\r\n                                        if (new Function(\"return \" + '\"' + value + '\"' + criter)()) {\r\n                                            matches++;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(range != null && !isRealNull(range.v)){\r\n                        var value = range.v;\r\n\r\n                        if(criter.indexOf(\"*\") > -1 || criter.indexOf(\"?\") > -1){\r\n                            if(formula.isWildcard(value, criter)){\r\n                                matches++;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if (typeof value !== 'string') {\r\n                                if (new Function(\"return \" + value + criter)()) {\r\n                                    matches++;\r\n                                }\r\n                            }\r\n                            else {\r\n                                if (new Function(\"return \" + '\"' + value + '\"' + criter)()) {\r\n                                    matches++;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return matches;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RADIANS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return number * Math.PI / 180;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RAND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            return Math.floor(Math.random() * 1000000000) / 1000000000;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTUNIQUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return window.luckysheet_function.UNIQUE.f(dataArr);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEGREES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return number * 180 / Math.PI;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ERFC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return jStat.erfc(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EVEN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var temp = Math.ceil(Math.abs(number));\r\n            temp = (temp & 1) ? temp + 1 : temp;\r\n            return (number > 0) ? temp : -temp;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.exp(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FACT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                if(getObjType(number) == \"boolean\"){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else if(number.toString().toLowerCase() == \"false\"){\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorial(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FACTDOUBLE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                if(getObjType(number) == \"boolean\"){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else if(number.toString().toLowerCase() == \"false\"){\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorialDouble(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PI\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            return Math.PI;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FLOOR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //number\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //significance\r\n            var significance = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(significance)){\r\n                return significance;\r\n            }\r\n\r\n            if(!isRealNum(significance)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            significance = parseFloat(significance);\r\n\r\n            if(significance == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            if(number > 0 && significance < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var precision = -Math.floor(Math.log(Math.abs(significance)) / Math.log(10));\r\n\r\n            if (number >= 0) {\r\n                return (Math.floor(number / significance) * significance) * Math.pow(10, precision) / Math.pow(10, precision);\r\n            }\r\n            else {\r\n                return -((Math.ceil(Math.abs(number) / significance) * significance) * Math.pow(10, precision)) / Math.pow(10, precision);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GCD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(dataArr[0])){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var x = parseInt(dataArr[0]);\r\n\r\n            if(x < 0 || x >= Math.pow(2, 53)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            for (var i = 1; i < dataArr.length; i++) {\r\n                var y = dataArr[i];\r\n\r\n                if(!isRealNum(y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                y = parseInt(y);\r\n\r\n                if(y < 0 || y >= Math.pow(2, 53)){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                while (x && y) {\r\n                    if (x > y) {\r\n                        x %= y;\r\n                    }\r\n                    else {\r\n                        y %= x;\r\n                    }\r\n                }\r\n\r\n                x += y;\r\n            }\r\n\r\n            return x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANDBETWEEN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E0B\u754C\r\n            var bottom = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(bottom)){\r\n                return bottom;\r\n            }\r\n\r\n            if(!isRealNum(bottom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            bottom = parseInt(bottom);\r\n\r\n            //\u4E0A\u754C\r\n            var top = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(top)){\r\n                return top;\r\n            }\r\n\r\n            if(!isRealNum(top)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            top = parseInt(top);\r\n\r\n            if(bottom > top){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u56DB\u820D\u4E94\u5165\u7684\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u4F4D\u6570\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //\u8BA1\u7B97\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.round(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUNDDOWN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u56DB\u820D\u4E94\u5165\u7684\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u4F4D\u6570\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //\u8BA1\u7B97\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUNDUP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u56DB\u820D\u4E94\u5165\u7684\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u4F4D\u6570\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //\u8BA1\u7B97\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.ceil(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SERIESSUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5E42\u7EA7\u6570\u7684\u8F93\u5165\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //x \u7684\u9996\u9879\u4E58\u5E42\r\n            var n = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(n)){\r\n                return n;\r\n            }\r\n\r\n            if(!isRealNum(n)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            n = parseFloat(n);\r\n\r\n            //\u7EA7\u6570\u4E2D\u6BCF\u4E00\u9879\u7684\u4E58\u5E42 n \u7684\u6B65\u957F\u589E\u52A0\u503C\r\n            var m = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(m)){\r\n                return m;\r\n            }\r\n\r\n            if(!isRealNum(m)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            m = parseFloat(m);\r\n\r\n            //\u4E0E x \u7684\u6BCF\u4E2A\u8FDE\u7EED\u4E58\u5E42\u76F8\u4E58\u7684\u4E00\u7EC4\u7CFB\u6570\r\n            var data_coefficients = arguments[3];\r\n            var coefficients = [];\r\n\r\n            if(getObjType(data_coefficients) == \"array\"){\r\n                if(getObjType(data_coefficients[0]) == \"array\" && !func_methods.isDyadicArr(data_coefficients)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                coefficients = coefficients.concat(func_methods.getDataArr(data_coefficients, false));\r\n            }\r\n            else if(getObjType(data_coefficients) == \"object\" && data_coefficients.startCell != null){\r\n                coefficients = coefficients.concat(func_methods.getCellDataArr(data_coefficients, \"number\", false));\r\n            }\r\n            else{\r\n                coefficients.push(data_coefficients);\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(!isRealNum(coefficients[0])){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = parseFloat(coefficients[0]) * Math.pow(x, n);\r\n\r\n            for (var i = 1; i < coefficients.length; i++) {\r\n                var number = coefficients[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                result += number * Math.pow(x, n + i * m);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SIGN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number > 0){\r\n                return 1;\r\n            }\r\n            else if(number == 0){\r\n                return 0;\r\n            }\r\n            else if(number < 0){\r\n                return -1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.sin(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SINH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return (Math.exp(number) - Math.exp(-number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SQRT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.sqrt(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SQRTPI\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.sqrt(number * Math.PI);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GAMMALN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.gammaln(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.cos(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRUNC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u622A\u53D6\u7684\u6570\u636E\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u4F4D\u6570\r\n            if(arguments.length == 2){\r\n                var digits = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(digits)){\r\n                    return digits;\r\n                }\r\n\r\n                if(!isRealNum(digits)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                digits = parseInt(digits);\r\n            }\r\n            else{\r\n                var digits = 0;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUOTIENT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u88AB\u9664\u6570\r\n            var numerator = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(numerator)){\r\n                return numerator;\r\n            }\r\n\r\n            if(!isRealNum(numerator)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            numerator = parseFloat(numerator);\r\n\r\n            //\u9664\u6570\r\n            var denominator = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(denominator)){\r\n                return denominator;\r\n            }\r\n\r\n            if(!isRealNum(denominator)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            denominator = parseFloat(denominator);\r\n\r\n            if(denominator == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return parseInt(numerator / denominator, 10);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"POWER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5E95\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u6307\u6570\r\n            var power = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(power)){\r\n                return power;\r\n            }\r\n\r\n            if(!isRealNum(power)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            power = parseFloat(power);\r\n\r\n            if(number == 0 && power == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number < 0 && power.toString().indexOf(\".\") > -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.pow(number, power);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMIFS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var rangeData = formula.getRangeArray(args[0])[0];\r\n            var results = new Array(rangeData.length);\r\n\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n\r\n            for(var i = 1; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n\r\n            for(var i = 0; i < rangeData.length; i++){\r\n                if(results[i]){\r\n                    sum = luckysheet_calcADPMM(sum, \"+\", rangeData[i]); //parseFloat(rangeData[i]);\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTIFS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var results = new Array(formula.getRangeArray(args[0])[0].length);\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n            for(var i = 0; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n            var result = 0;\r\n            for(var i = 0; i < results.length; i++){\r\n                if(results[i]){\r\n                    result++;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRODUCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var result = 1;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                result *= number;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HARMEAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var den = 0, len = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                den += 1 / number;\r\n                len++;\r\n            }\r\n\r\n            return len / den;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HYPGEOMDIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6837\u672C\u4E2D\u6210\u529F\u7684\u6B21\u6570\r\n            var sample_s = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(sample_s)){\r\n                return sample_s;\r\n            }\r\n\r\n            if(!isRealNum(sample_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            sample_s = parseInt(sample_s);\r\n\r\n            //\u6837\u672C\u91CF\r\n            var number_sample = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_sample)){\r\n                return number_sample;\r\n            }\r\n\r\n            if(!isRealNum(number_sample)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_sample = parseInt(number_sample);\r\n\r\n            //\u603B\u4F53\u4E2D\u6210\u529F\u7684\u6B21\u6570\r\n            var population_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(population_s)){\r\n                return population_s;\r\n            }\r\n\r\n            if(!isRealNum(population_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            population_s = parseInt(population_s);\r\n\r\n            //\u603B\u4F53\u5927\u5C0F\r\n            var number_pop = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(number_pop)){\r\n                return number_pop;\r\n            }\r\n\r\n            if(!isRealNum(number_pop)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_pop = parseInt(number_pop);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[4]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(sample_s < 0 || sample_s > Math.min(number_sample, population_s) || sample_s < Math.max(0, number_sample - number_pop + population_s)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_sample <= 0 || number_sample > number_pop){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(population_s <= 0 || population_s > number_pop){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_pop <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function pdf(x, n, M, N) {\r\n                var a = func_methods.factorial(M) / (func_methods.factorial(x) * func_methods.factorial(M - x));\r\n                var b = func_methods.factorial(N - M) / (func_methods.factorial(n - x) * func_methods.factorial(N - M - n + x));\r\n                var c = func_methods.factorial(N) / (func_methods.factorial(n) * func_methods.factorial(N - n));\r\n\r\n                return a * b / c;\r\n            }\r\n\r\n            function cdf(x, n, M, N) {\r\n                var sum = 0;\r\n\r\n                for (var i = 0; i <= x; i++) {\r\n                    sum += pdf(i, n, M, N);\r\n                }\r\n\r\n                return sum;\r\n            }\r\n\r\n            return (cumulative) ? cdf(sample_s, number_sample, population_s, number_pop) : pdf(sample_s, number_sample, population_s, number_pop);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INTERCEPT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x\u8F74\u4E0A\u7528\u4E8E\u9884\u6D4B\u7684\u503C\r\n            var x = 0;\r\n\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(func_methods.variance_s(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            var b = num / den;\r\n            var a = ymean - b * xmean;\r\n\r\n            return a + b * x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"KURT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //\u5254\u9664\u4E0D\u662F\u6570\u503C\u7C7B\u578B\u7684\u503C\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length < 4 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n\r\n            var sigma = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 4);\r\n            }\r\n\r\n            sigma = sigma / Math.pow(jStat.stdev(dataArr_n, true), 4);\r\n\r\n            return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - 3 * (n - 1) * (n - 1) / ((n - 2) * (n - 3));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LARGE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u7EC4\u6216\u8303\u56F4\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number)\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            //\u8981\u8FD4\u56DE\u7684\u5143\u7D20\u7684\u6392\u884C\u4F4D\u7F6E\r\n            var n;\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                n = func_methods.getDataArr(arguments[1]);\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                if(arguments[1].rowl > 1 || arguments[1].coll > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var cell = arguments[1].data;\r\n\r\n                if(cell == null || isRealNull(cell.v)){\r\n                    var n = 0;\r\n                }\r\n                else{\r\n                    var n = cell.v;\r\n                }\r\n            }\r\n            else{\r\n                n = arguments[1];\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(getObjType(n) == \"array\"){\r\n                if(dataArr_n.length == 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                var result = [];\r\n\r\n                for(var i = 0; i < n.length; i++){\r\n                    if(!isRealNum(n[i])){\r\n                        result.push(formula.error.v);\r\n                        continue;\r\n                    }\r\n\r\n                    n[i] = Math.ceil(parseFloat(n[i]));\r\n\r\n                    if(n[i] <= 0 || n[i] > dataArr_n.length){\r\n                        result.push(formula.error.nm);\r\n                        continue;\r\n                    }\r\n\r\n                    result.push(dataArr.sort(function(a, b) { return b - a; })[n[i] - 1]);\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                if(!isRealNum(n)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                n = Math.ceil(parseFloat(n));\r\n\r\n                if(dataArr_n.length == 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if(n <= 0 || n > dataArr_n.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return dataArr.sort(function(a, b) {\r\n                    return b - a;\r\n                })[n - 1];\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STDEVA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //\u4E0D\u662F\u6570\u503C\u7C7B\u578B\u7684\u503C\u8F6C\u5316\u6210\u6570\u5B57\uFF08true\u4E3A1\uFF0Cfalse\u548C\u6587\u672C\u4E3A0\uFF09\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else{\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    number = parseFloat(number);\r\n                }\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(dataArr_n.length == 1){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return func_methods.standardDeviation_s(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STDEVP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //\u5254\u9664\u4E0D\u662F\u6570\u503C\u7C7B\u578B\u7684\u503C\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(dataArr_n.length == 1){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return func_methods.standardDeviation(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GEOMEAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    if(getObjType(data) == \"boolean\"){\r\n                        if(data.toString().toLowerCase() == \"true\"){\r\n                            dataArr.push(1);\r\n                        }\r\n                        else if(data.toString().toLowerCase() == \"false\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u5254\u9664\u4E0D\u662F\u6570\u503C\u7C7B\u578B\u7684\u503C\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    continue;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.geomean(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANK_EQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u786E\u5B9A\u5176\u6392\u540D\u7684\u503C\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_ref = arguments[1];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var num = ref[j];\r\n\r\n                if(!isRealNum(num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num = parseFloat(num);\r\n\r\n                ref_n.push(num);\r\n            }\r\n\r\n            //\u8981\u6309\u5347\u5E8F\u8FD8\u662F\u6309\u964D\u5E8F\u8003\u8651\u201Cdata\u201D\u4E2D\u7684\u503C\r\n            if(arguments.length == 3){\r\n                var order = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(order)){\r\n                    return order;\r\n                }\r\n            }\r\n            else{\r\n                var order = false;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sort = (order) ? function(a, b) {\r\n                return a - b;\r\n            } : function(a, b) {\r\n                return b - a;\r\n            };\r\n\r\n            ref_n = ref_n.sort(sort);\r\n\r\n            var index = ref_n.indexOf(number);\r\n\r\n            if(index == -1){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return index + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANK_AVG\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u786E\u5B9A\u5176\u6392\u540D\u7684\u503C\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_ref = arguments[1];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var num = ref[j];\r\n\r\n                if(!isRealNum(num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num = parseFloat(num);\r\n\r\n                ref_n.push(num);\r\n            }\r\n\r\n            //\u8981\u6309\u5347\u5E8F\u8FD8\u662F\u6309\u964D\u5E8F\u8003\u8651\u201Cdata\u201D\u4E2D\u7684\u503C\r\n            if(arguments.length == 3){\r\n                var order = func_methods.getFirstValue(arguments[2]);\r\n\r\n                if(valueIsError(order)){\r\n                    return order;\r\n                }\r\n\r\n                if(getObjType(order) == \"boolean\"){\r\n\r\n                }\r\n                else if(getObjType(order) == \"string\" && (order.toLowerCase() == \"true\" || order.toLowerCase() == \"false\")){\r\n                    if(order.toLowerCase() == \"true\"){\r\n                        order = true;\r\n                    }\r\n\r\n                    if(order.toLowerCase() == \"false\"){\r\n                        order = false;\r\n                    }\r\n                }\r\n                else if(isRealNum(order)){\r\n                    order = parseFloat(order);\r\n\r\n                    order = order == 0 ? false : true;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                var order = false;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sort = (order) ? function(a, b) {\r\n                return a - b;\r\n            } : function(a, b) {\r\n                return b - a;\r\n            };\r\n\r\n            ref_n = ref_n.sort(sort);\r\n\r\n            var count = 0;\r\n            for (var i = 0; i < ref_n.length; i++) {\r\n                if (ref_n[i] == number) {\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            return (count > 1) ? (2 * ref_n.indexOf(number) + count + 1) / 2 : ref_n.indexOf(number) + 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTRANK_EXC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_ref = arguments[0];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var number = ref[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                ref_n.push(number);\r\n            }\r\n\r\n            //\u8981\u786E\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u8981\u5728\u8BA1\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6570\r\n            if(arguments.length == 3){\r\n                var significance = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(significance)){\r\n                    return significance;\r\n                }\r\n\r\n                if(!isRealNum(significance)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                significance = parseInt(significance);\r\n            }\r\n            else{\r\n                var significance = 3;\r\n            }\r\n\r\n            if(ref_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(significance < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(ref_n.length == 1 && ref_n[0] == x){\r\n                return 1;\r\n            }\r\n\r\n            ref_n = ref_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n            var uniques = window.luckysheet_function.UNIQUE.f(ref_n)[0];\r\n\r\n            var n = ref_n.length;\r\n            var m = uniques.length;\r\n\r\n            var power = Math.pow(10, significance);\r\n            var result = 0;\r\n            var match = false;\r\n            var i = 0;\r\n\r\n            while (!match && i < m) {\r\n                if (x === uniques[i]) {\r\n                    result = (ref_n.indexOf(uniques[i]) + 1) / (n + 1);\r\n                    match = true;\r\n                }\r\n                else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n                    result = (ref_n.lastIndexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\r\n                    match = true;\r\n                }\r\n\r\n                i++;\r\n            }\r\n\r\n            if(isNaN(result)){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return Math.floor(result * power) / power;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTRANK_INC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_ref = arguments[0];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var number = ref[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                ref_n.push(number);\r\n            }\r\n\r\n            //\u8981\u786E\u5B9A\u5176\u767E\u5206\u6BD4\u6392\u4F4D\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u8981\u5728\u8BA1\u7B97\u4E2D\u4F7F\u7528\u7684\u6709\u6548\u4F4D\u6570\r\n            if(arguments.length == 3){\r\n                var significance = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(significance)){\r\n                    return significance;\r\n                }\r\n\r\n                if(!isRealNum(significance)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                significance = parseInt(significance);\r\n            }\r\n            else{\r\n                var significance = 3;\r\n            }\r\n\r\n            if(ref_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(significance < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(ref_n.length == 1 && ref_n[0] == x){\r\n                return 1;\r\n            }\r\n\r\n            ref_n = ref_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n            var uniques = window.luckysheet_function.UNIQUE.f(ref_n)[0];\r\n\r\n            var n = ref_n.length;\r\n            var m = uniques.length;\r\n\r\n            var power = Math.pow(10, significance);\r\n            var result = 0;\r\n            var match = false;\r\n            var i = 0;\r\n\r\n            while (!match && i < m) {\r\n                if (x === uniques[i]) {\r\n                    result = ref_n.indexOf(uniques[i]) / (n - 1);\r\n                    match = true;\r\n                }\r\n                else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n                    result = (ref_n.lastIndexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\r\n                    match = true;\r\n                }\r\n\r\n                i++;\r\n            }\r\n\r\n            if(isNaN(result)){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return Math.floor(result * power) / power;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FORECAST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x\u8F74\u4E0A\u7528\u4E8E\u9884\u6D4B\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[2];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(func_methods.variance_s(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            var b = num / den;\r\n            var a = ymean - b * xmean;\r\n\r\n            return a + b * x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FISHERINV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var y = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            if(!isRealNum(y)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            y = parseFloat(y);\r\n\r\n            var e2y = Math.exp(2 * y);\r\n\r\n            return (e2y - 1) / (e2y + 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FISHER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            if(x <= -1 || x >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log((1 + x) / (1 - x)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MODE_SNGL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            var count = {};\r\n            var maxItems = [];\r\n            var max = 0;\r\n            var currentItem;\r\n\r\n            for (var i = 0; i < dataArr_n.length; i++) {\r\n                currentItem = dataArr_n[i];\r\n                count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\r\n\r\n                if (count[currentItem] > max) {\r\n                    max = count[currentItem];\r\n                    maxItems = [];\r\n                }\r\n\r\n                if (count[currentItem] == max) {\r\n                    maxItems[maxItems.length] = currentItem;\r\n                }\r\n            }\r\n\r\n            if(max <= 1){\r\n                return formula.error.na;\r\n            }\r\n\r\n            var resultIndex = dataArr_n.indexOf(maxItems[0]);\r\n\r\n            for(var j = 0; j < maxItems.length; j++){\r\n                var index = dataArr_n.indexOf(maxItems[j]);\r\n\r\n                if(index < resultIndex){\r\n                    resultIndex = index;\r\n                }\r\n            }\r\n\r\n            return dataArr_n[resultIndex];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEIBULL_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //WEIBULL \u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //Weibull \u5206\u5E03\u51FD\u6570\u7684\u5F62\u72B6\u53C2\u6570\r\n            var alpha = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            //Weibull \u5206\u5E03\u51FD\u6570\u7684\u5C3A\u5EA6\u53C2\u6570\r\n            var beta = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(beta)){\r\n                return beta;\r\n            }\r\n\r\n            if(!isRealNum(beta)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            beta = parseFloat(beta);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0 || alpha <= 0 || beta <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? 1 - Math.exp(-Math.pow(x / beta, alpha)) : Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha / Math.pow(beta, alpha);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVEDEV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.sum(jStat(dataArr_n).subtract(jStat.mean(dataArr_n)).abs()[0]) / dataArr_n.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0,\r\n                count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    sum += parseFloat(number);\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        sum += 1;\r\n                    }\r\n                    else{\r\n                        sum += 0;\r\n                    }\r\n                }\r\n\r\n                count++;\r\n            }\r\n\r\n            if(count == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return sum / count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BINOM_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8BD5\u9A8C\u7684\u6210\u529F\u6B21\u6570\r\n            var number_s = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_s)){\r\n                return number_s;\r\n            }\r\n\r\n            if(!isRealNum(number_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_s = parseInt(number_s);\r\n\r\n            //\u72EC\u7ACB\u68C0\u9A8C\u7684\u6B21\u6570\r\n            var trials = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(trials)){\r\n                return trials;\r\n            }\r\n\r\n            if(!isRealNum(trials)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            trials = parseInt(trials);\r\n\r\n            //\u4EFB\u4E00\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\r\n            var probability_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //\u662F\u5426\u4F7F\u7528\u4E8C\u9879\u5F0F\u7D2F\u79EF\u5206\u5E03\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(number_s < 0 || number_s > trials){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.binomial.cdf(number_s, trials, probability_s) : jStat.binomial.pdf(number_s, trials, probability_s);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BINOM_INV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D1D\u52AA\u5229\u8BD5\u9A8C\u6B21\u6570\r\n            var trials = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(trials)){\r\n                return trials;\r\n            }\r\n\r\n            if(!isRealNum(trials)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            trials = parseInt(trials);\r\n\r\n            //\u4EFB\u4E00\u6B21\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\r\n            var probability_s = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //\u671F\u671B\u7684\u4E34\u754C\u6982\u7387\r\n            var alpha = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            if(trials < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(alpha < 0 || alpha > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var x = 0;\r\n            while (x <= trials) {\r\n                if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\r\n                    return x;\r\n                }\r\n\r\n                x++;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONFIDENCE_NORM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7F6E\u4FE1\u6C34\u5E73\r\n            var alpha = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            //\u6570\u636E\u533A\u57DF\u7684\u603B\u4F53\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //\u6837\u672C\u603B\u91CF\u7684\u5927\u5C0F\r\n            var size = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(size)){\r\n                return size;\r\n            }\r\n\r\n            if(!isRealNum(size)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            size = parseInt(size);\r\n\r\n            if(alpha <= 0 || alpha >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(size < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.normalci(1, alpha, standard_dev, size)[1] - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CORREL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0 || func_methods.standardDeviation(data_y) == 0 || func_methods.standardDeviation(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return jStat.corrcoeff(data_y, data_x);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COVARIANCE_P\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_x.length == 0 || data_y.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var mean1 = jStat.mean(data_x);\r\n            var mean2 = jStat.mean(data_y);\r\n\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                result += (data_x[i] - mean1) * (data_y[i] - mean2);\r\n            }\r\n\r\n            result = result / data_x.length;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COVARIANCE_S\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_x.length == 0 || data_y.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return jStat.covariance(data_x, data_y);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEVSQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        if(getObjType(data) == \"boolean\"){\r\n                            if(data.toString().toLowerCase() == \"true\"){\r\n                                dataArr.push(1);\r\n                            }\r\n                            else if(data.toString().toLowerCase() == \"false\"){\r\n                                dataArr.push(0);\r\n                            }\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            var mean = jStat.mean(dataArr_n);\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < dataArr_n.length; i++) {\r\n                result += Math.pow((dataArr_n[i] - mean), 2);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXPON_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u7528\u4E8E\u6307\u5B9A\u6307\u6570\u5206\u5E03\u51FD\u6570\u7684 lambda \u503C\r\n            var lambda = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(lambda)){\r\n                return lambda;\r\n            }\r\n\r\n            if(!isRealNum(lambda)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            lambda = parseFloat(lambda);\r\n\r\n            //\u662F\u5426\u4F7F\u7528\u6307\u6570\u7D2F\u79EF\u5206\u5E03\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(lambda < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEIF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var count = 0;\r\n\r\n            var rangeData = arguments[0].data;\r\n            var rangeRow = arguments[0].rowl;\r\n            var rangeCol = arguments[0].coll;\r\n            var criteria = luckysheet_parseData(arguments[1]);\r\n            var sumRangeData = [];\r\n\r\n            //\u5982\u679C\u6709\u7B2C\u4E09\u4E2A\u53C2\u6570\r\n            if(arguments[2]){\r\n                //\u6839\u636E\u9009\u62E9\u7684\u76EE\u6807\u7684\u533A\u57DF\u786E\u5B9A\u5B9E\u9645\u76EE\u6807\u533A\u57DF\r\n                //\u521D\u59CB\u4F4D\u7F6E\r\n                var sumRangeStart = arguments[2].startCell;\r\n                var sumRangeRow = arguments[2].rowl;\r\n                var sumRangeCol = arguments[2].coll;\r\n                var sumRangeSheet = arguments[2].sheetName;\r\n\r\n                if(rangeRow == sumRangeRow && rangeCol == sumRangeCol){\r\n                    sumRangeData = arguments[2].data;\r\n                }\r\n                else{\r\n                    var row=[],col=[];\r\n                    var sumRangeEnd = \"\";\r\n                    var realSumRange = \"\";\r\n                    //console.log(\"\u5F00\u59CB\u4F4D\u7F6E\uFF01\uFF01\uFF01\",sumRangeStart,typeof(sumRangeStart));\r\n                    row[0] = parseInt(sumRangeStart.replace(/[^0-9]/g,\"\")) - 1;\r\n                    col[0] = ABCatNum(sumRangeStart.replace(/[^A-Za-z]/g,\"\"));\r\n\r\n                    //\u6839\u636E\u7B2C\u4E00\u4E2A\u8303\u56F4\u7684\u957F\u5BBD\u786E\u5B9A\u76EE\u6807\u8303\u56F4\u7684\u672B\u5C3E\u4F4D\u7F6E\r\n                    row[1] = row[0] + rangeRow - 1;\r\n                    col[1] = col[0] + rangeCol - 1;\r\n\r\n                    //console.log(row[0],col[0],row[1],col[1]);\r\n                    //\u672B\u5C3E\u4F4D\u7F6E\u8F6C\u5316\u4E3Asheet\u683C\u5F0F\uFF1A\u5982 F4\r\n                    var real_ABC = chatatABC(col[1]);\r\n                    var real_Num = row[1] + 1;\r\n                    sumRangeEnd = real_ABC + real_Num;\r\n                    //console.log(\"\u5408\u6210\u65B0\u7684\u672B\u5C3E\u4F4D\u7F6E\uFF1A\" + sumRangeEnd);\r\n\r\n                    realSumRange = sumRangeSheet + \"!\" +sumRangeStart + \":\" + sumRangeEnd;\r\n                    sumRangeData = luckysheet_getcelldata(realSumRange).data;\r\n                    //console.log(\"\u6700\u7EC8\u7684\u76EE\u6807\u8303\u56F4\uFF1A\",sumRangeData);\r\n                }\r\n\r\n                sumRangeData = formula.getRangeArray(sumRangeData)[0];\r\n            }\r\n            rangeData = formula.getRangeArray(rangeData)[0];\r\n\r\n            //\u5FAA\u73AF\u904D\u5386\u67E5\u627E\u5339\u914D\u9879\r\n            for(var i = 0; i < rangeData.length;i++){\r\n                var v = rangeData[i];\r\n                if(!!v && formula.acompareb(v, criteria)){\r\n                    var vnow = sumRangeData[i] || v;\r\n\r\n                    if(!isRealNum(vnow)){\r\n                        continue;\r\n                    }\r\n\r\n                    sum += parseFloat(vnow);\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            if(sum == 0 || count == 0){\r\n                return formula.error.d;\r\n            }\r\n            else{\r\n                return numFormat(sum / count);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEIFS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var count = 0;\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var rangeData = formula.getRangeArray(args[0])[0];\r\n            var results = new Array(rangeData.length);\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n            for(var i = 1; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n            for(var i = 0; i < rangeData.length; i++){\r\n                if(results[i] && isRealNum(rangeData[i])){\r\n                    sum += parseFloat(rangeData[i]);\r\n                    count ++;\r\n                }\r\n            }\r\n\r\n            if(sum == 0 || count == 0){\r\n                return formula.error.d;\r\n            }\r\n            else{\r\n                return numFormat(sum / count);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERMUT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8868\u793A\u5BF9\u8C61\u4E2A\u6570\u7684\u6574\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            //\u8868\u793A\u6BCF\u4E2A\u6392\u5217\u4E2D\u5BF9\u8C61\u4E2A\u6570\u7684\u6574\u6570\r\n            var number_chosen = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_chosen)){\r\n                return number_chosen;\r\n            }\r\n\r\n            if(!isRealNum(number_chosen)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_chosen = parseInt(number_chosen);\r\n\r\n            if(number <= 0 || number_chosen < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number < number_chosen){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorial(number) / func_methods.factorial(number - number_chosen);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRIMMEAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u76F8\u5173\u6570\u636E\u96C6\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u6392\u9664\u6BD4\u4F8B\r\n            var percent = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(percent)){\r\n                return percent;\r\n            }\r\n\r\n            if(!isRealNum(percent)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            percent = parseFloat(percent);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(percent < 0 || percent > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function rest(array, idx) {\r\n                idx = idx || 1;\r\n                if (!array || typeof array.slice !== 'function') {\r\n                    return array;\r\n                }\r\n                return array.slice(idx);\r\n            };\r\n\r\n            function initial(array, idx) {\r\n                idx = idx || 1;\r\n                if (!array || typeof array.slice !== 'function') {\r\n                    return array;\r\n                }\r\n                return array.slice(0, array.length - idx);\r\n            };\r\n\r\n            dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            })\r\n\r\n            var trim = window.luckysheet_function.FLOOR.f(dataArr_n.length * percent, 2) / 2;\r\n\r\n            var result = rest(dataArr_n, trim);\r\n            result = initial(result, trim);\r\n            result = jStat.mean(result);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTILE_EXC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B9A\u4E49\u76F8\u5BF9\u4F4D\u7F6E\u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF0C\u4E0D\u5305\u542B 0 \u548C 1\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseFloat(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k <= 0 || k >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            dataArr_n = dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n\r\n            var n = dataArr_n.length;\r\n\r\n            if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var l = k * (n + 1) - 1;\r\n            var fl = Math.floor(l);\r\n\r\n            return (l === fl) ? dataArr_n[l] : dataArr_n[fl] + (l - fl) * (dataArr_n[fl + 1] - dataArr_n[fl]);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTILE_INC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B9A\u4E49\u76F8\u5BF9\u4F4D\u7F6E\u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //0 \u5230 1 \u4E4B\u95F4\u7684\u767E\u5206\u70B9\u503C\uFF0C\u4E0D\u5305\u542B 0 \u548C 1\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseFloat(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k < 0 || k > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            dataArr_n = dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n\r\n            var n = dataArr_n.length;\r\n\r\n            var l = k * (n - 1);\r\n            var fl = Math.floor(l);\r\n\r\n            return (l === fl) ? dataArr_n[l] : dataArr_n[fl] + (l - fl) * (dataArr_n[fl + 1] - dataArr_n[fl]);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PEARSON\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den1 = 0;\r\n            var den2 = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den1 += Math.pow(data_x[i] - xmean, 2);\r\n                den2 += Math.pow(data_y[i] - ymean, 2);\r\n            }\r\n\r\n            return num / Math.sqrt(den1 * den2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_S_INV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5BF9\u5E94\u4E8E\u6B63\u6001\u5206\u5E03\u7684\u6982\u7387\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.normal.inv(probability, 0, 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_S_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u9700\u8981\u8BA1\u7B97\u5176\u5206\u5E03\u7684\u6570\u503C\r\n            var z = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(z)){\r\n                return z;\r\n            }\r\n\r\n            if(!isRealNum(z)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            z = parseFloat(z);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[1]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            return (cumulative) ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_INV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5BF9\u5E94\u4E8E\u6B63\u6001\u5206\u5E03\u7684\u6982\u7387\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                if(getObjType(probability) == \"boolean\"){\r\n                    if(probability.toString().toLowerCase() == \"true\"){\r\n                        probability = 1;\r\n                    }\r\n                    else if(probability.toString().toLowerCase() == \"false\"){\r\n                        probability = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //\u5206\u5E03\u7684\u7B97\u672F\u5E73\u5747\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                if(getObjType(mean) == \"boolean\"){\r\n                    if(mean.toString().toLowerCase() == \"true\"){\r\n                        mean = 1;\r\n                    }\r\n                    else if(mean.toString().toLowerCase() == \"false\"){\r\n                        mean = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                if(getObjType(standard_dev) == \"boolean\"){\r\n                    if(standard_dev.toString().toLowerCase() == \"true\"){\r\n                        standard_dev = 1;\r\n                    }\r\n                    else if(standard_dev.toString().toLowerCase() == \"false\"){\r\n                        standard_dev = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return jStat.normal.inv(probability, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u9700\u8981\u8BA1\u7B97\u5176\u5206\u5E03\u7684\u6570\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                if(getObjType(x) == \"boolean\"){\r\n                    if(x.toString().toLowerCase() == \"true\"){\r\n                        x = 1;\r\n                    }\r\n                    else if(x.toString().toLowerCase() == \"false\"){\r\n                        x = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u5206\u5E03\u7684\u7B97\u672F\u5E73\u5747\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NEGBINOM_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6A21\u62DF\u7684\u5931\u8D25\u6B21\u6570\r\n            var number_f = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_f)){\r\n                return number_f;\r\n            }\r\n\r\n            if(!isRealNum(number_f)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_f = parseInt(number_f);\r\n\r\n            //\u8981\u6A21\u62DF\u7684\u6210\u529F\u6B21\u6570\r\n            var number_s = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_s)){\r\n                return number_s;\r\n            }\r\n\r\n            if(!isRealNum(number_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_s = parseInt(number_s);\r\n\r\n            //\u4EFB\u4E00\u6B21\u7ED9\u5B9A\u68C0\u9A8C\u7684\u6210\u529F\u6982\u7387\r\n            var probability_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_f < 0 || number_s < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.negbin.cdf(number_f, number_s, probability_s) : jStat.negbin.pdf(number_f, number_s, probability_s);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return (dataArr_n.length === 0) ? 0 : Math.min.apply(Math, dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MEDIAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            return jStat.median(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MAXA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return (dataArr_n.length === 0) ? 0 : Math.max.apply(Math, dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGNORM_INV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E0E\u5BF9\u6570\u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //ln(x) \u7684\u5E73\u5747\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //ln(x) \u7684\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.lognormal.inv(probability, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGNORM_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E0E\u5BF9\u6570\u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //ln(x) \u7684\u5E73\u5747\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //ln(x) \u7684\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x <= 0 || standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"Z_TEST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u6765\u68C0\u9A8C x \u7684\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u8981\u6D4B\u8BD5\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //\u603B\u4F53\uFF08\u5DF2\u77E5\uFF09\u6807\u51C6\u504F\u5DEE\u3002 \u5982\u679C\u7701\u7565\uFF0C\u5219\u4F7F\u7528\u6837\u672C\u6807\u51C6\u504F\u5DEE\r\n            var sigma = func_methods.standardDeviation_s(dataArr_n);\r\n            if(arguments.length == 3){\r\n                sigma = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(sigma)){\r\n                    return sigma;\r\n                }\r\n\r\n                if(!isRealNum(sigma)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sigma = parseFloat(sigma);\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var n = dataArr_n.length;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n\r\n            return 1 - window.luckysheet_function.NORM_S_DIST.f((mean - x) / (sigma / Math.sqrt(n)), \"true\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x_range\r\n            var data_x_range = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_x_range = data_x_range.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_x_range = data_x_range.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                data_x_range.push(arguments[0]);\r\n            }\r\n\r\n            //prob_range\r\n            var data_prob_range = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_prob_range = data_prob_range.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                data_prob_range = data_prob_range.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                data_prob_range.push(arguments[1]);\r\n            }\r\n\r\n            if(data_x_range.length != data_prob_range.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //data_x_range \u548C data_prob_range \u53EA\u53D6\u6570\u503C\r\n            var x_range = [], prob_range = [], prob_range_sum = 0;\r\n\r\n            for(var i = 0; i < data_x_range.length; i++){\r\n                var num_x_range = data_x_range[i];\r\n                var num_prob_range = data_prob_range[i];\r\n\r\n                if(isRealNum(num_x_range) && isRealNum(num_prob_range)){\r\n                    x_range.push(parseFloat(num_x_range));\r\n                    prob_range.push(parseFloat(num_prob_range));\r\n\r\n                    prob_range_sum += parseFloat(num_prob_range);\r\n\r\n                    if(parseFloat(num_prob_range) <= 0 || parseFloat(num_prob_range) > 1){\r\n                        return formula.error.nm;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(prob_range_sum != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8981\u8BA1\u7B97\u5176\u6982\u7387\u7684\u6570\u503C\u4E0B\u754C\r\n            var lower_limit = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(lower_limit)){\r\n                return lower_limit;\r\n            }\r\n\r\n            if(!isRealNum(lower_limit)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            lower_limit = parseFloat(lower_limit);\r\n\r\n            //\u8981\u8BA1\u7B97\u5176\u6982\u7387\u7684\u6570\u503C\u4E0A\u754C\r\n            var upper_limit = lower_limit;\r\n            if(arguments.length == 4){\r\n                upper_limit = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(upper_limit)){\r\n                    return upper_limit;\r\n                }\r\n\r\n                if(!isRealNum(upper_limit)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                upper_limit = parseFloat(upper_limit);\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < x_range.length; i++) {\r\n                if (x_range[i] >= lower_limit && x_range[i] <= upper_limit) {\r\n                    result += prob_range[i];\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUARTILE_EXC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6570\u503C\u7684\u6570\u7EC4\u6216\u6570\u5B57\u578B\u5355\u5143\u683C\u533A\u57DF\r\n            var data_array = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(arguments[0]);\r\n            }\r\n\r\n            var array = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                var number = data_array[i];\r\n\r\n                if(isRealNum(number)){\r\n                    array.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u8981\u8FD4\u56DE\u7B2C\u51E0\u4E2A\u56DB\u5206\u4F4D\u503C\r\n            var quart = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(quart)){\r\n                return quart;\r\n            }\r\n\r\n            if(!isRealNum(quart)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            quart = parseInt(quart);\r\n\r\n            if(array.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(quart <= 0 || quart >= 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            switch (quart) {\r\n                case 1:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.25);\r\n                case 2:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.5);\r\n                case 3:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.75);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUARTILE_INC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6C42\u5F97\u56DB\u5206\u4F4D\u6570\u503C\u7684\u6570\u7EC4\u6216\u6570\u5B57\u578B\u5355\u5143\u683C\u533A\u57DF\r\n            var data_array = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(arguments[0]);\r\n            }\r\n\r\n            var array = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                var number = data_array[i];\r\n\r\n                if(isRealNum(number)){\r\n                    array.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u8981\u8FD4\u56DE\u7B2C\u51E0\u4E2A\u56DB\u5206\u4F4D\u503C\r\n            var quart = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(quart)){\r\n                return quart;\r\n            }\r\n\r\n            if(!isRealNum(quart)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            quart = parseInt(quart);\r\n\r\n            if(array.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(quart < 0 || quart > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            switch (quart) {\r\n                case 0:\r\n                    return Math.min.apply(Math, array);\r\n                case 1:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.25);\r\n                case 2:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.5);\r\n                case 3:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.75);\r\n                case 4:\r\n                    return Math.max.apply(Math, array);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"POISSON_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E8B\u4EF6\u6570\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseInt(x);\r\n\r\n            //\u671F\u671B\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0 || mean < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RSQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return Math.pow(window.luckysheet_function.PEARSON.f(data_y, data_x), 2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u81EA\u7531\u5EA6\u6570\u503C\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            //\u51B3\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.studentt.cdf(x, degrees_freedom) : jStat.studentt.pdf(x, degrees_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST_2T\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u81EA\u7531\u5EA6\u6570\u503C\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            if(x < 0 || degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (1 - jStat.studentt.cdf(x , degrees_freedom)) * 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST_RT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-\u5206\u5E03\u51FD\u6570\u7684\u8F93\u5165\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u81EA\u7531\u5EA6\u6570\u503C\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            if(degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 1 - jStat.studentt.cdf(x , degrees_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_INV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E0E\u5B66\u751F\u7684 t \u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //\u81EA\u7531\u5EA6\u6570\u503C\r\n            var deg_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(deg_freedom)){\r\n                return deg_freedom;\r\n            }\r\n\r\n            if(!isRealNum(deg_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            deg_freedom = parseInt(deg_freedom);\r\n\r\n            if(probability <= 0 || probability > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(deg_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.studentt.inv(probability, deg_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_INV_2T\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E0E\u5B66\u751F\u7684 t \u5206\u5E03\u76F8\u5173\u7684\u6982\u7387\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //\u81EA\u7531\u5EA6\u6570\u503C\r\n            var deg_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(deg_freedom)){\r\n                return deg_freedom;\r\n            }\r\n\r\n            if(!isRealNum(deg_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            deg_freedom = parseInt(deg_freedom);\r\n\r\n            if(probability <= 0 || probability > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(deg_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_TEST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u636E\u96C6\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[0]);\r\n            }\r\n\r\n            // var data_x = [];\r\n            var data_x = known_x;\r\n\r\n            //\u7B2C\u4E8C\u4E2A\u6570\u636E\u96C6\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[1]);\r\n            }\r\n\r\n            // var data_y = [];\r\n            var data_y = known_y;\r\n\r\n            //\u6307\u5B9A\u5206\u5E03\u7684\u5C3E\u6570\r\n            var tails = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(tails)){\r\n                return tails;\r\n            }\r\n\r\n            if(!isRealNum(tails)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            tails = parseInt(tails);\r\n\r\n            //\u6307\u5B9A t \u68C0\u9A8C\u7684\u7C7B\u578B\r\n            var type = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseInt(type);\r\n\r\n            if([1,2].indexOf(tails) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if([1,2,3].indexOf(type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var t = null, df = null;\r\n            if(type == 1){\r\n                var diff_arr = [];\r\n\r\n                for (i = 0; i < data_x.length; i++) {\r\n                    diff_arr.push(data_x[i] - data_y[i]);\r\n                }\r\n\r\n                var diff_mean = Math.abs(jStat.mean(diff_arr));\r\n                var diff_sd = func_methods.standardDeviation_s(diff_arr);\r\n\r\n                t = diff_mean / (diff_sd / Math.sqrt(data_x.length));\r\n                df = data_x.length - 1;\r\n            }\r\n            else{\r\n                var mean_x = jStat.mean(data_x);\r\n                var mean_y = jStat.mean(data_y);\r\n\r\n                var s_x = func_methods.variance_s(data_x);\r\n                var s_y = func_methods.variance_s(data_y);\r\n\r\n                t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / data_x.length + s_y / data_y.length);\r\n\r\n                switch(type){\r\n                    case 2:\r\n                        df = data_x.length + data_y.length - 2;\r\n                        break;\r\n                    case 3:\r\n                        df = Math.pow(s_x / data_x.length + s_y / data_y.length, 2) / (Math.pow(s_x / data_x.length, 2) / (data_x.length - 1) + Math.pow(s_y / data_y.length, 2) / (data_y.length - 1));\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if(tails == 1){\r\n                var result = window.luckysheet_function.T_DIST_RT.f(t, df);\r\n            }\r\n            else if(tails == 2){\r\n                var result = window.luckysheet_function.T_DIST_2T.f(t, df);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"F_DIST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u6765\u8BA1\u7B97\u51FD\u6570\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u5206\u5B50\u81EA\u7531\u5EA6\r\n            var degrees_freedom1 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom1)){\r\n                return degrees_freedom1;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom1 = parseInt(degrees_freedom1);\r\n\r\n            //\u5206\u6BCD\u81EA\u7531\u5EA6\r\n            var degrees_freedom2 = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(degrees_freedom2)){\r\n                return degrees_freedom2;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom2 = parseInt(degrees_freedom2);\r\n\r\n            //\u7528\u4E8E\u786E\u5B9A\u51FD\u6570\u5F62\u5F0F\u7684\u903B\u8F91\u503C\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom1 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom2 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.centralF.cdf(x, degrees_freedom1, degrees_freedom2) : jStat.centralF.pdf(x, degrees_freedom1, degrees_freedom2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"F_DIST_RT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u6765\u8BA1\u7B97\u51FD\u6570\u7684\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u5206\u5B50\u81EA\u7531\u5EA6\r\n            var degrees_freedom1 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom1)){\r\n                return degrees_freedom1;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom1 = parseInt(degrees_freedom1);\r\n\r\n            //\u5206\u6BCD\u81EA\u7531\u5EA6\r\n            var degrees_freedom2 = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(degrees_freedom2)){\r\n                return degrees_freedom2;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom2 = parseInt(degrees_freedom2);\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom1 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom2 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 1 - jStat.centralF.cdf(x, degrees_freedom1, degrees_freedom2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VAR_P\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / n;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VAR_S\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / (n - 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VARA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / (n - 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VARPA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / n;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STEYX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[0]);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[1]);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length < 3 || data_x.length < 3){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var lft = 0;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                lft += Math.pow(data_y[i] - ymean, 2);\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            return Math.sqrt((lft - num * num / den) / (n - 2));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STANDARDIZE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6B63\u6001\u5316\u7684\u968F\u673A\u53D8\u91CF\u503C\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //\u5206\u5E03\u7684\u5747\u503C\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //\u5206\u5E03\u7684\u6807\u51C6\u504F\u5DEE\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (x - mean) / standard_dev;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SMALL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6B63\u6001\u5316\u7684\u968F\u673A\u53D8\u91CF\u503C\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u8981\u8FD4\u56DE\u7684\u6570\u636E\u5728\u6570\u7EC4\u6216\u6570\u636E\u533A\u57DF\u91CC\u7684\u4F4D\u7F6E\uFF08\u4ECE\u5C0F\u5230\u5927\uFF09\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseInt(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k <= 0 || k > dataArr_n.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n\r\n            return  dataArr_n.sort(function(a, b) {\r\n                        return a - b;\r\n                    })[k - 1];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SLOPE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE3\u8868\u56E0\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[0]);\r\n            }\r\n\r\n            //\u4EE3\u8868\u81EA\u53D8\u91CF\u6570\u636E\u6570\u7EC4\u6216\u77E9\u9635\u7684\u8303\u56F4\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[1]);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y \u548C known_x \u53EA\u53D6\u6570\u503C\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length < 3 || data_x.length < 3){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            return num / den;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SKEW\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length < 3 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 3);\r\n            }\r\n\r\n            return n * sigma / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(dataArr_n, true), 3));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SKEW_P\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length < 3 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n            var m2 = 0;\r\n            var m3 = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                m3 += Math.pow(dataArr_n[i] - mean, 3);\r\n                m2 += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            m3 = m3 / n;\r\n            m2 = m2 / n;\r\n\r\n            return m3 / Math.pow(m2, 3 / 2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ADDRESS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u884C\u53F7\r\n            var row_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(row_num)){\r\n                return row_num;\r\n            }\r\n\r\n            if(!isRealNum(row_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            row_num = parseInt(row_num);\r\n\r\n            //\u5217\u6807\r\n            var column_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(column_num)){\r\n                return column_num;\r\n            }\r\n\r\n            if(!isRealNum(column_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            column_num = parseInt(column_num);\r\n\r\n            //\u5F15\u7528\u7C7B\u578B\r\n            var abs_num = 1;\r\n            if(arguments.length >= 3){\r\n                abs_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(abs_num)){\r\n                    return abs_num;\r\n                }\r\n\r\n                if(!isRealNum(abs_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                abs_num = parseInt(abs_num);\r\n            }\r\n\r\n            //A1\u6807\u8BB0\u5F62\u5F0F -- R1C1\u6807\u8BB0\u5F62\u5F0F\r\n            var A1 = true;\r\n            if(arguments.length >= 4){\r\n                A1 = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(A1)){\r\n                    return A1;\r\n                }\r\n            }\r\n\r\n            if(row_num <= 0 || column_num <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if([1,2,3,4].indexOf(abs_num) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var str;\r\n            if(A1){\r\n                column_num = chatatABC(column_num - 1);\r\n\r\n                switch(abs_num){\r\n                    case 1:\r\n                        str = \"$\" + column_num + \"$\" + row_num;\r\n                        break;\r\n                    case 2:\r\n                        str = column_num + \"$\" + row_num;\r\n                        break;\r\n                    case 3:\r\n                        str = \"$\" + column_num + row_num;\r\n                        break;\r\n                    case 4:\r\n                        str = column_num + row_num;\r\n                        break;\r\n                }\r\n            }\r\n            else{\r\n                switch(abs_num){\r\n                    case 1:\r\n                        str = \"R\" + row_num + \"C\" + column_num;\r\n                        break;\r\n                    case 2:\r\n                        str = \"R\" + row_num + \"C[\" + column_num + \"]\";\r\n                        break;\r\n                    case 3:\r\n                        str = \"R[\" + row_num + \"]\" + \"C\" + column_num;\r\n                        break;\r\n                    case 4:\r\n                        str = \"R[\" + row_num + \"]\" + \"C[\" + column_num + \"]\";\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if(arguments.length == 5){\r\n                //\u5DE5\u4F5C\u8868\u540D\u79F0\r\n                var sheet_text = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(sheet_text)){\r\n                    return sheet_text;\r\n                }\r\n\r\n                return sheet_text + \"!\" + str;\r\n            }\r\n            else{\r\n                return str;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INDIRECT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4EE5\u5E26\u5F15\u53F7\u7684\u5B57\u7B26\u4E32\u5F62\u5F0F\u63D0\u4F9B\u7684\u5355\u5143\u683C\u5F15\u7528\r\n            var ref_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(ref_text)){\r\n                return ref_text;\r\n            }\r\n\r\n            //A1\u6807\u8BB0\u5F62\u5F0F -- R1C1\u6807\u8BB0\u5F62\u5F0F\r\n            var A1 = true;\r\n            if(arguments.length == 2){\r\n                A1 = func_methods.getCellBoolen(arguments[1]);\r\n\r\n                if(valueIsError(A1)){\r\n                    return A1;\r\n                }\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let currentSheet = luckysheetfile[index];\r\n            let sheetdata = currentSheet.data;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            //\u8BA1\u7B97\r\n            if(A1){\r\n\r\n            }\r\n            else{\r\n\r\n            }\r\n\r\n            if(formula.iscelldata(ref_text)){\r\n                let cellrange = formula.getcellrange(ref_text);\r\n                let row = cellrange.row[0], col = cellrange.column[0];\r\n\r\n                if (row < 0 || row >= sheetdata.length || col < 0 || col >= sheetdata[0].length){\r\n                    return formula.error.r;\r\n                }\r\n\r\n                if (sheetdata[row][col] == null || isRealNull(sheetdata[row][col].v)){\r\n                    return 0;\r\n                }\r\n\r\n                let value = sheetdata[row][col].v;\r\n                if (formula.execFunctionGlobalData != null) {\r\n                    let ef = formula.execFunctionGlobalData[row+\"_\"+col+\"_\"+Store.calculateSheetIndex];\r\n                    if(ef!=null){\r\n                        value = ef.v;\r\n                    }\r\n                }\r\n\r\n\r\n                let retAll= {\r\n                    \"sheetName\": currentSheet.name,\r\n                    \"startCell\": ref_text,\r\n                    \"rowl\": row,\r\n                    \"coll\": col,\r\n                    \"data\": value\r\n                };\r\n\r\n                return retAll;\r\n            }\r\n            else{\r\n                return formula.error.r;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROW\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 1){\r\n                //\u8981\u8FD4\u56DE\u5176\u884C\u53F7\u7684\u5355\u5143\u683C\r\n                var reference;\r\n\r\n                if(getObjType(arguments[0]) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                    reference = arguments[0].startCell;\r\n                }\r\n                else{\r\n                    reference = arguments[0];\r\n                }\r\n\r\n                if(formula.iscelldata(reference)){\r\n                    var cellrange = formula.getcellrange(reference);\r\n\r\n                    return cellrange[\"row\"][0] + 1;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                return window.luckysheetCurrentRow + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROWS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8FD4\u56DE\u5176\u884C\u6570\u7684\u8303\u56F4\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\"){\r\n                    return arguments[0].length;\r\n                }\r\n                else{\r\n                    return 1;\r\n                }\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return arguments[0].rowl;\r\n            }\r\n            else{\r\n                return 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 1){\r\n                //\u8981\u8FD4\u56DE\u5176\u5217\u53F7\u7684\u5355\u5143\u683C\r\n                var reference;\r\n\r\n                if(getObjType(arguments[0]) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                    reference = arguments[0].startCell;\r\n                }\r\n                else{\r\n                    reference = arguments[0];\r\n                }\r\n\r\n                if(formula.iscelldata(reference)){\r\n                    var cellrange = formula.getcellrange(reference);\r\n\r\n                    return cellrange[\"column\"][0] + 1;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                return window.luckysheetCurrentColumn + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMNS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8FD4\u56DE\u6307\u5B9A\u6570\u7EC4\u6216\u8303\u56F4\u4E2D\u7684\u5217\u6570\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\"){\r\n                    return arguments[0][0].length;\r\n                }\r\n                else{\r\n                    return arguments[0].length;\r\n                }\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return arguments[0].coll;\r\n            }\r\n            else{\r\n                return 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OFFSET\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u8BA1\u7B97\u884C\u5217\u504F\u79FB\u91CF\u7684\u8D77\u70B9\r\n            if(!(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var reference = arguments[0].startCell;\r\n            let sheetName = arguments[0].sheetName;\r\n\r\n            //\u8981\u504F\u79FB\u7684\u884C\u6570\r\n            var rows = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(rows)){\r\n                return rows;\r\n            }\r\n\r\n            if(!isRealNum(rows)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rows = parseInt(rows);\r\n\r\n            //\u8981\u504F\u79FB\u7684\u5217\u6570\r\n            var cols = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(cols)){\r\n                return cols;\r\n            }\r\n\r\n            if(!isRealNum(cols)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cols = parseInt(cols);\r\n\r\n            //\u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u9AD8\u5EA6\r\n            var height = arguments[0].rowl;\r\n            if(arguments.length >= 4){\r\n                height = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(height)){\r\n                    return height;\r\n                }\r\n\r\n                if(!isRealNum(height)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                height = parseInt(height);\r\n            }\r\n\r\n            //\u8981\u4ECE\u504F\u79FB\u76EE\u6807\u5F00\u59CB\u8FD4\u56DE\u7684\u8303\u56F4\u7684\u5BBD\u5EA6\r\n            var width = arguments[0].coll;\r\n            if(arguments.length == 5){\r\n                width = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(width)){\r\n                    return width;\r\n                }\r\n\r\n                if(!isRealNum(width)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                width = parseInt(width);\r\n            }\r\n\r\n            if(height < 1 || width < 1){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var cellrange = formula.getcellrange(reference);\r\n            var cellRow0 = cellrange[\"row\"][0];\r\n            var cellCol0 = cellrange[\"column\"][0];\r\n\r\n            cellRow0 += rows;\r\n            cellCol0 += cols;\r\n\r\n            var cellRow1 = cellRow0 + height - 1;\r\n            var cellCol1 = cellCol0 + width - 1;\r\n\r\n            // let sheetdata = null;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            if (cellRow0 < 0 || cellRow1 >= sheetdata.length || cellCol0 < 0 || cellCol1 >= sheetdata[0].length){\r\n                return formula.error.r;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var r = cellRow0; r <= cellRow1; r++){\r\n                var rowArr = [];\r\n\r\n                for(var c = cellCol0; c <= cellCol1; c++){\r\n                    if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.calculateSheetIndex]!=null){\r\n                        let ef = formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.calculateSheetIndex];\r\n                        if(ef!=null){\r\n                            rowArr.push(ef.v);\r\n                        }\r\n                        else{\r\n                            rowArr.push(0);\r\n                        }\r\n                    }\r\n                    else if (sheetdata[r][c] != null && !isRealNull(sheetdata[r][c].v)){\r\n                        rowArr.push(sheetdata[r][c].v);\r\n                    }\r\n                    else{\r\n                        rowArr.push(0);\r\n                    }\r\n                }\r\n\r\n                result.push(rowArr);\r\n            }\r\n\r\n\r\n            let retAll= {\r\n                \"sheetName\": sheetName,\r\n                \"startCell\": getRangetxt(Store.calculateSheetIndex, {\r\n                    row: [cellRow0, cellRow1],\r\n                    column: [cellCol0, cellCol1]\r\n                }),\r\n                \"rowl\": cellRow0,\r\n                \"coll\": cellCol0,\r\n                \"data\": result\r\n            };\r\n\r\n            return retAll;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MATCH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //lookup_value\r\n            var lookup_value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(lookup_value)){\r\n                return lookup_value;\r\n            }\r\n\r\n            //lookup_array\r\n            var data_lookup_array = arguments[1];\r\n            var lookup_array = [];\r\n\r\n            if(getObjType(data_lookup_array) == \"array\"){\r\n                if(getObjType(data_lookup_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_lookup_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return formula.error.na;\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_lookup_array.length; i++){\r\n                        lookup_array.push(data_lookup_array[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_lookup_array) == \"object\" && data_lookup_array.startCell != null){\r\n                if(data_lookup_array.rowl > 1 && data_lookup_array.coll > 1){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                if(data_lookup_array.data != null){\r\n                    if(getObjType(data_lookup_array.data) == \"array\"){\r\n                        for(var i = 0; i < data_lookup_array.data.length; i++){\r\n                            for(var j = 0; j < data_lookup_array.data[i].length; j++){\r\n                                if(data_lookup_array.data[i][j] != null && !isRealNull(data_lookup_array.data[i][j].v)){\r\n                                    lookup_array.push(data_lookup_array.data[i][j].v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        lookup_array.push(data_lookup_array.data.v);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //match_type\r\n            var match_type = 1;\r\n            if(arguments.length == 3){\r\n                match_type = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(match_type)){\r\n                    return match_type;\r\n                }\r\n\r\n                if(!isRealNum(match_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                match_type = Math.ceil(parseFloat(match_type));\r\n            }\r\n\r\n            if([-1,0,1].indexOf(match_type) == -1){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var index;\r\n            var indexValue;\r\n\r\n            for (var idx = 0; idx < lookup_array.length; idx++) {\r\n                if (match_type === 1) {\r\n                    if (lookup_array[idx] === lookup_value) {\r\n                        return idx + 1;\r\n                    }\r\n                    else if (lookup_array[idx] < lookup_value) {\r\n                        if (!indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                        else if (lookup_array[idx] > indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                    }\r\n                }\r\n                else if (match_type === 0) {\r\n                    if (typeof lookup_value === 'string') {\r\n                        lookup_value = lookup_value.replace(/\\?/g, '.');\r\n                        if (lookup_array[idx].toLowerCase().match(lookup_value.toLowerCase())) {\r\n                            return idx + 1;\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (lookup_array[idx] === lookup_value) {\r\n                            return idx + 1;\r\n                        }\r\n                    }\r\n                }\r\n                else if (match_type === -1) {\r\n                    if (lookup_array[idx] === lookup_value) {\r\n                        return idx + 1;\r\n                    }\r\n                    else if (lookup_array[idx] > lookup_value) {\r\n                        if (!indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                        else if (lookup_array[idx] < indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return index ? index : formula.error.na;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VLOOKUP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //lookup_value\r\n            var lookup_value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(lookup_value)){\r\n                return lookup_value;\r\n            }\r\n\r\n            if(lookup_value.toString().replace(/\\s/g, \"\") == \"\"){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //table_array\r\n            var data_table_array = arguments[1];\r\n            var table_array = [];\r\n\r\n            if(getObjType(data_table_array) == \"array\"){\r\n                if(getObjType(data_table_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_table_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_table_array.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_table_array[i].length; j++){\r\n                            rowArr.push(data_table_array[i][j]);\r\n                        }\r\n\r\n                        table_array.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    var rowArr = [];\r\n\r\n                    for(var i = 0; i < data_table_array.length; i++){\r\n                        rowArr.push(data_table_array[i]);\r\n                    }\r\n\r\n                    table_array.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(data_table_array) == \"object\" && data_table_array.startCell != null){\r\n                table_array = func_methods.getCellDataDyadicArr(data_table_array, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //col_index_num\r\n            var col_index_num = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(col_index_num)){\r\n                return col_index_num;\r\n            }\r\n\r\n            if(!isRealNum(col_index_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            col_index_num = parseInt(col_index_num);\r\n\r\n            //range_lookup\r\n            var range_lookup = true;\r\n            if(arguments.length == 4){\r\n                range_lookup = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(range_lookup)){\r\n                    return range_lookup;\r\n                }\r\n            }\r\n\r\n            //\u5224\u65AD\r\n            if(col_index_num < 1){\r\n                return formula.error.v;\r\n            }\r\n            else if(col_index_num > table_array[0].length){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(range_lookup){\r\n                table_array = orderbydata(table_array, 0, true);\r\n\r\n                for(var r = 0; r < table_array.length; r++){\r\n                    var v = table_array[r][0];\r\n\r\n                    var result;\r\n\r\n                    if (isdatetime(lookup_value) && isdatetime(v)) {\r\n                        result = diff(lookup_value, v);\r\n                    }\r\n                    else if (isRealNum(lookup_value) && isRealNum(v)) {\r\n                        result = numeral(lookup_value).value() - numeral(v).value();\r\n                    }\r\n                    else if (!isRealNum(lookup_value) && !isRealNum(v)) {\r\n                        result = lookup_value.localeCompare(v, \"zh\");\r\n                    }\r\n                    else if (!isRealNum(lookup_value)) {\r\n                        result = 1;\r\n                    }\r\n                    else if (!isRealNum(v)) {\r\n                        result = -1;\r\n                    }\r\n\r\n                    if(result < 0){\r\n                        if(r == 0){\r\n                            return formula.error.na;\r\n                        }\r\n                        else{\r\n                            return table_array[r - 1][col_index_num - 1];\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(r == table_array.length - 1){\r\n                            return table_array[r][col_index_num - 1];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                var index = null;\r\n\r\n                for(var r = 0; r < table_array.length; r++){\r\n                    if(lookup_value.toString() == table_array[r][0].toString()){\r\n                        index = r;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(index == null){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                return table_array[index][col_index_num - 1];\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HLOOKUP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var searchkey = arguments[0];\r\n\r\n            if(typeof(searchkey) == \"object\"){\r\n                searchkey = arguments[0].data;\r\n\r\n                if (getObjType(searchkey) == \"array\") {\r\n                    searchkey = searchkey[r];\r\n\r\n                    if (getObjType(searchkey) == \"array\") {\r\n                        searchkey = searchkey[c];\r\n                    }\r\n                }\r\n                else{\r\n                    searchkey = searchkey.v;\r\n                }\r\n            }\r\n            var range = arguments[1].data;\r\n            var index = arguments[2];\r\n            var isaccurate = false;\r\n            if (arguments.length > 3) {\r\n                isaccurate = !!arguments[3];\r\n            }\r\n            if (index > range.rowl) {\r\n                return [formula.error.v, \"\u7D22\u5F15\u8D85\u8FC7\u4E86\u8303\u56F4\u7684\u957F\u5EA6\uFF0C\" + range[0].length];\r\n            }\r\n            if (index < 1) {\r\n                return [formula.error.v, \"\u7D22\u5F15\u5FC5\u987B\u5927\u4E8E1\"];\r\n            }\r\n\r\n            var result = formula.error.na;\r\n            for(var c = 0;c < range[0].length;c++){\r\n                var matchv = getcellvalue(0, c, range);\r\n                var showv = getcellvalue(index - 1, c, range);\r\n\r\n                if (isaccurate) {\r\n                    if (matchv.indexOf(searchkey) > -1) {\r\n                        result = showv;\r\n                    }\r\n                } else {\r\n                    if (formula.acompareb(matchv,searchkey)) {\r\n                        result = showv;\r\n                        return result;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOOKUP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B8C\u6210\u77E2\u91CF\u5F62\u5F0F\uFF08\u6570\u7EC4\u5F62\u5F0F\u4E0D\u63A8\u8350\uFF0C\u672A\u505A\uFF09\r\n            //=LOOKUP(4.19, A2:A6, B2:B6)\r\n            //=LOOKUP(0, A2:A6, B2:B6)\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var searchkey = arguments[0];\r\n\r\n            if(typeof(searchkey) == \"object\"){\r\n                searchkey = arguments[0].data;\r\n\r\n                if (getObjType(searchkey) == \"array\") {\r\n                    searchkey = searchkey[r];\r\n\r\n                    if (getObjType(searchkey) == \"array\") {\r\n                        searchkey = searchkey[c];\r\n                    }\r\n                }\r\n                else{\r\n                    searchkey = searchkey.v;\r\n                }\r\n            }\r\n\r\n            //\u5FC5\u987B\u4E3A\u4E00\u7EF4\u6570\u7EC4\r\n            var range = arguments[1].data;\r\n            var range2;\r\n            var result = formula.error.na;\r\n\r\n            function sortNum(a,b){ //\u7528\u4E8E\u6392\u5E8F\r\n                return b - a;\r\n            }\r\n\r\n            //\u83B7\u5F97\u4E24\u4E2A\u8303\u56F4\u7684\u6570\u7EC4\r\n            range= formula.getRangeArray(range)[0];\r\n            if(arguments[2]){\r\n                range2 = arguments[2].data;\r\n                range2 = formula.getRangeArray(range2)[0];\r\n            }\r\n\r\n            if(typeof(searchkey) == \"string\"){ //\u5B57\u7B26\u4E32\u76F4\u63A5\u5224\u65AD\u662F\u5426\u76F8\u7B49\r\n\r\n                for (var i = 0; i < range.length; i++) {\r\n                    var matchv = range[i];\r\n                    var showv;\r\n                    if(arguments[2]){\r\n                        showv = range2[i];\r\n                        if(matchv == searchkey) {\r\n                            result = showv;\r\n                        }\r\n                    }else{\r\n                        if (formula.acompareb(matchv,searchkey)) {\r\n                            result = matchv;\r\n                        }\r\n                    }\r\n                }\r\n            }else if(isdatatype(searchkey) == \"num\"){ //\u6570\u5B57\u5224\u65AD1.\u662F\u5426\u76F8\u7B492.\u4E0D\u7B49\uFF0C\u53BB\u627E\u63A5\u8FD1\u503C\r\n                    var rangeNow = [];\r\n\r\n                    for (var i = 0; i < range.length; i++) {\r\n                        var matchv = range[i];\r\n                        var showv;\r\n\r\n                        if(arguments[2]){\r\n                            showv = range2[i];\r\n                            if(matchv == searchkey) {\r\n                                result = showv;\r\n                                return result;\r\n                            }else if(matchv != searchkey && isdatatype(matchv) == \"num\"){\r\n                                rangeNow.push(matchv);\r\n                            }\r\n                        }else{\r\n                            if (matchv == searchkey) {\r\n                                result = matchv;\r\n                                return result;\r\n                            }else if(matchv != searchkey && isdatatype(matchv) == \"num\"){\r\n                                rangeNow.push(matchv);\r\n                            }\r\n                        }\r\n\r\n                    }\r\n                    if(rangeNow.length != 0){\r\n                        rangeNow.push(searchkey);\r\n                        rangeNow.sort(sortNum);\r\n\r\n                        var index = rangeNow.indexOf(searchkey);\r\n                        if(index == (rangeNow.length -1)){\r\n                            return [formula.error.na, \"\u627E\u4E0D\u5230\u5BF9\u5E94\u53C2\u6570\"];\r\n                        }else{\r\n                            var mat = rangeNow[index + 1];\r\n                            if(arguments[2]){\r\n                                var i = range.indexOf(mat);//\u6539\u6210\u6570\u7EC4\r\n                                result = range2[i];\r\n                            }else{\r\n                                result = mat;\r\n                            }\r\n\r\n                        }\r\n                    }\r\n\r\n            }\r\n\r\n            return result;\r\n\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INDEX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\u533A\u57DF\u6216\u6570\u7EC4\u5E38\u91CF\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n            let isReference = false;\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n                isReference = true;\r\n            }\r\n\r\n            var rowlen = array.length, collen = array[0].length;\r\n\r\n            //\u9009\u62E9\u6570\u7EC4\u4E2D\u7684\u67D0\u884C\uFF0C\u51FD\u6570\u4ECE\u8BE5\u884C\u8FD4\u56DE\u6570\u503C\r\n            var row_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(row_num)){\r\n                return row_num;\r\n            }\r\n\r\n            if(!isRealNum(row_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            row_num = parseInt(row_num);\r\n\r\n            //\u9009\u62E9\u6570\u7EC4\u4E2D\u7684\u67D0\u5217\uFF0C\u51FD\u6570\u4ECE\u8BE5\u5217\u8FD4\u56DE\u6570\u503C\r\n            var column_num = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(column_num)){\r\n                return column_num;\r\n            }\r\n\r\n\r\n\r\n            if(row_num < 0 || (isRealNum(column_num) && column_num < 0)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(row_num > rowlen || (isRealNum(column_num) && column_num > collen)){\r\n                return formula.error.r;\r\n            }\r\n\r\n            if(isReference){\r\n\r\n                var cellrange = formula.getcellrange(data_array.startCell);\r\n                var cellRow0 = cellrange[\"row\"][0];\r\n                var cellCol0 = cellrange[\"column\"][0];\r\n\r\n\r\n                let data = array;\r\n                if(row_num == 0 || column_num == 0){\r\n                    if(row_num==0){\r\n                        data = array[0];\r\n                        row_num = 1;\r\n                    }\r\n                    else{\r\n                        data = array[row_num-1];\r\n                    }\r\n\r\n                    if(isRealNum(column_num)){\r\n                        if(column_num==0){\r\n                            data = data[0];\r\n                            column_num = 1;\r\n                        }\r\n                        else{\r\n                            data = data[column_num-1]\r\n                        }\r\n                    }\r\n                    else{\r\n                        column_num = 1;\r\n                    }\r\n                }\r\n                else{\r\n                    if(!isRealNum(row_num)){\r\n                        row_num = 1;\r\n                    }\r\n\r\n                    if(!isRealNum(column_num)){\r\n                        column_num = 1;\r\n                    }\r\n                    data = array[row_num - 1][column_num - 1];\r\n                }\r\n\r\n                let row_index = cellRow0 + row_num - 1, column_index = cellCol0 + column_num - 1;\r\n\r\n                let retAll= {\r\n                    \"sheetName\": data_array.sheetName,\r\n                    \"startCell\": getRangetxt(Store.calculateSheetIndex, {\r\n                        row: [row_index, row_index],\r\n                        column: [column_index, column_index]\r\n                    }),\r\n                    \"rowl\": row_index,\r\n                    \"coll\": column_index,\r\n                    \"data\": data\r\n                };\r\n                return retAll;\r\n            }\r\n            else{\r\n                //\u8BA1\u7B97\r\n\r\n                if(!isRealNum(column_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                column_num = parseInt(column_num);\r\n\r\n                if(row_num <= 0 || column_num <= 0){\r\n                    return formula.error.v;\r\n                }\r\n                return array[row_num - 1][column_num - 1];\r\n            }\r\n\r\n\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GETPIVOTDATA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CHOOSE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6307\u5B9A\u8981\u8FD4\u56DE\u54EA\u4E00\u9879\r\n            var index_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(index_num)){\r\n                return index_num;\r\n            }\r\n\r\n            if(!isRealNum(index_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            index_num = parseInt(index_num);\r\n\r\n            if(index_num < 1 || index_num > arguments.length - 1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var data_result = arguments[index_num];\r\n\r\n            if(getObjType(data_result) == \"array\"){\r\n                if(getObjType(data_result[0]) == \"array\" && !func_methods.isDyadicArr(data_result)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return data_result;\r\n            }\r\n            else if(getObjType(data_result) == \"object\" && data_result.startCell != null){\r\n                if(data_result.data == null){\r\n                    return 0;\r\n                }\r\n\r\n                if(getObjType(data_result.data) == \"array\"){\r\n                    var result = func_methods.getCellDataDyadicArr(data_result.data, \"number\");\r\n\r\n                    return result;\r\n                }\r\n                else{\r\n                    if(isRealNull(data_result.data.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    return data_result.data.v;\r\n                }\r\n            }\r\n            else{\r\n                return data_result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HYPERLINK\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TIME\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u65F6\r\n            var hour = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(hour)){\r\n                return hour;\r\n            }\r\n\r\n            if(!isRealNum(hour)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            hour = parseInt(hour);\r\n\r\n            //\u5206\r\n            var minute = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(minute)){\r\n                return minute;\r\n            }\r\n\r\n            if(!isRealNum(minute)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            minute = parseInt(minute);\r\n\r\n            //\u79D2\r\n            var second = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(second)){\r\n                return second;\r\n            }\r\n\r\n            if(!isRealNum(second)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            second = parseInt(second);\r\n\r\n            if(hour < 0 || hour > 32767){\r\n                return formula.error.nm;\r\n            }\r\n            else if(hour > 24){\r\n                hour = hour % 24;\r\n            }\r\n\r\n            if(minute < 0 || minute > 32767){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(second < 0 || second > 32767){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var time = dayjs().set({'hour': hour, 'minute': minute, 'second': second});\r\n\r\n            return dayjs(time).format(\"h:mm:ss a\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TIMEVALUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u8868\u793A\u65F6\u95F4\u7684\u5B57\u7B26\u4E32\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return (3600 * dayjs(time_text).get('hour') + 60 * dayjs(time_text).get('minute') + dayjs(time_text).get('second')) / 86400;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EOMONTH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u8BA1\u7B97\u7ED3\u679C\u7684\u53C2\u7167\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            //\u6708\u6570\r\n            var months = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(months)){\r\n                return months;\r\n            }\r\n\r\n            if(!isRealNum(months)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            months = parseInt(months);\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var date = dayjs(start_date).add(months + 1, 'months').set('date', 1).subtract(1, 'days');\r\n            var mask = genarate(dayjs(date).format(\"YYYY-MM-DD H:mm:ss\"));\r\n\r\n            var result = mask[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EDATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u8BA1\u7B97\u7ED3\u679C\u7684\u53C2\u7167\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            //\u6708\u6570\r\n            var months = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(months)){\r\n                return months;\r\n            }\r\n\r\n            if(!isRealNum(months)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            months = parseInt(months);\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var date = dayjs(start_date).add(months, 'months');\r\n            var mask = genarate(dayjs(date).format(\"YYYY-MM-DD h:mm:ss\"));\r\n\r\n            var result = mask[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SECOND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u65F6\u95F4\u503C\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).seconds();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINUTE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u65F6\u95F4\u503C\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).minutes();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HOUR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u65F6\u95F4\u503C\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).hours();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOW\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return dayjs().format(\"YYYY-M-D HH:mm\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NETWORKDAYS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 3){\r\n                var result = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1, arguments[2]);\r\n            }\r\n            else{\r\n                var result = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NETWORKDAYS_INTL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEKEND_TYPES = [\r\n                [],\r\n                [6, 0],\r\n                [0, 1],\r\n                [1, 2],\r\n                [2, 3],\r\n                [3, 4],\r\n                [4, 5],\r\n                [5, 6],\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                [0, 0],\r\n                [1, 1],\r\n                [2, 2],\r\n                [3, 3],\r\n                [4, 4],\r\n                [5, 5],\r\n                [6, 6]\r\n            ];\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u7ED3\u675F\u65E5\u671F\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u7528\u4E8E\u8868\u793A\u54EA\u4E9B\u5929\u4E3A\u5468\u672B\u7684\u6570\u5B57\u6216\u5B57\u7B26\u4E32\r\n            var weekend = WEEKEND_TYPES[1];\r\n            if(arguments.length >= 3){\r\n                weekend = arguments[2];\r\n\r\n                if(typeof weekend == \"string\" && weekend.length == \"7\" && /^[0-1]{7}$/g.test(weekend)){\r\n\r\n                }\r\n                else{\r\n                    weekend = func_methods.getFirstValue(arguments[2]);\r\n                    if(valueIsError(weekend)){\r\n                        return weekend;\r\n                    }\r\n\r\n                    if(!isRealNum(weekend)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    weekend = parseInt(weekend);\r\n\r\n                    if(weekend < 1 || (weekend > 7 && weekend < 11) || weekend > 17){\r\n                        return formula.error.nm;\r\n                    }\r\n\r\n                    weekend = WEEKEND_TYPES[weekend];\r\n                }\r\n            }\r\n\r\n            //\u8FD9\u662F\u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\r\n            var holidays = [];\r\n            if(arguments.length == 4){\r\n                holidays = func_methods.getCellrangeDate(arguments[3]);\r\n                if(valueIsError(holidays)){\r\n                    return holidays;\r\n                }\r\n            }\r\n\r\n            for (var i = 0; i < holidays.length; i++) {\r\n                if(!dayjs(holidays[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var days = dayjs(end_date).diff(dayjs(start_date), 'days') + 1;\r\n            var total = days;\r\n            var day = dayjs(start_date);\r\n\r\n            for (i = 0; i < days; i++) {\r\n                var d = dayjs(day).weekday();\r\n                var dec = false;\r\n\r\n                if(getObjType(weekend) == \"array\"){\r\n                    if (d === weekend[0] || d === weekend[1]) {\r\n                        dec = true;\r\n                    }\r\n                }\r\n                else{\r\n                    if(d == 0){\r\n                        d = 7;\r\n                    }\r\n\r\n                    if(weekend.charAt(d - 1) == \"0\"){\r\n                        dec = true;\r\n                    }\r\n                }\r\n\r\n                for (var j = 0; j < holidays.length; j++) {\r\n                    if(dayjs(day).diff(dayjs(holidays[j]), 'days') === 0){\r\n                        dec = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (dec) {\r\n                    total--;\r\n                }\r\n\r\n                day = dayjs(day).add(1, 'days');\r\n            }\r\n\r\n            return total;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISOWEEKNUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u65E5\u671F\u548C\u65F6\u95F4\u8BA1\u7B97\u7684\u65E5\u671F\r\n            var date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(date)){\r\n                return date;\r\n            }\r\n\r\n            if(!dayjs(date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return dayjs(date).isoWeeks();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEEKNUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEK_STARTS = [\r\n                undefined,\r\n                7,\r\n                1,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                1,\r\n                2,\r\n                3,\r\n                4,\r\n                5,\r\n                6,\r\n                7\r\n            ];\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u7528\u4E8E\u8868\u793A\u54EA\u4E9B\u5929\u4E3A\u5468\u672B\u7684\u6570\u5B57\u6216\u5B57\u7B26\u4E32\r\n            var return_type = 1;\r\n            if(arguments.length == 2){\r\n                return_type = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(return_type)){\r\n                    return return_type;\r\n                }\r\n\r\n                if(!isRealNum(return_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return_type = parseInt(return_type);\r\n            }\r\n\r\n            if(return_type == 21){\r\n                return window.luckysheet_function.ISOWEEKNUM.f(arguments[0]);\r\n            }\r\n\r\n            if([1,2,11,12,13,14,15,16,17].indexOf(return_type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var week_start = WEEK_STARTS[return_type];\r\n            var inc = dayjs(serial_number).isoWeekday() >= week_start ? 1 : 0;\r\n            var result = dayjs(serial_number).isoWeeks() + inc;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEEKDAY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEK_TYPES = [\r\n                [],\r\n                [1, 2, 3, 4, 5, 6, 7],\r\n                [7, 1, 2, 3, 4, 5, 6],\r\n                [6, 0, 1, 2, 3, 4, 5],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [7, 1, 2, 3, 4, 5, 6],\r\n                [6, 7, 1, 2, 3, 4, 5],\r\n                [5, 6, 7, 1, 2, 3, 4],\r\n                [4, 5, 6, 7, 1, 2, 3],\r\n                [3, 4, 5, 6, 7, 1, 2],\r\n                [2, 3, 4, 5, 6, 7, 1],\r\n                [1, 2, 3, 4, 5, 6, 7]\r\n            ];\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u4EE5\u6570\u5B57\u6307\u793A\u4F7F\u7528\u54EA\u79CD\u7F16\u53F7\u987A\u5E8F\u6765\u8868\u793A\u661F\u671F\u51E0\r\n            var return_type = 1;\r\n            if(arguments.length == 2){\r\n                return_type = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(return_type)){\r\n                    return return_type;\r\n                }\r\n\r\n                if(!isRealNum(return_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return_type = parseInt(return_type);\r\n            }\r\n\r\n            if([1,2,3,11,12,13,14,15,16,17].indexOf(return_type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = WEEK_TYPES[return_type][dayjs(serial_number).day()];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7528\u4E8E\u8BA1\u7B97\u51C0\u5DE5\u4F5C\u65E5\u5929\u6570\u7684\u65F6\u95F4\u6BB5\u5F00\u59CB\u65E5\u671F\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return dayjs(serial_number).date();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAYS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u675F\u65E5\u671F\r\n            var end_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = dayjs(end_date).diff(dayjs(start_date), 'days');\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAYS360\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u7ED3\u675F\u65E5\u671F\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5929\u6570\u8BA1\u7B97\u65B9\u6CD5\r\n            var method = false;\r\n            if(arguments.length == 3){\r\n                method = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(method)){\r\n                    return method;\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sm = dayjs(start_date).month();\r\n            var em = dayjs(end_date).month();\r\n            var sd, ed;\r\n\r\n            if (method) {\r\n                sd = dayjs(start_date).date() === 31 ? 30 : dayjs(start_date).date();\r\n                ed = dayjs(end_date).date() === 31 ? 30 : dayjs(end_date).date();\r\n            }\r\n            else {\r\n                var smd = dayjs().set({ 'year': dayjs(start_date).year(), 'month': sm + 1, 'date': 0 }).date();\r\n                var emd = dayjs().set({ 'year': dayjs(end_date).year(), 'month': em + 1, 'date': 0 }).date();\r\n                sd = dayjs(start_date).date() === smd ? 30 : dayjs(start_date).date();\r\n\r\n                if (dayjs(end_date).date() === emd) {\r\n                    if (sd < 30) {\r\n                        em++;\r\n                        ed = 1;\r\n                    }\r\n                    else {\r\n                        ed = 30;\r\n                    }\r\n                }\r\n                else {\r\n                    ed = dayjs(end_date).date();\r\n                }\r\n            }\r\n\r\n            var result = 360 * dayjs(end_date).diff(dayjs(start_date), 'years') + 30 * (em - sm) + (ed - sd);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5E74\r\n            var year = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(year)){\r\n                return year;\r\n            }\r\n\r\n            if(!isRealNum(year)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            year = parseInt(year);\r\n\r\n            //\u6708\r\n            var month = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(month)){\r\n                return month;\r\n            }\r\n\r\n            if(!isRealNum(month)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            month = parseInt(month);\r\n\r\n            //\u65E5\r\n            var day = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(day)){\r\n                return day;\r\n            }\r\n\r\n            if(!isRealNum(day)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            day = parseInt(day);\r\n\r\n            if(year < 0 || year >= 10000){\r\n                return formula.error.nm;\r\n            }\r\n            else if(year >= 0 && year <= 1899){\r\n                year = year + 1900;\r\n            }\r\n\r\n            var date = dayjs().set({ 'year': year, 'month': month - 1, \"date\": day });\r\n\r\n            if(dayjs(date).year() < 1900){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return dayjs(date).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATEVALUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var date_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(date_text)){\r\n                return date_text;\r\n            }\r\n\r\n            if(!dayjs(date_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            date_text = dayjs(date_text).format(\"YYYY-MM-DD\");\r\n            var result = genarate(date_text)[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATEDIF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            luckysheet_getValue(arguments);\r\n            for (var i = 0; i < arguments.length-1; i++){\r\n                arguments[i] = moment.fromOADate(arguments[i]).format(\"l\");\r\n                if(!isdatetime(arguments[i])){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            var startDate = dayjs(arguments[0]);\r\n            var endDate = dayjs(arguments[1]);\r\n            var unit = arguments[2];\r\n            var result = formula.error.v;\r\n            if(window.luckysheet_function.DAYS.f(endDate,startDate) < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            switch(unit){\r\n                case \"Y\":case \"y\":\r\n                    result = endDate.diff(startDate,\"years\",false);\r\n                    break;\r\n                case \"M\":case \"m\":\r\n                    result = endDate.diff(startDate,\"months\",false);\r\n                    break;\r\n                case \"D\":case \"d\":\r\n                    result = endDate.diff(startDate,\"days\",false);\r\n                    break;\r\n                case \"MD\":case \"md\":\r\n                    result = endDate.format('DD') - startDate.format('DD');\r\n                    break;\r\n                case \"YM\":case \"ym\":\r\n                    var startM = parseInt(startDate.format('M')); //\u6CE8\u610F\u5B57\u7B26\u4E32\u8F6C\u5316\u4E3A\u6570\u5B57\r\n                    var endM = parseInt(endDate.format('M'));\r\n                    result = (startM <= endM) ?  endM - startM : endM + 12 - startM;\r\n                    break;\r\n                case \"YD\":case \"yd\":\r\n                    var startM = genarate(startDate.format('MM-DD'))[2];\r\n                    var endM = genarate(endDate.format('MM-DD'))[2];\r\n\r\n                    result = (startM <= endM) ? endM - startM : endM + 365 - startM;\r\n                    break;\r\n                default:\r\n                    result = formula.error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WORKDAY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 3){\r\n                var result = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1, arguments[2]);\r\n            }\r\n            else{\r\n                var result = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WORKDAY_INTL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEKEND_TYPES = [\r\n                [],\r\n                [6, 0],\r\n                [0, 1],\r\n                [1, 2],\r\n                [2, 3],\r\n                [3, 4],\r\n                [4, 5],\r\n                [5, 6],\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                [0, 0],\r\n                [1, 1],\r\n                [2, 2],\r\n                [3, 3],\r\n                [4, 4],\r\n                [5, 5],\r\n                [6, 6]\r\n            ];\r\n\r\n            //\u8BA1\u7B97\u7684\u5F00\u59CB\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5DE5\u4F5C\u65E5\u7684\u5929\u6570\r\n            var days = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(days)){\r\n                return days;\r\n            }\r\n\r\n            if(!isRealNum(days)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            days = parseInt(days);\r\n\r\n            //\u7528\u4E8E\u8868\u793A\u54EA\u4E9B\u5929\u4E3A\u5468\u672B\u7684\u6570\u5B57\u6216\u5B57\u7B26\u4E32\r\n            var weekend = WEEKEND_TYPES[1];\r\n            if(arguments.length >= 3){\r\n                weekend = arguments[2];\r\n\r\n                if(typeof weekend == \"string\" && weekend.length == \"7\" && /^[0-1]{7}$/g.test(weekend)){\r\n\r\n                }\r\n                else{\r\n                    weekend = func_methods.getFirstValue(arguments[2]);\r\n                    if(valueIsError(weekend)){\r\n                        return weekend;\r\n                    }\r\n\r\n                    if(!isRealNum(weekend)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    weekend = parseInt(weekend);\r\n\r\n                    if(weekend < 1 || (weekend > 7 && weekend < 11) || weekend > 17){\r\n                        return formula.error.nm;\r\n                    }\r\n\r\n                    weekend = WEEKEND_TYPES[weekend];\r\n                }\r\n            }\r\n\r\n            //\u8FD9\u662F\u4E00\u4E2A\u8303\u56F4\u6216\u6570\u7EC4\u5E38\u91CF\uFF0C\u5176\u4E2D\u5305\u542B\u4F5C\u4E3A\u8282\u5047\u65E5\u7684\u65E5\u671F\r\n            var holidays = [];\r\n            if(arguments.length == 4){\r\n                holidays = func_methods.getCellrangeDate(arguments[3]);\r\n                if(valueIsError(holidays)){\r\n                    return holidays;\r\n                }\r\n            }\r\n\r\n            for (var i = 0; i < holidays.length; i++) {\r\n                if(!dayjs(holidays[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var d = 0;\r\n\r\n            while (d < days) {\r\n                start_date = dayjs(start_date).add(1, 'days');\r\n                var day = dayjs(start_date).weekday();\r\n\r\n                if(getObjType(weekend)){\r\n                    if (day === weekend[0] || day === weekend[1]) {\r\n                        continue;\r\n                    }\r\n                }\r\n                else{\r\n                    if(day == 0){\r\n                        day = 7;\r\n                    }\r\n\r\n                    if(weekend.charAt(day - 1) == \"0\"){\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                for (var j = 0; j < holidays.length; j++) {\r\n                    if(dayjs(start_date).diff(dayjs(holidays[j]), 'days') === 0){\r\n                        d--;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                d++;\r\n            }\r\n\r\n            return dayjs(start_date).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YEAR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return dayjs(serial_number).year();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YEARFRAC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u7ED3\u675F\u65E5\u671F\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 3){\r\n                basis = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(start_date).date();\r\n            var sm = dayjs(start_date).month() + 1;\r\n            var sy = dayjs(start_date).year();\r\n            var ed = dayjs(end_date).date();\r\n            var em = dayjs(end_date).month() + 1;\r\n            var ey = dayjs(end_date).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(end_date).diff(dayjs(start_date), 'days') / ylength;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TODAY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return dayjs().format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MONTH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5F00\u59CB\u65E5\u671F\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return dayjs(serial_number).month() + 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EFFECT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6BCF\u5E74\u7684\u540D\u4E49\u5229\u7387\r\n            var nominal_rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(nominal_rate)){\r\n                return nominal_rate;\r\n            }\r\n\r\n            if(!isRealNum(nominal_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nominal_rate = parseFloat(nominal_rate);\r\n\r\n            //\u6BCF\u5E74\u7684\u590D\u5229\u8BA1\u7B97\u671F\u6570\r\n            var npery = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(npery)){\r\n                return npery;\r\n            }\r\n\r\n            if(!isRealNum(npery)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            npery = parseInt(npery);\r\n\r\n            if(nominal_rate <= 0 || npery < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.pow(1 + nominal_rate / npery, npery) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLAR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8BBE\u7F6E\u683C\u5F0F\u7684\u503C\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u663E\u793A\u7684\u5C0F\u6570\u4F4D\u6570\r\n            var decimals = 2;\r\n            if(arguments.length == 2){\r\n                decimals = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(decimals)){\r\n                    return decimals;\r\n                }\r\n\r\n                if(!isRealNum(decimals)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                decimals = parseInt(decimals);\r\n            }\r\n\r\n            if(decimals > 9){\r\n                decimals = 9;\r\n            }\r\n\r\n            var foucsStatus = \"0.\";\r\n            for(var i = 1; i <= decimals; i++){\r\n                foucsStatus += \"0\";\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sign = (number > 0) ? 1 : -1;\r\n\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, decimals))) / Math.pow(10, decimals);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLARDE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5206\u6570\r\n            var fractional_dollar = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(fractional_dollar)){\r\n                return fractional_dollar;\r\n            }\r\n\r\n            if(!isRealNum(fractional_dollar)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fractional_dollar = parseFloat(fractional_dollar);\r\n\r\n            //\u7528\u4F5C\u5206\u6570\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6570\r\n            var fraction = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(fraction)){\r\n                return fraction;\r\n            }\r\n\r\n            if(!isRealNum(fraction)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fraction = parseInt(fraction);\r\n\r\n            if(fraction < 0){\r\n                return formula.error.nm;\r\n            }\r\n            else if(fraction == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = parseInt(fractional_dollar, 10);\r\n\r\n            result += (fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10)) / fraction;\r\n\r\n            var power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\r\n            result = Math.round(result * power) / power;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLARFR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5C0F\u6570\r\n            var decimal_dollar = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(decimal_dollar)){\r\n                return decimal_dollar;\r\n            }\r\n\r\n            if(!isRealNum(decimal_dollar)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            decimal_dollar = parseFloat(decimal_dollar);\r\n\r\n            //\u7528\u4F5C\u5206\u6570\u4E2D\u7684\u5206\u6BCD\u7684\u6574\u6570\r\n            var fraction = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(fraction)){\r\n                return fraction;\r\n            }\r\n\r\n            if(!isRealNum(fraction)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fraction = parseInt(fraction);\r\n\r\n            if(fraction < 0){\r\n                return formula.error.nm;\r\n            }\r\n            else if(fraction == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = parseInt(decimal_dollar, 10);\r\n\r\n            result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D44\u4EA7\u539F\u503C\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //\u8D44\u4EA7\u6B8B\u503C\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            //\u6298\u65E7\u7B2C\u4E00\u5E74\u4E2D\u7684\u6708\u6570\r\n            var month = 12;\r\n            if(arguments.length == 5){\r\n                month = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(month)){\r\n                    return month;\r\n                }\r\n\r\n                if(!isRealNum(month)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                month = parseInt(month);\r\n            }\r\n\r\n            if(cost < 0 || salvage < 0 || life < 0 || period < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(month < 1 || month > 12){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(salvage >= cost){\r\n                return 0;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\r\n\r\n            var initial = cost * rate * month / 12;\r\n\r\n            var total = initial;\r\n            var current = 0;\r\n            var ceiling = (period === life) ? life - 1 : period;\r\n\r\n            for (var i = 2; i <= ceiling; i++) {\r\n                current = (cost - total) * rate;\r\n                total += current;\r\n            }\r\n\r\n            if (period === 1) {\r\n                var result = initial;\r\n            }\r\n            else if (period === life) {\r\n                var result = (cost - total) * rate;\r\n            }\r\n            else {\r\n                var result = current;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DDB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D44\u4EA7\u539F\u503C\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //\u8D44\u4EA7\u6B8B\u503C\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            //\u6298\u65E7\u7684\u9012\u51CF\u7CFB\u6570\r\n            var factor = 2;\r\n            if(arguments.length == 5){\r\n                factor = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(factor)){\r\n                    return factor;\r\n                }\r\n\r\n                if(!isRealNum(factor)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                factor = parseFloat(factor);\r\n            }\r\n\r\n            if(cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(salvage >= cost){\r\n                return 0;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var total = 0;\r\n            var current = 0;\r\n\r\n            for (var i = 1; i <= period; i++) {\r\n                current = Math.min((cost - total) * (factor / life), (cost - salvage - total));\r\n                total += current;\r\n            }\r\n\r\n            return current;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5E74\u91D1\u7684\u4ED8\u6B3E\u603B\u671F\u6570\u3002\r\n            var nper = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u989D\r\n            var pmt = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            //\u9884\u671F\u5229\u7387\r\n            var guess = 0.1;\r\n            if(arguments.length == 6){\r\n                guess = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var epsMax = 1e-6;\r\n\r\n            var iterMax = 100;\r\n            var iter = 0;\r\n            var close = false;\r\n            var rate = guess;\r\n\r\n            while (iter < iterMax && !close) {\r\n                var t1 = Math.pow(rate + 1, nper);\r\n                var t2 = Math.pow(rate + 1, nper - 1);\r\n\r\n                var f1 = fv + t1 * pv + pmt * (t1 - 1) * (rate * type + 1) / rate;\r\n                var f2 = nper * t2 * pv - pmt * (t1 - 1) *(rate * type + 1) / Math.pow(rate,2);\r\n                var f3 = nper * pmt * t2 * (rate * type + 1) / rate + pmt * (t1 - 1) * type / rate;\r\n\r\n                var newRate = rate - f1 / (f2 + f3);\r\n\r\n                if (Math.abs(newRate - rate) < epsMax) close = true;\r\n\r\n                iter++\r\n                rate = newRate;\r\n            }\r\n\r\n            if (!close) return formula.error.nm;\r\n\r\n            return rate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CUMPRINC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u5E74\u91D1\u7684\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u9996\u671F\r\n            var start_period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(start_period)){\r\n                return start_period;\r\n            }\r\n\r\n            if(!isRealNum(start_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_period = parseInt(start_period);\r\n\r\n            //\u672B\u671F\r\n            var end_period = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(end_period)){\r\n                return end_period;\r\n            }\r\n\r\n            if(!isRealNum(end_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            end_period = parseInt(end_period);\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseFloat(type);\r\n\r\n            if(rate <= 0 || nper <= 0 || pv <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(start_period < 1 || end_period < 1 || start_period > end_period){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, 0, type);\r\n            var principal = 0;\r\n\r\n            if (start_period === 1) {\r\n                if (type === 0) {\r\n                    principal = payment + pv * rate;\r\n                }\r\n                else {\r\n                    principal = payment;\r\n                }\r\n                start_period++;\r\n            }\r\n\r\n            for (var i = start_period; i <= end_period; i++) {\r\n                if (type > 0) {\r\n                    principal += payment - (window.luckysheet_function.FV.f(rate, i - 2, payment, pv, 1) - payment) * rate;\r\n                }\r\n                else {\r\n                    principal += payment - window.luckysheet_function.FV.f(rate, i - 1, payment, pv, 0) * rate;\r\n                }\r\n            }\r\n\r\n            return principal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPNUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                var basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / (360 / frequency);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(maturity).diff(dayjs(settlement), 'days') / (ylength / frequency);\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (average / frequency);\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (360 / frequency);\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (365 / frequency);\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / (360 / frequency);\r\n\r\n                    break;\r\n            }\r\n\r\n            return Math.round(result);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SYD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D44\u4EA7\u539F\u503C\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //\u8D44\u4EA7\u6B8B\u503C\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //\u5728\u4F7F\u7528\u671F\u9650\u5185\u8981\u8BA1\u7B97\u6298\u65E7\u7684\u6298\u65E7\u671F\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            if(life == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period < 1 || period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return ((cost - salvage) * (life - period + 1) * 2) / (life * (life + 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLEQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u503A\u5238\u8D2D\u4E70\u65F6\u7684\u8D34\u73B0\u7387\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            if(discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) > 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (365 * discount) / (360 - discount * dayjs(maturity).diff(dayjs(settlement), 'days'));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLYIELD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            if(pr <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return ((100 - pr) / pr) * (360 / dayjs(maturity).diff(dayjs(settlement), 'days'));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLPRICE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            if(discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) > 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 100 * (1 - discount * dayjs(maturity).diff(dayjs(settlement), 'days') / 360);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u989D\r\n            var pmt = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if (rate === 0) {\r\n                var result = -pmt * nper - fv;\r\n            }\r\n            else {\r\n                var result = (((1 - Math.pow(1 + rate, nper)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, nper);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACCRINT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u53D1\u884C\u65E5\r\n            var issue = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u9996\u6B21\u8BA1\u606F\u65E5\r\n            var first_interest = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(first_interest)){\r\n                return first_interest;\r\n            }\r\n\r\n            if(!dayjs(first_interest).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[2]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u8BC1\u5238\u7684\u7968\u9762\u503C\r\n            var par = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(par)){\r\n                return par;\r\n            }\r\n\r\n            if(!isRealNum(par)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            par = parseFloat(par);\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length >= 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            //\u5F53\u7ED3\u7B97\u65E5\u671F\u665A\u4E8E\u9996\u6B21\u8BA1\u606F\u65E5\u671F\u65F6\u7528\u4E8E\u8BA1\u7B97\u603B\u5E94\u8BA1\u5229\u606F\u7684\u65B9\u6CD5\r\n            var calc_method = true;\r\n            if(arguments.length == 8){\r\n                calc_method = func_methods.getCellBoolen(arguments[7]);\r\n\r\n                if(valueIsError(calc_method)){\r\n                    return calc_method;\r\n                }\r\n            }\r\n\r\n            if(rate <= 0 || par <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(issue) - dayjs(settlement) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result;\r\n            if(dayjs(settlement) - dayjs(first_interest) >= 0 && !calc_method){\r\n                var sd = dayjs(first_interest).date();\r\n                var sm = dayjs(first_interest).month() + 1;\r\n                var sy = dayjs(first_interest).year();\r\n                var ed = dayjs(settlement).date();\r\n                var em = dayjs(settlement).month() + 1;\r\n                var ey = dayjs(settlement).year();\r\n\r\n                switch (basis) {\r\n                    case 0: // US (NASD) 30/360\r\n                        if (sd === 31 && ed === 31) {\r\n                            sd = 30;\r\n                            ed = 30;\r\n                        }\r\n                        else if (sd === 31) {\r\n                            sd = 30;\r\n                        }\r\n                        else if (sd === 30 && ed === 31) {\r\n                            ed = 30;\r\n                        }\r\n\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                    case 1: // Actual/actual\r\n                        var ylength = 365;\r\n                        if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                            if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(first_interest, settlement) || (em === 1 && ed === 29)) {\r\n                                ylength = 366;\r\n                            }\r\n\r\n                            return dayjs(settlement).diff(dayjs(first_interest), 'days') / ylength;\r\n                        }\r\n\r\n                        var years = (ey - sy) + 1;\r\n                        var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                        var average = days / years;\r\n\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / average;\r\n\r\n                        break;\r\n                    case 2: // Actual/360\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / 360;\r\n\r\n                        break;\r\n                    case 3: // Actual/365\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / 365;\r\n\r\n                        break;\r\n                    case 4: // European 30/360\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                }\r\n            }\r\n            else{\r\n                var sd = dayjs(issue).date();\r\n                var sm = dayjs(issue).month() + 1;\r\n                var sy = dayjs(issue).year();\r\n                var ed = dayjs(settlement).date();\r\n                var em = dayjs(settlement).month() + 1;\r\n                var ey = dayjs(settlement).year();\r\n\r\n                switch (basis) {\r\n                    case 0: // US (NASD) 30/360\r\n                        if (sd === 31 && ed === 31) {\r\n                            sd = 30;\r\n                            ed = 30;\r\n                        }\r\n                        else if (sd === 31) {\r\n                            sd = 30;\r\n                        }\r\n                        else if (sd === 30 && ed === 31) {\r\n                            ed = 30;\r\n                        }\r\n\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                    case 1: // Actual/actual\r\n                        var ylength = 365;\r\n                        if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                            if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(issue, settlement) || (em === 1 && ed === 29)) {\r\n                                ylength = 366;\r\n                            }\r\n\r\n                            return dayjs(settlement).diff(dayjs(issue), 'days') / ylength;\r\n                        }\r\n\r\n                        var years = (ey - sy) + 1;\r\n                        var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                        var average = days / years;\r\n\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / average;\r\n\r\n                        break;\r\n                    case 2: // Actual/360\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / 360;\r\n\r\n                        break;\r\n                    case 3: // Actual/365\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / 365;\r\n\r\n                        break;\r\n                    case 4: // European 30/360\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                }\r\n            }\r\n\r\n            return par * rate * result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACCRINTM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u53D1\u884C\u65E5\r\n            var issue = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5230\u671F\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u8BC1\u5238\u7684\u7968\u9762\u503C\r\n            var par = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(par)){\r\n                return par;\r\n            }\r\n\r\n            if(!isRealNum(par)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            par = parseFloat(par);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate <= 0 || par <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(issue) - dayjs(settlement) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(issue).date();\r\n            var sm = dayjs(issue).month() + 1;\r\n            var sy = dayjs(issue).year();\r\n            var ed = dayjs(settlement).date();\r\n            var em = dayjs(settlement).month() + 1;\r\n            var ey = dayjs(settlement).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(issue, settlement) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(settlement).diff(dayjs(issue), 'days') / ylength;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            return par * rate * result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYBS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var interest; //\u7ED3\u7B97\u65E5\u4E4B\u524D\u7684\u4E0A\u4E00\u4E2A\u4ED8\u606F\u65E5\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = di;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    var sd = dayjs(interest).date();\r\n                    var sm = dayjs(interest).month() + 1;\r\n                    var sy = dayjs(interest).year();\r\n                    var ed = dayjs(settlement).date();\r\n                    var em = dayjs(settlement).month() + 1;\r\n                    var ey = dayjs(settlement).year();\r\n\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                case 2: // Actual/360\r\n                case 3: // Actual/365\r\n                    result = dayjs(settlement).diff(dayjs(interest), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var sd = dayjs(interest).date();\r\n                    var sm = dayjs(interest).month() + 1;\r\n                    var sy = dayjs(interest).year();\r\n                    var ed = dayjs(settlement).date();\r\n                    var em = dayjs(settlement).month() + 1;\r\n                    var ey = dayjs(settlement).year();\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n                    for(var i = 1; i <= maxCount; i++){\r\n                        var d1 = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n                        if(d1 <= dayjs(settlement)){\r\n                            var d2 = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                            result = dayjs(d2).diff(dayjs(d1), 'days');\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = 365 / frequency;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYSNC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var interest; //\u7ED3\u7B97\u65E5\u4E4B\u540E\u7684\u4E0B\u4E00\u4E2A\u4ED8\u606F\u65E5\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                    break;\r\n                }\r\n            }\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    var sd = dayjs(settlement).date();\r\n                    var sm = dayjs(settlement).month() + 1;\r\n                    var sy = dayjs(settlement).year();\r\n                    var ed = dayjs(interest).date();\r\n                    var em = dayjs(interest).month() + 1;\r\n                    var ey = dayjs(interest).year();\r\n\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                case 2: // Actual/360\r\n                case 3: // Actual/365\r\n                    result = dayjs(interest).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var sd = dayjs(settlement).date();\r\n                    var sm = dayjs(settlement).month() + 1;\r\n                    var sy = dayjs(settlement).year();\r\n                    var ed = dayjs(interest).date();\r\n                    var em = dayjs(interest).month() + 1;\r\n                    var ey = dayjs(interest).year();\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPNCD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var interest; //\u7ED3\u7B97\u65E5\u4E4B\u540E\u7684\u4E0B\u4E00\u4E2A\u4ED8\u606F\u65E5\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return dayjs(interest).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPPCD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var interest; //\u7ED3\u7B97\u65E5\u4E4B\u524D\u7684\u4E0A\u4E00\u4E2A\u4ED8\u606F\u65E5\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = di;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return dayjs(interest).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u6BCF\u671F\u7684\u4ED8\u6B3E\u91D1\u989D\r\n            var pmt = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //\u73B0\u503C\uFF0C\u6216\u4E00\u7CFB\u5217\u672A\u6765\u4ED8\u6B3E\u7684\u5F53\u524D\u503C\u7684\u7D2F\u79EF\u548C\r\n            var pv = 0;\r\n            if(arguments.length >= 4){\r\n                pv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(pv)){\r\n                    return pv;\r\n                }\r\n\r\n                if(!isRealNum(pv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                pv = parseFloat(pv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result;\r\n            if (rate === 0) {\r\n                result = pv + pmt * nper;\r\n            }\r\n            else {\r\n                var term = Math.pow(1 + rate, nper);\r\n                if (type === 1) {\r\n                    result = pv * term + pmt * (1 + rate) * (term - 1) / rate;\r\n                }\r\n                else {\r\n                    result = pv * term + pmt * (term - 1) / rate;\r\n                }\r\n            }\r\n\r\n            return -result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FVSCHEDULE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u73B0\u503C\r\n            var principal = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(principal)){\r\n                return principal;\r\n            }\r\n\r\n            if(!isRealNum(principal)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            principal = parseFloat(principal);\r\n\r\n            //\u4E00\u7EC4\u5229\u7387\r\n            var data_schedule = arguments[1];\r\n            var schedule = [];\r\n\r\n            if(getObjType(data_schedule) == \"array\"){\r\n                if(getObjType(data_schedule[0]) == \"array\" && !func_methods.isDyadicArr(data_schedule)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                schedule = schedule.concat(func_methods.getDataArr(data_schedule, false));\r\n            }\r\n            else if(getObjType(data_schedule) == \"object\" && data_schedule.startCell != null){\r\n                schedule = schedule.concat(func_methods.getCellDataArr(data_schedule, \"number\", false));\r\n            }\r\n            else{\r\n                schedule.push(data_schedule);\r\n            }\r\n\r\n            var schedule_n = [];\r\n\r\n            for(var i = 0; i < schedule.length; i++){\r\n                var number = schedule[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                schedule_n.push(parseFloat(number));\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var n = schedule_n.length;\r\n            var future = principal;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                future *= 1 + schedule_n[i];\r\n            }\r\n\r\n            return future;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YIELD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\r\n            var pr = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var num = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            if(num > 1){\r\n                var a = 1;\r\n                var b = 0;\r\n                var yld = a;\r\n\r\n                for(var i = 1; i <= 100; i++){\r\n                    var price = window.luckysheet_function.PRICE.f(settlement, maturity, rate, yld, redemption, frequency, basis);\r\n\r\n                    if(Math.abs(price - pr) < 0.000001){\r\n                        break;\r\n                    }\r\n\r\n                    if(price > pr){\r\n                        b = yld;\r\n                    }\r\n                    else{\r\n                        a = yld;\r\n                    }\r\n\r\n                    yld = (a + b) / 2;\r\n                }\r\n\r\n                var result = yld;\r\n            }\r\n            else{\r\n                var DSR = window.luckysheet_function.COUPDAYSNC.f(settlement, maturity, frequency, basis);\r\n                var E = window.luckysheet_function.COUPDAYS.f(settlement, maturity, frequency, basis);\r\n                var A = window.luckysheet_function.COUPDAYBS.f(settlement, maturity, frequency, basis);\r\n\r\n                var T1 = redemption / 100 + rate / frequency;\r\n                var T2 = pr / 100 + (A / E) * (rate / frequency);\r\n                var T3 = frequency * E / DSR;\r\n\r\n                var result = ((T1 - T2) / T2) * T3;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YIELDDISC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var yearfrac = window.luckysheet_function.YEARFRAC.f(settlement, maturity, basis);\r\n\r\n            return (redemption / pr - 1) / yearfrac;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOMINAL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6BCF\u5E74\u7684\u5B9E\u9645\u5229\u7387\r\n            var effect_rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(effect_rate)){\r\n                return effect_rate;\r\n            }\r\n\r\n            if(!isRealNum(effect_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            effect_rate = parseFloat(effect_rate);\r\n\r\n            //\u6BCF\u5E74\u7684\u590D\u5229\u671F\u6570\r\n            var npery = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(npery)){\r\n                return npery;\r\n            }\r\n\r\n            if(!isRealNum(npery)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            npery = parseInt(npery);\r\n\r\n            if(effect_rate <= 0 || npery < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"XIRR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //\u4E0E\u73B0\u91D1\u6D41\u6570\u989D\u53C2\u6570\u4E2D\u7684\u73B0\u91D1\u6D41\u5BF9\u5E94\u7684\u65E5\u671F\u6570\u7EC4\u6216\u8303\u56F4\r\n            var dates = func_methods.getCellrangeDate(arguments[1]);\r\n            if(valueIsError(dates)){\r\n                return dates;\r\n            }\r\n\r\n            for(var i = 0; i < dates.length; i++){\r\n                if(!dayjs(dates[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //\u5BF9\u5185\u90E8\u56DE\u62A5\u7387\u7684\u4F30\u7B97\u503C\r\n            var guess = 0.1;\r\n            if(arguments.length == 3){\r\n                guess = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            var positive = false;\r\n            var negative = false;\r\n            for (var i = 0; i < values_n.length; i++) {\r\n                if (values_n[i] > 0) {\r\n                    positive = true;\r\n                }\r\n\r\n                if (values_n[i] < 0) {\r\n                    negative = true;\r\n                }\r\n\r\n                if(positive && negative){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(!positive || !negative){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(values_n.length != dates.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var irrResult = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = values[0];\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    result += values[i] / Math.pow(r, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var irrResultDeriv = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = 0;\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    var frac = window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365;\r\n                    result -= frac * values[i] / Math.pow(r, frac + 1);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var resultRate = guess;\r\n            var epsMax = 1e-10;\r\n\r\n            var newRate, epsRate, resultValue;\r\n            var contLoop = true;\r\n\r\n            do {\r\n                resultValue = irrResult(values_n, dates, resultRate);\r\n                newRate = resultRate - resultValue / irrResultDeriv(values_n, dates, resultRate);\r\n                epsRate = Math.abs(newRate - resultRate);\r\n                resultRate = newRate;\r\n                contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n            }\r\n            while (contLoop);\r\n\r\n            return resultRate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MIRR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //\u73B0\u91D1\u6D41\u4E2D\u4F7F\u7528\u7684\u8D44\u91D1\u652F\u4ED8\u7684\u5229\u7387\r\n            var finance_rate = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(finance_rate)){\r\n                return finance_rate;\r\n            }\r\n\r\n            if(!isRealNum(finance_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            finance_rate = parseFloat(finance_rate);\r\n\r\n            //\u5C06\u73B0\u91D1\u6D41\u518D\u6295\u8D44\u7684\u6536\u76CA\u7387\r\n            var reinvest_rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(reinvest_rate)){\r\n                return reinvest_rate;\r\n            }\r\n\r\n            if(!isRealNum(reinvest_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            reinvest_rate = parseFloat(reinvest_rate);\r\n\r\n            //\u8BA1\u7B97\r\n            var n = values_n.length;\r\n            var payments = [];\r\n            var incomes = [];\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                if (values_n[i] < 0) {\r\n                    payments.push(values_n[i]);\r\n                }\r\n                else {\r\n                    incomes.push(values_n[i]);\r\n                }\r\n            }\r\n\r\n            if(payments.length == 0 || incomes.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var num = -window.luckysheet_function.NPV.f(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\r\n            var den = window.luckysheet_function.NPV.f(finance_rate, payments) * (1 + finance_rate);\r\n\r\n            return Math.pow(num / den, 1 / (n - 1)) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IRR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6295\u8D44\u76F8\u5173\u6536\u76CA\u6216\u652F\u51FA\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", true));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //\u5BF9\u5185\u90E8\u56DE\u62A5\u7387\u7684\u4F30\u7B97\u503C\r\n            var guess = 0.1;\r\n            if(arguments.length == 2){\r\n                guess = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            var dates = [];\r\n            var positive = false;\r\n            var negative = false;\r\n\r\n            for (var i = 0; i < values.length; i++) {\r\n                dates[i] = (i === 0) ? 0 : dates[i - 1] + 365;\r\n\r\n                if (values[i] > 0) {\r\n                    positive = true;\r\n                }\r\n\r\n                if (values[i] < 0) {\r\n                    negative = true;\r\n                }\r\n            }\r\n\r\n            if(!positive || !negative){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var irrResult = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = values[0];\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    // result += values[i] / Math.pow(r, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n                    result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var irrResultDeriv = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = 0;\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    // var frac = window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365;\r\n                    var frac = (dates[i] - dates[0]) / 365;\r\n                    result -= frac * values[i] / Math.pow(r, frac + 1);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var resultRate = guess;\r\n            var epsMax = 1e-10;\r\n\r\n            var newRate, epsRate, resultValue;\r\n            var contLoop = true;\r\n\r\n            do {\r\n                resultValue = irrResult(values_n, dates, resultRate);\r\n                newRate = resultRate - resultValue / irrResultDeriv(values_n, dates, resultRate);\r\n                epsRate = Math.abs(newRate - resultRate);\r\n                resultRate = newRate;\r\n                contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n            }\r\n            while (contLoop);\r\n\r\n            return resultRate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NPV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u67D0\u4E00\u671F\u95F4\u7684\u8D34\u73B0\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u652F\u51FA\uFF08\u8D1F\u503C\uFF09\u548C\u6536\u76CA\uFF08\u6B63\u503C\uFF09\r\n            var values = [];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    values = values.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    values = values.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    values.push(data);\r\n                }\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(isRealNum(number)){\r\n                    values_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = 0;\r\n\r\n            if(values_n.length > 0){\r\n                for(var i = 0; i < values_n.length; i++){\r\n                    result += values_n[i] / Math.pow(1 + rate, i + 1);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"XNPV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5E94\u7528\u4E8E\u73B0\u91D1\u6D41\u7684\u8D34\u73B0\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u4E0E dates \u4E2D\u7684\u652F\u4ED8\u65F6\u95F4\u76F8\u5BF9\u5E94\u7684\u4E00\u7CFB\u5217\u73B0\u91D1\u6D41\r\n            var data_values = arguments[1];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //\u4E0E\u73B0\u91D1\u6D41\u652F\u4ED8\u76F8\u5BF9\u5E94\u7684\u652F\u4ED8\u65E5\u671F\u8868\r\n            var dates = func_methods.getCellrangeDate(arguments[2]);\r\n            if(valueIsError(dates)){\r\n                return dates;\r\n            }\r\n\r\n            for(var i = 0; i < dates.length; i++){\r\n                if(!dayjs(dates[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            if(values_n.length != dates.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = 0;\r\n            for (var i = 0; i < values_n.length; i++) {\r\n                result += values_n[i] / Math.pow(1 + rate, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CUMIPMT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u5E74\u91D1\u7684\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u9996\u671F\r\n            var start_period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(start_period)){\r\n                return start_period;\r\n            }\r\n\r\n            if(!isRealNum(start_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_period = parseInt(start_period);\r\n\r\n            //\u672B\u671F\r\n            var end_period = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(end_period)){\r\n                return end_period;\r\n            }\r\n\r\n            if(!isRealNum(end_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            end_period = parseInt(end_period);\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseFloat(type);\r\n\r\n            if(rate <= 0 || nper <= 0 || pv <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(start_period < 1 || end_period < 1 || start_period > end_period){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, 0, type);\r\n            var interest = 0;\r\n\r\n            if (start_period === 1) {\r\n                if (type === 0) {\r\n                    interest = -pv;\r\n                    start_period++;\r\n                }\r\n            }\r\n\r\n            for (var i = start_period; i <= end_period; i++) {\r\n                if (type === 1) {\r\n                    interest += window.luckysheet_function.FV.f(rate, i - 2, payment, pv, 1) - payment;\r\n                }\r\n                else {\r\n                    interest += window.luckysheet_function.FV.f(rate, i - 1, payment, pv, 0);\r\n                }\r\n            }\r\n\r\n            interest *= rate;\r\n\r\n            return interest;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PMT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D37\u6B3E\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u8BE5\u9879\u8D37\u6B3E\u7684\u4ED8\u6B3E\u603B\u6570\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length == 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result;\r\n\r\n            if (rate === 0) {\r\n                result = (pv + fv) / nper;\r\n            }\r\n            else {\r\n                var term = Math.pow(1 + rate, nper);\r\n\r\n                if (type === 1) {\r\n                    result = (fv * rate / (term - 1) + pv * rate / (1 - 1 / term)) / (1 + rate);\r\n                }\r\n                else {\r\n                    result = fv * rate / (term - 1) + pv * rate / (1 - 1 / term);\r\n                }\r\n            }\r\n\r\n            return -result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IPMT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u5176\u5229\u606F\u6570\u989D\u7684\u671F\u6570\r\n            var per = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(per)){\r\n                return per;\r\n            }\r\n\r\n            if(!isRealNum(per)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            per = parseFloat(per);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 5){\r\n                fv = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 6){\r\n                type = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(per < 1 || per > nper){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, fv, type);\r\n            var interest;\r\n\r\n            if (per === 1) {\r\n                if (type === 1) {\r\n                    interest = 0;\r\n                }\r\n                else {\r\n                    interest = -pv;\r\n                }\r\n            }\r\n            else {\r\n                if (type === 1) {\r\n                    interest = window.luckysheet_function.FV.f(rate, per - 2, payment, pv, 1) - payment;\r\n                }\r\n                else {\r\n                    interest = window.luckysheet_function.FV.f(rate, per - 1, payment, pv, 0);\r\n                }\r\n            }\r\n\r\n            var result = interest * rate;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PPMT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u7528\u4E8E\u8BA1\u7B97\u5176\u5229\u606F\u6570\u989D\u7684\u671F\u6570\r\n            var per = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(per)){\r\n                return per;\r\n            }\r\n\r\n            if(!isRealNum(per)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            per = parseFloat(per);\r\n\r\n            //\u603B\u4ED8\u6B3E\u671F\u6570\r\n            var nper = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 5){\r\n                fv = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 6){\r\n                type = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(per < 1 || per > nper){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, fv, type);\r\n            var payment2 = window.luckysheet_function.IPMT.f(rate, per, nper, pv, fv, type);\r\n\r\n            return payment - payment2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INTRATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6295\u8D44\u989D\r\n            var investment = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(investment)){\r\n                return investment;\r\n            }\r\n\r\n            if(!isRealNum(investment)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            investment = parseFloat(investment);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u5230\u671F\u65F6\u7684\u5151\u6362\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(investment <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = 360 / ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        result = ylength / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                        result = ((redemption - investment) / investment) * result;\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = average / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = 360 / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = 365 / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = 360 / ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = ((redemption - investment) / investment) * result;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var DSC = window.luckysheet_function.COUPDAYSNC.f(settlement, maturity, frequency, basis);\r\n            var E = window.luckysheet_function.COUPDAYS.f(settlement, maturity, frequency, basis);\r\n            var A = window.luckysheet_function.COUPDAYBS.f(settlement, maturity, frequency, basis);\r\n            var num = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            if(num > 1){\r\n                var T1 = redemption / Math.pow(1 + yld / frequency, num - 1 + DSC / E);\r\n\r\n                var T2 = 0;\r\n                for(var i = 1; i <= num; i++){\r\n                    T2 += (100 * rate / frequency) / Math.pow(1 + yld / frequency, i - 1 + DSC / E);\r\n                }\r\n\r\n                var T3 = 100 * (rate / frequency) * (A / E);\r\n\r\n                var result = T1 + T2 - T3;\r\n            }\r\n            else{\r\n                var DSR = E - A;\r\n                var T1 = 100 * (rate / frequency) + redemption;\r\n                var T2 = (yld / frequency) * (DSR / E) + 1;\r\n                var T3 = 100 * (rate / frequency) * (A / E);\r\n\r\n                var result = T1 / T2 - T3;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICEDISC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(discount <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        result = dayjs(maturity).diff(dayjs(settlement), 'days') / ylength;\r\n                        result = redemption - discount * redemption * result;\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            result = redemption - discount * redemption * result;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICEMAT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u53D1\u884C\u65E5\r\n            var issue = func_methods.getCellDate(arguments[2]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u5728\u53D1\u884C\u65E5\u7684\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\r\n            var yld = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n            var td = dayjs(issue).date();\r\n            var tm = dayjs(issue).month() + 1;\r\n            var ty = dayjs(issue).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    if(td == 31){\r\n                        td = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (td + tm * 30 + ty * 360));\r\n                    var A = ((sd + sm * 30 + sy * 360) - (td + tm * 30 + ty * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                        var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                        var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                        result = (100 + (DIM / B * rate * 100)) / (1 + DSM / B * yld) - (A / B * rate * 100);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (td + tm * 30 + ty * 360));\r\n                    var A = ((sd + sm * 30 + sy * 360) - (td + tm * 30 + ty * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = (100 + (DIM / B * rate * 100)) / (1 + (DSM / B * yld)) - (A / B * rate * 100);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RECEIVED\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6295\u8D44\u989D\r\n            var investment = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(investment)){\r\n                return investment;\r\n            }\r\n\r\n            if(!isRealNum(investment)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            investment = parseFloat(investment);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u8D34\u73B0\u7387\r\n            var discount = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseFloat(basis);\r\n            }\r\n\r\n            if(investment <= 0 || discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                        result = investment / (1 - discount * DIM / B);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = investment / (1 - discount * DIM / B);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DISC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u4EF7\u683C\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u6E05\u507F\u4EF7\u503C\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseFloat(basis);\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                        result = ((redemption - pr) / redemption) * (B / DSM);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, \"date\": 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = ((redemption - pr) / redemption) * (B / DSM);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NPER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5229\u7387\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //\u5404\u671F\u6240\u5E94\u652F\u4ED8\u7684\u91D1\u989D\r\n            var pmt = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //\u73B0\u503C\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //\u6700\u540E\u4E00\u6B21\u4ED8\u6B3E\u540E\u5E0C\u671B\u5F97\u5230\u7684\u73B0\u91D1\u4F59\u989D\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //\u6307\u5B9A\u5404\u671F\u7684\u4ED8\u6B3E\u65F6\u95F4\u662F\u5728\u671F\u521D\u8FD8\u662F\u671F\u672B\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var num = pmt * (1 + rate * type) - fv * rate;\r\n            var den = (pv * rate + pmt * (1 + rate * type));\r\n\r\n            return Math.log(num / den) / Math.log(1 + rate);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SLN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8D44\u4EA7\u539F\u503C\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //\u8D44\u4EA7\u6B8B\u503C\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //\u8D44\u4EA7\u7684\u6298\u65E7\u671F\u6570\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            if(life == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return (cost - salvage) / life;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DURATION\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var coupon = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(coupon)){\r\n                return coupon;\r\n            }\r\n\r\n            if(!isRealNum(coupon)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            coupon = parseFloat(coupon);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(coupon < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var nper = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            var sum1 = 0;\r\n            var sum2 = 0;\r\n            for(var i = 1; i <= nper; i++){\r\n                sum1 += 100 * (coupon / frequency) * i / Math.pow(1 + (yld / frequency), i);\r\n                sum2 += 100 * (coupon / frequency) / Math.pow(1 + (yld / frequency), i);\r\n            }\r\n\r\n            var result = (sum1 + 100 * nper / Math.pow(1 + (yld / frequency), nper)) / (sum2 + 100 / Math.pow(1 + (yld / frequency), nper));\r\n            result = result / frequency;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MDURATION\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7ED3\u7B97\u65E5\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5230\u671F\u65E5\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u606F\u7968\u5229\u7387\r\n            var coupon = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(coupon)){\r\n                return coupon;\r\n            }\r\n\r\n            if(!isRealNum(coupon)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            coupon = parseFloat(coupon);\r\n\r\n            //\u6709\u4EF7\u8BC1\u5238\u7684\u5E74\u6536\u76CA\u7387\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //\u5E74\u4ED8\u606F\u6B21\u6570\r\n            var frequency = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //\u65E5\u8BA1\u6570\u57FA\u51C6\u7C7B\u578B\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(coupon < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var duration = window.luckysheet_function.DURATION.f(settlement, maturity, coupon, yld, frequency, basis);\r\n\r\n            return duration / (1 + yld / frequency);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2DEC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E8C\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = parseInt(number, 2);\r\n            var stringified = number.toString();\r\n\r\n            if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n                return parseInt(stringified.substring(1), 2) - 512;\r\n            }\r\n            else {\r\n                return result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2HEX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E8C\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = parseInt(number, 2).toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2OCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4E8C\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var stringified = number.toString();\r\n            if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n                return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8);\r\n            }\r\n\r\n            var result = parseInt(number, 2).toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2BIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if (number < 0) {\r\n                return '1' + new Array(9 - (512 + number).toString(2).length).join('0') + (512 + number).toString(2);\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2HEX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if (number < 0) {\r\n                return (1099511627776 + number).toString(16).toUpperCase();\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2OCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if (number < 0) {\r\n                return (1073741824 + number).toString(8);\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2BIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u516D\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var negative = (number.length === 10 && number.substring(0, 1).toLowerCase() === 'f') ? true : false;\r\n\r\n            var decimal = (negative) ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\r\n\r\n            if (decimal < -512 || decimal > 511) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if (negative) {\r\n                return '1' + new Array(9 - (512 + decimal).toString(2).length).join('0') + (512 + decimal).toString(2);\r\n            }\r\n\r\n            var result = decimal.toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2DEC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u516D\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var decimal = parseInt(number, 16);\r\n\r\n            return (decimal >= 549755813888) ? decimal - 1099511627776 : decimal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2OCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5341\u516D\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var decimal = parseInt(number, 16);\r\n\r\n            if (decimal > 536870911 && decimal < 1098974756864) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if (decimal >= 1098974756864) {\r\n                return (decimal - 1098437885952).toString(8);\r\n            }\r\n\r\n            var result = decimal.toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2BIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u516B\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            number = number.toString();\r\n\r\n            var negative = (number.length === 10 && number.substring(0, 1) === '7') ? true : false;\r\n\r\n            var decimal = (negative) ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\r\n\r\n            if (decimal < -512 || decimal > 511) {\r\n                return error.num;\r\n            }\r\n\r\n            if (negative) {\r\n                return '1' + new Array(9 - (512 + decimal).toString(2).length).join('0') + (512 + decimal).toString(2);\r\n            }\r\n\r\n            var result = decimal.toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2DEC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u516B\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var decimal = parseInt(number, 8);\r\n\r\n            return (decimal >= 536870912) ? decimal - 1073741824 : decimal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2HEX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u516B\u8FDB\u5236\u6570\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //\u6709\u6548\u4F4D\u6570\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var decimal = parseInt(number, 8);\r\n\r\n            if (decimal >= 536870912) {\r\n                return 'FF' + (decimal + 3221225472).toString(16).toUpperCase();\r\n            }\r\n\r\n            var result = decimal.toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COMPLEX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u590D\u6570\u7684\u5B9E\u7CFB\u6570\r\n            var real_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(real_num)){\r\n                return real_num;\r\n            }\r\n\r\n            if(!isRealNum(real_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            real_num = parseFloat(real_num);\r\n\r\n            //\u590D\u6570\u7684\u865A\u7CFB\u6570\r\n            var i_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(i_num)){\r\n                return i_num;\r\n            }\r\n\r\n            if(!isRealNum(i_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            i_num = parseFloat(i_num);\r\n\r\n            //\u590D\u6570\u4E2D\u865A\u7CFB\u6570\u7684\u540E\u7F00\r\n            var suffix = \"i\";\r\n            if(arguments.length == 3){\r\n                suffix = arguments[2].toString();\r\n            }\r\n\r\n            if(suffix != \"i\" && suffix != \"j\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if (real_num === 0 && i_num === 0) {\r\n                return 0;\r\n            }\r\n            else if (real_num === 0) {\r\n                return (i_num === 1) ? suffix : i_num.toString() + suffix;\r\n            }\r\n            else if (i_num === 0) {\r\n                return real_num.toString();\r\n            }\r\n            else {\r\n                var sign = (i_num > 0) ? '+' : '';\r\n                return real_num.toString() + sign + ((i_num === 1) ? suffix : i_num.toString() + suffix);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMREAL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u590D\u6570\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            if(inumber.toLowerCase() == \"true\" || inumber.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(inumber == \"0\"){\r\n                return 0;\r\n            }\r\n\r\n            if(['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0){\r\n                return 0;\r\n            }\r\n\r\n            var plus = inumber.indexOf('+');\r\n            var minus = inumber.indexOf('-');\r\n\r\n            if (plus === 0) {\r\n                plus = inumber.indexOf('+', 1);\r\n            }\r\n\r\n            if (minus === 0) {\r\n                minus = inumber.indexOf('-', 1);\r\n            }\r\n\r\n            var last = inumber.substring(inumber.length - 1, inumber.length);\r\n            var unit = (last === 'i' || last === 'j');\r\n\r\n            if (plus >= 0 || minus >= 0) {\r\n                if (!unit) {\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if (plus >= 0) {\r\n                    return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(0, plus));\r\n                }\r\n                else {\r\n                    return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(0, minus));\r\n                }\r\n            }\r\n            else {\r\n                if (unit) {\r\n                    return (isNaN(inumber.substring(0, inumber.length - 1))) ? formula.error.nm : 0;\r\n                }\r\n                else {\r\n                    return (isNaN(inumber)) ? formula.error.nm : inumber;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMAGINARY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u590D\u6570\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            if(inumber.toLowerCase() == \"true\" || inumber.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(inumber == \"0\"){\r\n                return 0;\r\n            }\r\n\r\n            if (['i', 'j'].indexOf(inumber) >= 0) {\r\n                return 1;\r\n            }\r\n\r\n            inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\r\n\r\n            var plus = inumber.indexOf('+');\r\n            var minus = inumber.indexOf('-');\r\n\r\n            if (plus === 0) {\r\n                plus = inumber.indexOf('+', 1);\r\n            }\r\n\r\n            if (minus === 0) {\r\n                minus = inumber.indexOf('-', 1);\r\n            }\r\n\r\n            var last = inumber.substring(inumber.length - 1, inumber.length);\r\n            var unit = (last === 'i' || last === 'j');\r\n\r\n            if (plus >= 0 || minus >= 0) {\r\n                if (!unit) {\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if (plus >= 0) {\r\n                    return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(plus + 1, inumber.length - 1));\r\n                }\r\n                else {\r\n                    return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ? formula.error.nm : -Number(inumber.substring(minus + 1, inumber.length - 1));\r\n                }\r\n            }\r\n            else {\r\n                if (unit) {\r\n                    return (isNaN(inumber.substring(0, inumber.length - 1))) ? formula.error.nm : inumber.substring(0, inumber.length - 1);\r\n                }\r\n                else {\r\n                    return (isNaN(inumber)) ? formula.error.nm : 0;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMCONJUGATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u590D\u6570\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            var x = window.luckysheet_function.IMREAL.f(inumber);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(inumber);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var unit = inumber.substring(inumber.length - 1);\r\n            unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n\r\n            return (y !== 0) ? window.luckysheet_function.COMPLEX.f(x, -y, unit) : inumber;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMABS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DELTA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u5B57\r\n            var number1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number1)){\r\n                return number1;\r\n            }\r\n\r\n            if(!isRealNum(number1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number1 = parseFloat(number1);\r\n\r\n            //\u7B2C\u4E8C\u4E2A\u6570\u5B57\r\n            var number2 = 0;\r\n            if(arguments.length == 2){\r\n                number2 = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(number2)){\r\n                    return number2;\r\n                }\r\n\r\n                if(!isRealNum(number2)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number2 = parseFloat(number2);\r\n            }\r\n\r\n            return (number1 === number2) ? 1 : 0;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMSUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var result = arguments[0];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var a = window.luckysheet_function.IMREAL.f(result);\r\n                if(valueIsError(a)){\r\n                    return a;\r\n                }\r\n\r\n                var b = window.luckysheet_function.IMAGINARY.f(result);\r\n                if(valueIsError(b)){\r\n                    return b;\r\n                }\r\n\r\n                var c = window.luckysheet_function.IMREAL.f(arguments[i]);\r\n                if(valueIsError(c)){\r\n                    return c;\r\n                }\r\n\r\n                var d = window.luckysheet_function.IMAGINARY.f(arguments[i]);\r\n                if(valueIsError(d)){\r\n                    return d;\r\n                }\r\n\r\n                result = window.luckysheet_function.COMPLEX.f(a + c, b + d);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMSUB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //inumber1\r\n            var inumber1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber1)){\r\n                return inumber1;\r\n            }\r\n\r\n            inumber1 = inumber1.toString();\r\n\r\n            if(inumber1.toLowerCase() == \"true\" || inumber1.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var a = window.luckysheet_function.IMREAL.f(inumber1);\r\n            if(valueIsError(a)){\r\n                return a;\r\n            }\r\n\r\n            var b = window.luckysheet_function.IMAGINARY.f(inumber1);\r\n            if(valueIsError(b)){\r\n                return b;\r\n            }\r\n\r\n            //inumber2\r\n            var inumber2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(inumber2)){\r\n                return inumber2;\r\n            }\r\n\r\n            inumber2 = inumber2.toString();\r\n\r\n            if(inumber2.toLowerCase() == \"true\" || inumber2.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var c = window.luckysheet_function.IMREAL.f(inumber2);\r\n            if(valueIsError(c)){\r\n                return c;\r\n            }\r\n\r\n            var d = window.luckysheet_function.IMAGINARY.f(inumber2);\r\n            if(valueIsError(d)){\r\n                return d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var unit1 = inumber1.substring(inumber1.length - 1);\r\n            var unit2 = inumber2.substring(inumber2.length - 1);\r\n\r\n            var unit = 'i';\r\n\r\n            if (unit1 === 'j') {\r\n                unit = 'j';\r\n            }\r\n            else if (unit2 === 'j') {\r\n                unit = 'j';\r\n            }\r\n\r\n            return window.luckysheet_function.COMPLEX.f(a - c, b - d, unit);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMPRODUCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var result = arguments[0];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var a = window.luckysheet_function.IMREAL.f(result);\r\n                if(valueIsError(a)){\r\n                    return a;\r\n                }\r\n\r\n                var b = window.luckysheet_function.IMAGINARY.f(result);\r\n                if(valueIsError(b)){\r\n                    return b;\r\n                }\r\n\r\n                var c = window.luckysheet_function.IMREAL.f(arguments[i]);\r\n                if(valueIsError(c)){\r\n                    return c;\r\n                }\r\n\r\n                var d = window.luckysheet_function.IMAGINARY.f(arguments[i]);\r\n                if(valueIsError(d)){\r\n                    return d;\r\n                }\r\n\r\n                result = window.luckysheet_function.COMPLEX.f(a * c - b * d, a * d + b * c);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMDIV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //inumber1\r\n            var inumber1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber1)){\r\n                return inumber1;\r\n            }\r\n\r\n            inumber1 = inumber1.toString();\r\n\r\n            if(inumber1.toLowerCase() == \"true\" || inumber1.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var a = window.luckysheet_function.IMREAL.f(inumber1);\r\n            if(valueIsError(a)){\r\n                return a;\r\n            }\r\n\r\n            var b = window.luckysheet_function.IMAGINARY.f(inumber1);\r\n            if(valueIsError(b)){\r\n                return b;\r\n            }\r\n\r\n            //inumber2\r\n            var inumber2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(inumber2)){\r\n                return inumber2;\r\n            }\r\n\r\n            inumber2 = inumber2.toString();\r\n\r\n            if(inumber2.toLowerCase() == \"true\" || inumber2.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var c = window.luckysheet_function.IMREAL.f(inumber2);\r\n            if(valueIsError(c)){\r\n                return c;\r\n            }\r\n\r\n            var d = window.luckysheet_function.IMAGINARY.f(inumber2);\r\n            if(valueIsError(d)){\r\n                return d;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var unit1 = inumber1.substring(inumber1.length - 1);\r\n            var unit2 = inumber2.substring(inumber2.length - 1);\r\n\r\n            var unit = 'i';\r\n\r\n            if (unit1 === 'j') {\r\n                unit = 'j';\r\n            }\r\n            else if (unit2 === 'j') {\r\n                unit = 'j';\r\n            }\r\n\r\n            if (c === 0 && d === 0) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var den = c * c + d * d;\r\n\r\n            return window.luckysheet_function.COMPLEX.f((a * c + b * d) / den, (b * c - a * d) / den, unit);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //logical\r\n            var logical = func_methods.getCellBoolen(arguments[0]);\r\n\r\n            if(valueIsError(logical)){\r\n                return logical;\r\n            }\r\n\r\n            return !logical;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return true;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FALSE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = true;\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var logical = func_methods.getCellBoolen(arguments[i]);\r\n\r\n                if(valueIsError(logical)){\r\n                    return logical;\r\n                }\r\n\r\n                if(!logical){\r\n                    result = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IFERROR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value_if_error = func_methods.getFirstValue(arguments[1], \"text\");\r\n\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            // (getObjType(value) === 'string' && $.trim(value) === ''It means that the cell associated with IFERROR has been deleted by keyboard\r\n            if(valueIsError(value) || (getObjType(value) === 'string' && $.trim(value) === '' )){\r\n                return value_if_error;\r\n            }\r\n\r\n            return value;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6D4B\u8BD5\u7684\u6761\u4EF6\r\n            var logical_test = func_methods.getCellBoolen(arguments[0]);\r\n            if(valueIsError(logical_test)){\r\n                return logical_test;\r\n            }\r\n\r\n            //\u7ED3\u679C\u4E3A TRUE\r\n            var value_if_true = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(value_if_true) && value_if_false!=error.d){\r\n                return value_if_true;\r\n            }\r\n\r\n            //\u7ED3\u679C\u4E3A FALSE\r\n            var value_if_false = \"\";\r\n            if(arguments.length == 3){\r\n                value_if_false = func_methods.getFirstValue(arguments[2], \"text\");\r\n                if(valueIsError(value_if_false) && value_if_false!=error.d){\r\n                    return value_if_false;\r\n                }\r\n            }\r\n\r\n            if(logical_test){\r\n                return value_if_true;\r\n            }\r\n            else{\r\n                return value_if_false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = false;\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var logical = func_methods.getCellBoolen(arguments[i]);\r\n\r\n                if(valueIsError(logical)){\r\n                    return logical;\r\n                }\r\n\r\n                if(logical){\r\n                    result = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 != value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EQ\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 == value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 > value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GTE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 >= value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 < value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LTE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 <= value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ADD\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 + value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINUS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 - value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MULTIPLY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 * value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DIVIDE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            if(value2 == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return value1 / value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONCAT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 + \"\" + value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UNARY_PERCENT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u4F5C\u4E3A\u767E\u5206\u6BD4\u89E3\u91CA\u7684\u6570\u503C\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var result = number / 100;\r\n\r\n            return Math.round(result * 100) / 100;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONCATENATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = \"\";\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var text = func_methods.getFirstValue(arguments[i], \"text\");\r\n                if(valueIsError(text)){\r\n                    return text;\r\n                }\r\n\r\n                result = result + \"\" + text;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CODE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            if(text == \"\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return text.charCodeAt(0);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CHAR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 1 || number > 255){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return String.fromCharCode(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ARABIC\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString().toUpperCase();\r\n\r\n            if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var r = 0;\r\n            text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, function(i) {\r\n                r += {\r\n                    M: 1000,\r\n                    CM: 900,\r\n                    D: 500,\r\n                    CD: 400,\r\n                    C: 100,\r\n                    XC: 90,\r\n                    L: 50,\r\n                    XL: 40,\r\n                    X: 10,\r\n                    IX: 9,\r\n                    V: 5,\r\n                    IV: 4,\r\n                    I: 1\r\n                }[i];\r\n            });\r\n\r\n            return r;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROMAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number == 0){\r\n                return \"\";\r\n            }\r\n            else if(number < 1 || number > 3999){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function convert(num) {\r\n                var a=[\r\n                    [\"\",\"I\",\"II\",\"III\",\"IV\",\"V\",\"VI\",\"VII\",\"VIII\",\"IX\"],\r\n                    [\"\",\"X\",\"XX\",\"XXX\",\"XL\",\"L\",\"LX\",\"LXX\",\"LXXX\",\"XC\"],\r\n                    [\"\",\"C\",\"CC\",\"CCC\",\"CD\",\"D\",\"DC\",\"DCC\",\"DCCC\",\"CM\"],\r\n                    [\"\",\"M\",\"MM\",\"MMM\"]\r\n                ];\r\n\r\n                var i = a[3][Math.floor(num / 1000)];\r\n                var j = a[2][Math.floor(num % 1000 / 100)];\r\n                var k = a[1][Math.floor(num % 100 / 10)];\r\n                var l = a[0][num % 10];\r\n\r\n                return  i + j + k + l;\r\n            }\r\n\r\n            return convert(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXEXTRACT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8F93\u5165\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u8868\u8FBE\u5F0F\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            var match = text.match(new RegExp(regular_expression));\r\n            return match ? (match[match.length > 1 ? match.length - 1 : 0]) : null;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXMATCH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8F93\u5165\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u8868\u8FBE\u5F0F\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            var match = text.match(new RegExp(regular_expression));\r\n            return match ? true : false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXREPLACE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8F93\u5165\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //\u8868\u8FBE\u5F0F\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            //\u63D2\u5165\u6587\u672C\r\n            var replacement = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(replacement)){\r\n                return replacement;\r\n            }\r\n\r\n            return text.replace(new RegExp(regular_expression), replacement);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6587\u672C\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            return getObjType(value) == \"string\" ? value : '';\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FIXED\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8FDB\u884C\u820D\u5165\u5E76\u8F6C\u6362\u4E3A\u6587\u672C\u7684\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u5C0F\u6570\u4F4D\u6570\r\n            var decimals = 2;\r\n            if(arguments.length >= 2){\r\n                decimals = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(decimals)){\r\n                    return decimals;\r\n                }\r\n\r\n                if(!isRealNum(decimals)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                decimals = parseInt(decimals);\r\n            }\r\n\r\n            //\u903B\u8F91\u503C\r\n            var no_commas = false;\r\n            if(arguments.length == 3){\r\n                no_commas = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(no_commas)){\r\n                    return no_commas;\r\n                }\r\n            }\r\n\r\n            if(decimals > 127){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var format = no_commas ? '0' : '#,##0';\r\n\r\n            if (decimals <= 0) {\r\n                number = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);\r\n            }\r\n            else if (decimals > 0) {\r\n                format += '.' + new Array(decimals + 1).join('0');\r\n            }\r\n\r\n            return update(format, number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FIND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u67E5\u627E\u7684\u6587\u672C\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //\u5305\u542B\u8981\u67E5\u627E\u6587\u672C\u7684\u6587\u672C\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //\u6307\u5B9A\u5F00\u59CB\u8FDB\u884C\u67E5\u627E\u7684\u5B57\u7B26\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseFloat(start_num);\r\n            }\r\n\r\n            if(start_num < 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(find_text == \"\"){\r\n                return start_num;\r\n            }\r\n\r\n            if(within_text.indexOf(find_text) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = within_text.indexOf(find_text, start_num - 1) + 1;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FINDB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u67E5\u627E\u7684\u6587\u672C\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //\u5305\u542B\u8981\u67E5\u627E\u6587\u672C\u7684\u6587\u672C\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //\u6307\u5B9A\u5F00\u59CB\u8FDB\u884C\u67E5\u627E\u7684\u5B57\u7B26\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseFloat(start_num);\r\n            }\r\n\r\n            if(start_num < 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(find_text == \"\"){\r\n                return start_num;\r\n            }\r\n\r\n            if(within_text.indexOf(find_text) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var strArr = within_text.split(\"\");\r\n            var index = within_text.indexOf(find_text, start_num - 1);\r\n\r\n            var result = 0;\r\n            for(var i = 0; i < index; i++){\r\n                if(/[^\\x00-\\xff]/g.test(strArr[i])){\r\n                    result += 2;\r\n                }\r\n                else{\r\n                    result += 1;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"JOIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B9A\u754C\u7B26\r\n            var separator = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(separator)){\r\n                return separator;\r\n            }\r\n\r\n            //\u503C\u6216\u6570\u7EC4\r\n            var dataArr = [];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return dataArr.join(separator);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LEFT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u8981\u63D0\u53D6\uFFFD\uFFFD\uFFFD\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\r\n            var num_chars = 1;\r\n            if(arguments.length == 2){\r\n                num_chars = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(num_chars)){\r\n                    return num_chars;\r\n                }\r\n\r\n                if(!isRealNum(num_chars)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num_chars = parseInt(num_chars);\r\n            }\r\n\r\n            if(num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(num_chars >= text.length){\r\n                return text;\r\n            }\r\n            else if(num_chars == 0){\r\n                return \"\";\r\n            }\r\n            else{\r\n                return text.substr(0, num_chars);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RIGHT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u8981\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\r\n            var num_chars = 1;\r\n            if(arguments.length == 2){\r\n                num_chars = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(num_chars)){\r\n                    return num_chars;\r\n                }\r\n\r\n                if(!isRealNum(num_chars)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num_chars = parseInt(num_chars);\r\n            }\r\n\r\n            if(num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(num_chars >= text.length){\r\n                return text;\r\n            }\r\n            else if(num_chars == 0){\r\n                return \"\";\r\n            }\r\n            else{\r\n                return text.substr(-num_chars, num_chars);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MID\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5305\u542B\u8981\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6587\u672C\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //\u5F00\u59CB\u63D0\u53D6\u7684\u4F4D\u7F6E\r\n            var start_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(start_num)){\r\n                return start_num;\r\n            }\r\n\r\n            if(!isRealNum(start_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_num = parseInt(start_num);\r\n\r\n            //\u63D0\u53D6\u7684\u5B57\u7B26\u7684\u6570\u91CF\r\n            var num_chars = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(num_chars)){\r\n                return num_chars;\r\n            }\r\n\r\n            if(!isRealNum(num_chars)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            num_chars = parseInt(num_chars);\r\n\r\n            if(start_num < 1 || num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(start_num > text.length){\r\n                return \"\";\r\n            }\r\n\r\n            if(start_num + num_chars > text.length){\r\n                return text.substr(start_num - 1, text.length - start_num + 1);\r\n            }\r\n\r\n            return text.substr(start_num - 1, num_chars);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LEN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LENB\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.replace(/[^\\x00-\\xff]/g, \"aa\").length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOWER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text ? text.toLowerCase() : text;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UPPER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text ? text.toUpperCase() : text;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXACT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E321\r\n            var text1 = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text1)){\r\n                return text1;\r\n            }\r\n\r\n            text1 = text1.toString();\r\n\r\n            //\u5B57\u7B26\u4E322\r\n            var text2 = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(text2)){\r\n                return text2;\r\n            }\r\n\r\n            text2 = text2.toString();\r\n\r\n            return text1 === text2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REPLACE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E321\r\n            var old_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(old_text)){\r\n                return old_text;\r\n            }\r\n\r\n            old_text = old_text.toString();\r\n\r\n            //\u8FDB\u884C\u66FF\u6362\u64CD\u4F5C\u7684\u4F4D\u7F6E\r\n            var start_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(start_num)){\r\n                return start_num;\r\n            }\r\n\r\n            if(!isRealNum(start_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_num = parseInt(start_num);\r\n\r\n            //\u8981\u5728\u6587\u672C\u4E2D\u66FF\u6362\u7684\u5B57\u7B26\u4E2A\u6570\r\n            var num_chars = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(num_chars)){\r\n                return num_chars;\r\n            }\r\n\r\n            if(!isRealNum(num_chars)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            num_chars = parseInt(num_chars);\r\n\r\n            //\u5B57\u7B26\u4E322\r\n            var new_text = func_methods.getFirstValue(arguments[3], \"text\");\r\n            if(valueIsError(new_text)){\r\n                return new_text;\r\n            }\r\n\r\n            new_text = new_text.toString();\r\n\r\n            return old_text.substr(0, start_num - 1) + new_text + old_text.substr(start_num - 1 + num_chars);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REPT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E321\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //\u91CD\u590D\u6B21\u6570\r\n            var number_times = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_times)){\r\n                return number_times;\r\n            }\r\n\r\n            if(!isRealNum(number_times)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_times = parseInt(number_times);\r\n\r\n            if(number_times < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(number_times > 100){\r\n                number_times = 100;\r\n            }\r\n\r\n            return new Array(number_times + 1).join(text);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEARCH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E321\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //\u5B57\u7B26\u4E322\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //\u5F00\u59CB\u4F4D\u7F6E\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseInt(start_num);\r\n            }\r\n\r\n            if(start_num <= 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1;\r\n\r\n            return (foundAt === 0) ? formula.error.v : foundAt;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUBSTITUTE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u9700\u8981\u66FF\u6362\u5176\u4E2D\u5B57\u7B26\u7684\u6587\u672C\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //\u9700\u8981\u66FF\u6362\u7684\u6587\u672C\r\n            var old_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(old_text)){\r\n                return old_text;\r\n            }\r\n\r\n            old_text = old_text.toString();\r\n\r\n            //\u7528\u4E8E\u66FF\u6362 old_text \u7684\u6587\u672C\r\n            var new_text = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(new_text)){\r\n                return new_text;\r\n            }\r\n\r\n            new_text = new_text.toString();\r\n\r\n            //instance_num\r\n            var instance_num = null;\r\n            if(arguments.length == 4){\r\n                instance_num = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(instance_num)){\r\n                    return instance_num;\r\n                }\r\n\r\n                if(!isRealNum(instance_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                instance_num = parseInt(instance_num);\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var reg = new RegExp(old_text, \"g\");\r\n\r\n            var result;\r\n\r\n            if(instance_num == null){\r\n                result = text.replace(reg, new_text);\r\n            }\r\n            else{\r\n                if(instance_num <= 0){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var match = text.match(reg);\r\n\r\n                if(match == null || instance_num > match.length){\r\n                    return text;\r\n                }\r\n                else{\r\n                    var len = old_text.length;\r\n                    var index = 0;\r\n\r\n                    for(var i = 1; i <= instance_num; i++){\r\n                        index = text.indexOf(old_text, index) + 1;\r\n                    }\r\n\r\n                    result = text.substring(0, index - 1) + new_text + text.substring(index - 1 + len);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CLEAN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            var textArr = [];\r\n            for(var i = 0; i < text.length; i++){\r\n                var code = text.charCodeAt(i);\r\n\r\n                if(/[\\u4e00-\\u9fa5]/g.test(text.charAt(i)) || (code > 31 && code < 127)){\r\n                    textArr.push(text.charAt(i));\r\n                }\r\n            }\r\n\r\n            return textArr.join(\"\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TEXT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            //\u683C\u5F0F\r\n            var format_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(format_text)){\r\n                return format_text;\r\n            }\r\n\r\n            format_text = format_text.toString();\r\n\r\n            return update(format_text, value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRIM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.replace(/ +/g, ' ').trim();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VALUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return genarate(text)[2];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROPER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5B57\u7B26\u4E32\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString().toLowerCase();\r\n\r\n            return text.replace(/[a-zA-Z]+/g, function(word){ return word.substring(0,1).toUpperCase() + word.substring(1); })\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONVERT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //\u6570\u503C\u7684\u5355\u4F4D\r\n            var from_unit = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(from_unit)){\r\n                return from_unit;\r\n            }\r\n\r\n            from_unit = from_unit.toString();\r\n\r\n            //\u7ED3\u679C\u7684\u5355\u4F4D\r\n            var to_unit = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(to_unit)){\r\n                return to_unit;\r\n            }\r\n\r\n            to_unit = to_unit.toString();\r\n\r\n            //\u8BA1\u7B97\r\n            var units = [\r\n                [\"a.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n                [\"a.u. of charge\", \"e\", null, \"electric_charge\", false, false, 1.60217653141414e-19],\r\n                [\"a.u. of energy\", \"Eh\", null, \"energy\", false, false, 4.35974417757576e-18],\r\n                [\"a.u. of length\", \"a?\", null, \"length\", false, false, 5.29177210818182e-11],\r\n                [\"a.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n                [\"a.u. of time\", \"?/Eh\", null, \"time\", false, false, 2.41888432650516e-17],\r\n                [\"admiralty knot\", \"admkn\", null, \"speed\", false, true, 0.514773333],\r\n                [\"ampere\", \"A\", null, \"electric_current\", true, false, 1],\r\n                [\"ampere per meter\", \"A/m\", null, \"magnetic_field_intensity\", true, false, 1],\r\n                [\"\u00E5ngstr\u00F6m\", \"\u00C5\", [\"ang\"], \"length\", false, true, 1e-10],\r\n                [\"are\", \"ar\", null, \"area\", false, true, 100],\r\n                [\"astronomical unit\", \"ua\", null, \"length\", false, false, 1.49597870691667e-11],\r\n                [\"bar\", \"bar\", null, \"pressure\", false, false, 100000],\r\n                [\"barn\", \"b\", null, \"area\", false, false, 1e-28],\r\n                [\"becquerel\", \"Bq\", null, \"radioactivity\", true, false, 1],\r\n                [\"bit\", \"bit\", [\"b\"], \"information\", false, true, 1],\r\n                [\"btu\", \"BTU\", [\"btu\"], \"energy\", false, true, 1055.05585262],\r\n                [\"byte\", \"byte\", null, \"information\", false, true, 8],\r\n                [\"candela\", \"cd\", null, \"luminous_intensity\", true, false, 1],\r\n                [\"candela per square metre\", \"cd/m?\", null, \"luminance\", true, false, 1],\r\n                [\"coulomb\", \"C\", null, \"electric_charge\", true, false, 1],\r\n                [\"cubic \u00E5ngstr\u00F6m\", \"ang3\", [\"ang^3\"], \"volume\", false, true, 1e-30],\r\n                [\"cubic foot\", \"ft3\", [\"ft^3\"], \"volume\", false, true, 0.028316846592],\r\n                [\"cubic inch\", \"in3\", [\"in^3\"], \"volume\", false, true, 0.000016387064],\r\n                [\"cubic light-year\", \"ly3\", [\"ly^3\"], \"volume\", false, true, 8.46786664623715e-47],\r\n                [\"cubic metre\", \"m?\", null, \"volume\", true, true, 1],\r\n                [\"cubic mile\", \"mi3\", [\"mi^3\"], \"volume\", false, true, 4168181825.44058],\r\n                [\"cubic nautical mile\", \"Nmi3\", [\"Nmi^3\"], \"volume\", false, true, 6352182208],\r\n                [\"cubic Pica\", \"Pica3\", [\"Picapt3\", \"Pica^3\", \"Picapt^3\"], \"volume\", false, true, 7.58660370370369e-8],\r\n                [\"cubic yard\", \"yd3\", [\"yd^3\"], \"volume\", false, true, 0.764554857984],\r\n                [\"cup\", \"cup\", null, \"volume\", false, true, 0.0002365882365],\r\n                [\"dalton\", \"Da\", [\"u\"], \"mass\", false, false, 1.66053886282828e-27],\r\n                [\"day\", \"d\", [\"day\"], \"time\", false, true, 86400],\r\n                [\"degree\", \"\u00B0\", null, \"angle\", false, false, 0.0174532925199433],\r\n                [\"degrees Rankine\", \"Rank\", null, \"temperature\", false, true, 0.555555555555556],\r\n                [\"dyne\", \"dyn\", [\"dy\"], \"force\", false, true, 0.00001],\r\n                [\"electronvolt\", \"eV\", [\"ev\"], \"energy\", false, true, 1.60217656514141],\r\n                [\"ell\", \"ell\", null, \"length\", false, true, 1.143],\r\n                [\"erg\", \"erg\", [\"e\"], \"energy\", false, true, 1e-7],\r\n                [\"farad\", \"F\", null, \"electric_capacitance\", true, false, 1],\r\n                [\"fluid ounce\", \"oz\", null, \"volume\", false, true, 0.0000295735295625],\r\n                [\"foot\", \"ft\", null, \"length\", false, true, 0.3048],\r\n                [\"foot-pound\", \"flb\", null, \"energy\", false, true, 1.3558179483314],\r\n                [\"gal\", \"Gal\", null, \"acceleration\", false, false, 0.01],\r\n                [\"gallon\", \"gal\", null, \"volume\", false, true, 0.003785411784],\r\n                [\"gauss\", \"G\", [\"ga\"], \"magnetic_flux_density\", false, true, 1],\r\n                [\"grain\", \"grain\", null, \"mass\", false, true, 0.0000647989],\r\n                [\"gram\", \"g\", null, \"mass\", false, true, 0.001],\r\n                [\"gray\", \"Gy\", null, \"absorbed_dose\", true, false, 1],\r\n                [\"gross registered ton\", \"GRT\", [\"regton\"], \"volume\", false, true, 2.8316846592],\r\n                [\"hectare\", \"ha\", null, \"area\", false, true, 10000],\r\n                [\"henry\", \"H\", null, \"inductance\", true, false, 1],\r\n                [\"hertz\", \"Hz\", null, \"frequency\", true, false, 1],\r\n                [\"horsepower\", \"HP\", [\"h\"], \"power\", false, true, 745.69987158227],\r\n                [\"horsepower-hour\", \"HPh\", [\"hh\", \"hph\"], \"energy\", false, true, 2684519.538],\r\n                [\"hour\", \"h\", [\"hr\"], \"time\", false, true, 3600],\r\n                [\"imperial gallon (U.K.)\", \"uk_gal\", null, \"volume\", false, true, 0.00454609],\r\n                [\"imperial hundredweight\", \"lcwt\", [\"uk_cwt\", \"hweight\"], \"mass\", false, true, 50.802345],\r\n                [\"imperial quart (U.K)\", \"uk_qt\", null, \"volume\", false, true, 0.0011365225],\r\n                [\"imperial ton\", \"brton\", [\"uk_ton\", \"LTON\"], \"mass\", false, true, 1016.046909],\r\n                [\"inch\", \"in\", null, \"length\", false, true, 0.0254],\r\n                [\"international acre\", \"uk_acre\", null, \"area\", false, true, 4046.8564224],\r\n                [\"IT calorie\", \"cal\", null, \"energy\", false, true, 4.1868],\r\n                [\"joule\", \"J\", null, \"energy\", true, true, 1],\r\n                [\"katal\", \"kat\", null, \"catalytic_activity\", true, false, 1],\r\n                [\"kelvin\", \"K\", [\"kel\"], \"temperature\", true, true, 1],\r\n                [\"kilogram\", \"kg\", null, \"mass\", true, true, 1],\r\n                [\"knot\", \"kn\", null, \"speed\", false, true, 0.514444444444444],\r\n                [\"light-year\", \"ly\", null, \"length\", false, true, 9460730472580800],\r\n                [\"litre\", \"L\", [\"l\", \"lt\"], \"volume\", false, true, 0.001],\r\n                [\"lumen\", \"lm\", null, \"luminous_flux\", true, false, 1],\r\n                [\"lux\", \"lx\", null, \"illuminance\", true, false, 1],\r\n                [\"maxwell\", \"Mx\", null, \"magnetic_flux\", false, false, 1e-18],\r\n                [\"measurement ton\", \"MTON\", null, \"volume\", false, true, 1.13267386368],\r\n                [\"meter per hour\", \"m/h\", [\"m/hr\"], \"speed\", false, true, 0.00027777777777778],\r\n                [\"meter per second\", \"m/s\", [\"m/sec\"], \"speed\", true, true, 1],\r\n                [\"meter per second squared\", \"m?s??\", null, \"acceleration\", true, false, 1],\r\n                [\"parsec\", \"pc\", [\"parsec\"], \"length\", false, true, 30856775814671900],\r\n                [\"meter squared per second\", \"m?/s\", null, \"kinematic_viscosity\", true, false, 1],\r\n                [\"metre\", \"m\", null, \"length\", true, true, 1],\r\n                [\"miles per hour\", \"mph\", null, \"speed\", false, true, 0.44704],\r\n                [\"millimetre of mercury\", \"mmHg\", null, \"pressure\", false, false, 133.322],\r\n                [\"minute\", \"?\", null, \"angle\", false, false, 0.000290888208665722],\r\n                [\"minute\", \"min\", [\"mn\"], \"time\", false, true, 60],\r\n                [\"modern teaspoon\", \"tspm\", null, \"volume\", false, true, 0.000005],\r\n                [\"mole\", \"mol\", null, \"amount_of_substance\", true, false, 1],\r\n                [\"morgen\", \"Morgen\", null, \"area\", false, true, 2500],\r\n                [\"n.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n                [\"n.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n                [\"n.u. of speed\", \"c?\", null, \"speed\", false, false, 299792458],\r\n                [\"n.u. of time\", \"?/(me?c??)\", null, \"time\", false, false, 1.28808866778687e-21],\r\n                [\"nautical mile\", \"M\", [\"Nmi\"], \"length\", false, true, 1852],\r\n                [\"newton\", \"N\", null, \"force\", true, true, 1],\r\n                [\"\u0153rsted\", \"Oe \", null, \"magnetic_field_intensity\", false, false, 79.5774715459477],\r\n                [\"ohm\", \"\u03A9\", null, \"electric_resistance\", true, false, 1],\r\n                [\"ounce mass\", \"ozm\", null, \"mass\", false, true, 0.028349523125],\r\n                [\"pascal\", \"Pa\", null, \"pressure\", true, false, 1],\r\n                [\"pascal second\", \"Pa?s\", null, \"dynamic_viscosity\", true, false, 1],\r\n                [\"pferdest\u00E4rke\", \"PS\", null, \"power\", false, true, 735.49875],\r\n                [\"phot\", \"ph\", null, \"illuminance\", false, false, 0.0001],\r\n                [\"pica (1/6 inch)\", \"pica\", null, \"length\", false, true, 0.00035277777777778],\r\n                [\"pica (1/72 inch)\", \"Pica\", [\"Picapt\"], \"length\", false, true, 0.00423333333333333],\r\n                [\"poise\", \"P\", null, \"dynamic_viscosity\", false, false, 0.1],\r\n                [\"pond\", \"pond\", null, \"force\", false, true, 0.00980665],\r\n                [\"pound force\", \"lbf\", null, \"force\", false, true, 4.4482216152605],\r\n                [\"pound mass\", \"lbm\", null, \"mass\", false, true, 0.45359237],\r\n                [\"quart\", \"qt\", null, \"volume\", false, true, 0.000946352946],\r\n                [\"radian\", \"rad\", null, \"angle\", true, false, 1],\r\n                [\"second\", \"?\", null, \"angle\", false, false, 0.00000484813681109536],\r\n                [\"second\", \"s\", [\"sec\"], \"time\", true, true, 1],\r\n                [\"short hundredweight\", \"cwt\", [\"shweight\"], \"mass\", false, true, 45.359237],\r\n                [\"siemens\", \"S\", null, \"electrical_conductance\", true, false, 1],\r\n                [\"sievert\", \"Sv\", null, \"equivalent_dose\", true, false, 1],\r\n                [\"slug\", \"sg\", null, \"mass\", false, true, 14.59390294],\r\n                [\"square \u00E5ngstr\u00F6m\", \"ang2\", [\"ang^2\"], \"area\", false, true, 1e-20],\r\n                [\"square foot\", \"ft2\", [\"ft^2\"], \"area\", false, true, 0.09290304],\r\n                [\"square inch\", \"in2\", [\"in^2\"], \"area\", false, true, 0.00064516],\r\n                [\"square light-year\", \"ly2\", [\"ly^2\"], \"area\", false, true, 8.95054210748189e+31],\r\n                [\"square meter\", \"m?\", null, \"area\", true, true, 1],\r\n                [\"square mile\", \"mi2\", [\"mi^2\"], \"area\", false, true, 2589988.110336],\r\n                [\"square nautical mile\", \"Nmi2\", [\"Nmi^2\"], \"area\", false, true, 3429904],\r\n                [\"square Pica\", \"Pica2\", [\"Picapt2\", \"Pica^2\", \"Picapt^2\"], \"area\", false, true, 0.00001792111111111],\r\n                [\"square yard\", \"yd2\", [\"yd^2\"], \"area\", false, true, 0.83612736],\r\n                [\"statute mile\", \"mi\", null, \"length\", false, true, 1609.344],\r\n                [\"steradian\", \"sr\", null, \"solid_angle\", true, false, 1],\r\n                [\"stilb\", \"sb\", null, \"luminance\", false, false, 0.0001],\r\n                [\"stokes\", \"St\", null, \"kinematic_viscosity\", false, false, 0.0001],\r\n                [\"stone\", \"stone\", null, \"mass\", false, true, 6.35029318],\r\n                [\"tablespoon\", \"tbs\", null, \"volume\", false, true, 0.0000147868],\r\n                [\"teaspoon\", \"tsp\", null, \"volume\", false, true, 0.00000492892],\r\n                [\"tesla\", \"T\", null, \"magnetic_flux_density\", true, true, 1],\r\n                [\"thermodynamic calorie\", \"c\", null, \"energy\", false, true, 4.184],\r\n                [\"ton\", \"ton\", null, \"mass\", false, true, 907.18474],\r\n                [\"tonne\", \"t\", null, \"mass\", false, false, 1000],\r\n                [\"U.K. pint\", \"uk_pt\", null, \"volume\", false, true, 0.00056826125],\r\n                [\"U.S. bushel\", \"bushel\", null, \"volume\", false, true, 0.03523907],\r\n                [\"U.S. oil barrel\", \"barrel\", null, \"volume\", false, true, 0.158987295],\r\n                [\"U.S. pint\", \"pt\", [\"us_pt\"], \"volume\", false, true, 0.000473176473],\r\n                [\"U.S. survey mile\", \"survey_mi\", null, \"length\", false, true, 1609.347219],\r\n                [\"U.S. survey/statute acre\", \"us_acre\", null, \"area\", false, true, 4046.87261],\r\n                [\"volt\", \"V\", null, \"voltage\", true, false, 1],\r\n                [\"watt\", \"W\", null, \"power\", true, true, 1],\r\n                [\"watt-hour\", \"Wh\", [\"wh\"], \"energy\", false, true, 3600],\r\n                [\"weber\", \"Wb\", null, \"magnetic_flux\", true, false, 1],\r\n                [\"yard\", \"yd\", null, \"length\", false, true, 0.9144],\r\n                [\"year\", \"yr\", null, \"time\", false, true, 31557600]\r\n            ];\r\n\r\n            var binary_prefixes = {\r\n                Yi: [\"yobi\", 80, 1208925819614629174706176, \"Yi\", \"yotta\"],\r\n                Zi: [\"zebi\", 70, 1180591620717411303424, \"Zi\", \"zetta\"],\r\n                Ei: [\"exbi\", 60, 1152921504606846976, \"Ei\", \"exa\"],\r\n                Pi: [\"pebi\", 50, 1125899906842624, \"Pi\", \"peta\"],\r\n                Ti: [\"tebi\", 40, 1099511627776, \"Ti\", \"tera\"],\r\n                Gi: [\"gibi\", 30, 1073741824, \"Gi\", \"giga\"],\r\n                Mi: [\"mebi\", 20, 1048576, \"Mi\", \"mega\"],\r\n                ki: [\"kibi\", 10, 1024, \"ki\", \"kilo\"]\r\n            };\r\n\r\n            var unit_prefixes = {\r\n                Y: [\"yotta\", 1e+24, \"Y\"],\r\n                Z: [\"zetta\", 1e+21, \"Z\"],\r\n                E: [\"exa\", 1e+18, \"E\"],\r\n                P: [\"peta\", 1e+15, \"P\"],\r\n                T: [\"tera\", 1e+12, \"T\"],\r\n                G: [\"giga\", 1e+09, \"G\"],\r\n                M: [\"mega\", 1e+06, \"M\"],\r\n                k: [\"kilo\", 1e+03, \"k\"],\r\n                h: [\"hecto\", 1e+02, \"h\"],\r\n                e: [\"dekao\", 1e+01, \"e\"],\r\n                d: [\"deci\", 1e-01, \"d\"],\r\n                c: [\"centi\", 1e-02, \"c\"],\r\n                m: [\"milli\", 1e-03, \"m\"],\r\n                u: [\"micro\", 1e-06, \"u\"],\r\n                n: [\"nano\", 1e-09, \"n\"],\r\n                p: [\"pico\", 1e-12, \"p\"],\r\n                f: [\"femto\", 1e-15, \"f\"],\r\n                a: [\"atto\", 1e-18, \"a\"],\r\n                z: [\"zepto\", 1e-21, \"z\"],\r\n                y: [\"yocto\", 1e-24, \"y\"]\r\n            };\r\n\r\n            var from = null;\r\n            var to = null;\r\n            var base_from_unit = from_unit;\r\n            var base_to_unit = to_unit;\r\n            var from_multiplier = 1;\r\n            var to_multiplier = 1;\r\n            var alt;\r\n\r\n            for (var i = 0; i < units.length; i++) {\r\n                alt = (units[i][2] === null) ? [] : units[i][2];\r\n\r\n                if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n                    from = units[i];\r\n                }\r\n\r\n                if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n                    to = units[i];\r\n                }\r\n            }\r\n\r\n            if (from === null) {\r\n                var from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\r\n                var from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\r\n\r\n                if (from_unit.substring(0, 2) === 'da') {\r\n                    from_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n                }\r\n\r\n                if (from_binary_prefix) {\r\n                    from_multiplier = from_binary_prefix[2];\r\n                    base_from_unit = from_unit.substring(2);\r\n                }\r\n                else if (from_unit_prefix) {\r\n                    from_multiplier = from_unit_prefix[1];\r\n                    base_from_unit = from_unit.substring(from_unit_prefix[2].length);\r\n                }\r\n\r\n                for (var j = 0; j < units.length; j++) {\r\n                    alt = (units[j][2] === null) ? [] : units[j][2];\r\n\r\n                    if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n                        from = units[j];\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (to === null) {\r\n                var to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\r\n                var to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\r\n\r\n                if (to_unit.substring(0, 2) === 'da') {\r\n                    to_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n                }\r\n\r\n                if (to_binary_prefix) {\r\n                    to_multiplier = to_binary_prefix[2];\r\n                    base_to_unit = to_unit.substring(2);\r\n                }\r\n                else if (to_unit_prefix) {\r\n                    to_multiplier = to_unit_prefix[1];\r\n                    base_to_unit = to_unit.substring(to_unit_prefix[2].length);\r\n                }\r\n\r\n                for (var k = 0; k < units.length; k++) {\r\n                    alt = (units[k][2] === null) ? [] : units[k][2];\r\n\r\n                    if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n                        to = units[k];\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (from === null || to === null) {\r\n                return formula.error.na;\r\n            }\r\n\r\n            if (from[3] !== to[3]) {\r\n                return formula.error.na;\r\n            }\r\n\r\n            return number * from[6] * from_multiplier / (to[6] * to_multiplier);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMX2MY2\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x \u548C array_y \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i], 2) - Math.pow(data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMX2PY2\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x \u548C array_y \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i], 2) + Math.pow(data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMXMY2\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //\u7B2C\u4E8C\u4E2A\u6570\u7EC4\u6216\u6570\u503C\u533A\u57DF\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x \u548C array_y \u53EA\u53D6\u6570\u503C\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i] - data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRANSPOSE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4ECE\u5176\u8FD4\u56DE\u552F\u4E00\u503C\u7684\u6570\u7EC4\u6216\u533A\u57DF\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n\r\n            array = array[0].map(function(col, a){\r\n                return array.map(function(row){\r\n                    return row[a];\r\n                });\r\n            });\r\n\r\n            return array;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TREND\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = func_methods.getDataDyadicArr(data_known_y);\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = func_methods.getCellDataDyadicArr(data_known_y, \"text\");\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_known_y));\r\n\r\n                known_y.push(rowArr);\r\n            }\r\n\r\n            var known_y_rowlen = known_y.length;\r\n            var known_y_collen = known_y[0].length;\r\n\r\n            for(var i = 0; i < known_y_rowlen; i++){\r\n                for(var j = 0; j < known_y_collen; j++){\r\n                    if(!isRealNum(known_y[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_y[i][j] = parseFloat(known_y[i][j]);\r\n                }\r\n            }\r\n\r\n            //\u53EF\u9009 x \u503C\u96C6\u5408\r\n            var known_x = [];\r\n            for(var i = 1; i <= known_y_rowlen; i++){\r\n                for(var j = 1; j <= known_y_collen; j++){\r\n                    var number = (i - 1) * known_y_collen + j;\r\n                    known_x.push(number);\r\n                }\r\n            }\r\n\r\n            if(arguments.length >= 2){\r\n                var data_known_x = arguments[1];\r\n                known_x = [];\r\n\r\n                if(getObjType(data_known_x) == \"array\"){\r\n                    if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_x = func_methods.getDataDyadicArr(data_known_x);\r\n                }\r\n                else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                    known_x = func_methods.getCellDataDyadicArr(data_known_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_known_x));\r\n\r\n                    known_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < known_x.length; i++){\r\n                    for(var j = 0; j < known_x[0].length; j++){\r\n                        if(!isRealNum(known_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        known_x[i][j] = parseFloat(known_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var known_x_rowlen = known_x.length;\r\n            var known_x_collen = known_x[0].length;\r\n\r\n            //\u65B0 x \u503C\r\n            var new_x = known_x;\r\n\r\n            if(arguments.length >= 3){\r\n                var data_new_x = arguments[2];\r\n                new_x = [];\r\n\r\n                if(getObjType(data_new_x) == \"array\"){\r\n                    if(getObjType(data_new_x[0]) == \"array\" && !func_methods.isDyadicArr(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    new_x = func_methods.getDataDyadicArr(data_new_x);\r\n                }\r\n                else if(getObjType(data_new_x) == \"object\" && data_new_x.startCell != null){\r\n                    new_x = func_methods.getCellDataDyadicArr(data_new_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_new_x));\r\n\r\n                    new_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < new_x.length; i++){\r\n                    for(var j = 0; j < new_x[0].length; j++){\r\n                        if(!isRealNum(new_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        new_x[i][j] = parseFloat(new_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u903B\u8F91\u503C\r\n            var const_b = true;\r\n\r\n            if(arguments.length == 4){\r\n                const_b = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(const_b)){\r\n                    return const_b;\r\n                }\r\n            }\r\n\r\n            if(known_y_rowlen != known_x_rowlen || known_y_collen != known_x_collen){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function leastSquare(arr_x, arr_y){\r\n                var xSum = 0, ySum = 0, xySum = 0, x2Sum = 0;\r\n\r\n                for(var i = 0; i < arr_x.length; i++){\r\n                    for(var j = 0; j < arr_x[i].length; j++){\r\n                        xSum += arr_x[i][j];\r\n                        ySum += arr_y[i][j];\r\n                        xySum += arr_x[i][j] * arr_y[i][j];\r\n                        x2Sum += arr_x[i][j] * arr_x[i][j];\r\n                    }\r\n                }\r\n\r\n                var n = arr_x.length * arr_x[0].length;\r\n\r\n                var xMean = xSum / n;\r\n                var yMean = ySum / n;\r\n                var xyMean = xySum / n;\r\n                var x2Mean = x2Sum / n;\r\n\r\n                var m = (xyMean - xMean * yMean) / (x2Mean - xMean * xMean);\r\n                var b = yMean - m * xMean;\r\n\r\n                return [m, b];\r\n            }\r\n\r\n            var ls = leastSquare(known_x, known_y);\r\n            var m = ls[0];\r\n\r\n            if(const_b){\r\n                var b = ls[1];\r\n            }\r\n            else{\r\n                var b = 0;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var i = 0; i < new_x.length; i++){\r\n                for(var j = 0; j < new_x[i].length; j++){\r\n                    var x = new_x[i][j];\r\n                    var y = m * x + b;\r\n\r\n                    result.push(Math.round(y * 1000000000) / 1000000000);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FREQUENCY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u9891\u7387\u6570\u7EC4\r\n            var data_data_array = arguments[0];\r\n            var data_array = [];\r\n\r\n            if(getObjType(data_data_array) == \"array\"){\r\n                if(getObjType(data_data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(data_data_array, true));\r\n            }\r\n            else if(getObjType(data_data_array) == \"object\" && data_data_array.startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(data_data_array, \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(data_data_array);\r\n            }\r\n\r\n            var data_array_n = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                if(isRealNum(data_array[i])){\r\n                    data_array_n.push(parseFloat(data_array[i]));\r\n                }\r\n            }\r\n\r\n            //\u95F4\u9694\u6570\u7EC4\r\n            var data_bins_array = arguments[1];\r\n            var bins_array = [];\r\n\r\n            if(getObjType(data_bins_array) == \"array\"){\r\n                if(getObjType(data_bins_array[0]) == \"array\" && !func_methods.isDyadicArr(data_bins_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                bins_array = bins_array.concat(func_methods.getDataArr(data_bins_array, true));\r\n            }\r\n            else if(getObjType(data_bins_array) == \"object\" && data_bins_array.startCell != null){\r\n                bins_array = bins_array.concat(func_methods.getCellDataArr(data_bins_array, \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_bins_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                bins_array.push(data_bins_array);\r\n            }\r\n\r\n            var bins_array_n = [];\r\n\r\n            for(var i = 0; i < bins_array.length; i++){\r\n                if(isRealNum(bins_array[i])){\r\n                    bins_array_n.push(parseFloat(bins_array[i]));\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(data_array_n.length == 0 && bins_array_n.length == 0){\r\n                return [[0], [0]];\r\n            }\r\n            else if(data_array_n.length == 0){\r\n                var result = [[0]];\r\n\r\n                for(var i = 0; i < bins_array_n.length; i++){\r\n                    result.push([0]);\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else if(bins_array_n.length == 0){\r\n                return [[0], [data_array_n.length]];\r\n            }\r\n            else{\r\n                bins_array_n.sort(function(a, b){\r\n                    return a - b;\r\n                });\r\n\r\n                var result = [];\r\n\r\n                for(var i = 0; i < bins_array_n.length; i++){\r\n                    if(i == 0){\r\n                        var count = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[0]){\r\n                                count++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count]);\r\n                    }\r\n                    else if(i == bins_array_n.length - 1){\r\n                        var count1 = 0, count2 = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[i] && data_array_n[j] > bins_array_n[i - 1]){\r\n                                count1++;\r\n                            }\r\n\r\n                            if(data_array_n[j] > bins_array_n[i]){\r\n                                count2++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count1]);\r\n                        result.push([count2]);\r\n                    }\r\n                    else{\r\n                        var count = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[i] && data_array_n[j] > bins_array_n[i - 1]){\r\n                                count++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count]);\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GROWTH\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5DF2\u77E5\u7684 y \u503C\u96C6\u5408\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = func_methods.getDataDyadicArr(data_known_y);\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = func_methods.getCellDataDyadicArr(data_known_y, \"text\");\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_known_y));\r\n\r\n                known_y.push(rowArr);\r\n            }\r\n\r\n            var known_y_rowlen = known_y.length;\r\n            var known_y_collen = known_y[0].length;\r\n\r\n            for(var i = 0; i < known_y_rowlen; i++){\r\n                for(var j = 0; j < known_y_collen; j++){\r\n                    if(!isRealNum(known_y[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_y[i][j] = parseFloat(known_y[i][j]);\r\n                }\r\n            }\r\n\r\n            //\u53EF\u9009 x \u503C\u96C6\u5408\r\n            var known_x = [];\r\n            for(var i = 1; i <= known_y_rowlen; i++){\r\n                for(var j = 1; j <= known_y_collen; j++){\r\n                    var number = (i - 1) * known_y_collen + j;\r\n                    known_x.push(number);\r\n                }\r\n            }\r\n\r\n            if(arguments.length >= 2){\r\n                var data_known_x = arguments[1];\r\n                known_x = [];\r\n\r\n                if(getObjType(data_known_x) == \"array\"){\r\n                    if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_x = func_methods.getDataDyadicArr(data_known_x);\r\n                }\r\n                else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                    known_x = func_methods.getCellDataDyadicArr(data_known_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_known_x));\r\n\r\n                    known_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < known_x.length; i++){\r\n                    for(var j = 0; j < known_x[0].length; j++){\r\n                        if(!isRealNum(known_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        known_x[i][j] = parseFloat(known_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var known_x_rowlen = known_x.length;\r\n            var known_x_collen = known_x[0].length;\r\n\r\n            //\u65B0 x \u503C\r\n            var new_x = known_x;\r\n\r\n            if(arguments.length >= 3){\r\n                var data_new_x = arguments[2];\r\n                new_x = [];\r\n\r\n                if(getObjType(data_new_x) == \"array\"){\r\n                    if(getObjType(data_new_x[0]) == \"array\" && !func_methods.isDyadicArr(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    new_x = func_methods.getDataDyadicArr(data_new_x);\r\n                }\r\n                else if(getObjType(data_new_x) == \"object\" && data_new_x.startCell != null){\r\n                    new_x = func_methods.getCellDataDyadicArr(data_new_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_new_x));\r\n\r\n                    new_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < new_x.length; i++){\r\n                    for(var j = 0; j < new_x[0].length; j++){\r\n                        if(!isRealNum(new_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        new_x[i][j] = parseFloat(new_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //\u903B\u8F91\u503C\r\n            var const_b = true;\r\n\r\n            if(arguments.length == 4){\r\n                const_b = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(const_b)){\r\n                    return const_b;\r\n                }\r\n            }\r\n\r\n            if(known_y_rowlen != known_x_rowlen || known_y_collen != known_x_collen){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function leastSquare(arr_x, arr_y){\r\n                var xSum = 0, ySum = 0, xySum = 0, x2Sum = 0;\r\n\r\n                for(var i = 0; i < arr_x.length; i++){\r\n                    for(var j = 0; j < arr_x[i].length; j++){\r\n                        xSum += arr_x[i][j];\r\n                        // ySum += arr_y[i][j];\r\n                        ySum += Math.log(arr_y[i][j]);\r\n                        // xySum += arr_x[i][j] * arr_y[i][j];\r\n                        xySum += arr_x[i][j] * Math.log(arr_y[i][j]);\r\n                        x2Sum += arr_x[i][j] * arr_x[i][j];\r\n                    }\r\n                }\r\n\r\n                var n = arr_x.length * arr_x[0].length;\r\n\r\n                var xMean = xSum / n;\r\n                var yMean = ySum / n;\r\n                var xyMean = xySum / n;\r\n                var x2Mean = x2Sum / n;\r\n\r\n                var m = (xyMean - xMean * yMean) / (x2Mean - xMean * xMean);\r\n                var b = yMean - m * xMean;\r\n\r\n                return [Math.exp(m), Math.exp(b)];\r\n            }\r\n\r\n            var ls = leastSquare(known_x, known_y);\r\n            var m = ls[0];\r\n\r\n            if(const_b){\r\n                var b = ls[1];\r\n            }\r\n            else{\r\n                var b = 1;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var i = 0; i < new_x.length; i++){\r\n                for(var j = 0; j < new_x[i].length; j++){\r\n                    var x = new_x[i][j];\r\n                    var y = b * Math.pow(m, x);\r\n                    // var y = Math.exp(b + m * x);\r\n\r\n                    result.push(Math.round(y * 1000000000) / 1000000000);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LINEST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGEST\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MDETERM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u7EC4\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array);\r\n                array.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array.length; i++){\r\n                for(var j = 0; j < array[i].length; j++){\r\n                    if(!isRealNum(array[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array[i][j] = parseFloat(array[i][j]);\r\n                }\r\n            }\r\n\r\n            if(array.length != array[0].length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            function Ma(a, n){\r\n                var A;\r\n                var b = new Array();\r\n\r\n                if(n == 1){\r\n                    A = a[0][0];\r\n\r\n                    return A;\r\n                }\r\n                else if(n == 2){\r\n                    A = a[0][0] * a[1][1] - a[0][1] * a[1][0];\r\n\r\n                    return A;\r\n                }\r\n                else if(n == 3){\r\n                    A = a[0][0]*a[1][1]*a[2][2] + a[1][0]*a[2][1]*a[0][2] + a[2][0]*a[0][1]*a[1][2] - a[2][0]*a[1][1]*a[0][2] - a[0]      [0]*a[2][1]*a[1][2] - a[1][0]*a[0][1]*a[2][2];\r\n\r\n                    return A;\r\n                }\r\n                else{\r\n                    A = 0;\r\n                    var c = new Array();\r\n                    var e = new Array();\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        b[i] = a[i][0] * Math.pow(-1, i + 1 + 1);\r\n                    }\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        e[i] = new Array();\r\n\r\n                        for(var j = 0; j < n - 1; j++){\r\n                            e[i][j] = a[i][j + 1];\r\n                        }\r\n                    }\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        for(var j = 0; j < n; j++){\r\n                            c[j] = new Array();\r\n\r\n                            for(var k = 0; k < n - 1; k++){\r\n                                if(i > j){\r\n                                    c[j][k] = e[j][k];\r\n                                }\r\n                                else if(i < j){\r\n                                    c[j - 1][k] = e[j][k];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        A += b[i] * arguments.callee(c, n - 1);\r\n                    }\r\n\r\n                    return A;\r\n                }\r\n            }\r\n\r\n            return Ma(array, array.length);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINVERSE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u7EC4\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array);\r\n                array.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array.length; i++){\r\n                for(var j = 0; j < array[i].length; j++){\r\n                    if(!isRealNum(array[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array[i][j] = parseFloat(array[i][j]);\r\n                }\r\n            }\r\n\r\n            if(array.length != array[0].length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            return inverse(array);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MMULT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u7EC41\r\n            var data_array1 = arguments[0];\r\n            var array1 = [];\r\n\r\n            if(getObjType(data_array1) == \"array\"){\r\n                if(getObjType(data_array1[0]) == \"array\" && !func_methods.isDyadicArr(data_array1)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array1 = func_methods.getDataDyadicArr(data_array1);\r\n            }\r\n            else if(getObjType(data_array1) == \"object\" && data_array1.startCell != null){\r\n                array1 = func_methods.getCellDataDyadicArr(data_array1, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array1);\r\n                array1.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array1.length; i++){\r\n                for(var j = 0; j < array1[i].length; j++){\r\n                    if(!isRealNum(array1[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array1[i][j] = parseFloat(array1[i][j]);\r\n                }\r\n            }\r\n\r\n            //\u6570\u7EC42\r\n            var data_array2 = arguments[1];\r\n            var array2 = [];\r\n\r\n            if(getObjType(data_array2) == \"array\"){\r\n                if(getObjType(data_array2[0]) == \"array\" && !func_methods.isDyadicArr(data_array2)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array2 = func_methods.getDataDyadicArr(data_array2);\r\n            }\r\n            else if(getObjType(data_array2) == \"object\" && data_array2.startCell != null){\r\n                array2 = func_methods.getCellDataDyadicArr(data_array2, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array2);\r\n                array2.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array2.length; i++){\r\n                for(var j = 0; j < array2[i].length; j++){\r\n                    if(!isRealNum(array2[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array2[i][j] = parseFloat(array2[i][j]);\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(array1[0].length != array2.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var rowlen = array1.length;\r\n            var collen = array2[0].length;\r\n\r\n            var result = [];\r\n\r\n            for(var m = 0; m < rowlen; m++){\r\n                var rowArr = [];\r\n\r\n                for(var n = 0; n < collen; n++){\r\n                    var value = 0;\r\n\r\n                    for(var p = 0; p < array1[0].length; p++){\r\n                        value += array1[m][p] * array2[p][n];\r\n                    }\r\n\r\n                    rowArr.push(value);\r\n                }\r\n\r\n                result.push(rowArr);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMPRODUCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u7B2C\u4E00\u4E2A\u6570\u7EC4\r\n            //\u6570\u7EC41\r\n            var data_array1 = arguments[0];\r\n            var array1 = [];\r\n\r\n            if(getObjType(data_array1) == \"array\"){\r\n                if(getObjType(data_array1[0]) == \"array\" && !func_methods.isDyadicArr(data_array1)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array1 = func_methods.getDataDyadicArr(data_array1);\r\n            }\r\n            else if(getObjType(data_array1) == \"object\" && data_array1.startCell != null){\r\n                array1 = func_methods.getCellDataDyadicArr(data_array1, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array1);\r\n                array1.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array1.length; i++){\r\n                for(var j = 0; j < array1[i].length; j++){\r\n                    if(!isRealNum(array1[i][j])){\r\n                        array1[i][j] = 0;\r\n                    }\r\n                    else{\r\n                        array1[i][j] = parseFloat(array1[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var rowlen = array1.length;\r\n            var collen = array1[0].length;\r\n\r\n            if(arguments.length >= 2){\r\n                for(var i = 1; i < arguments.length; i++){\r\n                    var data = arguments[i];\r\n                    var arr = [];\r\n\r\n                    if(getObjType(data) == \"array\"){\r\n                        if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        arr = func_methods.getDataDyadicArr(data);\r\n                    }\r\n                    else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                        arr = func_methods.getCellDataDyadicArr(data, \"text\");\r\n                    }\r\n                    else{\r\n                        var rowArr = [];\r\n                        rowArr.push(data);\r\n                        arr.push(rowArr);\r\n                    }\r\n\r\n                    if(arr.length != rowlen || arr[0].length != collen){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var m = 0; m < rowlen; m++){\r\n                        for(var n = 0; n < collen; n++){\r\n                            if(!isRealNum(arr[m][n])){\r\n                                array1[m][n] = 0;\r\n                            }\r\n                            else{\r\n                                array1[m][n] = array1[m][n] * parseFloat(arr[m][n]);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            for(var m = 0; m < rowlen; m++){\r\n                for(var n = 0; n < collen; n++){\r\n                    sum += array1[m][n];\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISFORMULA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data_cell = arguments[0];\r\n            var cell;\r\n\r\n            if(getObjType(data_cell) == \"object\" && data_cell.startCell != null){\r\n                if(data_cell.data == null){\r\n                    return false;\r\n                }\r\n\r\n                if(getObjType(data_cell.data) == \"array\"){\r\n                    cell = data_cell.data[0][0];\r\n                }\r\n                else{\r\n                    cell = data_cell.data;\r\n                }\r\n\r\n                if(cell != null && cell.f != null){\r\n                    return true;\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CELL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\u4FE1\u606F\u7684\u7C7B\u578B\r\n            var data_info_type = arguments[0];\r\n            var info_type;\r\n\r\n            if(getObjType(data_info_type) == \"array\"){\r\n                if(getObjType(data_info_type[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_info_type)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    info_type = data_info_type[0][0];\r\n                }\r\n                else{\r\n                    info_type = data_info_type[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_info_type) == \"object\" && data_info_type.startCell != null){\r\n                if(data_info_type.data == null){\r\n                    return formula.error.v;\r\n                }\r\n                else{\r\n                    if(getObjType(data_info_type.data) == \"array\"){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    info_type = data_info_type.data.v;\r\n\r\n                    if(isRealNull(info_type)){\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                info_type = data_info_type;\r\n            }\r\n\r\n            //\u5355\u5143\u683C\r\n            var data_reference = arguments[1];\r\n            var reference;\r\n\r\n            if(getObjType(data_reference) == \"object\" && data_reference.startCell != null){\r\n                reference = data_reference.startCell;\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if([\"address\", \"col\", \"color\", \"contents\", \"filename\", \"format\", \"parentheses\", \"prefix\", \"protect\", \"row\", \"type\", \"width\"].indexOf(info_type) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var file = getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            var cellrange = formula.getcellrange(reference);\r\n            var row_index = cellrange.row[0];\r\n            var col_index = cellrange.column[0];\r\n\r\n            // let sheetdata = null;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            let value;\r\n            if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[row_index+\"_\"+col_index+\"_\"+Store.calculateSheetIndex]!=null){\r\n                value = formula.execFunctionGlobalData[row_index+\"_\"+col_index+\"_\"+Store.calculateSheetIndex].v;\r\n            }\r\n            else if(sheetdata[row_index][col_index] != null && sheetdata[row_index][col_index].v != null && sheetdata[row_index][col_index].v !=\"\"){\r\n                value = sheetdata[row_index][col_index];\r\n                if(value instanceof Object){\r\n                    value = value.v;\r\n                }\r\n            }\r\n            else {\r\n                value = 0;\r\n            }\r\n\r\n            switch(info_type){\r\n                case \"address\":\r\n                    return reference;\r\n                    break;\r\n                case \"col\":\r\n                    return col_index + 1;\r\n                    break;\r\n                case \"color\":\r\n                    return 0;\r\n                    break;\r\n                case \"contents\":\r\n                    // if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==\"\"){\r\n                    //     value = 0;\r\n                    // }\r\n\r\n                    return value;\r\n                    break;\r\n                case \"filename\":\r\n                    return file.name;\r\n                    break;\r\n                case \"format\":\r\n                    if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].ct == null){\r\n                        return \"G\";\r\n                    }\r\n\r\n                    return sheetdata[row_index][col_index].ct.fa;\r\n                    break;\r\n                case \"parentheses\":\r\n                    if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==\"\"){\r\n                        return 0;\r\n                    }\r\n\r\n                    if (sheetdata[row_index][col_index].v > 0){\r\n                        return 1;\r\n                    }\r\n                    else{\r\n                        return 0;\r\n                    }\r\n                    break;\r\n                case \"prefix\":\r\n                    if (value==0){\r\n                        return \"\";\r\n                    }\r\n\r\n                    if (sheetdata[row_index][col_index].ht == 0){//\u5C45\u4E2D\u5BF9\u9F50\r\n                        return \"^\";\r\n                    }\r\n                    else if (sheetdata[row_index][col_index].ht == 1){//\u5DE6\u5BF9\u9F50\r\n                        return \"'\";\r\n                    }\r\n                    else if (sheetdata[row_index][col_index].ht == 2){//\u53F3\u5BF9\u9F50\r\n                        return '\"';\r\n                    }\r\n                    else{\r\n                        return \"\";\r\n                    }\r\n                    break;\r\n                case \"protect\":\r\n                    return 0;\r\n                    break;\r\n                case \"row\":\r\n                    return row_index + 1;\r\n                    break;\r\n                case \"type\":\r\n                    if (value==0){\r\n                        return \"b\";\r\n                    }\r\n\r\n                    return \"l\";\r\n                    break;\r\n                case \"width\":\r\n                    var cfg = file.config;\r\n\r\n                    if(cfg[\"columnlen\"] != null && col_index in cfg[\"columnlen\"]){\r\n                        return cfg[\"columnlen\"][col_index];\r\n                    }\r\n\r\n                    return Store.defaultcollen;\r\n                    break;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.na;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ERROR_TYPE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_error_val = arguments[0];\r\n            var error_val;\r\n\r\n            if(getObjType(data_error_val) == \"array\"){\r\n                if(getObjType(data_error_val[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_error_val)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    error_val = data_error_val[0][0];\r\n                }\r\n                else{\r\n                    error_val = data_error_val[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_error_val) == \"object\" && data_error_val.startCell != null){\r\n                if(data_error_val.data == null){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                if(getObjType(data_error_val.data) == \"array\"){\r\n                    error_val = data_error_val.data[0][0];\r\n\r\n                    if(error_val == null || isRealNull(error_val.v)){\r\n                        return formula.error.na;\r\n                    }\r\n\r\n                    error_val = error_val.v;\r\n                }\r\n                else{\r\n                    if(isRealNull(data_error_val.data.v)){\r\n                        return formula.error.na;\r\n                    }\r\n\r\n                    error_val = data_error_val.data.v;\r\n                }\r\n            }\r\n            else{\r\n                error_val = data_error_val;\r\n            }\r\n\r\n            var error_obj = {\r\n                \"#NULL!\": 1,\r\n                \"#DIV/0!\": 2,\r\n                \"#VALUE!\": 3,\r\n                \"#REF!\": 4,\r\n                \"#NAME?\": 5,\r\n                \"#NUM!\": 6,\r\n                \"#N/A\": 7,\r\n                \"#GETTING_DATA\": 8\r\n            }\r\n\r\n            if(error_val in error_obj){\r\n                return error_obj[error_val];\r\n            }\r\n            else{\r\n                return formula.error.na;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISBLANK\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_error_val = arguments[0];\r\n            var error_val;\r\n\r\n            if(getObjType(data_error_val) == \"object\" && data_error_val.startCell != null){\r\n                if(data_error_val.data == null){\r\n                    return true;\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISERR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISERROR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISLOGICAL\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(value.toString() == \"#N/A\"){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNONTEXT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return true;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return true;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNUMBER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(isRealNum(value)){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISREF\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISTEXT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return false;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return false;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return false;\r\n            }\r\n            else{\r\n                return true;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TYPE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                return 64;\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return 16;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return 1;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return 16;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return 4;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return 1;\r\n            }\r\n            else{\r\n                return 2;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"N\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u5355\u5143\u683C\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    value = data_value.data[0][0];\r\n\r\n                    if(value == null || isRealNull(value.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    value = value.v;\r\n                }\r\n                else{\r\n                    if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    value = data_value.data.v;\r\n                }\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return value;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                if(value.toString().toLowerCase() == \"true\"){\r\n                    return 1;\r\n                }\r\n                else{\r\n                    return 0;\r\n                }\r\n            }\r\n            else if(isRealNum(value)){\r\n                return parseFloat(value);\r\n            }\r\n            else{\r\n                return 0;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_DATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"yyyy-mm-dd\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_PURE_NUMBER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(dayjs(value).isValid()){\r\n                return genarate(value)[2];\r\n            }\r\n            else{\r\n                return numeral(value).value() == null ? value : numeral(value).value();\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_TEXT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            return update(\"@\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_DOLLARS\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"$ 0.00\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_PERCENT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u5B57\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"0%\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DGET\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            if (resultIndexes.length === 0) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (resultIndexes.length > 1) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return targetFields[resultIndexes[0]];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DMAX\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var maxValue = targetFields[resultIndexes[0]];\r\n\r\n            for (var i = 1; i < resultIndexes.length; i++) {\r\n                if (maxValue < targetFields[resultIndexes[i]]) {\r\n                    maxValue = targetFields[resultIndexes[i]];\r\n                }\r\n            }\r\n\r\n            return maxValue;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DMIN\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = findField(database, field);\r\n                targetFields = rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = rest(database[field]);\r\n            }\r\n\r\n            var minValue = targetFields[resultIndexes[0]];\r\n\r\n            for (var i = 1; i < resultIndexes.length; i++) {\r\n                if (minValue > targetFields[resultIndexes[i]]) {\r\n                    minValue = targetFields[resultIndexes[i]];\r\n                }\r\n            }\r\n\r\n            return minValue;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAVERAGE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                sum += targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return resultIndexes.length === 0 ? formula.error.d : sum / resultIndexes.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DCOUNT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DCOUNTA\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DPRODUCT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            var result = 1;\r\n\r\n            for (i = 0; i < targetValues.length; i++) {\r\n                result *= targetValues[i];\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSTDEV\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSTDEVP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSUM\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            var result = 0;\r\n\r\n            for (i = 0; i < targetValues.length; i++) {\r\n                result += targetValues[i];\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DVAR\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DVARP\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u6570\u636E\u5E93\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5217\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u6761\u4EF6\u7684\u5355\u5143\u683C\u533A\u57DF\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LINESPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n            var lineColor = arguments[1];\r\n            var lineWidth = arguments[2];\r\n            var normalValue = arguments[3];\r\n            var normalColor = arguments[4];\r\n            var maxSpot = arguments[5];\r\n            var minSpot = arguments[6];\r\n            var spotRadius = arguments[7];\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = 1;\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting[\"offsetY\"] = lineWidth+1;\r\n            sparksetting.height = height-(lineWidth+1);\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            if(lineColor==null){\r\n                lineColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", lineColor);\r\n            //sparkColorSetting(\"fillColor\", fillColor);\r\n            sparksetting[\"fillColor\"] = 0;\r\n\r\n\r\n\r\n\r\n            //\u8BBE\u7F6E\u8F85\u52A9\u7EBF\uFF0C\u53EF\u4EE5\u652F\u6301min\u3001max\u3001avg\u3001median\u7B49\u51E0\u4E2A\u5B57\u7B26\u53D8\u91CF\uFF0C\u6216\u8005\u5177\u4F53\u7684\u6570\u503C\u3002\r\n            if(!!normalValue){\r\n                if(typeof(normalValue)==\"string\"){\r\n                    normalValue = normalValue.toLowerCase();\r\n                    var nv = null;\r\n                    if(normalValue==\"min\"){\r\n                        nv = window.luckysheet_function.MIN.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"max\"){\r\n                        nv = window.luckysheet_function.MAX.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"avg\" || normalValue==\"mean\"){\r\n                        nv = window.luckysheet_function.AVERAGE.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"median\"){\r\n                        nv = window.luckysheet_function.MEDIAN.f({\"data\":dataformat});\r\n                    }\r\n\r\n                    if(!!nv){\r\n                        sparksetting[\"normalRangeMin\"] = nv;\r\n                        sparksetting[\"normalRangeMax\"] = nv;\r\n                    }\r\n                }\r\n                else{\r\n                    sparksetting[\"normalRangeMin\"] = normalValue;\r\n                    sparksetting[\"normalRangeMax\"] = normalValue;\r\n                }\r\n\r\n            }\r\n\r\n            if(normalColor==null){\r\n                normalColor = \"#000\";\r\n            }\r\n            sparkColorSetting(\"normalRangeColor\", normalColor);\r\n\r\n            sparkColorSetting(\"maxSpotColor\", maxSpot);\r\n            sparkColorSetting(\"minSpotColor\", minSpot);\r\n\r\n            if(spotRadius==null){\r\n                spotRadius = \"1.5\";\r\n            }\r\n            sparksetting[\"spotRadius\"] = spotRadius;\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n            // {\r\n            //     height:rowlen,\r\n            //     width:firstcolumnlen,\r\n            //     normalRangeMin:6,\r\n            //     normalRangeMax:6,\r\n            //     normalRangeColor:\"#000\"\r\n            // }\r\n            //return \"\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AREASPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n            var lineColor = arguments[1];\r\n            var fillColor = arguments[2];\r\n            var lineWidth = arguments[3];\r\n            var normalValue = arguments[4];\r\n            var normalColor = arguments[5];\r\n            // var maxSpot = arguments[5];\r\n            // var minSpot = arguments[6];\r\n            // var spotRadius = arguments[7];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = 1;\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting[\"offsetY\"] = lineWidth+1;\r\n            sparksetting.height = height-(lineWidth+1);\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            if(lineColor==null){\r\n                lineColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", lineColor);\r\n            sparkColorSetting(\"fillColor\", fillColor);\r\n            // sparksetting[\"fillColor\"] = 0;\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = \"1\";\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n\r\n            //\u8BBE\u7F6E\u8F85\u52A9\u7EBF\uFF0C\u53EF\u4EE5\u652F\u6301min\u3001max\u3001avg\u3001median\u7B49\u51E0\u4E2A\u5B57\u7B26\u53D8\u91CF\uFF0C\u6216\u8005\u5177\u4F53\u7684\u6570\u503C\u3002\r\n            if(!!normalValue){\r\n                if(typeof(normalValue)==\"string\"){\r\n                    normalValue = normalValue.toLowerCase();\r\n                    var nv = null;\r\n                    if(normalValue==\"min\"){\r\n                        nv = window.luckysheet_function.MIN.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"max\"){\r\n                        nv = window.luckysheet_function.MAX.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"avg\" || normalValue==\"mean\"){\r\n                        nv = window.luckysheet_function.AVERAGE.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"median\"){\r\n                        nv = window.luckysheet_function.MEDIAN.f({\"data\":dataformat});\r\n                    }\r\n\r\n                    if(!!nv){\r\n                        sparksetting[\"normalRangeMin\"] = nv;\r\n                        sparksetting[\"normalRangeMax\"] = nv;\r\n                    }\r\n                }\r\n                else{\r\n                    sparksetting[\"normalRangeMin\"] = normalValue;\r\n                    sparksetting[\"normalRangeMax\"] = normalValue;\r\n                }\r\n\r\n            }\r\n\r\n            if(normalColor==null){\r\n                normalColor = \"#000\";\r\n            }\r\n            sparkColorSetting(\"normalRangeColor\", normalColor);\r\n\r\n            // sparkColorSetting(\"maxSpotColor\", maxSpot);\r\n            // sparkColorSetting(\"minSpotColor\", minSpot);\r\n\r\n            // if(spotRadius==null){\r\n            //     spotRadius = \"1.5\";\r\n            // }\r\n            // sparksetting[\"spotRadius\"] = spotRadius;\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n            // {\r\n            //     height:rowlen,\r\n            //     width:firstcolumnlen,\r\n            //     normalRangeMin:6,\r\n            //     normalRangeMax:6,\r\n            //     normalRangeColor:\"#000\"\r\n            // }\r\n            //return \"\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMNSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var chartRangeMax = arguments[4];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"column\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STACKCOLUMNSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            var dataformat = [];\r\n\r\n            var data = [];\r\n            if(rangeValue!=null && rangeValue.data!=null){\r\n                data = rangeValue.data;\r\n            }\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                data = formula.getPureValueByData(data);\r\n            }\r\n            else if(getObjType(data) == \"object\"){\r\n                data = data.v;\r\n\r\n                return [data];\r\n            }\r\n            else{\r\n                if(/\\{.*?\\}/.test(data)){\r\n                    data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n                }\r\n                data = new Function(\"return \" + data)();\r\n            }\r\n\r\n            var stackconfig = arguments[1];\r\n            var offsetY = data.length;\r\n            if(stackconfig==null || !!stackconfig){\r\n                for(var c=0;c<data[0].length;c++){\r\n                    var colstr = \"\";\r\n                    for(var r=0;r<data.length;r++){\r\n                        colstr += data[r][c] + \":\";\r\n                    }\r\n                    colstr = colstr.substr(0, colstr.length-1);\r\n                    dataformat.push(colstr);\r\n                }\r\n            }\r\n            else{\r\n                for(var r=0;r<data.length;r++){\r\n                    var rowstr = \"\";\r\n                    for(var c=0;c<data[0].length;c++){\r\n                        rowstr += data[r][c] + \":\";\r\n                    }\r\n                    rowstr = rowstr.substr(0, rowstr.length-1);\r\n                    dataformat.push(rowstr);\r\n                }\r\n                var offsetY = data[0].length;\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n            //sparksetting.offsetY = offsetY;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[2];\r\n            var chartRangeMax = arguments[3];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"column\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BARSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var chartRangeMax = arguments[4];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"bar\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STACKBARSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            var dataformat = [];\r\n\r\n            var data = [];\r\n            if(rangeValue!=null && rangeValue.data!=null){\r\n                data = rangeValue.data;\r\n            }\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                data = formula.getPureValueByData(data);\r\n            }\r\n            else if(getObjType(data) == \"object\"){\r\n                data = data.v;\r\n                return [data];\r\n            }\r\n            else{\r\n                if(/\\{.*?\\}/.test(data)){\r\n                    data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n                }\r\n                data = new Function(\"return \" + data)();\r\n            }\r\n\r\n            var stackconfig = arguments[1];\r\n            var offsetY = data.length;\r\n            if(stackconfig==null || !!stackconfig){\r\n                for(var c=0;c<data[0].length;c++){\r\n                    var colstr = \"\";\r\n                    for(var r=0;r<data.length;r++){\r\n                        colstr += data[r][c] + \":\";\r\n                    }\r\n                    colstr = colstr.substr(0, colstr.length-1);\r\n                    dataformat.push(colstr);\r\n                }\r\n            }\r\n            else{\r\n                for(var r=0;r<data.length;r++){\r\n                    var rowstr = \"\";\r\n                    for(var c=0;c<data[0].length;c++){\r\n                        rowstr += data[r][c] + \":\";\r\n                    }\r\n                    rowstr = rowstr.substr(0, rowstr.length-1);\r\n                    dataformat.push(rowstr);\r\n                }\r\n                var offsetY = data[0].length;\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n            //sparksetting.offsetY = offsetY;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[2];\r\n            var chartRangeMax = arguments[3];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"bar\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DISCRETESPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var thresholdValue = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"discrete\";\r\n\r\n            if(thresholdValue==null){\r\n                thresholdValue = 0;\r\n            }\r\n            sparksetting[\"thresholdValue\"] = thresholdValue;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"thresholdColor\", negBarColor);\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRISTATESPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var zeroBarColor = arguments[4];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"tristate\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(zeroBarColor==null){\r\n                zeroBarColor = \"#999\";\r\n            }\r\n            sparkColorSetting(\"zeroBarColor\", zeroBarColor);\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PIESPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var offset = arguments[1];\r\n            var borderWidth = arguments[2];\r\n            var borderColor = arguments[3];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"pie\";\r\n            if(offset==null){\r\n                offset = 0;\r\n            }\r\n            sparksetting[\"offset\"] = offset;\r\n\r\n            if(borderWidth==null){\r\n                borderWidth = 0;\r\n            }\r\n            sparkColorSetting(\"borderWidth\", borderWidth);\r\n\r\n            if(borderColor==null){\r\n                borderColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"borderColor\", borderColor);\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BOXSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\uFFFD\uFFFD\uFFFD\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var outlierIQR = arguments[1];\r\n            var target = arguments[2];\r\n            var spotRadius = arguments[3];\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            sparksetting[\"type\"] = \"box\";\r\n            if(outlierIQR==null){\r\n                outlierIQR = 1.5;\r\n            }\r\n            sparksetting[\"outlierIQR\"] = outlierIQR;\r\n\r\n            if(target==null){\r\n                target = 0;\r\n            }\r\n            else{\r\n                sparkColorSetting(\"target\", target);\r\n            }\r\n\r\n            if(spotRadius==null){\r\n                spotRadius = 1.5;\r\n            }\r\n            sparkColorSetting(\"spotRadius\", spotRadius);\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BULLETSPLINES\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //\u8272\u8868\uFF0C\u63A5\u4E0B\u6765\u4F1A\u7528\u5230\r\n            var colorList = formula.colorList;\r\n            //var rangeValue = arguments[0];\r\n\r\n            //\u5B9A\u4E49\u9700\u8981\u683C\u5F0F\u5316data\u6570\u636E\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //\u5728\u4E0B\u9762\u83B7\u5F97\u8BE5\u5355\u5143\u683C\u7684\u957F\u5EA6\u548C\u5BBD\u5EA6,\u540C\u65F6\u8003\u8651\u4E86\u5408\u5E76\u5355\u5143\u683C\u95EE\u9898\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //\u5F00\u59CB\u8FDB\u884Csparklines\u7684\u8BE6\u7EC6\u8BBE\u7F6E\uFF0C\u5BBD\u548C\u9AD8\u4E3A\u5355\u5143\u683C\u7684\u5BBD\u9AD8\u3002\r\n            var sparksetting = {};\r\n\r\n            //\u8BBE\u7F6Esparklines\u56FE\u8868\u7684\u5BBD\u9AD8\uFF0C\u7EBF\u56FE\u7684\u9AD8\u4F1A\u968F\u7740\u7C97\u7EC6\u800C\u8D85\u51FA\u5355\u5143\u683C\u9AD8\u5EA6\uFF0C\u6240\u4EE5\u51CF\u53BB\u4E00\u4E2A\u91CF\uFF0C\u8BBE\u7F6EoffsetY\u6216\u8005offsetX\u4E3A\u6E32\u67D3\u504F\u79FB\u91CF\uFF0C\u4F20\u7ED9luckysheetDrawMain\u4F7F\u7528\u3002\u9ED8\u8BA4\u4E3A0\u3002=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //\u5B9A\u4E49sparklines\u7684\u901A\u7528\u8272\u5F69\u8BBE\u7F6E\u51FD\u6570\uFF0C\u53EF\u4EE5\u8BBE\u7F6E \u8272\u8868\u3010colorList\u3011\u7D22\u5F15\u6570\u503C \u6216\u8005 \u5177\u4F53\u989C\u8272\u503C\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n            var dataformat = [];\r\n            luckysheet_getValue(arguments);\r\n\r\n            var data1 = formula.getValueByFuncData(arguments[0]);\r\n            var data2 = formula.getValueByFuncData(arguments[1]);\r\n\r\n            dataformat.push(data1);\r\n            dataformat.push(data2);\r\n\r\n            for(var i=2;i<arguments.length;i++){\r\n                dataformat.push(formula.getValueByFuncData(arguments[i]));\r\n            }\r\n\r\n            sparksetting[\"type\"] = \"bullet\";\r\n            ////\u5177\u4F53\u5B9E\u73B0\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    //\u52A8\u6001\u6570\u7EC4\u516C\u5F0F\r\n    \"SORT\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u6392\u5E8F\u7684\u8303\u56F4\u6216\u6570\u7EC4\r\n            var data_array = arguments[0];\r\n            var array = [], rowlen = 1, collen = 1;\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_array.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_array[i].length; j++){\r\n                            var number = data_array[i][j];\r\n\r\n                            rowArr.push(number);\r\n                        }\r\n\r\n                        array.push(rowArr);\r\n                    }\r\n\r\n                    rowlen = array.length;\r\n                    collen = array[0].length;\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_array.length; i++){\r\n                        var number = data_array[i];\r\n\r\n                        array.push(number);\r\n                    }\r\n\r\n                    rowlen = array.length;\r\n                }\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                if(data_array.data != null){\r\n                    if(getObjType(data_array.data) == \"array\"){\r\n                        for(var i = 0; i < data_array.data.length; i++){\r\n                            var rowArr = [];\r\n\r\n                            for(var j = 0; j < data_array.data[i].length; j++){\r\n                                if(data_array.data[i][j] != null){\r\n                                    var number = data_array.data[i][j].v;\r\n\r\n                                    if(isRealNull(number)){\r\n                                        number = 0;\r\n                                    }\r\n\r\n                                    rowArr.push(number);\r\n                                }\r\n                                else{\r\n                                    rowArr.push(0);\r\n                                }\r\n                            }\r\n\r\n                            array.push(rowArr);\r\n                        }\r\n\r\n                        rowlen = array.length;\r\n                        collen = array[0].length;\r\n                    }\r\n                    else{\r\n                        var number = data_array.data.v;\r\n\r\n                        if(isRealNull(number)){\r\n                            number = 0;\r\n                        }\r\n\r\n                        array.push(number);\r\n                    }\r\n                }\r\n                else{\r\n                    array.push(0);\r\n                }\r\n            }\r\n            else{\r\n                var number = data_array;\r\n\r\n                array.push(number);\r\n            }\r\n\r\n            //\u8868\u793A\u8981\u6392\u5E8F\u7684\u884C\u6216\u5217\u7684\u6570\u5B57\uFF08\u9ED8\u8BA4row1/col1\uFF09\r\n            var sort_index = 1;\r\n            if(arguments.length >= 2){\r\n                sort_index = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(sort_index)){\r\n                    return sort_index;\r\n                }\r\n\r\n                if(!isRealNum(sort_index)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sort_index = parseInt(sort_index);\r\n            }\r\n\r\n            //\u8868\u793A\u6240\u9700\u6392\u5E8F\u987A\u5E8F\u7684\u6570\u5B57\uFF1B1\u8868\u793A\u5347\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0C-1\u8868\u793A\u964D\u5E8F\u3002\r\n            var sort_order = 1;\r\n            if(arguments.length >= 3){\r\n                sort_order = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(sort_order)){\r\n                    return sort_order;\r\n                }\r\n\r\n                if(!isRealNum(sort_order)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sort_order = Math.floor(parseFloat(sort_order));\r\n            }\r\n\r\n            //\u8868\u793A\u6240\u9700\u6392\u5E8F\u65B9\u5411\u7684\u903B\u8F91\u503C\uFF1B\u6309\u884C\u6392\u5E8F\u4E3AFALSE\uFF08\u9ED8\u8BA4\uFF09\uFF0C\u6309\u5217\u6392\u5E8F\u4E3ATRUE\u3002\r\n            var by_col = false;\r\n            if(arguments.length == 4){\r\n                by_col = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(by_col)){\r\n                    return by_col;\r\n                }\r\n            }\r\n\r\n            if(by_col){\r\n                if(sort_index < 1 || sort_index > rowlen){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                if(sort_index < 1 || sort_index > collen){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            if(sort_order != 1 && sort_order != -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var asc = function(x, y){\r\n                if(getObjType(x) == \"array\"){\r\n                    x = x[sort_index - 1];\r\n                }\r\n\r\n                if(getObjType(y) == \"array\"){\r\n                    y = y[sort_index - 1];\r\n                }\r\n\r\n                if(!isNaN(x) && !isNaN(y)){\r\n                    return x - y;\r\n                }\r\n                else if(!isNaN(x)){\r\n                    return -1;\r\n                }\r\n                else if(!isNaN(y)){\r\n                    return 1;\r\n                }\r\n                else{\r\n                    if(x > y){\r\n                        return 1;\r\n                    }\r\n                    else if(x < y){\r\n                        return -1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var desc = function(x, y){\r\n                if(getObjType(x) == \"array\"){\r\n                    x = x[sort_index - 1];\r\n                }\r\n\r\n                if(getObjType(y) == \"array\"){\r\n                    y = y[sort_index - 1];\r\n                }\r\n\r\n                if(!isNaN(x) && !isNaN(y)){\r\n                    return y - x;\r\n                }\r\n                else if(!isNaN(x)){\r\n                    return 1;\r\n                }\r\n                else if(!isNaN(y)){\r\n                    return -1;\r\n                }\r\n                else{\r\n                    if(x > y){\r\n                        return -1;\r\n                    }\r\n                    else if(x < y){\r\n                        return 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(by_col){\r\n                array = array[0].map(function(col, a){\r\n                    return array.map(function(row){\r\n                        return row[a];\r\n                    });\r\n                });\r\n\r\n                if(sort_order == 1){\r\n                    array.sort(asc);\r\n                }\r\n\r\n                if(sort_order == -1){\r\n                    array.sort(desc);\r\n                }\r\n\r\n                array = array[0].map(function(col, b){\r\n                    return array.map(function(row){\r\n                        return row[b];\r\n                    });\r\n                });\r\n            }\r\n            else{\r\n                if(sort_order == 1){\r\n                    array.sort(asc);\r\n                }\r\n\r\n                if(sort_order == -1){\r\n                    array.sort(desc);\r\n                }\r\n            }\r\n\r\n            return array;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FILTER\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u7B5B\u9009\u7684\u6570\u7EC4\u6216\u8303\u56F4\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_array));\r\n\r\n                array.push(rowArr);\r\n            }\r\n\r\n            var rowlen = array.length,\r\n                collen = array[0].length;\r\n\r\n            //\u5E03\u5C14\u6570\u7EC4\uFF0C\u5176\u9AD8\u5EA6\u6216\u5BBD\u5EA6\u4E0E\u6570\u7EC4\u76F8\u540C\r\n            var data_include = arguments[1];\r\n            var include = [];\r\n            var type = \"row\"; //\u7B5B\u9009\u65B9\u5F0F row - \u884C\uFF0Ccol - \u5217\r\n\r\n            if(getObjType(data_include) == \"array\"){\r\n                if(getObjType(data_include[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_include)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(data_include.length > 1 && data_include[0].length > 1){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(data_include.length > 1){\r\n                        if(data_include.length != array.length){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        type = \"row\";\r\n\r\n                        for(var i = 0; i < data_include.length; i++){\r\n                            var txt = data_include[i][0];\r\n\r\n                            if(getObjType(txt) == \"boolean\"){\r\n\r\n                            }\r\n                            else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                                if(txt.toLowerCase() == \"true\"){\r\n                                    txt = true;\r\n                                }\r\n                                else if(txt.toLowerCase() == \"false\"){\r\n                                    txt = false;\r\n                                }\r\n                            }\r\n                            else if(isRealNum(txt)){\r\n                                txt = parseFloat(txt);\r\n\r\n                                txt = txt == 0 ? false : true;\r\n                            }\r\n                            else{\r\n                                return formula.error.v;\r\n                            }\r\n\r\n                            include.push(txt);\r\n                        }\r\n                    }\r\n\r\n                    if(data_include[0].length > 1){\r\n                        if(data_include[0].length != array[0].length){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        type = \"col\";\r\n\r\n                        for(var i = 0; i < data_include[0].length; i++){\r\n                            var txt = data_include[0][i];\r\n\r\n                            if(getObjType(txt) == \"boolean\"){\r\n\r\n                            }\r\n                            else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                                if(txt.toLowerCase() == \"true\"){\r\n                                    txt = true;\r\n                                }\r\n                                else if(txt.toLowerCase() == \"false\"){\r\n                                    txt = false;\r\n                                }\r\n                            }\r\n                            else if(isRealNum(txt)){\r\n                                txt = parseFloat(txt);\r\n\r\n                                txt = txt == 0 ? false : true;\r\n                            }\r\n                            else{\r\n                                return formula.error.v;\r\n                            }\r\n\r\n                            include.push(txt);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(data_include.length != array[0].length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"col\";\r\n\r\n                    for(var i = 0; i < data_include.length; i++){\r\n                        var txt = data_include[i];\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_include) == \"object\" && data_include.data != null && getObjType(data_include.data) == \"array\"){\r\n                if(data_include.data.length > 1 && data_include.data[0].length > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                if(data_include.data.length > 1){\r\n                    if(data_include.data.length != array.length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"row\";\r\n\r\n                    for(var i = 0; i < data_include.data.length; i++){\r\n                        var txt = data_include.data[i][0].v;\r\n\r\n                        if(isRealNull(txt)){\r\n                            txt = 0;\r\n                        }\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n\r\n                if(data_include.data[0].length > 1){\r\n                    if(data_include.data[0].length != array[0].length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"col\";\r\n\r\n                    for(var i = 0; i < data_include.data[0].length; i++){\r\n                        var txt = data_include.data[0][i].v;\r\n\r\n                        if(isRealNull(txt)){\r\n                            txt = 0;\r\n                        }\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u5982\u679C\u5305\u542B\u6570\u7EC4\u4E2D\u7684\u6240\u6709\u503C\u90FD\u4E3A\u7A7A(filter\u4E0D\u8FD4\u56DE\u4EFB\u4F55\u503C)\uFF0C\u5219\u8FD4\u56DE\u7684\u503C\r\n            var if_empty = \"\";\r\n            if(arguments.length == 3){\r\n                if_empty = func_methods.getFirstValue(arguments[2], \"text\");\r\n                if(valueIsError(if_empty)){\r\n                    return if_empty;\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = [];\r\n            if(type == \"row\"){\r\n                for(var i = 0; i < array.length; i++){\r\n                    if(include[i]){\r\n                        result.push(array[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                for(var i = 0; i < array.length; i++){\r\n                    var rowArr = [];\r\n\r\n                    for(var j = 0; j < array[0].length; j++){\r\n                        if(include[j]){\r\n                            rowArr.push(array[i][j]);\r\n                        }\r\n                    }\r\n\r\n                    if(rowArr.length > 0){\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(result.length == 0){\r\n                return if_empty;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UNIQUE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u4ECE\u5176\u8FD4\u56DE\u552F\u4E00\u503C\u7684\u6570\u7EC4\u6216\u533A\u57DF\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_array));\r\n\r\n                array.push(rowArr);\r\n            }\r\n\r\n            //\u903B\u8F91\u503C\uFF0C\u6307\u793A\u5982\u4F55\u6BD4\u8F83\uFF1B\u6309\u884C = FALSE \u6216\u7701\u7565\uFF1B\u6309\u5217 = TRUE\r\n            var by_col = false;\r\n            if(arguments.length >= 2){\r\n                by_col = func_methods.getCellBoolen(arguments[1]);\r\n\r\n                if(valueIsError(by_col)){\r\n                    return by_col;\r\n                }\r\n            }\r\n\r\n            //\u903B\u8F91\u503C\uFF0C\u4EC5\u8FD4\u56DE\u552F\u4E00\u503C\u4E2D\u51FA\u73B0\u4E00\u6B21 = TRUE\uFF1B\u5305\u62EC\u6240\u6709\u552F\u4E00\u503C = FALSE \u6216\u7701\u7565\r\n            var occurs_once = false;\r\n            if(arguments.length == 3){\r\n                occurs_once = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(occurs_once)){\r\n                    return occurs_once;\r\n                }\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            if(by_col){\r\n                array = array[0].map(function(col, a){\r\n                    return array.map(function(row){\r\n                        return row[a];\r\n                    });\r\n                });\r\n\r\n                var strObj = {}, strArr = [];\r\n                var allUnique = [];\r\n\r\n                for(var i = 0; i < array.length; i++){\r\n                    var str = '';\r\n\r\n                    for(var j = 0; j < array[i].length; j++){\r\n                        str += array[i][j].toString() + \"|||\";\r\n                    }\r\n\r\n                    strArr.push(str);\r\n\r\n                    if(!(str in strObj)){\r\n                        strObj[str] = 0;\r\n\r\n                        allUnique.push(array[i]);\r\n                    }\r\n                }\r\n\r\n                if(occurs_once){\r\n                    var oneUnique = [];\r\n\r\n                    for(var i = 0; i < strArr.length; i++){\r\n                        if(strArr.indexOf(strArr[i]) == strArr.lastIndexOf(strArr[i])){\r\n                            oneUnique.push(array[i]);\r\n                        }\r\n                    }\r\n\r\n                    oneUnique = oneUnique[0].map(function(col, a){\r\n                        return oneUnique.map(function(row){\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    return oneUnique;\r\n                }\r\n                else{\r\n                    allUnique = allUnique[0].map(function(col, a){\r\n                        return allUnique.map(function(row){\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    return allUnique;\r\n                }\r\n            }\r\n            else{\r\n                var strObj = {}, strArr = [];\r\n                var allUnique = [];\r\n\r\n                for(var i = 0; i < array.length; i++){\r\n                    var str = '';\r\n\r\n                    for(var j = 0; j < array[i].length; j++){\r\n                        str += array[i][j].toString() + \"|||\";\r\n                    }\r\n\r\n                    strArr.push(str);\r\n\r\n                    if(!(str in strObj)){\r\n                        strObj[str] = 0;\r\n\r\n                        allUnique.push(array[i]);\r\n                    }\r\n                }\r\n\r\n                if(occurs_once){\r\n                    var oneUnique = [];\r\n\r\n                    for(var i = 0; i < strArr.length; i++){\r\n                        if(strArr.indexOf(strArr[i]) == strArr.lastIndexOf(strArr[i])){\r\n                            oneUnique.push(array[i]);\r\n                        }\r\n                    }\r\n\r\n                    return oneUnique;\r\n                }\r\n                else{\r\n                    return allUnique;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANDARRAY\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8FD4\u56DE\u7684\u884C\u6570\r\n            var rows = 1;\r\n            if(arguments.length >= 1){\r\n                rows = func_methods.getFirstValue(arguments[0]);\r\n                if(valueIsError(rows)){\r\n                    return rows;\r\n                }\r\n\r\n                if(!isRealNum(rows)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                rows = parseInt(rows);\r\n            }\r\n\r\n            //\u8981\u8FD4\u56DE\u7684\u5217\u6570\r\n            var cols = 1;\r\n            if(arguments.length == 2){\r\n                cols = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cols)){\r\n                    return cols;\r\n                }\r\n\r\n                if(!isRealNum(cols)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                cols = parseInt(cols);\r\n            }\r\n\r\n            if(rows <= 0 || cols <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = [];\r\n\r\n            for(var i = 0; i < rows; i++){\r\n                var result_row = [];\r\n\r\n                for(var j = 0; j < cols; j++){\r\n                    result_row.push(Math.random().toFixed(9));\r\n                }\r\n\r\n                result.push(result_row);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEQUENCE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //\u8981\u8FD4\u56DE\u7684\u884C\u6570\r\n            var rows = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rows)){\r\n                return rows;\r\n            }\r\n\r\n            if(!isRealNum(rows)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rows = parseInt(rows);\r\n\r\n            //\u8981\u8FD4\u56DE\u7684\u5217\u6570\r\n            var cols = 1;\r\n            if(arguments.length >= 2){\r\n                cols = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cols)){\r\n                    return cols;\r\n                }\r\n\r\n                if(!isRealNum(cols)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                cols = parseInt(cols);\r\n            }\r\n\r\n            //\u5E8F\u5217\u4E2D\u7684\u7B2C\u4E00\u4E2A\u6570\u5B57\r\n            var start = 1;\r\n            if(arguments.length >= 3){\r\n                start = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start)){\r\n                    return start;\r\n                }\r\n\r\n                if(!isRealNum(start)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start = parseFloat(start);\r\n            }\r\n\r\n            //\u5E8F\u5217\u4E2D\u6BCF\u4E2A\u5E8F\u5217\u503C\u7684\u589E\u91CF\r\n            var step = 1;\r\n            if(arguments.length == 4){\r\n                step = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(step)){\r\n                    return step;\r\n                }\r\n\r\n                if(!isRealNum(step)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                step = parseFloat(step);\r\n            }\r\n\r\n            if(rows <= 0 || cols <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //\u8BA1\u7B97\r\n            var result = [];\r\n\r\n            for(var i = 0; i < rows; i++){\r\n                var result_row = [];\r\n\r\n                for(var j = 0; j < cols; j++){\r\n                    var number = start + step * (j + cols * i);\r\n                    result_row.push(number);\r\n                }\r\n\r\n                result.push(result_row);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EVALUATE\": function() {\r\n        //\u5FC5\u8981\u53C2\u6570\u4E2A\u6570\u9519\u8BEF\u68C0\u6D4B\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //\u53C2\u6570\u7C7B\u578B\u9519\u8BEF\u68C0\u6D4B\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var sheetindex_now = window.luckysheetCurrentIndex;\r\n            //\u516C\u5F0F\u6587\u672C\r\n            var strtext = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(strtext)){\r\n                return strtext;\r\n            }\r\n            //\u5728\u6587\u672C\u516C\u5F0F\u524D\u9762\u6DFB\u52A0=\r\n            if(strtext.trim().indexOf('=')!=0)\r\n            {\r\n                strtext ='='+strtext;\r\n            }\r\n            //console.log(strtext);\r\n            var result_this = formula.execstringformula(strtext,cell_r,cell_c,sheetindex_now);\r\n            return result_this[1];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //\u8BA1\u7B97\u9519\u8BEF\u68C0\u6D4B\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REMOTE\": function() {\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            const cellRow = window.luckysheetCurrentRow;\r\n            const cellColumn = window.luckysheetCurrentColumn;\r\n            const cellFunction = window.luckysheetCurrentFunction;\r\n\r\n            const remoteFunction = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(remoteFunction)){\r\n                return remoteFunction;\r\n            }\r\n\r\n            luckysheetConfigsetting.remoteFunction(remoteFunction, data => {\r\n                const flowData = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cellRow, cellColumn, data);\r\n                flowData[cellRow][cellColumn] = {\r\n                    \"v\": data,\r\n                    \"f\": cellFunction\r\n                };\r\n                jfrefreshgrid(flowData, [{\"row\": [cellRow, cellRow], \"column\": [cellColumn, cellColumn]}]);\r\n            });\r\n\r\n            return \"Loading...\";\r\n        }\r\n        catch (e) {\r\n            console.log(e);\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n};\r\n\r\nexport default functionImplementation;\r\n", "import functionImplementation from './functionImplementation';\r\nimport Store from '../store/index'\r\nimport locale from '../locale/locale';\r\n//{\"0\":\"\u6570\u5B66\",\"1\":\"\u7EDF\u8BA1\",\"2\":\"\u67E5\u627E\",\"3\":\"Luckysheet\u5185\u7F6E\",\"4\":\"\u6570\u636E\u6316\u6398\",\"5\":\"\u6570\u636E\u6E90\",\"6\":\"\u65E5\u671F\",\"7\":\"\u8FC7\u6EE4\u5668\",\"8\":\"\u8D22\u52A1\",\"9\":\"\u5DE5\u7A0B\u8BA1\u7B97\",\"10\":\"\u903B\u8F91\",\"11\":\"\u8FD0\u7B97\u7B26\",\"12\":\"\u6587\u672C\",\"13\":\"\u8F6C\u6362\u5DE5\u5177\",\"14\":\"\u6570\u7EC4\"}\r\n\r\nconst functionlist = function(){\r\n    let _locale = locale();\r\n    // internationalization,get function list\r\n    let functionListOrigin = _locale.functionlist;\r\n\r\n    // add new property f\r\n    for (let i = 0; i < functionListOrigin.length; i++) {\r\n        let func = functionListOrigin[i];\r\n        func.f = functionImplementation[func.n];\r\n    }\r\n\r\n    Store.functionlist = functionListOrigin;\r\n    \r\n    // get n property\r\n    const luckysheet_function = {};\r\n\r\n    for (let i = 0; i < functionListOrigin.length; i++) {\r\n        let func = functionListOrigin[i];\r\n        luckysheet_function[func.n] = func;\r\n    }\r\n\r\n    window.luckysheet_function = luckysheet_function; //Mount window for eval() calculation formula\r\n    \r\n    Store.luckysheet_function = luckysheet_function;\r\n}\r\n\r\nexport default functionlist;", "import luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport {zoomChange} from './zoom';\r\nimport sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport {rowLocationByIndex, colLocationByIndex,mouseposition,rowLocation,colLocation} from '../global/location';\r\nimport Store from '../store';\r\n\r\nlet ExcelPlaceholder = {\r\n    \"[tabName]\":\"&A\",\r\n    \"[CurrentDate]\":\"&D\",\r\n    \"[fileName]\":\"&F\",\r\n    \"[background]\":\"&G\",\r\n    \"[Shadow]\":\"&H\",\r\n    \"[TotalPages]\":\"&N\",\r\n    \"[pageNumber]\":\"&P\",\r\n    \"[CurrentTime]\":\"&T\",\r\n    \"[filePath]\":\"&Z\",\r\n}\r\n\r\n// Get the pixel value per millimeter\r\nfunction getOneMmsPx (){\r\n    let div = document.createElement(\"div\");\r\n    div.style.width = \"1mm\";\r\n    document.querySelector(\"body\").appendChild(div);\r\n    let mm1 = div.getBoundingClientRect();\r\n    let w = mm1.width;\r\n    $(div).remove();\r\n    return mm1.width;\r\n}\r\n\r\nexport function viewChange(curType, preType){\r\n    let currentSheet = sheetmanage.getSheetByIndex();\r\n\r\n    if(currentSheet.config==null){\r\n        currentSheet.config = {};\r\n    }\r\n\r\n    if(currentSheet.config.sheetViewZoom==null){\r\n        currentSheet.config.sheetViewZoom = {};\r\n    }\r\n\r\n    let defaultZoom = 1, type=\"zoomScaleNormal\";\r\n    printLineAndNumberDelete(currentSheet);\r\n    if(curType==\"viewNormal\"){\r\n        type = \"viewNormalZoomScale\";\r\n    }\r\n    else if(curType==\"viewLayout\"){\r\n        type = \"viewLayoutZoomScale\";\r\n    }\r\n    else if(curType==\"viewPage\"){\r\n        type = \"viewPageZoomScale\";\r\n        defaultZoom = 0.6;\r\n        printLineAndNumberCreate(currentSheet);\r\n    }\r\n\r\n    \r\n\r\n    let curZoom = currentSheet.config.sheetViewZoom[type];\r\n    if(curZoom==null){\r\n        curZoom = defaultZoom;\r\n    }\r\n\r\n    currentSheet.config.curentsheetView = curType;\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfredo.push({\r\n            \"type\": \"viewChange\",\r\n            \"curType\": curType,\r\n            \"preType\": preType,\r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n        });\r\n    }\r\n\r\n    // Store.zoomRatio = curZoom;\r\n    // server.saveParam(\"all\", Store.currentSheetIndex, curZoom, { \"k\": \"zoomRatio\" });\r\n    server.saveParam(\"cg\", Store.currentSheetIndex, curType, { \"k\": \"curentsheetView\" });\r\n\r\n    Store.currentSheetView = curType;\r\n\r\n    zoomChange(curZoom);\r\n}\r\n\r\n\r\nfunction printLineAndNumberDelete(sheet){\r\n\r\n}\r\n\r\nfunction printLineAndNumberCreate(sheet){\r\n    \r\n}\r\n\r\nfunction switchViewBtn($t){\r\n    let $viewList = $t.parent(), preType=$viewList.find(\"luckysheet-print-viewBtn-active\").attr(\"type\");\r\n    if($t.attr(\"type\") == preType){\r\n        return;\r\n    }\r\n\r\n    let curType = $t.attr(\"type\");\r\n    if(curType!=null){\r\n        viewChange(curType, preType);\r\n    }\r\n    else{\r\n        return;\r\n    }\r\n\r\n    $t.parent().find(\".luckysheet-print-viewBtn\").removeClass(\"luckysheet-print-viewBtn-active\");\r\n    $t.addClass(\"luckysheet-print-viewBtn-active\");\r\n}\r\n\r\nexport function printInitial(){\r\n    let container = luckysheetConfigsetting.container;\r\n    let _this = this;\r\n    $(\"#\"+container).find(\".luckysheet-print-viewBtn\").click(function(){\r\n        switchViewBtn($(this));\r\n    });\r\n\r\n}\r\n", "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.zh = {}));\n}(this, (function (exports) { 'use strict';\n\n  var fp = typeof window !== \"undefined\" && window.flatpickr !== undefined\n      ? window.flatpickr\n      : {\n          l10ns: {},\n      };\n  var Mandarin = {\n      weekdays: {\n          shorthand: [\"\u5468\u65E5\", \"\u5468\u4E00\", \"\u5468\u4E8C\", \"\u5468\u4E09\", \"\u5468\u56DB\", \"\u5468\u4E94\", \"\u5468\u516D\"],\n          longhand: [\n              \"\u661F\u671F\u65E5\",\n              \"\u661F\u671F\u4E00\",\n              \"\u661F\u671F\u4E8C\",\n              \"\u661F\u671F\u4E09\",\n              \"\u661F\u671F\u56DB\",\n              \"\u661F\u671F\u4E94\",\n              \"\u661F\u671F\u516D\",\n          ],\n      },\n      months: {\n          shorthand: [\n              \"\u4E00\u6708\",\n              \"\u4E8C\u6708\",\n              \"\u4E09\u6708\",\n              \"\u56DB\u6708\",\n              \"\u4E94\u6708\",\n              \"\u516D\u6708\",\n              \"\u4E03\u6708\",\n              \"\u516B\u6708\",\n              \"\u4E5D\u6708\",\n              \"\u5341\u6708\",\n              \"\u5341\u4E00\u6708\",\n              \"\u5341\u4E8C\u6708\",\n          ],\n          longhand: [\n              \"\u4E00\u6708\",\n              \"\u4E8C\u6708\",\n              \"\u4E09\u6708\",\n              \"\u56DB\u6708\",\n              \"\u4E94\u6708\",\n              \"\u516D\u6708\",\n              \"\u4E03\u6708\",\n              \"\u516B\u6708\",\n              \"\u4E5D\u6708\",\n              \"\u5341\u6708\",\n              \"\u5341\u4E00\u6708\",\n              \"\u5341\u4E8C\u6708\",\n          ],\n      },\n      rangeSeparator: \" \u81F3 \",\n      weekAbbreviation: \"\u5468\",\n      scrollTitle: \"\u6EDA\u52A8\u5207\u6362\",\n      toggleTitle: \"\u70B9\u51FB\u5207\u6362 12/24 \u5C0F\u65F6\u65F6\u5236\",\n  };\n  fp.l10ns.zh = Mandarin;\n  var zh = fp.l10ns;\n\n  exports.Mandarin = Mandarin;\n  exports.default = zh;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n", "/**\r\n * Monitor special variables\r\n */\r\nimport {createProxy} from '../utils/util';\r\nimport Store from '../store/index';\r\nimport method from '../global/method';\r\nimport { getluckysheetfile } from '../methods/get'\r\nimport { toJson } from '../global/api';\r\n\r\nlet undoTimer,redoTimer;\r\nfunction undoAccessible(len) {\r\n    clearTimeout(undoTimer);\r\n    undoTimer = setTimeout(() => {\r\n        $('#luckysheet-icon-undo')[len ? 'removeClass' : 'addClass']('disabled');\r\n    }, 10);\r\n}\r\nfunction redoAccessible(len) {\r\n    clearTimeout(redoTimer);\r\n    redoTimer = setTimeout(() => {\r\n        $('#luckysheet-icon-redo')[len ? 'removeClass' : 'addClass']('disabled');\r\n    }, 10);\r\n}\r\n\r\nconst initListener = function(){\r\n    // createProxy(Store,['jfredo']);\r\n    createProxy(Store, 'jfredo',(target, property, val, receiver)=>{\r\n        if (property !== 'length') {\r\n            //  \u94A9\u5B50\u51FD\u6570\r\n            method.createHookFunction('updated',val)\r\n        }\r\n        undoAccessible(Store.jfredo.length);\r\n    } );\r\n    createProxy(Store, 'jfundo',(target, property, val, receiver)=>{\r\n        redoAccessible(Store.jfundo.length);\r\n    } );\r\n    \r\n\r\n\r\n    createProxy(Store, 'asyncLoad', (target, property, val, receiver)=>{\r\n        if(property === 'length' && val === 0){\r\n            method.createHookFunction('workbookCreateAfter', toJson())\r\n        }\r\n    })\r\n}\r\n\r\nexport {\r\n    initListener\r\n}", "\r\nimport defaultSetting from './config.js';\r\nimport { common_extend } from './utils/util';\r\nimport Store from './store';\r\nimport server from './controllers/server';\r\nimport luckysheetConfigsetting from './controllers/luckysheetConfigsetting';\r\nimport sheetmanage from './controllers/sheetmanage';\r\nimport luckysheetsizeauto from './controllers/resize';\r\nimport luckysheetHandler from './controllers/handler';\r\nimport {initialFilterHandler} from './controllers/filter';\r\nimport {initialMatrixOperation} from './controllers/matrixOperation';\r\nimport {initialSheetBar} from './controllers/sheetBar';\r\nimport {formulaBarInitial} from './controllers/formulaBar';\r\nimport {rowColumnOperationInitial} from './controllers/rowColumnOperation';\r\nimport {keyboardInitial} from './controllers/keyboard';\r\nimport {orderByInitial} from './controllers/orderBy';\r\nimport {initPlugins} from './controllers/expendPlugins';\r\nimport {\r\n    getluckysheetfile,\r\n    getluckysheet_select_save,\r\n    getconfig,\r\n} from './methods/get';\r\nimport {\r\n    setluckysheet_select_save\r\n} from './methods/set';\r\nimport { luckysheetrefreshgrid, jfrefreshgrid } from './global/refresh';\r\nimport functionlist from './function/functionlist';\r\nimport { luckysheetlodingHTML } from './controllers/constant';\r\nimport { getcellvalue, getdatabyselection } from './global/getdata';\r\nimport { setcellvalue } from './global/setdata';\r\nimport { selectHightlightShow } from './controllers/select';\r\nimport {zoomInitial} from './controllers/zoom';\r\nimport {printInitial} from './controllers/print';\r\nimport method from './global/method';\r\n\r\nimport * as api from './global/api';\r\n\r\nimport flatpickr from 'flatpickr'\r\nimport Mandarin from 'flatpickr/dist/l10n/zh.js'\r\nimport { initListener } from './controllers/listener';\r\nimport { hideloading, showloading } from './global/loading.js';\r\nimport { luckysheetextendData } from './global/extend.js';\r\n\r\nlet luckysheet = {};\r\n\r\n// mount api\r\n// luckysheet.api = api;\r\n// Object.assign(luckysheet, api);\r\n\r\nluckysheet = common_extend(api,luckysheet);\r\n\r\n\r\n\r\n//\u521B\u5EFAluckysheet\u8868\u683C\r\nluckysheet.create = function (setting) {\r\n    method.destroy()\r\n    // Store original parameters for api: toJson\r\n    Store.toJsonOptions = {}\r\n    for(let c in setting){\r\n        if(c !== 'data'){\r\n            Store.toJsonOptions[c] = setting[c];\r\n        }\r\n    }\r\n\r\n    let extendsetting = common_extend(defaultSetting, setting);\r\n\r\n    let loadurl = extendsetting.loadUrl,\r\n        menu = extendsetting.menu,\r\n        title = extendsetting.title;\r\n\r\n    let container = extendsetting.container;\r\n    Store.container = container;\r\n    Store.luckysheetfile = extendsetting.data;\r\n    Store.defaultcolumnNum = extendsetting.column;\r\n    Store.defaultrowNum = extendsetting.row;\r\n    Store.defaultFontSize = extendsetting.defaultFontSize;\r\n    Store.fullscreenmode = extendsetting.fullscreenmode;\r\n    Store.lang = extendsetting.lang; //language\r\n    Store.allowEdit = extendsetting.allowEdit;\r\n    Store.limitSheetNameLength =  extendsetting.limitSheetNameLength;\r\n    Store.defaultSheetNameMaxLength = extendsetting.defaultSheetNameMaxLength;\r\n    Store.fontList = extendsetting.fontList;\r\n    server.gridKey = extendsetting.gridKey;\r\n    server.loadUrl = extendsetting.loadUrl;\r\n    server.updateUrl = extendsetting.updateUrl;\r\n    server.updateImageUrl = extendsetting.updateImageUrl;\r\n    server.title = extendsetting.title;\r\n    server.loadSheetUrl = extendsetting.loadSheetUrl;\r\n    server.allowUpdate = extendsetting.allowUpdate;\r\n\r\n    luckysheetConfigsetting.autoFormatw = extendsetting.autoFormatw;\r\n    luckysheetConfigsetting.accuracy = extendsetting.accuracy;\r\n    luckysheetConfigsetting.total = extendsetting.data[0].total;\r\n\r\n    luckysheetConfigsetting.loading = extendsetting.loading;\r\n    luckysheetConfigsetting.allowCopy = extendsetting.allowCopy;\r\n    luckysheetConfigsetting.showtoolbar = extendsetting.showtoolbar;\r\n    luckysheetConfigsetting.showtoolbarConfig = extendsetting.showtoolbarConfig;\r\n    luckysheetConfigsetting.showinfobar = extendsetting.showinfobar;\r\n    luckysheetConfigsetting.showsheetbar = extendsetting.showsheetbar;\r\n    luckysheetConfigsetting.showsheetbarConfig = extendsetting.showsheetbarConfig;\r\n    luckysheetConfigsetting.showstatisticBar = extendsetting.showstatisticBar;\r\n    luckysheetConfigsetting.showstatisticBarConfig = extendsetting.showstatisticBarConfig;\r\n    luckysheetConfigsetting.sheetFormulaBar = extendsetting.sheetFormulaBar;\r\n    luckysheetConfigsetting.cellRightClickConfig = extendsetting.cellRightClickConfig;\r\n    luckysheetConfigsetting.sheetRightClickConfig = extendsetting.sheetRightClickConfig;\r\n    luckysheetConfigsetting.pointEdit = extendsetting.pointEdit;\r\n    luckysheetConfigsetting.pointEditUpdate = extendsetting.pointEditUpdate;\r\n    luckysheetConfigsetting.pointEditZoom = extendsetting.pointEditZoom;\r\n\r\n    luckysheetConfigsetting.userInfo = extendsetting.userInfo;\r\n    luckysheetConfigsetting.userMenuItem = extendsetting.userMenuItem;\r\n    luckysheetConfigsetting.myFolderUrl = extendsetting.myFolderUrl;\r\n    luckysheetConfigsetting.functionButton = extendsetting.functionButton;\r\n\r\n    luckysheetConfigsetting.showConfigWindowResize = extendsetting.showConfigWindowResize;\r\n    luckysheetConfigsetting.enableAddRow = extendsetting.enableAddRow;\r\n    luckysheetConfigsetting.enableAddBackTop = extendsetting.enableAddBackTop;\r\n    luckysheetConfigsetting.addRowCount = extendsetting.addRowCount;\r\n    luckysheetConfigsetting.enablePage = extendsetting.enablePage;\r\n    luckysheetConfigsetting.pageInfo = extendsetting.pageInfo;\r\n\r\n    luckysheetConfigsetting.editMode = extendsetting.editMode;\r\n    luckysheetConfigsetting.beforeCreateDom = extendsetting.beforeCreateDom;\r\n    luckysheetConfigsetting.workbookCreateBefore = extendsetting.workbookCreateBefore;\r\n    luckysheetConfigsetting.workbookCreateAfter = extendsetting.workbookCreateAfter;\r\n    luckysheetConfigsetting.remoteFunction = extendsetting.remoteFunction;\r\n\r\n    luckysheetConfigsetting.fireMousedown = extendsetting.fireMousedown;\r\n    luckysheetConfigsetting.forceCalculation = extendsetting.forceCalculation;\r\n    luckysheetConfigsetting.plugins = extendsetting.plugins;\r\n\r\n    luckysheetConfigsetting.rowHeaderWidth = extendsetting.rowHeaderWidth;\r\n    luckysheetConfigsetting.columnHeaderHeight = extendsetting.columnHeaderHeight;\r\n\r\n    luckysheetConfigsetting.defaultColWidth = extendsetting.defaultColWidth;\r\n    luckysheetConfigsetting.defaultRowHeight = extendsetting.defaultRowHeight;\r\n\r\n    luckysheetConfigsetting.title = extendsetting.title;\r\n    luckysheetConfigsetting.container = extendsetting.container;\r\n    luckysheetConfigsetting.hook = extendsetting.hook;\r\n\r\n    luckysheetConfigsetting.pager = extendsetting.pager;\r\n\r\n    luckysheetConfigsetting.initShowsheetbarConfig = false;\r\n\r\n    luckysheetConfigsetting.imageUpdateMethodConfig = extendsetting.imageUpdateMethodConfig;\r\n\r\n    if (Store.lang === 'zh') flatpickr.localize(Mandarin.zh);\r\n\r\n    // Store the currently used plugins for monitoring asynchronous loading\r\n    Store.asyncLoad.push(...luckysheetConfigsetting.plugins);\r\n\r\n    // Register plugins\r\n    initPlugins(extendsetting.plugins , extendsetting.data);\r\n\r\n    // Store formula information, including internationalization\r\n    functionlist();\r\n\r\n    let devicePixelRatio = extendsetting.devicePixelRatio;\r\n    if(devicePixelRatio == null){\r\n        devicePixelRatio = 1;\r\n    }\r\n    Store.devicePixelRatio = Math.ceil(devicePixelRatio);\r\n\r\n    //loading\r\n    const loadingObj=luckysheetlodingHTML(\"#\" + container)\r\n    Store.loadingObj=loadingObj\r\n\r\n    if (loadurl == \"\") {\r\n        sheetmanage.initialjfFile(menu, title);\r\n        // luckysheetsizeauto();\r\n        initialWorkBook();\r\n    }\r\n    else {\r\n        $.post(loadurl, {\"gridKey\" : server.gridKey}, function (d) {\r\n            let data = new Function(\"return \" + d)();\r\n            Store.luckysheetfile = data;\r\n\r\n            sheetmanage.initialjfFile(menu, title);\r\n            // luckysheetsizeauto();\r\n            initialWorkBook();\r\n\r\n            //\u9700\u8981\u66F4\u65B0\u6570\u636E\u7ED9\u540E\u53F0\u65F6\uFF0C\u5EFA\u7ACBWebSocket\u8FDE\u63A5\r\n            if(server.allowUpdate){\r\n                server.openWebSocket();\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\nfunction initialWorkBook(){\r\n    luckysheetHandler();//Overall dom initialization\r\n    initialFilterHandler();//Filter initialization\r\n    initialMatrixOperation();//Right click matrix initialization\r\n    initialSheetBar();//bottom sheet bar initialization\r\n    formulaBarInitial();//top formula bar initialization\r\n    rowColumnOperationInitial();//row and coloumn operate initialization\r\n    keyboardInitial();//Keyboard operate initialization\r\n    orderByInitial();//menu bar orderby function initialization\r\n    zoomInitial();//zoom method initialization\r\n    printInitial();//print initialization\r\n    initListener();\r\n}\r\n\r\n//\u83B7\u53D6\u6240\u6709\u8868\u683C\u6570\u636E\r\nluckysheet.getluckysheetfile = getluckysheetfile;\r\n\r\n//\u83B7\u53D6\u5F53\u524D\u8868\u683C \u9009\u533A\r\nluckysheet.getluckysheet_select_save = getluckysheet_select_save;\r\n\r\n//\u8BBE\u7F6E\u5F53\u524D\u8868\u683C \u9009\u533A\r\nluckysheet.setluckysheet_select_save = setluckysheet_select_save;\r\n\r\n//\u83B7\u53D6\u5F53\u524D\u8868\u683C config\u914D\u7F6E\r\nluckysheet.getconfig = getconfig;\r\n\r\n//\u4E8C\u7EF4\u6570\u7EC4\u6570\u636E \u8F6C\u5316\u6210 {r, c, v}\u683C\u5F0F \u4E00\u7EF4\u6570\u7EC4 (\u4F20\u5165\u53C2\u6570\u4E3A\u4E8C\u7EF4\u6570\u636Edata)\r\nluckysheet.getGridData = sheetmanage.getGridData;\r\n\r\n//\u751F\u6210\u8868\u683C\u6240\u9700\u4E8C\u7EF4\u6570\u7EC4 \uFF08\u4F20\u5165\u53C2\u6570\u4E3A\u8868\u683C\u6570\u636E\u5BF9\u8C61file\uFF09\r\nluckysheet.buildGridData = sheetmanage.buildGridData;\r\n\r\n// Refresh the canvas display data according to scrollHeight and scrollWidth\r\nluckysheet.luckysheetrefreshgrid = luckysheetrefreshgrid;\r\n\r\n// Refresh canvas\r\nluckysheet.jfrefreshgrid = jfrefreshgrid;\r\n\r\n// Get the value of the cell\r\nluckysheet.getcellvalue = getcellvalue;\r\n\r\n// Set cell value\r\nluckysheet.setcellvalue = setcellvalue;\r\n\r\n// Get selection range value\r\nluckysheet.getdatabyselection = getdatabyselection;\r\n\r\nluckysheet.sheetmanage = sheetmanage;\r\n\r\n// Data of the current table\r\nluckysheet.flowdata = function () {\r\n    return Store.flowdata;\r\n}\r\n\r\n// Set selection highlight\r\nluckysheet.selectHightlightShow = selectHightlightShow;\r\n\r\n// Reset parameters after destroying the table\r\nluckysheet.destroy = method.destroy;\r\n\r\nluckysheet.showLoadingProgress = showloading;\r\nluckysheet.hideLoadingProgress = hideloading;\r\nluckysheet.luckysheetextendData = luckysheetextendData;\r\n\r\nexport {\r\n    luckysheet\r\n}\r\n", "    /**\r\n     * polyfill event in firefox\r\n     */\r\n\tfunction __firefox(){\r\n        HTMLElement.prototype.__defineGetter__(\"runtimeStyle\", __element_style);\r\n        window.constructor.prototype.__defineGetter__(\"event\", __window_event);\r\n        Event.prototype.__defineGetter__(\"srcElement\", __event_srcElement);\r\n    }\r\n\r\n    function __element_style(){\r\n        return this.style;\r\n    }\r\n\r\n    function __window_event(){\r\n        return __window_event_constructor();\r\n    }\r\n\r\n    function __event_srcElement(){\r\n        return this.target;\r\n    }\r\n\r\n    function __window_event_constructor(){\r\n        if(document.all){\r\n            return window.event;\r\n        }\r\n\r\n        var _caller = __window_event_constructor.caller;\r\n        \r\n        while(_caller != null){\r\n            var _argument = _caller.arguments[0];\r\n\r\n            if(_argument){\r\n                var _temp = _argument.constructor;\r\n                \r\n                if(_temp.toString().indexOf(\"Event\") != -1){\r\n                    return _argument;\r\n                }\r\n            }\r\n\r\n            _caller = _caller.caller;\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    export default __firefox;", "import './utils/math'\r\nimport { luckysheet } from './core'\r\nimport __firefox from './utils/polyfill'\r\n// Prevent gulp warning: 'Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification'\r\n// window.evall = window.eval;\r\n// polyfill event in firefox\r\nif(window.addEventListener && (navigator.userAgent.indexOf(\"Firefox\") > 0)){\r\n    __firefox();\r\n}\r\n\r\n// export default luckysheet;\r\n\r\n// use esbuild,bundle iife format\r\nmodule.exports =  luckysheet"],
  "mappings": "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,YACX,OAAW,6FACX,QAAW,MACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,cACX,OAAW,iIACX,QAAW,KACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,YACX,OAAW,gKACX,QAAW,KACX,QAAW,IACX,OAAW,IACX,KAAW,iBAEhB,CACC,EAAK,QACL,EAAK,GACL,EAAK,yMACL,EAAK,yMACL,EAAK,CAAC,EAAG,GACT,EAAK,CAAC,CACF,KAAW,YACX,OAAW,6FACX,QAAW,WACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,cACX,OAAW,iIACX,QAAW,6BACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,YACX,OAAW,gKACX,QAAW,IACX,QAAW,IACX,OAAW,IACX,KAAW,iBAEhB,CACC,EAAK,OACL,EAAK,GACL,EAAK,qKACL,EAAK,qKACL,EAAK,CAAC,EAAG,KACT,EAAK,CAAC,CACF,KAAW,YACX,OAAW;AAAA;AAAA,uFACX,QAAW,UACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,SACX,OAAW,mGACX,QAAW,KACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,gBACX,OAAW,oHACX,QAAW,IACX,QAAW,IACX,OAAW,IACX,KAAW,cAEZ,CACH,EAAK,OACL,EAAK,GACL,EAAK,6IACL,EAAK,6IACL,EAAK,CAAC,EAAG,GACT,EAAK,CAAC,CACF,KAAW,OACX,OAAW,uFACX,QAAW,KACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,YACX,OAAW,gIACX,QAAW,IACX,QAAW,IACX,OAAW,IACX,KAAW,iBAEZ,CACH,EAAK,QACL,EAAK,GACL,EAAK,+JACL,EAAK,+JACL,EAAK,CAAC,EAAG,GACT,EAAK,CAAC,CACF,KAAW,OACX,OAAW,uFACX,QAAW,KACX,QAAW,IACX,OAAW,IACX,KAAW,YACR,CACH,KAAW,YACX,OAAW,iIACX,QAAW,IACX,QAAW,IACX,OAAW,IACX,KAAW,iBAEhB,CACC,EAAK,MACL,EAAK,GACL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KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,KAAQ,CAAE,GAAM,OAAQ,GAAM,YAElC,CACI,KAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,OAAQ,GAAM,WAC9B,IAAQ,CAAE,GAAM,O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",
  "names": []
}