{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/packs/profile_pic_cropper.js","webpack:///./node_modules/cropperjs/dist/cropper.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","$","cropper","image","input","$modal","jQuery","on","e","uncropped_url","attr","src","modal","reader","file","files","prop","done","url","length","size","alert","URL","createObjectURL","FileReader","onload","result","readAsDataURL","layoutSelector","val","aspectRatio","width","height","Cropper","viewMode","scalable","isNaN","destroy","cropper_data","getData","x","y","click","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPrimitive","toPrimitive","TypeError","String","Number","_toPropertyKey","_typeof","iterator","constructor","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","configurable","writable","_createClass","protoProps","staticProps","obj","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","minLen","toString","slice","test","len","arr2","IS_BROWSER","window","document","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","concat","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","dragMode","initialAspectRatio","NaN","data","preview","responsive","restore","checkCrossOrigin","checkOrientation","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","crop","zoom","TEMPLATE","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","isPlainObject","_constructor","error","isFunction","toArray","callback","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","Math","round","REGEXP_SUFFIX","setStyle","element","styles","style","hasClass","classList","contains","className","indexOf","addClass","elem","add","trim","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","toLowerCase","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","set","addEventListener","removeEventListener","removeListener","type","handler","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","detail","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","transform","join","WebkitTransform","msTransform","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","x1","abs","startX","y1","startY","x2","endX","y2","endY","z1","sqrt","ratio","getPointer","_ref2","endOnly","pageX","pageY","end","getPointersCenter","count","_ref3","getAdjustedSizes","_ref4","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getSourceCanvas","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","naturalWidth","imageNaturalHeight","naturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","createElement","context","getContext","maxSizes","minSizes","min","max","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","drawImage","map","param","floor","fromCharCode","getStringFromCharCode","dataView","start","str","getUint8","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","atob","arrayBuffer","ArrayBuffer","uint8","Uint8Array","charCodeAt","arrayBufferToDataURL","mimeType","chunks","chunkSize","subarray","btoa","resetAndGetOrientation","orientation","DataView","littleEndian","app1Start","ifdStart","byteLength","offset","tiffOffset","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","parseOrientation","render","this","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","containerData","offsetWidth","offsetHeight","imageData","rotated","canvasWidth","canvasHeight","canvasData","limited","limitCanvas","oldLeft","oldTop","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","output","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","getElementsByTagName","events","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","ratioX","ratioY","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","_this","delta","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","right","bottom","renderable","shiftKey","range","check","side","move","methods","reset","initialImageData","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","source","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","croppable","AnotherCropper","tagName","Error","reloading","sizing","init","toDataURL","read","clone","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","isIOSWebKit","navigator","userAgent","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild","factory"],"mappings":"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","file":"js/profile_pic_cropper-18f3c9ead8b82ef1a9a6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 29);\n","import Cropper from 'cropperjs'\n(function($) {\n // https://fengyuanchen.github.io/cropperjs/examples/upload-cropped-image-to-server.html\n\n var image = $(\"#cropper-image\")[0];\n var input = $(\"#main-photo-upload\");\n var horAvatar = $(\"#main-photo-preview-horizontal\");\n var varAvatar = $(\"#main-photo-preview-vertical\");\n var cropper;\n var $modal = $('#cropper-modal');\n\n $('#crop-current-photo-button').on('click', function(e) {\n var uncropped_url = $(\"#existing-photo-file-field\").attr('data-value');\n image.src = uncropped_url;\n $modal.modal('show');\n })\n\n input.on('change', function (e) {\n var files = $(\"#main-photo-upload\").prop(\"files\");\n //TODO: make this work. Problems loading the existing file is\n //preventing cropping the existing profile picture\n var done = function (url) {\n input.value = '';\n image.src = url;\n // $alert.hide();\n $modal.modal('show');\n };\n var reader;\n var file;\n var url;\n\n if (files && files.length > 0) {\n file = files[0];\n if (file.size > 5242879) {\n alert(\"File size is too large. Must be less than 5MB\")\n }else {\n if (URL) {\n done(URL.createObjectURL(file));\n } else if (FileReader) {\n reader = new FileReader();\n reader.onload = function (e) {\n done(reader.result);\n };\n reader.readAsDataURL(file);\n }\n }\n }\n });\n\n $(\"#crop-current-photo-button\").on(\"click\", function(){\n var files = $(\"#main-photo-upload\").files;\n var done = function (url) {\n input.value = '';\n image.src = url;\n // $alert.hide();\n $modal.modal('show');\n };\n var reader;\n var file;\n var url;\n\n if (files && files.length > 0) {\n file = files[0];\n if (URL) {\n done(URL.createObjectURL(file));\n } else if (FileReader) {\n reader = new FileReader();\n reader.onload = function (e) {\n done(reader.result);\n };\n reader.readAsDataURL(file);\n }\n }\n });\n\n $modal.on('shown.bs.modal', function () {\n\n // define aspect ratio by profile layout choice\n var layoutSelector = $(\"#horizontal-profile-picture-field\").val() == 'true' ?\n \".artist__jumbotron\" :\n \".vertical-artist__left\";\n if ($(\"#type-profile-picture-field\").val() == 'Manager') {\n layoutSelector = \".non-performer__preview\"\n }\n\n var aspectRatio = $(layoutSelector).width() / $(layoutSelector).height();\n var aspectRatio = $(\"#horizontal-profile-picture-field\").val() == 'true' ?\n aspectRatio : 40/47\n cropper = new Cropper(image, {\n viewMode: 1,\n scalable: false,\n aspectRatio: isNaN(aspectRatio) ? 1 : aspectRatio ,\n });\n }).on('hidden.bs.modal', function () {\n cropper.destroy();\n cropper = null;\n });\n\n $('#crop').on('click', function () {\n let cropper_data = cropper.getData(true)\n // console.log(cropper_data)\n $(\"#hidden-field-pic_width\").val(cropper_data.width);\n $(\"#hidden-field-pic_height\").val(cropper_data.height);\n $(\"#hidden-field-pic_x\").val(cropper_data.x);\n $(\"#hidden-field-pic_y\").val(cropper_data.y);\n\n $(\"#profile-pic-submit-button\").click()\n });\n\n})(jQuery);\n","/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n})(this, function () {\n 'use strict';\n\n function ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n }\n function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n }\n function _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n }\n function _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n }\n function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n }\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n }\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n }\n function _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n }\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n var WINDOW = IS_BROWSER ? window : {};\n var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n var NAMESPACE = 'cropper';\n\n // Actions\n var ACTION_ALL = 'all';\n var ACTION_CROP = 'crop';\n var ACTION_MOVE = 'move';\n var ACTION_ZOOM = 'zoom';\n var ACTION_EAST = 'e';\n var ACTION_WEST = 'w';\n var ACTION_SOUTH = 's';\n var ACTION_NORTH = 'n';\n var ACTION_NORTH_EAST = 'ne';\n var ACTION_NORTH_WEST = 'nw';\n var ACTION_SOUTH_EAST = 'se';\n var ACTION_SOUTH_WEST = 'sw';\n\n // Classes\n var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n // Data keys\n var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n // Drag modes\n var DRAG_MODE_CROP = 'crop';\n var DRAG_MODE_MOVE = 'move';\n var DRAG_MODE_NONE = 'none';\n\n // Events\n var EVENT_CROP = 'crop';\n var EVENT_CROP_END = 'cropend';\n var EVENT_CROP_MOVE = 'cropmove';\n var EVENT_CROP_START = 'cropstart';\n var EVENT_DBLCLICK = 'dblclick';\n var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n var EVENT_READY = 'ready';\n var EVENT_RESIZE = 'resize';\n var EVENT_WHEEL = 'wheel';\n var EVENT_ZOOM = 'zoom';\n\n // Mime types\n var MIME_TYPE_JPEG = 'image/jpeg';\n\n // RegExps\n var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n var REGEXP_DATA_URL = /^data:/;\n var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n var REGEXP_TAG_NAME = /^img|canvas$/i;\n\n // Misc\n // Inspired by the default width and height of a canvas element.\n var MIN_CONTAINER_WIDTH = 200;\n var MIN_CONTAINER_HEIGHT = 100;\n var DEFAULTS = {\n // Define the view mode of the cropper\n viewMode: 0,\n // 0, 1, 2, 3\n\n // Define the dragging mode of the cropper\n dragMode: DRAG_MODE_CROP,\n // 'crop', 'move' or 'none'\n\n // Define the initial aspect ratio of the crop box\n initialAspectRatio: NaN,\n // Define the aspect ratio of the crop box\n aspectRatio: NaN,\n // An object with the previous cropping result data\n data: null,\n // A selector for adding extra containers to preview\n preview: '',\n // Re-render the cropper when resize the window\n responsive: true,\n // Restore the cropped area after resize the window\n restore: true,\n // Check if the current image is a cross-origin image\n checkCrossOrigin: true,\n // Check the current image's Exif Orientation information\n checkOrientation: true,\n // Show the black modal\n modal: true,\n // Show the dashed lines for guiding\n guides: true,\n // Show the center indicator for guiding\n center: true,\n // Show the white modal to highlight the crop box\n highlight: true,\n // Show the grid background\n background: true,\n // Enable to crop the image automatically when initialize\n autoCrop: true,\n // Define the percentage of automatic cropping area when initializes\n autoCropArea: 0.8,\n // Enable to move the image\n movable: true,\n // Enable to rotate the image\n rotatable: true,\n // Enable to scale the image\n scalable: true,\n // Enable to zoom the image\n zoomable: true,\n // Enable to zoom the image by dragging touch\n zoomOnTouch: true,\n // Enable to zoom the image by wheeling mouse\n zoomOnWheel: true,\n // Define zoom ratio when zoom the image by wheeling mouse\n wheelZoomRatio: 0.1,\n // Enable to move the crop box\n cropBoxMovable: true,\n // Enable to resize the crop box\n cropBoxResizable: true,\n // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n toggleDragModeOnDblclick: true,\n // Size limitation\n minCanvasWidth: 0,\n minCanvasHeight: 0,\n minCropBoxWidth: 0,\n minCropBoxHeight: 0,\n minContainerWidth: MIN_CONTAINER_WIDTH,\n minContainerHeight: MIN_CONTAINER_HEIGHT,\n // Shortcuts of events\n ready: null,\n cropstart: null,\n cropmove: null,\n cropend: null,\n crop: null,\n zoom: null\n };\n var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
';\n\n /**\n * Check if the given value is not a number.\n */\n var isNaN = Number.isNaN || WINDOW.isNaN;\n\n /**\n * Check if the given value is a number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n */\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n }\n\n /**\n * Check if the given value is a positive number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n */\n var isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\n };\n\n /**\n * Check if the given value is undefined.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n */\n function isUndefined(value) {\n return typeof value === 'undefined';\n }\n\n /**\n * Check if the given value is an object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n */\n function isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n }\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n /**\n * Check if the given value is a plain object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n */\n function isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n try {\n var _constructor = value.constructor;\n var prototype = _constructor.prototype;\n return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Check if the given value is a function.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n */\n function isFunction(value) {\n return typeof value === 'function';\n }\n var slice = Array.prototype.slice;\n\n /**\n * Convert array-like or iterable object to an array.\n * @param {*} value - The value to convert.\n * @returns {Array} Returns a new array.\n */\n function toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\n }\n\n /**\n * Iterate the given data.\n * @param {*} data - The data to iterate.\n * @param {Function} callback - The process function for each element.\n * @returns {*} The original data.\n */\n function forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n toArray(data).forEach(function (value, key) {\n callback.call(data, value, key, data);\n });\n } else if (isObject(data)) {\n Object.keys(data).forEach(function (key) {\n callback.call(data, data[key], key, data);\n });\n }\n }\n return data;\n }\n\n /**\n * Extend the given object.\n * @param {*} target - The target object to extend.\n * @param {*} args - The rest objects for merging to the target object.\n * @returns {Object} The extended object.\n */\n var assign = Object.assign || function assign(target) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (isObject(target) && args.length > 0) {\n args.forEach(function (arg) {\n if (isObject(arg)) {\n Object.keys(arg).forEach(function (key) {\n target[key] = arg[key];\n });\n }\n });\n }\n return target;\n };\n var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n /**\n * Normalize decimal number.\n * Check out {@link https://0.30000000000000004.com/}\n * @param {number} value - The value to normalize.\n * @param {number} [times=100000000000] - The times for normalizing.\n * @returns {number} Returns the normalized number.\n */\n function normalizeDecimalNumber(value) {\n var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n }\n var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n /**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\n function setStyle(element, styles) {\n var style = element.style;\n forEach(styles, function (value, property) {\n if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n value = \"\".concat(value, \"px\");\n }\n style[property] = value;\n });\n }\n\n /**\n * Check if the given element has a special class.\n * @param {Element} element - The element to check.\n * @param {string} value - The class to search.\n * @returns {boolean} Returns `true` if the special class was found.\n */\n function hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n }\n\n /**\n * Add classes to the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be added.\n */\n function addClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n var className = element.className.trim();\n if (!className) {\n element.className = value;\n } else if (className.indexOf(value) < 0) {\n element.className = \"\".concat(className, \" \").concat(value);\n }\n }\n\n /**\n * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\n function removeClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\n }\n }\n\n /**\n * Add or remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be toggled.\n * @param {boolean} added - Add only.\n */\n function toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n }\n\n // IE10-11 doesn't support the second parameter of `classList.toggle`\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n }\n var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n /**\n * Transform the given string from camelCase to kebab-case\n * @param {string} value - The value to transform.\n * @returns {string} The transformed value.\n */\n function toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n }\n\n /**\n * Get data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to get.\n * @returns {string} The data value.\n */\n function getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n if (element.dataset) {\n return element.dataset[name];\n }\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\n }\n\n /**\n * Set data to the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to set.\n * @param {string} data - The data value.\n */\n function setData(element, name, data) {\n if (isObject(data)) {\n element[name] = data;\n } else if (element.dataset) {\n element.dataset[name] = data;\n } else {\n element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n }\n }\n\n /**\n * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\n function removeData(element, name) {\n if (isObject(element[name])) {\n try {\n delete element[name];\n } catch (error) {\n element[name] = undefined;\n }\n } else if (element.dataset) {\n // #128 Safari not allows to delete dataset property\n try {\n delete element.dataset[name];\n } catch (error) {\n element.dataset[name] = undefined;\n }\n } else {\n element.removeAttribute(\"data-\".concat(toParamCase(name)));\n }\n }\n var REGEXP_SPACES = /\\s\\s*/;\n var onceSupported = function () {\n var supported = false;\n if (IS_BROWSER) {\n var once = false;\n var listener = function listener() {};\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\n /**\n * This setter can fix a `TypeError` in strict mode\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n * @param {boolean} value - The value to set\n */\n set: function set(value) {\n once = value;\n }\n });\n WINDOW.addEventListener('test', listener, options);\n WINDOW.removeEventListener('test', listener, options);\n }\n return supported;\n }();\n\n /**\n * Remove event listener from the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n function removeListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (!onceSupported) {\n var listeners = element.listeners;\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n element.removeEventListener(event, handler, options);\n });\n }\n\n /**\n * Add event listener to the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n function addListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (options.once && !onceSupported) {\n var _element$listeners = element.listeners,\n listeners = _element$listeners === void 0 ? {} : _element$listeners;\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n listener.apply(element, args);\n };\n if (!listeners[event]) {\n listeners[event] = {};\n }\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n element.addEventListener(event, _handler, options);\n });\n }\n\n /**\n * Dispatch event on the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Object} data - The additional event data.\n * @returns {boolean} Indicate if the event is default prevented or not.\n */\n function dispatchEvent(element, type, data) {\n var event;\n\n // Event and CustomEvent on IE9-11 are global objects, not constructors\n if (isFunction(Event) && isFunction(CustomEvent)) {\n event = new CustomEvent(type, {\n detail: data,\n bubbles: true,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, data);\n }\n return element.dispatchEvent(event);\n }\n\n /**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\n function getOffset(element) {\n var box = element.getBoundingClientRect();\n return {\n left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n };\n }\n var location = WINDOW.location;\n var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n /**\n * Check if the given URL is a cross origin URL.\n * @param {string} url - The target URL.\n * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n */\n function isCrossOriginURL(url) {\n var parts = url.match(REGEXP_ORIGINS);\n return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n }\n\n /**\n * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\n function addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n }\n\n /**\n * Get transforms base on the given object.\n * @param {Object} obj - The target object.\n * @returns {string} A string contains transform values.\n */\n function getTransforms(_ref) {\n var rotate = _ref.rotate,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n translateX = _ref.translateX,\n translateY = _ref.translateY;\n var values = [];\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n }\n\n // Rotate should come first before scale to match orientation transform\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\n };\n }\n\n /**\n * Get the max ratio of a group of pointers.\n * @param {string} pointers - The target pointers.\n * @returns {number} The result ratio.\n */\n function getMaxZoomRatio(pointers) {\n var pointers2 = _objectSpread2({}, pointers);\n var maxRatio = 0;\n forEach(pointers, function (pointer, pointerId) {\n delete pointers2[pointerId];\n forEach(pointers2, function (pointer2) {\n var x1 = Math.abs(pointer.startX - pointer2.startX);\n var y1 = Math.abs(pointer.startY - pointer2.startY);\n var x2 = Math.abs(pointer.endX - pointer2.endX);\n var y2 = Math.abs(pointer.endY - pointer2.endY);\n var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n var ratio = (z2 - z1) / z1;\n if (Math.abs(ratio) > Math.abs(maxRatio)) {\n maxRatio = ratio;\n }\n });\n });\n return maxRatio;\n }\n\n /**\n * Get a pointer from an event object.\n * @param {Object} event - The target event object.\n * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n * @returns {Object} The result pointer contains start and/or end point coordinates.\n */\n function getPointer(_ref2, endOnly) {\n var pageX = _ref2.pageX,\n pageY = _ref2.pageY;\n var end = {\n endX: pageX,\n endY: pageY\n };\n return endOnly ? end : _objectSpread2({\n startX: pageX,\n startY: pageY\n }, end);\n }\n\n /**\n * Get the center point coordinate of a group of pointers.\n * @param {Object} pointers - The target pointers.\n * @returns {Object} The center point coordinate.\n */\n function getPointersCenter(pointers) {\n var pageX = 0;\n var pageY = 0;\n var count = 0;\n forEach(pointers, function (_ref3) {\n var startX = _ref3.startX,\n startY = _ref3.startY;\n pageX += startX;\n pageY += startY;\n count += 1;\n });\n pageX /= count;\n pageY /= count;\n return {\n pageX: pageX,\n pageY: pageY\n };\n }\n\n /**\n * Get the max sizes in a rectangle under the given aspect ratio.\n * @param {Object} data - The original sizes.\n * @param {string} [type='contain'] - The adjust type.\n * @returns {Object} The result sizes.\n */\n function getAdjustedSizes(_ref4) {\n var aspectRatio = _ref4.aspectRatio,\n height = _ref4.height,\n width = _ref4.width;\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n var isValidWidth = isPositiveNumber(width);\n var isValidHeight = isPositiveNumber(height);\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n } else if (isValidWidth) {\n height = width / aspectRatio;\n } else if (isValidHeight) {\n width = height * aspectRatio;\n }\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * Get the new sizes of a rectangle after rotated.\n * @param {Object} data - The original sizes.\n * @returns {Object} The result sizes.\n */\n function getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\n }\n var arc = degree % 90 * Math.PI / 180;\n var sinArc = Math.sin(arc);\n var cosArc = Math.cos(arc);\n var newWidth = width * cosArc + height * sinArc;\n var newHeight = width * sinArc + height * cosArc;\n return degree > 90 ? {\n width: newHeight,\n height: newWidth\n } : {\n width: newWidth,\n height: newHeight\n };\n }\n\n /**\n * Get a canvas which drew the given image.\n * @param {HTMLImageElement} image - The image for drawing.\n * @param {Object} imageData - The image data.\n * @param {Object} canvasData - The canvas data.\n * @param {Object} options - The options.\n * @returns {HTMLCanvasElement} The result canvas.\n */\n function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n var imageAspectRatio = _ref6.aspectRatio,\n imageNaturalWidth = _ref6.naturalWidth,\n imageNaturalHeight = _ref6.naturalHeight,\n _ref6$rotate = _ref6.rotate,\n rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n _ref6$scaleX = _ref6.scaleX,\n scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n _ref6$scaleY = _ref6.scaleY,\n scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n var aspectRatio = _ref7.aspectRatio,\n naturalWidth = _ref7.naturalWidth,\n naturalHeight = _ref7.naturalHeight;\n var _ref8$fillColor = _ref8.fillColor,\n fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n _ref8$maxWidth = _ref8.maxWidth,\n maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n _ref8$maxHeight = _ref8.maxHeight,\n maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n _ref8$minWidth = _ref8.minWidth,\n minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n _ref8$minHeight = _ref8.minHeight,\n minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n var destMaxSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var destMinSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = fillColor;\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2, height / 2);\n context.rotate(rotate * Math.PI / 180);\n context.scale(scaleX, scaleY);\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n context.imageSmoothingQuality = imageSmoothingQuality;\n context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n context.restore();\n return canvas;\n }\n var fromCharCode = String.fromCharCode;\n\n /**\n * Get string from char code in data view.\n * @param {DataView} dataView - The data view for read.\n * @param {number} start - The start index.\n * @param {number} length - The read length.\n * @returns {string} The read result.\n */\n function getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n return str;\n }\n var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n /**\n * Transform Data URL to array buffer.\n * @param {string} dataURL - The Data URL to transform.\n * @returns {ArrayBuffer} The result array buffer.\n */\n function dataURLToArrayBuffer(dataURL) {\n var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n var binary = atob(base64);\n var arrayBuffer = new ArrayBuffer(binary.length);\n var uint8 = new Uint8Array(arrayBuffer);\n forEach(uint8, function (value, i) {\n uint8[i] = binary.charCodeAt(i);\n });\n return arrayBuffer;\n }\n\n /**\n * Transform array buffer to Data URL.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n * @param {string} mimeType - The mime type of the Data URL.\n * @returns {string} The result Data URL.\n */\n function arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = [];\n\n // Chunk Typed Array for better performance (#435)\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n while (uint8.length > 0) {\n // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n // eslint-disable-next-line prefer-spread\n chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n uint8 = uint8.subarray(chunkSize);\n }\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n }\n\n /**\n * Get orientation value from given array buffer.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n * @returns {number} The read orientation value.\n */\n function resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation;\n\n // Ignores range error when the image does not have correct Exif information\n try {\n var littleEndian;\n var app1Start;\n var ifdStart;\n\n // Only handle JPEG image (start by 0xFFD8)\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n offset += 1;\n }\n }\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n var _offset;\n var i;\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n // 8 is the offset of the current tag's value\n _offset += 8;\n\n // Get the original orientation value\n orientation = dataView.getUint16(_offset, littleEndian);\n\n // Override the orientation with its default value\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n return orientation;\n }\n\n /**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\n function parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n\n // Rotate left 180°\n case 3:\n rotate = -180;\n break;\n\n // Flip vertical\n case 4:\n scaleY = -1;\n break;\n\n // Flip vertical and rotate right 90°\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n\n // Rotate right 90°\n case 6:\n rotate = 90;\n break;\n\n // Flip horizontal and rotate right 90°\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n\n // Rotate left 90°\n case 8:\n rotate = -90;\n break;\n }\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n }\n var render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n },\n initContainer: function initContainer() {\n var element = this.element,\n options = this.options,\n container = this.container,\n cropper = this.cropper;\n var minWidth = Number(options.minContainerWidth);\n var minHeight = Number(options.minContainerHeight);\n addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n };\n this.containerData = containerData;\n setStyle(cropper, {\n width: containerData.width,\n height: containerData.height\n });\n addClass(element, CLASS_HIDDEN);\n removeClass(cropper, CLASS_HIDDEN);\n },\n // Canvas (image wrapper)\n initCanvas: function initCanvas() {\n var containerData = this.containerData,\n imageData = this.imageData;\n var viewMode = this.options.viewMode;\n var rotated = Math.abs(imageData.rotate) % 180 === 90;\n var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n var aspectRatio = naturalWidth / naturalHeight;\n var canvasWidth = containerData.width;\n var canvasHeight = containerData.height;\n if (containerData.height * aspectRatio > containerData.width) {\n if (viewMode === 3) {\n canvasWidth = containerData.height * aspectRatio;\n } else {\n canvasHeight = containerData.width / aspectRatio;\n }\n } else if (viewMode === 3) {\n canvasHeight = containerData.width / aspectRatio;\n } else {\n canvasWidth = containerData.height * aspectRatio;\n }\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n canvasData.left = (containerData.width - canvasData.width) / 2;\n canvasData.top = (containerData.height - canvasData.height) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.initialCanvasData = assign({}, canvasData);\n },\n limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var viewMode = options.viewMode;\n var aspectRatio = canvasData.aspectRatio;\n var cropped = this.cropped && cropBoxData;\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n if (viewMode === 3) {\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n } else if (viewMode > 0) {\n if (minCanvasWidth) {\n minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n } else if (minCanvasHeight) {\n minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n } else if (cropped) {\n minCanvasWidth = cropBoxData.width;\n minCanvasHeight = cropBoxData.height;\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\n minCanvasWidth = _getAdjustedSizes.width;\n minCanvasHeight = _getAdjustedSizes.height;\n canvasData.minWidth = minCanvasWidth;\n canvasData.minHeight = minCanvasHeight;\n canvasData.maxWidth = Infinity;\n canvasData.maxHeight = Infinity;\n }\n if (positionLimited) {\n if (viewMode > (cropped ? 0 : 1)) {\n var newCanvasLeft = containerData.width - canvasData.width;\n var newCanvasTop = containerData.height - canvasData.height;\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n if (cropped && this.limited) {\n canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n canvasData.maxLeft = cropBoxData.left;\n canvasData.maxTop = cropBoxData.top;\n if (viewMode === 2) {\n if (canvasData.width >= containerData.width) {\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n }\n if (canvasData.height >= containerData.height) {\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n }\n }\n }\n } else {\n canvasData.minLeft = -canvasData.width;\n canvasData.minTop = -canvasData.height;\n canvasData.maxLeft = containerData.width;\n canvasData.maxTop = containerData.height;\n }\n }\n },\n renderCanvas: function renderCanvas(changed, transformed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n if (transformed) {\n var _getRotatedSizes = getRotatedSizes({\n width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n degree: imageData.rotate || 0\n }),\n naturalWidth = _getRotatedSizes.width,\n naturalHeight = _getRotatedSizes.height;\n var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n canvasData.left -= (width - canvasData.width) / 2;\n canvasData.top -= (height - canvasData.height) / 2;\n canvasData.width = width;\n canvasData.height = height;\n canvasData.aspectRatio = naturalWidth / naturalHeight;\n canvasData.naturalWidth = naturalWidth;\n canvasData.naturalHeight = naturalHeight;\n this.limitCanvas(true, false);\n }\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n this.limitCanvas(false, true);\n canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n setStyle(this.canvas, assign({\n width: canvasData.width,\n height: canvasData.height\n }, getTransforms({\n translateX: canvasData.left,\n translateY: canvasData.top\n })));\n this.renderImage(changed);\n if (this.cropped && this.limited) {\n this.limitCropBox(true, true);\n }\n },\n renderImage: function renderImage(changed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n assign(imageData, {\n width: width,\n height: height,\n left: (canvasData.width - width) / 2,\n top: (canvasData.height - height) / 2\n });\n setStyle(this.image, assign({\n width: imageData.width,\n height: imageData.height\n }, getTransforms(assign({\n translateX: imageData.left,\n translateY: imageData.top\n }, imageData))));\n if (changed) {\n this.output();\n }\n },\n initCropBox: function initCropBox() {\n var options = this.options,\n canvasData = this.canvasData;\n var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n var autoCropArea = Number(options.autoCropArea) || 0.8;\n var cropBoxData = {\n width: canvasData.width,\n height: canvasData.height\n };\n if (aspectRatio) {\n if (canvasData.height * aspectRatio > canvasData.width) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true);\n\n // Initialize auto crop area\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n // The width/height of auto crop area must large than \"minWidth/Height\"\n cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n this.initialCropBoxData = assign({}, cropBoxData);\n },\n limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData,\n limited = this.limited;\n var aspectRatio = options.aspectRatio;\n if (sizeLimited) {\n var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n // The min/maxCropBoxWidth/Height must be less than container's width/height\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n if (aspectRatio) {\n if (minCropBoxWidth && minCropBoxHeight) {\n if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n } else if (minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else if (minCropBoxHeight) {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n }\n\n // The minWidth/Height must be less than maxWidth/Height\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\n if (positionLimited) {\n if (limited) {\n cropBoxData.minLeft = Math.max(0, canvasData.left);\n cropBoxData.minTop = Math.max(0, canvasData.top);\n cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n } else {\n cropBoxData.minLeft = 0;\n cropBoxData.minTop = 0;\n cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n cropBoxData.maxTop = containerData.height - cropBoxData.height;\n }\n }\n },\n renderCropBox: function renderCropBox() {\n var options = this.options,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData;\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n this.limitCropBox(false, true);\n cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n if (options.movable && options.cropBoxMovable) {\n // Turn to move the canvas when the crop box is equal to the container\n setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n }\n setStyle(this.cropBox, assign({\n width: cropBoxData.width,\n height: cropBoxData.height\n }, getTransforms({\n translateX: cropBoxData.left,\n translateY: cropBoxData.top\n })));\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\n if (!this.disabled) {\n this.output();\n }\n },\n output: function output() {\n this.preview();\n dispatchEvent(this.element, EVENT_CROP, this.getData());\n }\n };\n var preview = {\n initPreview: function initPreview() {\n var element = this.element,\n crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var alt = element.alt || 'The image to preview';\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = url;\n image.alt = alt;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n if (!preview) {\n return;\n }\n var previews = preview;\n if (typeof preview === 'string') {\n previews = element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img');\n\n // Save the original size for recover\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n img.src = url;\n img.alt = alt;\n\n /**\n * Override img element styles\n * Add `display:block` to avoid margin top issue\n * Add `height:auto` to override `height` attribute on IE8\n * (Occur only when margin-top <= -height)\n */\n img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n el.innerHTML = '';\n el.appendChild(img);\n });\n },\n resetPreview: function resetPreview() {\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n setStyle(element, {\n width: data.width,\n height: data.height\n });\n element.innerHTML = data.html;\n removeData(element, DATA_PREVIEW);\n });\n },\n preview: function preview() {\n var imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var cropBoxWidth = cropBoxData.width,\n cropBoxHeight = cropBoxData.height;\n var width = imageData.width,\n height = imageData.height;\n var left = cropBoxData.left - canvasData.left - imageData.left;\n var top = cropBoxData.top - canvasData.top - imageData.top;\n if (!this.cropped || this.disabled) {\n return;\n }\n setStyle(this.viewBoxImage, assign({\n width: width,\n height: height\n }, getTransforms(assign({\n translateX: -left,\n translateY: -top\n }, imageData))));\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n var originalWidth = data.width;\n var originalHeight = data.height;\n var newWidth = originalWidth;\n var newHeight = originalHeight;\n var ratio = 1;\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\n setStyle(element, {\n width: newWidth,\n height: newHeight\n });\n setStyle(element.getElementsByTagName('img')[0], assign({\n width: width * ratio,\n height: height * ratio\n }, getTransforms(assign({\n translateX: -left * ratio,\n translateY: -top * ratio\n }, imageData))));\n });\n }\n };\n var events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n if (options.zoomable && options.zoomOnWheel) {\n addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\n addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n if (options.responsive) {\n addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n }\n },\n unbind: function unbind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n };\n var handlers = {\n resize: function resize() {\n if (this.disabled) {\n return;\n }\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var ratioX = container.offsetWidth / containerData.width;\n var ratioY = container.offsetHeight / containerData.height;\n var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n // Resize when width changed or height changed\n if (ratio !== 1) {\n var canvasData;\n var cropBoxData;\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n this.render();\n if (options.restore) {\n this.setCanvasData(forEach(canvasData, function (n, i) {\n canvasData[i] = n * ratio;\n }));\n this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n cropBoxData[i] = n * ratio;\n }));\n }\n }\n },\n dblclick: function dblclick() {\n if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n return;\n }\n this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n },\n wheel: function wheel(event) {\n var _this = this;\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n if (this.disabled) {\n return;\n }\n event.preventDefault();\n\n // Limit wheel speed to prevent zoom too fast (#21)\n if (this.wheeling) {\n return;\n }\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n if (event.deltaY) {\n delta = event.deltaY > 0 ? 1 : -1;\n } else if (event.wheelDelta) {\n delta = -event.wheelDelta / 120;\n } else if (event.detail) {\n delta = event.detail > 0 ? 1 : -1;\n }\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n if (this.disabled\n\n // Handle mouse event and pointer event and ignore touch event\n || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n // No primary button (Usually the left button)\n isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n // Open context menu\n || event.ctrlKey)) {\n return;\n }\n var options = this.options,\n pointers = this.pointers;\n var action;\n if (event.changedTouches) {\n // Handle touch event\n forEach(event.changedTouches, function (touch) {\n pointers[touch.identifier] = getPointer(touch);\n });\n } else {\n // Handle mouse event and pointer event\n pointers[event.pointerId || 0] = getPointer(event);\n }\n if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n action = ACTION_ZOOM;\n } else {\n action = getData(event.target, DATA_ACTION);\n }\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n\n // This line is required for preventing page zooming in iOS browsers\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n if (action === ACTION_CROP) {\n this.cropping = true;\n addClass(this.dragBox, CLASS_MODAL);\n }\n },\n cropMove: function cropMove(event) {\n var action = this.action;\n if (this.disabled || !action) {\n return;\n }\n var pointers = this.pointers;\n event.preventDefault();\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n // The first parameter should not be undefined (#432)\n assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n });\n } else {\n assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n }\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n var action = this.action,\n pointers = this.pointers;\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n delete pointers[touch.identifier];\n });\n } else {\n delete pointers[event.pointerId || 0];\n }\n if (!action) {\n return;\n }\n event.preventDefault();\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n };\n var change = {\n change: function change(event) {\n var options = this.options,\n canvasData = this.canvasData,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData,\n pointers = this.pointers;\n var action = this.action;\n var aspectRatio = options.aspectRatio;\n var left = cropBoxData.left,\n top = cropBoxData.top,\n width = cropBoxData.width,\n height = cropBoxData.height;\n var right = left + width;\n var bottom = top + height;\n var minLeft = 0;\n var minTop = 0;\n var maxWidth = containerData.width;\n var maxHeight = containerData.height;\n var renderable = true;\n var offset;\n\n // Locking aspect ratio in \"free mode\" by holding shift key\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\n if (this.limited) {\n minLeft = cropBoxData.minLeft;\n minTop = cropBoxData.minTop;\n maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n }\n var pointer = pointers[Object.keys(pointers)[0]];\n var range = {\n x: pointer.endX - pointer.startX,\n y: pointer.endY - pointer.startY\n };\n var check = function check(side) {\n switch (side) {\n case ACTION_EAST:\n if (right + range.x > maxWidth) {\n range.x = maxWidth - right;\n }\n break;\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n break;\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n break;\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n break;\n }\n };\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n\n // Resize crop box\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_SOUTH);\n height += range.y;\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n } else {\n check(ACTION_NORTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n left += cropBoxData.width - width;\n } else {\n check(ACTION_NORTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n\n // Move canvas\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n\n // Zoom canvas\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n\n // Create crop box\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\n offset = getOffset(this.cropper);\n left = pointer.startX - offset.left;\n top = pointer.startY - offset.top;\n width = cropBoxData.minWidth;\n height = cropBoxData.minHeight;\n if (range.x > 0) {\n action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n } else if (range.x < 0) {\n left -= width;\n action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n }\n if (range.y < 0) {\n top -= height;\n }\n\n // Show the crop box if is hidden\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n break;\n }\n if (renderable) {\n cropBoxData.width = width;\n cropBoxData.height = height;\n cropBoxData.left = left;\n cropBoxData.top = top;\n this.action = action;\n this.renderCropBox();\n }\n\n // Override\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n };\n var methods = {\n // Show the crop box manually\n crop: function crop() {\n if (this.ready && !this.cropped && !this.disabled) {\n this.cropped = true;\n this.limitCropBox(true, true);\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\n return this;\n },\n // Reset the image and crop box to their initial states\n reset: function reset() {\n if (this.ready && !this.disabled) {\n this.imageData = assign({}, this.initialImageData);\n this.canvasData = assign({}, this.initialCanvasData);\n this.cropBoxData = assign({}, this.initialCropBoxData);\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n return this;\n },\n // Clear the crop box\n clear: function clear() {\n if (this.cropped && !this.disabled) {\n assign(this.cropBoxData, {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n });\n this.cropped = false;\n this.renderCropBox();\n this.limitCanvas(true, true);\n\n // Render canvas after crop box rendered\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n return this;\n },\n /**\n * Replace the image's src and rebuild the cropper\n * @param {string} url - The new URL.\n * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n * @returns {Cropper} this\n */\n replace: function replace(url) {\n var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n if (this.ready) {\n this.viewBoxImage.src = url;\n forEach(this.previews, function (element) {\n element.getElementsByTagName('img')[0].src = url;\n });\n }\n } else {\n if (this.isImg) {\n this.replaced = true;\n }\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\n }\n return this;\n },\n // Enable (unfreeze) the cropper\n enable: function enable() {\n if (this.ready && this.disabled) {\n this.disabled = false;\n removeClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n // Disable (freeze) the cropper\n disable: function disable() {\n if (this.ready && !this.disabled) {\n this.disabled = true;\n addClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n /**\n * Destroy the cropper and remove the instance from the image\n * @returns {Cropper} this\n */\n destroy: function destroy() {\n var element = this.element;\n if (!element[NAMESPACE]) {\n return this;\n }\n element[NAMESPACE] = undefined;\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n this.uncreate();\n return this;\n },\n /**\n * Move the canvas with relative offsets\n * @param {number} offsetX - The relative offset distance on the x-axis.\n * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n * @returns {Cropper} this\n */\n move: function move(offsetX) {\n var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n var _this$canvasData = this.canvasData,\n left = _this$canvasData.left,\n top = _this$canvasData.top;\n return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n },\n /**\n * Move the canvas to an absolute point\n * @param {number} x - The x-axis coordinate.\n * @param {number} [y=x] - The y-axis coordinate.\n * @returns {Cropper} this\n */\n moveTo: function moveTo(x) {\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var canvasData = this.canvasData;\n var changed = false;\n x = Number(x);\n y = Number(y);\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n if (changed) {\n this.renderCanvas(true);\n }\n }\n return this;\n },\n /**\n * Zoom the canvas with a relative ratio\n * @param {number} ratio - The target ratio.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoom: function zoom(ratio, _originalEvent) {\n var canvasData = this.canvasData;\n ratio = Number(ratio);\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\n /**\n * Zoom the canvas to an absolute ratio\n * @param {number} ratio - The target ratio.\n * @param {Object} pivot - The zoom pivot point coordinate.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n var options = this.options,\n canvasData = this.canvasData;\n var width = canvasData.width,\n height = canvasData.height,\n naturalWidth = canvasData.naturalWidth,\n naturalHeight = canvasData.naturalHeight;\n ratio = Number(ratio);\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n if (_originalEvent) {\n var pointers = this.pointers;\n var offset = getOffset(this.cropper);\n var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n pageX: _originalEvent.pageX,\n pageY: _originalEvent.pageY\n };\n\n // Zoom from the triggering point of the event\n canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n } else {\n // Zoom from the center of the canvas\n canvasData.left -= (newWidth - width) / 2;\n canvasData.top -= (newHeight - height) / 2;\n }\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Rotate the canvas with a relative degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotate: function rotate(degree) {\n return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n },\n /**\n * Rotate the canvas to an absolute degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotateTo: function rotateTo(degree) {\n degree = Number(degree);\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n return this;\n },\n /**\n * Scale the image on the x-axis.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @returns {Cropper} this\n */\n scaleX: function scaleX(_scaleX) {\n var scaleY = this.imageData.scaleY;\n return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n },\n /**\n * Scale the image on the y-axis.\n * @param {number} scaleY - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scaleY: function scaleY(_scaleY) {\n var scaleX = this.imageData.scaleX;\n return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n },\n /**\n * Scale the image\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scale: function scale(scaleX) {\n var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n var imageData = this.imageData;\n var transformed = false;\n scaleX = Number(scaleX);\n scaleY = Number(scaleY);\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n return this;\n },\n /**\n * Get the cropped area position and size data (base on the original image)\n * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n * @returns {Object} The result cropped data.\n */\n getData: function getData() {\n var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n x: cropBoxData.left - canvasData.left,\n y: cropBoxData.top - canvasData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n var ratio = imageData.width / imageData.naturalWidth;\n forEach(data, function (n, i) {\n data[i] = n / ratio;\n });\n if (rounded) {\n // In case rounding off leads to extra 1px in right or bottom border\n // we should round the top-left corner and the dimension (#343).\n var bottom = Math.round(data.y + data.height);\n var right = Math.round(data.x + data.width);\n data.x = Math.round(data.x);\n data.y = Math.round(data.y);\n data.width = right - data.x;\n data.height = bottom - data.y;\n }\n } else {\n data = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n return data;\n },\n /**\n * Set the cropped area position and size with new data\n * @param {Object} data - The new data.\n * @returns {Cropper} this\n */\n setData: function setData(data) {\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData;\n var cropBoxData = {};\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\n }\n if (options.scalable) {\n if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n imageData.scaleX = data.scaleX;\n transformed = true;\n }\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n var ratio = imageData.width / imageData.naturalWidth;\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n this.setCropBoxData(cropBoxData);\n }\n return this;\n },\n /**\n * Get the container size data.\n * @returns {Object} The result container data.\n */\n getContainerData: function getContainerData() {\n return this.ready ? assign({}, this.containerData) : {};\n },\n /**\n * Get the image position and size data.\n * @returns {Object} The result image data.\n */\n getImageData: function getImageData() {\n return this.sized ? assign({}, this.imageData) : {};\n },\n /**\n * Get the canvas position and size data.\n * @returns {Object} The result canvas data.\n */\n getCanvasData: function getCanvasData() {\n var canvasData = this.canvasData;\n var data = {};\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n return data;\n },\n /**\n * Set the canvas position and size with new data.\n * @param {Object} data - The new canvas data.\n * @returns {Cropper} this\n */\n setCanvasData: function setCanvasData(data) {\n var canvasData = this.canvasData;\n var aspectRatio = canvasData.aspectRatio;\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\n if (isNumber(data.width)) {\n canvasData.width = data.width;\n canvasData.height = data.width / aspectRatio;\n } else if (isNumber(data.height)) {\n canvasData.height = data.height;\n canvasData.width = data.height * aspectRatio;\n }\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Get the crop box position and size data.\n * @returns {Object} The result crop box data.\n */\n getCropBoxData: function getCropBoxData() {\n var cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n left: cropBoxData.left,\n top: cropBoxData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n }\n return data || {};\n },\n /**\n * Set the crop box position and size with new data.\n * @param {Object} data - The new crop box data.\n * @returns {Cropper} this\n */\n setCropBoxData: function setCropBoxData(data) {\n var cropBoxData = this.cropBoxData;\n var aspectRatio = this.options.aspectRatio;\n var widthChanged;\n var heightChanged;\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\n if (aspectRatio) {\n if (widthChanged) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else if (heightChanged) {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.renderCropBox();\n }\n return this;\n },\n /**\n * Get a canvas drawn the cropped image.\n * @param {Object} [options={}] - The config options.\n * @returns {HTMLCanvasElement} - The result canvas.\n */\n getCroppedCanvas: function getCroppedCanvas() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n // Returns the source canvas if it is not cropped.\n if (!this.cropped) {\n return source;\n }\n var _this$getData = this.getData(options.rounded),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\n var aspectRatio = initialWidth / initialHeight;\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.maxWidth || Infinity,\n height: options.maxHeight || Infinity\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.minWidth || 0,\n height: options.minHeight || 0\n }, 'cover');\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.width || (ratio !== 1 ? source.width : initialWidth),\n height: options.height || (ratio !== 1 ? source.height : initialHeight)\n }),\n width = _getAdjustedSizes.width,\n height = _getAdjustedSizes.height;\n width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = options.fillColor || 'transparent';\n context.fillRect(0, 0, width, height);\n var _options$imageSmoothi = options.imageSmoothingEnabled,\n imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n imageSmoothingQuality = options.imageSmoothingQuality;\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n var sourceWidth = source.width;\n var sourceHeight = source.height;\n\n // Source canvas parameters\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight;\n\n // Destination canvas parameters\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n if (srcX <= -initialWidth || srcX > sourceWidth) {\n srcX = 0;\n srcWidth = 0;\n dstX = 0;\n dstWidth = 0;\n } else if (srcX <= 0) {\n dstX = -srcX;\n srcX = 0;\n srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n dstWidth = srcWidth;\n } else if (srcX <= sourceWidth) {\n dstX = 0;\n srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n dstWidth = srcWidth;\n }\n if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n srcY = 0;\n srcHeight = 0;\n dstY = 0;\n dstHeight = 0;\n } else if (srcY <= 0) {\n dstY = -srcY;\n srcY = 0;\n srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n dstHeight = srcHeight;\n } else if (srcY <= sourceHeight) {\n dstY = 0;\n srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n dstHeight = srcHeight;\n }\n var params = [srcX, srcY, srcWidth, srcHeight];\n\n // Avoid \"IndexSizeError\"\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n }\n\n // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n return canvas;\n },\n /**\n * Change the aspect ratio of the crop box.\n * @param {number} aspectRatio - The new aspect ratio.\n * @returns {Cropper} this\n */\n setAspectRatio: function setAspectRatio(aspectRatio) {\n var options = this.options;\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n if (this.ready) {\n this.initCropBox();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n return this;\n },\n /**\n * Change the drag mode.\n * @param {string} mode - The new drag mode.\n * @returns {Cropper} this\n */\n setDragMode: function setDragMode(mode) {\n var options = this.options,\n dragBox = this.dragBox,\n face = this.face;\n if (this.ready && !this.disabled) {\n var croppable = mode === DRAG_MODE_CROP;\n var movable = options.movable && mode === DRAG_MODE_MOVE;\n mode = croppable || movable ? mode : DRAG_MODE_NONE;\n options.dragMode = mode;\n setData(dragBox, DATA_ACTION, mode);\n toggleClass(dragBox, CLASS_CROP, croppable);\n toggleClass(dragBox, CLASS_MOVE, movable);\n if (!options.cropBoxMovable) {\n // Sync drag mode to crop box when it is not movable\n setData(face, DATA_ACTION, mode);\n toggleClass(face, CLASS_CROP, croppable);\n toggleClass(face, CLASS_MOVE, movable);\n }\n }\n return this;\n }\n };\n var AnotherCropper = WINDOW.Cropper;\n var Cropper = /*#__PURE__*/function () {\n /**\n * Create a new Cropper.\n * @param {Element} element - The target element for cropping.\n * @param {Object} [options={}] - The configuration options.\n */\n function Cropper(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n _classCallCheck(this, Cropper);\n if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n throw new Error('The first argument is required and must be an or element.');\n }\n this.element = element;\n this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n this.cropped = false;\n this.disabled = false;\n this.pointers = {};\n this.ready = false;\n this.reloading = false;\n this.replaced = false;\n this.sized = false;\n this.sizing = false;\n this.init();\n }\n return _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n if (element[NAMESPACE]) {\n return;\n }\n element[NAMESPACE] = this;\n if (tagName === 'img') {\n this.isImg = true;\n\n // e.g.: \"img/picture.jpg\"\n url = element.getAttribute('src') || '';\n this.originalUrl = url;\n\n // Stop when it's a blank image\n if (!url) {\n return;\n }\n\n // e.g.: \"https://example.com/img/picture.jpg\"\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n if (!url) {\n return;\n }\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n }\n\n // Only IE10+ supports Typed Arrays\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n }\n\n // Detect the mime type of the image directly if it is a Data URL\n if (REGEXP_DATA_URL.test(url)) {\n // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n } else {\n // Only a JPEG image may contains Exif Orientation information,\n // the rest types of Data URLs are not necessary to check orientation at all.\n this.clone();\n }\n return;\n }\n\n // 1. Detect the mime type of the image by a XMLHttpRequest.\n // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr;\n\n // 1. Cross origin requests are only supported for protocol schemes:\n // http, https, data, chrome, chrome-extension.\n // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n // in some browsers as IE11 and Safari.\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n xhr.onprogress = function () {\n // Abort the request directly if it not a JPEG image for better performance\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n };\n\n // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n }\n\n // The third parameter is required for avoiding side-effect (#682)\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.withCredentials = element.crossOrigin === 'use-credentials';\n xhr.send();\n }\n }, {\n key: \"read\",\n value: function read(arrayBuffer) {\n var options = this.options,\n imageData = this.imageData;\n\n // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n var _parseOrientation = parseOrientation(orientation);\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\n this.clone();\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var element = this.element,\n url = this.url;\n var crossOrigin = element.crossOrigin;\n var crossOriginUrl = url;\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n if (!crossOrigin) {\n crossOrigin = 'anonymous';\n }\n\n // Bust cache when there is not a \"crossOrigin\" property (#519)\n crossOriginUrl = addTimestamp(url);\n }\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = crossOriginUrl || url;\n image.alt = element.alt || 'The image to crop';\n this.image = image;\n image.onload = this.start.bind(this);\n image.onerror = this.stop.bind(this);\n addClass(image, CLASS_HIDE);\n element.parentNode.insertBefore(image, element.nextSibling);\n }\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true;\n\n // Match all browsers that use WebKit as the layout engine in iOS devices,\n // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.initialImageData = assign({}, _this2.imageData);\n _this2.sizing = false;\n _this2.sized = true;\n _this2.build();\n };\n\n // Most modern browsers (excepts iOS WebKit)\n if (image.naturalWidth && !isIOSWebKit) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n if (!isIOSWebKit) {\n body.removeChild(sizingImage);\n }\n };\n sizingImage.src = image.src;\n\n // iOS WebKit will convert the image automatically\n // with its orientation once append it into DOM (#279)\n if (!isIOSWebKit) {\n sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n body.appendChild(sizingImage);\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n image.parentNode.removeChild(image);\n this.image = null;\n }\n }, {\n key: \"build\",\n value: function build() {\n if (!this.sized || this.ready) {\n return;\n }\n var element = this.element,\n options = this.options,\n image = this.image;\n\n // Create cropper elements\n var container = element.parentNode;\n var template = document.createElement('div');\n template.innerHTML = TEMPLATE;\n var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n this.container = container;\n this.cropper = cropper;\n this.canvas = canvas;\n this.dragBox = dragBox;\n this.cropBox = cropBox;\n this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n this.face = face;\n canvas.appendChild(image);\n\n // Hide the original image\n addClass(element, CLASS_HIDDEN);\n\n // Inserts the cropper after to the current image\n container.insertBefore(cropper, element.nextSibling);\n\n // Show the hidden image\n removeClass(image, CLASS_HIDE);\n this.initPreview();\n this.bind();\n options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n addClass(cropBox, CLASS_HIDDEN);\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\n if (!options.cropBoxResizable) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n }\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n if (options.autoCrop) {\n this.crop();\n }\n this.setData(options.data);\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n this.ready = false;\n this.unbind();\n this.resetPreview();\n var parentNode = this.cropper.parentNode;\n if (parentNode) {\n parentNode.removeChild(this.cropper);\n }\n removeClass(this.element, CLASS_HIDDEN);\n }\n }, {\n key: \"uncreate\",\n value: function uncreate() {\n if (this.ready) {\n this.unbuild();\n this.ready = false;\n this.cropped = false;\n } else if (this.sizing) {\n this.sizingImage.onload = null;\n this.sizing = false;\n this.sized = false;\n } else if (this.reloading) {\n this.xhr.onabort = null;\n this.xhr.abort();\n } else if (this.image) {\n this.stop();\n }\n }\n\n /**\n * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n }();\n assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n return Cropper;\n});"],"sourceRoot":""}