{"version":3,"sources":["webpack:///src/components/UI/ImageCropper.vue","webpack:///src/components/UI/Loader.vue","webpack:///./src/components/UI/ImageCropper.vue","webpack:///./src/components/UI/Loader.vue","webpack:///./node_modules/cropperjs/dist/cropper.css?9744","webpack:///./node_modules/cropperjs/dist/cropper.js","webpack:///./node_modules/cropperjs/dist/cropper.css","webpack:///./src/components/UI/ImageCropper.vue?f82d","webpack:///./src/components/UI/ImageCropper.vue?dfc1","webpack:///./src/components/UI/ImageCropper.vue?c072","webpack:///./src/components/UI/ImageCropper.vue?336c","webpack:///./src/components/UI/ImageCropper.vue?323f","webpack:///./src/components/UI/ImageCropper.vue?ee74","webpack:///./src/components/UI/Loader.vue?9492","webpack:///./src/components/UI/Loader.vue?b215","webpack:///./src/components/UI/Loader.vue?1982"],"names":["name","components","Loader","props","allowedFileTypes","type","Array","default","cropperContainerStyle","String","Object","alwaysHideRestore","Boolean","isStatic","uploadButtonView","note","aspectRatio","Number","aspectRatioCssClass","imageContainerCssClass","autoCropArea","dragMode","guides","previewContainer","minContainerWidth","minContainerHeight","minWidth","minHeight","maxWidth","maxHeight","width","height","viewMode","originalImage","required","data","imageURL","inValidImage","imgCropper","previewReady","isMinimalSizeAtLoad","isWrongFileType","imageCheckedTimer","newImageChosen","sourceFileType","isLoading","imageErrorMessages","$t","notValidated","zoomSlider","computed","imageValidationRules","_this2","rules","showRestoreIcon","showSlider","isValid","noValidImageChosen","errorMessages","output","push","watch","handler","val","$emit","created","setStartImage","beforeDestroy","URL","revokeObjectURL","methods","checkValidation","isExistingImage","test","performance","now","renderCropper","imageSource","_this","previews","document","querySelectorAll","image","getElementById","src","destroy","each","elem","firstChild","removeChild","Cropper","initialAspectRatio","zoomOnWheel","zoomOnTouch","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","highlight","ready","_this3","clone","cloneNode","className","style","cssText","appendChild","t","setTimeout","zoomTo","CROPPER_DATA","cropper","getImageData","naturalWidth","naturalHeight","clearTimeout","crop","event","detail","imageData","previewAspectRatio","previewImage","getElementsByTagName","item","previewWidth","offsetWidth","previewHeight","imageScaledRatio","marginLeft","x","marginTop","y","arr","callback","length","i","call","sourceCanHaveTransparency","mimeTypeCanHaveTransparency","getCroppedCanvas","croppedCanvas","imageSmoothingEnabled","imageSmoothingQuality","canvasToUploadDataUrl","onFileChanged","file","target","files","indexOf","toLowerCase","Image","createObjectURL","onload","resizedImage","resizeImage","value","getNewPhoto","cropperZoomTo","evt","CONTAINER_DATA","getCropBoxData","img","MAX_WITH","MAX_HEIGHT","isResized","canvas","createElement","Math","round","ctx","getContext","drawImage","restoreImage","reset","EventBus","message","color","render","_vm","_c","_self","staticClass","_t","on","click","$event","attrs","icon","_e","accept","rel","change","_v","_s","directives","rawName","expression","modifiers","number","step","min","max","domProps","input","__r","_n","blur","$forceUpdate","isArray","innerHTML","_l","index","key","concat","class","id","staticRenderFns","_withStripped","viewBox","xmlns","fill","cx","cy","r","attributeName","from","to","begin","dur","values","calcMode","repeatCount"],"mappings":"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AC,CAAC,CACH,CAAC,CAEN,CAAC,CACF,CAAC;AACJ,CAAC;AACD,IAAIf,eAAe,GAAG,EAAE;AACxBvC,MAAM,CAACwC,aAAa,GAAG,IAAI;;;;;;;;;;;;ACvG3B;;AAEA;AACA,cAAc,mBAAO,CAAC,8OAAoH;AAC1I;AACA,4CAA4C,QAAS;AACrD;AACA;AACA,UAAU,mBAAO,CAAC,6GAAgD;AAClE,8CAA8C,qCAAqC;AACnF;AACA,GAAG,KAAU,EAAE,E;;;;;;;;;;;;ACXf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE,KAA4D;AAC9D,EAAE,SACsG;AACxG,CAAC,sBAAsB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,aAAa,SAAS;AACtB,eAAe,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,aAAa,EAAE;AACf,eAAe,OAAO;AACtB;AACA;AACA,0FAA0F,aAAa;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;AACA;AACA;AACA,sCAAsC,GAAG;;AAEzC;AACA;AACA,gBAAgB;AAChB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY;AACZ,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,gFAAgF,eAAe;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA,aAAa,YAAY;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,gBAAgB,iBAAiB,2BAA2B,4BAA4B,8BAA8B,+BAA+B,sCAAsC;AACtO;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,SAAS;AACT,OAAO;AACP,mDAAmD;AACnD;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,kCAAkC;AAClC,mCAAmC;AACnC,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA,mCAAmC;AACnC,KAAK;AACL;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA,mCAAmC;AACnC,KAAK;AACL;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO,YAAY;AAClC,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,OAAO,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,6CAA6C;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,+BAA+B,8BAA8B,4BAA4B,2BAA2B,eAAe,uBAAuB,WAAW,gBAAgB;AACnO;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA,KAAK;A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","file":"js/18.js?id=ce551ce66c31830a888d","sourcesContent":["<template>\n  <div class=\"wrapper-imageCropper\">\n    <div\n      v-if=\"!isStatic\"\n      class=\"cropper-controls is-flex-grow-1\"\n    >\n      <slot></slot>\n      <div class=\"upload-controls mb-5 content\">\n        <div class=\"is-inline-flex is-align-items-center mb-5\">\n          <a\n            v-if=\"showRestoreIcon\"\n            @click=\"restoreImage()\"\n            class=\"icon mr-4\"\n          >\n            <font-awesome-icon :icon=\"['fas', 'undo']\" />\n          </a>\n          <div class=\"file is-success\">\n            <label class=\"file-label\">\n              <input\n                class=\"file-input\"\n                type=\"file\"\n                :accept=\"String(allowedFileTypes)\"\n                @change=\"onFileChanged\"\n                rel=\"fileInput\"\n              />\n              <span class=\"file-cta\">\n                <span class=\"file-label\">\n                  <template v-if=\"uploadButtonView !== 'text'\">\n                    <span class=\"icon\">\n                      <font-awesome-icon :icon=\"['far', 'camera']\" />\n                    </span>\n                    <span v-if=\"uploadButtonView !== 'icon'\">{{$t('Form.Control.Choose')}}</span>\n                  </template>\n                  <template v-if=\"uploadButtonView === 'text'\">\n                    {{$t('Form.Control.ChooseImage')}}\n                  </template>\n                </span>\n              </span>\n            </label>\n          </div>\n        </div>\n\n        <!-- Zoom control -->\n        <div\n          v-if=\"showSlider\"\n          class=\"slider-field is-flex field mb-5\"\n        >\n          <strong class=\"icon is-size-5\">-</strong>\n          <input\n            v-model.number=\"zoomSlider\"\n            class=\"slider is-medium is-circle is-fullwidth\"\n            step=\"0.1\"\n            v-bind:min=\"0.1\"\n            v-bind:max=\"0.8\"\n            type=\"range\"\n            @input=\"cropperZoomTo\"\n          />\n          <strong class=\"icon is-size-5\">+</strong>\n        </div>\n        <div\n          v-if=\"errorMessages.length\"\n          class=\"errorMessages has-text-danger is-size-7\"\n        >\n          <span\n            v-if=\"!Array.isArray(errorMessages)\"\n            class=\"help is-danger\"\n            v-html=\"errorMessages\"\n          ></span>\n          <div\n            v-else\n            class=\"help is-danger\"\n          >\n            <div\n              v-for=\"(message, index) in errorMessages\"\n              :key=\"`e${index}`\"\n              v-html=\"message\"\n            ></div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"img-container-wrapper\">\n      <div\n        v-if=\"isLoading\"\n        class=\"loader-wrapper is-flex is-align-items-center is-justify-content-center\"\n      >\n        <Loader class=\"custom-loader\" />\n      </div>\n      <div>\n        <div\n          class=\"image img-container\"\n          :class=\"[aspectRatioCssClass, imageContainerCssClass]\"\n          :style=\"cropperContainerStyle\"\n        >\n          <img\n            id=\"image\"\n            class=\"originalImage\"\n            :src=\"imageURL\"\n            :style=\"{aspectRatio: aspectRatio}\"\n          >\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Cropper from 'cropperjs';\nimport 'cropperjs/dist/cropper.css';\nimport Loader from './Loader.vue'\nimport EventBus from '../../eventbus/event-bus';\nimport { canvasToUploadDataUrl, mimeTypeCanHaveTransparency } from '@/utils/imageHelper'\nexport default {\n  name: 'ImageCropper',\n\n  components: {\n    Loader,\n  },\n\n  props: {\n    allowedFileTypes: {\n      type: Array,\n      default: function() {\n        return [\n          'image/png',\n          'image/jpg',\n          'image/jpeg',\n          'image/gif',\n          'image/webp',\n        ]\n      }\n    },\n    cropperContainerStyle: {\n      type: [String, Object],\n      default: null,\n    },\n\n    alwaysHideRestore: {\n      type: Boolean,\n      default: false\n    },\n\n    isStatic: {\n      type: Boolean,\n      default: false\n    },\n\n    uploadButtonView: {\n      type: String,\n      default: 'text',\n      note: 'Options are: text | icon-text | icon'\n    },\n\n    aspectRatio: {\n      type: Number,\n      default: 4 / 3\n    },\n\n    aspectRatioCssClass: {\n      type: String,\n      default: 'is-4by3'\n    },\n\n    imageContainerCssClass: {\n      type: String,\n      default: ''\n    },\n\n    autoCropArea: {\n      type: Number,\n      default: 1\n    },\n\n    dragMode: {\n      type: String,\n      default: 'move'\n    },\n\n    guides: {\n      type: Boolean,\n      default: true\n    },\n\n    previewContainer: {\n      type: String,\n      default: ''\n    },\n\n    minContainerWidth: {\n      type: Number,\n      default: 100\n    },\n\n    minContainerHeight: {\n      type: Number,\n      default: 100\n    },\n\n    minWidth: {\n      type: Number,\n      default: 1024\n    },\n\n    minHeight: {\n      type: Number,\n      default: 1024\n    },\n\n    maxWidth: {\n      type: Number,\n      default: 1920\n    },\n    maxHeight: {\n      type: Number,\n      default: 1920\n    },\n\n    width: {\n      type: Number,\n      default: 0\n    },\n\n    height: {\n      type: Number,\n      default: 0\n    },\n\n    viewMode: {\n      type: Number,\n      default: 3\n    },\n\n    originalImage: {\n      type: String,\n      default: ''\n    },\n\n    required: {\n      type: Boolean,\n      default: true\n    }\n  },\n\n  data() {\n    return {\n      imageURL: '',\n      inValidImage: false,\n      imgCropper: null,\n      previewReady: false,\n      isMinimalSizeAtLoad: false,\n      isWrongFileType: false,\n      imageCheckedTimer: null,\n      newImageChosen: false,\n      sourceFileType: '',\n      isLoading: false,\n      imageErrorMessages: {\n        required: this.$t('Form.InputErrors.ImageIsRequired'),\n        inValidImage: this.$t('Form.InputErrors.ImageTooSmall'),\n        isWrongFileType: this.$t('Form.InputErrors.WrongType'),\n      },\n      notValidated: true,\n      zoomSlider: 0.1\n    }\n  },\n\n  computed: {\n    imageValidationRules() {\n      let rules = {\n        required: () => { return !this.required },\n        inValidImage: () => { return !this.inValidImage },\n        isWrongFileType: () => { return !this.isWrongFileType }\n      }\n      return rules\n    },\n\n    showRestoreIcon() {\n      return !this.alwaysHideRestore && this.newImageChosen && this.originalImage !== ''\n    },\n\n    showSlider() {\n      return this.previewReady && !this.isMinimalSizeAtLoad\n    },\n\n    isValid() {\n      return !this.inValidImage && !this.isWrongFileType\n    },\n\n    noValidImageChosen() {\n      return this.newImageChosen && (this.inValidImage || !this.previewReady || this.isWrongFileType)\n    },\n\n    errorMessages() {\n      let output = []\n\n      if (this.required && !this.notValidated && !this.originalImage && !this.newImageChosen) { output.push(this.imageErrorMessages.required) }\n      this.inValidImage && output.push(this.imageErrorMessages.inValidImage)\n      this.isWrongFileType && output.push(this.imageErrorMessages.isWrongFileType)\n      return output\n    }\n  },\n\n  watch: {\n    noValidImageChosen: {\n      handler: function(val) {\n        this.$emit('errorCallbackInvalid', val)\n      }\n    },\n  },\n\n  created() {\n    this.setStartImage()\n  },\n\n  beforeDestroy() {\n    this.imageURL && URL.revokeObjectURL(this.imageURL)\n  },\n\n  methods: {\n    checkValidation() {\n      this.notValidated = false\n    },\n\n    setStartImage() {\n      this.imageURL = '/images/noImage.png'\n      if (!this.originalImage) { return }\n\n      let isExistingImage = /\\.(jpe?g|png|webp)(\\?|$)/i.test(this.originalImage)\n      this.imageURL = isExistingImage ? this.originalImage + '?' + performance.now() : this.originalImage\n    },\n\n    /**\n     * Render image cropper\n     */\n    renderCropper(imageSource) {\n      let _this = this\n      const previews = this.previewContainer ? document.querySelectorAll(this.previewContainer) : []\n      const image = document.getElementById('image')\n      this.previewReady = false\n      image.src = imageSource\n\n      // First destroy cropperjs instance when exists before creating instance \n      this.imgCropper && this.imgCropper.destroy()\n\n      // Delete all childs in preview elements\n      _this.each(previews, function(elem) {\n        while (elem.firstChild) {\n          elem.removeChild(elem.firstChild)\n        }\n      })\n\n      // Create cropper instance\n      this.imgCropper = new Cropper(image, {\n        initialAspectRatio: this.aspectRatio,\n        aspectRatio: this.aspectRatio,\n        viewMode: this.viewMode,\n        dragMode: this.dragMode,\n        minContainerWidth: this.minContainerWidth,\n        minContainerHeight: this.minContainerHeight,\n        zoomOnWheel: false,\n        zoomOnTouch: false,\n        cropBoxMovable: false,\n        cropBoxResizable: false,\n        toggleDragModeOnDblclick: false,\n        autoCropArea: this.autoCropArea,\n        guides: this.guides,\n        highlight: false,\n        ready() {\n          // Occupy preview elements\n          let clone = this.cloneNode();\n          clone.className = '';\n          clone.style.cssText = (\n            'display: block;' +\n            'width: 100%;' +\n            'min-width: 0;' +\n            'min-height: 0;' +\n            'max-width: none;' +\n            'max-height: none;'\n          )\n\n          _this.each(previews, function(elem) {\n            elem.appendChild(clone.cloneNode());\n          });\n          let t = setTimeout(() => {\n            _this.zoomSlider = 0.1\n            _this.imgCropper.zoomTo(0.1)\n            let CROPPER_DATA = this.cropper.getImageData()\n            _this.isMinimalSizeAtLoad = CROPPER_DATA.naturalWidth <= _this.minWidth || CROPPER_DATA.naturalHeight <= (_this.minHeight / _this.aspectRatio)\n            _this.inValidImage = _this.minWidth > CROPPER_DATA.naturalWidth || (_this.minHeight / _this.aspectRatio) > CROPPER_DATA.naturalHeight //_this.minHeight > CROPPER_DATA.naturalHeight\n            clearTimeout(t)\n          }, 0)\n          _this.previewReady = true\n          _this.isLoading = false\n        },\n\n        crop(event) {\n          // When preview is ready update preview elemens when\n          // crop data is updated.\n          if (!_this.previewReady) {\n            return;\n          }\n\n          var data = event.detail\n          var cropper = this.cropper;\n          var imageData = cropper.getImageData();\n          var previewAspectRatio = this.aspectRatio;\n\n          _this.each(previews, function(elem) {\n            var previewImage = elem.getElementsByTagName('img').item(0);\n            var previewWidth = elem.offsetWidth;\n            var previewHeight = previewWidth / previewAspectRatio;\n            var imageScaledRatio = data.width / previewWidth;\n\n            elem.style.height = previewHeight + 'px';\n            previewImage.style.width = imageData.naturalWidth / imageScaledRatio + 'px';\n            previewImage.style.height = imageData.naturalHeight / imageScaledRatio + 'px';\n            previewImage.style.marginLeft = -data.x / imageScaledRatio + 'px';\n            previewImage.style.marginTop = -data.y / imageScaledRatio + 'px';\n          });\n        },\n      });\n    },\n\n    /**\n     * Loop method with used to indentify the preview containers\n     */\n    each(arr, callback) {\n      if (!arr.length) { return }\n\n      for (let i = 0; i < arr.length; i++) {\n        callback.call(arr, arr[i], i, arr);\n      }\n\n      return arr;\n    },\n\n    /**\n     * Check if the image that is being cropped can contain transparency.\n     * A newly chosen file uses its MIME type, an existing (CDN) image uses its file extension.\n     */\n    sourceCanHaveTransparency() {\n      if (this.sourceFileType) {\n        return mimeTypeCanHaveTransparency(this.sourceFileType)\n      }\n\n      return /\\.(png|gif|webp)(\\?|$)/i.test(this.originalImage || '')\n    },\n\n    /**\n     * Get cropped image base64 data\n     */\n    getCroppedCanvas() {\n      if (this.imgCropper === null) { return null }\n      const croppedCanvas = this.imgCropper.getCroppedCanvas({\n        width: this.width || this.maxWidth,\n        height: this.height || this.maxHeight,\n        minWidth: this.minWidth,\n        minHeight: this.minHeight,\n        maxWidth: this.maxWidth,\n        maxHeight: this.maxHeight,\n        imageSmoothingEnabled: true,\n        imageSmoothingQuality: 'high',\n      })\n\n      return canvasToUploadDataUrl(croppedCanvas, 0.92, this.sourceCanHaveTransparency())\n    },\n\n    /**\n     * Rerender image cropper with new chosen image\n     */\n    onFileChanged(event) {\n      const _this = this\n      const file = event.target.files[0]\n\n      // if there's no file selected (user cancels) return \n      if (!file) {\n        return\n      }\n\n      this.inValidImage = false\n      this.isMinimalSizeAtLoad = false\n\n      // Check if file is a image\n      this.isWrongFileType = false\n      if (this.allowedFileTypes.indexOf(event.target.files[0].type.toLowerCase()) === -1) {\n        this.isWrongFileType = true\n        return\n      }\n\n      this.isLoading = true\n      this.newImageChosen = true\n      this.sourceFileType = file.type.toLowerCase()\n      this.$emit('callbackImageChosen', true)\n\n      const image = new Image()\n\n      // Clear old blob\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      this.imageURL = URL.createObjectURL(file)\n      image.src = this.imageURL\n\n      image.onload = () => {\n        let resizedImage = _this.resizeImage(image)\n\n        if (!resizedImage) {\n          // No resize needed\n          resizedImage = image.src\n        }\n\n        let t = setTimeout(function() {\n          _this.renderCropper(resizedImage)\n          resizedImage = ''\n          clearTimeout(t)\n        }, 10)\n      }\n\n      // Clear input value to allow selecting the same file again\n      event.target.value = ''\n    },\n\n    /**\n     * Emit cropped image and close modal\n     */\n    getNewPhoto() {\n      // Clear image in memory\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      return this.getCroppedCanvas()\n    },\n\n    /**\n     * Cropper controls\n     */\n    cropperZoomTo(evt) {\n      const CONTAINER_DATA = this.imgCropper.getCropBoxData()\n\n      if (evt.target.value > 0.8) { return }\n\n      this.imgCropper.zoomTo(evt.target.value, {\n        x: CONTAINER_DATA.width / 1.5,\n        y: CONTAINER_DATA.height / 1.5,\n      })\n    },\n\n    /**\n     * Resize original image if needed\n     */\n    resizeImage(img) {\n      const MAX_WITH = this.maxWidth\n      const MAX_HEIGHT = this.maxHeight\n      let isResized = false\n      let canvas = document.createElement('canvas');\n      let width = img.width;\n      let height = img.height;\n\n      // calculate the width and height, constraining the proportions\n      if (width > height) {\n        if (width > MAX_WITH) {\n          height = Math.round(height *= MAX_WITH / width);\n          width = MAX_WITH;\n\n          isResized = true\n        }\n      } else {\n        if (height > MAX_HEIGHT) {\n          width = Math.round(width *= MAX_HEIGHT / height);\n          height = MAX_HEIGHT;\n\n          isResized = true\n        }\n      }\n\n      if (isResized) {\n        // resize the canvas and draw the image data into it\n        canvas.width = width;\n        canvas.height = height;\n        var ctx = canvas.getContext(\"2d\");\n        ctx.imageSmoothingEnabled = true;\n        ctx.imageSmoothingQuality = 'high';\n        ctx.drawImage(img, 0, 0, width, height);\n        return canvasToUploadDataUrl(canvas, 1, this.sourceCanHaveTransparency());\n      }\n\n      return false\n    },\n\n    restoreImage() {\n      this.reset()\n      EventBus.$emit('showToast', {\n        type: 'info',\n        message: 'Previous image is restored',\n      })\n    },\n\n    reset() {\n      this.newImageChosen = false\n      this.sourceFileType = ''\n      this.previewReady = false\n      this.isMinimalSizeAtLoad = false\n      this.inValidImage = false\n      this.isWrongFileType = false\n      this.zoomSlider = 0.1\n\n      const image = document.getElementById('image')\n      image.src = this.originalImage\n\n      this.$emit('callbackImageChosen', false)\n\n      // Destroy cropperjs instance\n      this.imgCropper && this.imgCropper.destroy()\n      // Destroy image blob\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      // Set original image\n      this.imageURL = this.originalImage || '/images/noImage.png'\n\n      const previews = this.previewContainer ? document.querySelectorAll(this.previewContainer) : []\n      this.each(previews, function(elem) {\n        while (elem.firstChild) {\n          elem.removeChild(elem.firstChild)\n        }\n      })\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper-imageCropper\n  display: flex\n  flex-direction: column\n\n  .originalImage\n    object-fit: cover\n\n  @media screen and (max-width: 400px)\n    .file-icon\n      display: none\n\n    .img-container-wrapper\n      flex-shrink: 1\n      transform: scale(0.8)\n\n  .img-container-wrapper\n    position: relative\n    .loader-wrapper\n      position: absolute\n      top: 0\n      right: 0\n      bottom: 0\n      left: 0\n      z-index: 1\n\n      .custom-loader\n        position: relative\n        z-index: 1\n      &::after\n        position: absolute\n        top: 0\n        right: 0\n        bottom: 0\n        left: 0\n        content: \"\"\n        background-color: #FFFFFF\n        opacity: .6\n\n  .img-container\n    position: relative\n    display: inline-flex\n    align-items: center\n    // background: #ddd\n    overflow: hidden\n    flex-shrink: 0\n    width: 100%\n    background-color: #ebebeb\n\n    ::v-deep img\n      // display: block\n      // max-width: 100%\n      // height: auto\n      background-color: transparent !important\n\n    &.is-rounded\n      border-radius: 50%\n\n  .slider\n    width: 100%\n\n::v-deep .cropper-container\n  position: absolute\n  top: 0\n  right: 0\n  bottom: 0\n  left: 0\n</style>","<template>\n  <div class=\"has-padding has-text-centered\">\n    <svg\n      viewBox=\"0 0 120 30\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      :fill=\"color\"\n      :width=\"width\"\n      :height=\"height\"\n    >\n      <circle cx=\"15\" cy=\"15\" r=\"15\">\n        <animate\n          attributeName=\"r\"\n          from=\"15\"\n          to=\"15\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"15;9;15\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"1\"\n          to=\"1\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"1;.5;1\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n      <circle cx=\"60\" cy=\"15\" r=\"9\" fill-opacity=\"0.3\">\n        <animate\n          attributeName=\"r\"\n          from=\"9\"\n          to=\"9\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"9;15;9\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"0.5\"\n          to=\"0.5\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\".5;1;.5\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n      <circle cx=\"105\" cy=\"15\" r=\"15\">\n        <animate\n          attributeName=\"r\"\n          from=\"15\"\n          to=\"15\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"15;9;15\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"1\"\n          to=\"1\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"1;.5;1\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n    </svg>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: \"dots\",\n  props: {\n    color: {\n      type: String,\n      default: \"#000\"\n    },\n    height: {\n      type: Number,\n      default: 240\n    },\n    width: {\n      type: Number,\n      default: 60\n    }\n  }\n};\n</script>\n","var render = function render() {\n  var _vm = this,\n    _c = _vm._self._c\n  return _c(\"div\", { staticClass: \"wrapper-imageCropper\" }, [\n    !_vm.isStatic\n      ? _c(\n          \"div\",\n          { staticClass: \"cropper-controls is-flex-grow-1\" },\n          [\n            _vm._t(\"default\"),\n            _c(\"div\", { staticClass: \"upload-controls mb-5 content\" }, [\n              _c(\n                \"div\",\n                { staticClass: \"is-inline-flex is-align-items-center mb-5\" },\n                [\n                  _vm.showRestoreIcon\n                    ? _c(\n                        \"a\",\n                        {\n                          staticClass: \"icon mr-4\",\n                          on: {\n                            click: function ($event) {\n                              return _vm.restoreImage()\n                            },\n                          },\n                        },\n                        [\n                          _c(\"font-awesome-icon\", {\n                            attrs: { icon: [\"fas\", \"undo\"] },\n                          }),\n                        ],\n                        1\n                      )\n                    : _vm._e(),\n                  _c(\"div\", { staticClass: \"file is-success\" }, [\n                    _c(\"label\", { staticClass: \"file-label\" }, [\n                      _c(\"input\", {\n                        staticClass: \"file-input\",\n                        attrs: {\n                          type: \"file\",\n                          accept: String(_vm.allowedFileTypes),\n                          rel: \"fileInput\",\n                        },\n                        on: { change: _vm.onFileChanged },\n                      }),\n                      _c(\"span\", { staticClass: \"file-cta\" }, [\n                        _c(\n                          \"span\",\n                          { staticClass: \"file-label\" },\n                          [\n                            _vm.uploadButtonView !== \"text\"\n                              ? [\n                                  _c(\n                                    \"span\",\n                                    { staticClass: \"icon\" },\n                                    [\n                                      _c(\"font-awesome-icon\", {\n                                        attrs: { icon: [\"far\", \"camera\"] },\n                                      }),\n                                    ],\n                                    1\n                                  ),\n                                  _vm.uploadButtonView !== \"icon\"\n                                    ? _c(\"span\", [\n                                        _vm._v(\n                                          _vm._s(_vm.$t(\"Form.Control.Choose\"))\n                                        ),\n                                      ])\n                                    : _vm._e(),\n                                ]\n                              : _vm._e(),\n                            _vm.uploadButtonView === \"text\"\n                              ? [\n                                  _vm._v(\n                                    \" \" +\n                                      _vm._s(\n                                        _vm.$t(\"Form.Control.ChooseImage\")\n                                      ) +\n                                      \" \"\n                                  ),\n                                ]\n                              : _vm._e(),\n                          ],\n                          2\n                        ),\n                      ]),\n                    ]),\n                  ]),\n                ]\n              ),\n              _vm.showSlider\n                ? _c(\n                    \"div\",\n                    { staticClass: \"slider-field is-flex field mb-5\" },\n                    [\n                      _c(\"strong\", { staticClass: \"icon is-size-5\" }, [\n                        _vm._v(\"-\"),\n                      ]),\n                      _c(\"input\", {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model.number\",\n                            value: _vm.zoomSlider,\n                            expression: \"zoomSlider\",\n                            modifiers: { number: true },\n                          },\n                        ],\n                        staticClass: \"slider is-medium is-circle is-fullwidth\",\n                        attrs: {\n                          step: \"0.1\",\n                          min: 0.1,\n                          max: 0.8,\n                          type: \"range\",\n                        },\n                        domProps: { value: _vm.zoomSlider },\n                        on: {\n                          input: _vm.cropperZoomTo,\n                          __r: function ($event) {\n                            _vm.zoomSlider = _vm._n($event.target.value)\n                          },\n                          blur: function ($event) {\n                            return _vm.$forceUpdate()\n                          },\n                        },\n                      }),\n                      _c(\"strong\", { staticClass: \"icon is-size-5\" }, [\n                        _vm._v(\"+\"),\n                      ]),\n                    ]\n                  )\n                : _vm._e(),\n              _vm.errorMessages.length\n                ? _c(\n                    \"div\",\n                    { staticClass: \"errorMessages has-text-danger is-size-7\" },\n                    [\n                      !Array.isArray(_vm.errorMessages)\n                        ? _c(\"span\", {\n                            staticClass: \"help is-danger\",\n                            domProps: { innerHTML: _vm._s(_vm.errorMessages) },\n                          })\n                        : _c(\n                            \"div\",\n                            { staticClass: \"help is-danger\" },\n                            _vm._l(\n                              _vm.errorMessages,\n                              function (message, index) {\n                                return _c(\"div\", {\n                                  key: `e${index}`,\n                                  domProps: { innerHTML: _vm._s(message) },\n                                })\n                              }\n                            ),\n                            0\n                          ),\n                    ]\n                  )\n                : _vm._e(),\n            ]),\n          ],\n          2\n        )\n      : _vm._e(),\n    _c(\"div\", { staticClass: \"img-container-wrapper\" }, [\n      _vm.isLoading\n        ? _c(\n            \"div\",\n            {\n              staticClass:\n                \"loader-wrapper is-flex is-align-items-center is-justify-content-center\",\n            },\n            [_c(\"Loader\", { staticClass: \"custom-loader\" })],\n            1\n          )\n        : _vm._e(),\n      _c(\"div\", [\n        _c(\n          \"div\",\n          {\n            staticClass: \"image img-container\",\n            class: [_vm.aspectRatioCssClass, _vm.imageContainerCssClass],\n            style: _vm.cropperContainerStyle,\n          },\n          [\n            _c(\"img\", {\n              staticClass: \"originalImage\",\n              style: { aspectRatio: _vm.aspectRatio },\n              attrs: { id: \"image\", src: _vm.imageURL },\n            }),\n          ]\n        ),\n      ]),\n    ]),\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function render() {\n  var _vm = this,\n    _c = _vm._self._c\n  return _c(\"div\", { staticClass: \"has-padding has-text-centered\" }, [\n    _c(\n      \"svg\",\n      {\n        attrs: {\n          viewBox: \"0 0 120 30\",\n          xmlns: \"http://www.w3.org/2000/svg\",\n          fill: _vm.color,\n          width: _vm.width,\n          height: _vm.height,\n        },\n      },\n      [\n        _c(\"circle\", { attrs: { cx: \"15\", cy: \"15\", r: \"15\" } }, [\n          _c(\"animate\", {\n            attrs: {\n              attributeName: \"r\",\n              from: \"15\",\n              to: \"15\",\n              begin: \"0s\",\n              dur: \"0.8s\",\n              values: \"15;9;15\",\n              calcMode: \"linear\",\n              repeatCount: \"indefinite\",\n            },\n          }),\n          _c(\"animate\", {\n            attrs: {\n              attributeName: \"fill-opacity\",\n              from: \"1\",\n              to: \"1\",\n              begin: \"0s\",\n              dur: \"0.8s\",\n              values: \"1;.5;1\",\n              calcMode: \"linear\",\n              repeatCount: \"indefinite\",\n            },\n          }),\n        ]),\n        _c(\n          \"circle\",\n          { attrs: { cx: \"60\", cy: \"15\", r: \"9\", \"fill-opacity\": \"0.3\" } },\n          [\n            _c(\"animate\", {\n              attrs: {\n                attributeName: \"r\",\n                from: \"9\",\n                to: \"9\",\n                begin: \"0s\",\n                dur: \"0.8s\",\n                values: \"9;15;9\",\n                calcMode: \"linear\",\n                repeatCount: \"indefinite\",\n              },\n            }),\n            _c(\"animate\", {\n              attrs: {\n                attributeName: \"fill-opacity\",\n                from: \"0.5\",\n                to: \"0.5\",\n                begin: \"0s\",\n                dur: \"0.8s\",\n                values: \".5;1;.5\",\n                calcMode: \"linear\",\n                repeatCount: \"indefinite\",\n              },\n            }),\n          ]\n        ),\n        _c(\"circle\", { attrs: { cx: \"105\", cy: \"15\", r: \"15\" } }, [\n          _c(\"animate\", {\n            attrs: {\n              attributeName: \"r\",\n              from: \"15\",\n              to: \"15\",\n              begin: \"0s\",\n              dur: \"0.8s\",\n              values: \"15;9;15\",\n              calcMode: \"linear\",\n              repeatCount: \"indefinite\",\n            },\n          }),\n          _c(\"animate\", {\n            attrs: {\n              attributeName: \"fill-opacity\",\n              from: \"1\",\n              to: \"1\",\n              begin: \"0s\",\n              dur: \"0.8s\",\n              values: \"1;.5;1\",\n              calcMode: \"linear\",\n              repeatCount: \"indefinite\",\n            },\n          }),\n        ]),\n      ]\n    ),\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../css-loader/dist/cjs.js??ref--7-oneOf-3-1!../../postcss-loader/src/index.js??ref--7-oneOf-3-2!./cropper.css\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"0bded00b\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../css-loader/dist/cjs.js??ref--7-oneOf-3-1!../../postcss-loader/src/index.js??ref--7-oneOf-3-2!./cropper.css\", function() {\n     var newContent = require(\"!!../../css-loader/dist/cjs.js??ref--7-oneOf-3-1!../../postcss-loader/src/index.js??ref--7-oneOf-3-2!./cropper.css\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\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() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n})(this, (function () { '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\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\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\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\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\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\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\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\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\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\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\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 <img> or <canvas> 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\n  return Cropper;\n\n}));\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \"/*!\\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:02.731Z\\n */\\n\\n.cropper-container {\\n  direction: ltr;\\n  font-size: 0;\\n  line-height: 0;\\n  position: relative;\\n  -ms-touch-action: none;\\n      touch-action: none;\\n  -webkit-touch-callout: none;\\n  -webkit-user-select: none;\\n     -moz-user-select: none;\\n      -ms-user-select: none;\\n          user-select: none;\\n}\\n\\n.cropper-container img {\\n    -webkit-backface-visibility: hidden;\\n            backface-visibility: hidden;\\n    display: block;\\n    height: 100%;\\n    image-orientation: 0deg;\\n    max-height: none !important;\\n    max-width: none !important;\\n    min-height: 0 !important;\\n    min-width: 0 !important;\\n    width: 100%;\\n  }\\n\\n.cropper-wrap-box,\\n.cropper-canvas,\\n.cropper-drag-box,\\n.cropper-crop-box,\\n.cropper-modal {\\n  bottom: 0;\\n  left: 0;\\n  position: absolute;\\n  right: 0;\\n  top: 0;\\n}\\n\\n.cropper-wrap-box,\\n.cropper-canvas {\\n  overflow: hidden;\\n}\\n\\n.cropper-drag-box {\\n  background-color: #fff;\\n  opacity: 0;\\n}\\n\\n.cropper-modal {\\n  background-color: #000;\\n  opacity: 0.5;\\n}\\n\\n.cropper-view-box {\\n  display: block;\\n  height: 100%;\\n  outline: 1px solid #39f;\\n  outline-color: rgba(51, 153, 255, 0.75);\\n  overflow: hidden;\\n  width: 100%;\\n}\\n\\n.cropper-dashed {\\n  border: 0 dashed #eee;\\n  display: block;\\n  opacity: 0.5;\\n  position: absolute;\\n}\\n\\n.cropper-dashed.dashed-h {\\n    border-bottom-width: 1px;\\n    border-top-width: 1px;\\n    height: calc(100% / 3);\\n    left: 0;\\n    top: calc(100% / 3);\\n    width: 100%;\\n  }\\n\\n.cropper-dashed.dashed-v {\\n    border-left-width: 1px;\\n    border-right-width: 1px;\\n    height: 100%;\\n    left: calc(100% / 3);\\n    top: 0;\\n    width: calc(100% / 3);\\n  }\\n\\n.cropper-center {\\n  display: block;\\n  height: 0;\\n  left: 50%;\\n  opacity: 0.75;\\n  position: absolute;\\n  top: 50%;\\n  width: 0;\\n}\\n\\n.cropper-center::before,\\n  .cropper-center::after {\\n    background-color: #eee;\\n    content: ' ';\\n    display: block;\\n    position: absolute;\\n  }\\n\\n.cropper-center::before {\\n    height: 1px;\\n    left: -3px;\\n    top: 0;\\n    width: 7px;\\n  }\\n\\n.cropper-center::after {\\n    height: 7px;\\n    left: 0;\\n    top: -3px;\\n    width: 1px;\\n  }\\n\\n.cropper-face,\\n.cropper-line,\\n.cropper-point {\\n  display: block;\\n  height: 100%;\\n  opacity: 0.1;\\n  position: absolute;\\n  width: 100%;\\n}\\n\\n.cropper-face {\\n  background-color: #fff;\\n  left: 0;\\n  top: 0;\\n}\\n\\n.cropper-line {\\n  background-color: #39f;\\n}\\n\\n.cropper-line.line-e {\\n    cursor: ew-resize;\\n    right: -3px;\\n    top: 0;\\n    width: 5px;\\n  }\\n\\n.cropper-line.line-n {\\n    cursor: ns-resize;\\n    height: 5px;\\n    left: 0;\\n    top: -3px;\\n  }\\n\\n.cropper-line.line-w {\\n    cursor: ew-resize;\\n    left: -3px;\\n    top: 0;\\n    width: 5px;\\n  }\\n\\n.cropper-line.line-s {\\n    bottom: -3px;\\n    cursor: ns-resize;\\n    height: 5px;\\n    left: 0;\\n  }\\n\\n.cropper-point {\\n  background-color: #39f;\\n  height: 5px;\\n  opacity: 0.75;\\n  width: 5px;\\n}\\n\\n.cropper-point.point-e {\\n    cursor: ew-resize;\\n    margin-top: -3px;\\n    right: -3px;\\n    top: 50%;\\n  }\\n\\n.cropper-point.point-n {\\n    cursor: ns-resize;\\n    left: 50%;\\n    margin-left: -3px;\\n    top: -3px;\\n  }\\n\\n.cropper-point.point-w {\\n    cursor: ew-resize;\\n    left: -3px;\\n    margin-top: -3px;\\n    top: 50%;\\n  }\\n\\n.cropper-point.point-s {\\n    bottom: -3px;\\n    cursor: s-resize;\\n    left: 50%;\\n    margin-left: -3px;\\n  }\\n\\n.cropper-point.point-ne {\\n    cursor: nesw-resize;\\n    right: -3px;\\n    top: -3px;\\n  }\\n\\n.cropper-point.point-nw {\\n    cursor: nwse-resize;\\n    left: -3px;\\n    top: -3px;\\n  }\\n\\n.cropper-point.point-sw {\\n    bottom: -3px;\\n    cursor: nesw-resize;\\n    left: -3px;\\n  }\\n\\n.cropper-point.point-se {\\n    bottom: -3px;\\n    cursor: nwse-resize;\\n    height: 20px;\\n    opacity: 1;\\n    right: -3px;\\n    width: 20px;\\n  }\\n\\n@media (min-width: 768px) {\\n\\n.cropper-point.point-se {\\n      height: 15px;\\n      width: 15px;\\n  }\\n    }\\n\\n@media (min-width: 992px) {\\n\\n.cropper-point.point-se {\\n      height: 10px;\\n      width: 10px;\\n  }\\n    }\\n\\n@media (min-width: 1200px) {\\n\\n.cropper-point.point-se {\\n      height: 5px;\\n      opacity: 0.75;\\n      width: 5px;\\n  }\\n    }\\n\\n.cropper-point.point-se::before {\\n    background-color: #39f;\\n    bottom: -50%;\\n    content: ' ';\\n    display: block;\\n    height: 200%;\\n    opacity: 0;\\n    position: absolute;\\n    right: -50%;\\n    width: 200%;\\n  }\\n\\n.cropper-invisible {\\n  opacity: 0;\\n}\\n\\n.cropper-bg {\\n  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\\n}\\n\\n.cropper-hide {\\n  display: block;\\n  height: 0;\\n  position: absolute;\\n  width: 0;\\n}\\n\\n.cropper-hidden {\\n  display: none !important;\\n}\\n\\n.cropper-move {\\n  cursor: move;\\n}\\n\\n.cropper-crop {\\n  cursor: crosshair;\\n}\\n\\n.cropper-disabled .cropper-drag-box,\\n.cropper-disabled .cropper-face,\\n.cropper-disabled .cropper-line,\\n.cropper-disabled .cropper-point {\\n  cursor: not-allowed;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \"/**\\n* Colors\\n*/\\n/**\\n* Text sizes\\n*/\\n/**\\n* Column settings\\n*/\\n/**\\n* Font properties\\n*/\\n.wrapper-imageCropper[data-v-507fbe0d] {\\n  display: -webkit-box;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -webkit-box-orient: vertical;\\n  -webkit-box-direction: normal;\\n      -ms-flex-direction: column;\\n          flex-direction: column;\\n}\\n.wrapper-imageCropper .originalImage[data-v-507fbe0d] {\\n  -o-object-fit: cover;\\n     object-fit: cover;\\n}\\n@media screen and (max-width: 400px) {\\n.wrapper-imageCropper .file-icon[data-v-507fbe0d] {\\n    display: none;\\n}\\n.wrapper-imageCropper .img-container-wrapper[data-v-507fbe0d] {\\n    -ms-flex-negative: 1;\\n        flex-shrink: 1;\\n    -webkit-transform: scale(0.8);\\n            transform: scale(0.8);\\n}\\n}\\n.wrapper-imageCropper .img-container-wrapper[data-v-507fbe0d] {\\n  position: relative;\\n}\\n.wrapper-imageCropper .img-container-wrapper .loader-wrapper[data-v-507fbe0d] {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1;\\n}\\n.wrapper-imageCropper .img-container-wrapper .loader-wrapper .custom-loader[data-v-507fbe0d] {\\n  position: relative;\\n  z-index: 1;\\n}\\n.wrapper-imageCropper .img-container-wrapper .loader-wrapper[data-v-507fbe0d]::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  content: \\\"\\\";\\n  background-color: #FFFFFF;\\n  opacity: 0.6;\\n}\\n.wrapper-imageCropper .img-container[data-v-507fbe0d] {\\n  position: relative;\\n  display: -webkit-inline-box;\\n  display: -ms-inline-flexbox;\\n  display: inline-flex;\\n  -webkit-box-align: center;\\n      -ms-flex-align: center;\\n          align-items: center;\\n  overflow: hidden;\\n  -ms-flex-negative: 0;\\n      flex-shrink: 0;\\n  width: 100%;\\n  background-color: #ebebeb;\\n}\\n.wrapper-imageCropper .img-container[data-v-507fbe0d] img {\\n  background-color: transparent !important;\\n}\\n.wrapper-imageCropper .img-container.is-rounded[data-v-507fbe0d] {\\n  border-radius: 50%;\\n}\\n.wrapper-imageCropper .slider[data-v-507fbe0d] {\\n  width: 100%;\\n}\\n[data-v-507fbe0d] .cropper-container {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=style&index=0&id=507fbe0d&lang=sass&scoped=true\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"52119df9\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=style&index=0&id=507fbe0d&lang=sass&scoped=true\", function() {\n     var newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=style&index=0&id=507fbe0d&lang=sass&scoped=true\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","import { render, staticRenderFns } from \"./ImageCropper.vue?vue&type=template&id=507fbe0d&scoped=true\"\nimport script from \"./ImageCropper.vue?vue&type=script&lang=js\"\nexport * from \"./ImageCropper.vue?vue&type=script&lang=js\"\nimport style0 from \"./ImageCropper.vue?vue&type=style&index=0&id=507fbe0d&lang=sass&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"507fbe0d\",\n  null\n  \n)\n\n/* hot reload */\nif (module.hot) {\n  var api = require(\"/github/workspace/node_modules/vue-hot-reload-api/dist/index.js\")\n  api.install(require('vue'))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('507fbe0d')) {\n      api.createRecord('507fbe0d', component.options)\n    } else {\n      api.reload('507fbe0d', component.options)\n    }\n    module.hot.accept(\"./ImageCropper.vue?vue&type=template&id=507fbe0d&scoped=true\", function () {\n      api.rerender('507fbe0d', {\n        render: render,\n        staticRenderFns: staticRenderFns\n      })\n    })\n  }\n}\ncomponent.options.__file = \"src/components/UI/ImageCropper.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=script&lang=js\"","export * from \"-!../../../node_modules/vue-style-loader/index.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=style&index=0&id=507fbe0d&lang=sass&scoped=true\"","export * from \"-!../../../node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"d2a26fb4-vue-loader-template\\\"}!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??ref--6!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=template&id=507fbe0d&scoped=true\"","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=337695a4\"\nimport script from \"./Loader.vue?vue&type=script&lang=js\"\nexport * from \"./Loader.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* hot reload */\nif (module.hot) {\n  var api = require(\"/github/workspace/node_modules/vue-hot-reload-api/dist/index.js\")\n  api.install(require('vue'))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('337695a4')) {\n      api.createRecord('337695a4', component.options)\n    } else {\n      api.reload('337695a4', component.options)\n    }\n    module.hot.accept(\"./Loader.vue?vue&type=template&id=337695a4\", function () {\n      api.rerender('337695a4', {\n        render: render,\n        staticRenderFns: staticRenderFns\n      })\n    })\n  }\n}\ncomponent.options.__file = \"src/components/UI/Loader.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"","export * from \"-!../../../node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"d2a26fb4-vue-loader-template\\\"}!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??ref--6!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=template&id=337695a4\""],"sourceRoot":""}