text: (function ($) {
    // register namespace
    $.extend(true, window, {
      "Slick": {
        "CellSelectionModel": CellSelectionModel
      }
    });
  
  
    function CellSelectionModel(options) {
      var _grid;
      var _canvas;
      var _ranges = [];
      var _self = this;
      var _selector = new Slick.CellRangeSelector({
        "selectionCss": {
          "border": "2px solid black"
        }
      });
      var _options;
      var _defaults = {
        selectActiveCell: true
      };
  
  
      function init(grid) {
        _options = $.extend(true, {}, _defaults, options);
        _grid = grid;
        _canvas = _grid.getCanvasNode();
        _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
        grid.registerPlugin(_selector);
        _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
        _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
      }
  
      function destroy() {
        _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
        _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
        _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
        _grid.unregisterPlugin(_selector);
      }
  
      function removeInvalidRanges(ranges) {
        var result = [];
  
        for (var i = 0; i < ranges.length; i++) {
          var r = ranges[i];
          if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
            result.push(r);
          }
        }
  
        return result;
      }
  
      function setSelectedRanges(ranges) {
        _ranges = removeInvalidRanges(ranges);
        _self.onSelectedRangesChanged.notify(_ranges);
      }
  
      function getSelectedRanges() {
        return _ranges;
      }
  
      function handleBeforeCellRangeSelected(e, args) {
        if (_grid.getEditorLock().isActive()) {
          e.stopPropagation();
          return false;
        }
      }
  
      function handleCellRangeSelected(e, args) {
        setSelectedRanges([args.range]);
      }
  
      function handleActiveCellChange(e, args) {
        if (_options.selectActiveCell) {
          setSelectedRanges([new Slick.Range(args.row, args.cell)]);
        }
      }
  
      $.extend(this, {
        "getSelectedRanges": getSelectedRanges,
        "setSelectedRanges": setSelectedRanges,
  
        "init": init,
        "destroy": destroy,
  
        "onSelectedRangesChanged": new Slick.Event()
      });
    }
  })(jQuery);