ngx-image-cropper 5.0.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/esm2020/lib/component/image-cropper.component.mjs +540 -0
- package/esm2020/lib/image-cropper.module.mjs +26 -0
- package/esm2020/lib/interfaces/cropper-options.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper-position.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper.settings.mjs +50 -0
- package/esm2020/lib/interfaces/dimensions.interface.mjs +2 -0
- package/esm2020/lib/interfaces/exif-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-cropped-event.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +2 -0
- package/esm2020/lib/interfaces/loaded-image.interface.mjs +2 -0
- package/esm2020/lib/interfaces/move-start.interface.mjs +7 -0
- package/esm2020/lib/services/crop.service.mjs +117 -0
- package/esm2020/lib/services/cropper-position.service.mjs +201 -0
- package/esm2020/lib/services/load-image.service.mjs +168 -0
- package/esm2020/lib/utils/blob.utils.mjs +12 -0
- package/esm2020/lib/utils/exif.utils.mjs +89 -0
- package/esm2020/lib/utils/hammer.utils.mjs +2 -0
- package/esm2020/lib/utils/keyboard.utils.mjs +40 -0
- package/esm2020/lib/utils/resize.utils.mjs +75 -0
- package/esm2020/ngx-image-cropper.mjs +5 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/{ngx-image-cropper.js → ngx-image-cropper.mjs} +250 -1034
- package/fesm2015/ngx-image-cropper.mjs.map +1 -0
- package/fesm2020/ngx-image-cropper.mjs +1315 -0
- package/fesm2020/ngx-image-cropper.mjs.map +1 -0
- package/lib/component/image-cropper.component.d.ts +12 -9
- package/lib/image-cropper.module.d.ts +6 -0
- package/lib/interfaces/cropper.settings.d.ts +1 -1
- package/lib/services/crop.service.d.ts +3 -0
- package/lib/services/cropper-position.service.d.ts +3 -0
- package/lib/services/load-image.service.d.ts +3 -0
- package/lib/utils/hammer.utils.d.ts +1 -1
- package/ngx-image-cropper.d.ts +1 -3
- package/package.json +22 -10
- package/bundles/ngx-image-cropper.umd.js +0 -2418
- package/bundles/ngx-image-cropper.umd.js.map +0 -1
- package/bundles/ngx-image-cropper.umd.min.js +0 -16
- package/bundles/ngx-image-cropper.umd.min.js.map +0 -1
- package/esm2015/lib/component/image-cropper.component.js +0 -827
- package/esm2015/lib/image-cropper.module.js +0 -24
- package/esm2015/lib/interfaces/cropper-options.interface.js +0 -56
- package/esm2015/lib/interfaces/cropper-position.interface.js +0 -20
- package/esm2015/lib/interfaces/cropper.settings.js +0 -140
- package/esm2015/lib/interfaces/dimensions.interface.js +0 -16
- package/esm2015/lib/interfaces/exif-transform.interface.js +0 -16
- package/esm2015/lib/interfaces/image-cropped-event.interface.js +0 -24
- package/esm2015/lib/interfaces/image-transform.interface.js +0 -20
- package/esm2015/lib/interfaces/index.js +0 -6
- package/esm2015/lib/interfaces/loaded-image.interface.js +0 -18
- package/esm2015/lib/interfaces/move-start.interface.js +0 -37
- package/esm2015/lib/services/crop.service.js +0 -176
- package/esm2015/lib/services/cropper-position.service.js +0 -259
- package/esm2015/lib/services/load-image.service.js +0 -304
- package/esm2015/lib/utils/blob.utils.js +0 -26
- package/esm2015/lib/utils/exif.utils.js +0 -128
- package/esm2015/lib/utils/hammer.utils.js +0 -29
- package/esm2015/lib/utils/keyboard.utils.js +0 -58
- package/esm2015/lib/utils/resize.utils.js +0 -116
- package/esm2015/ngx-image-cropper.js +0 -13
- package/esm2015/public-api.js +0 -11
- package/fesm2015/ngx-image-cropper.js.map +0 -1
- package/ngx-image-cropper.metadata.json +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../projects/ngx-image-cropper/src/lib/interfaces/cropper.settings.ts","../../../projects/ngx-image-cropper/src/lib/interfaces/move-start.interface.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/ngx-image-cropper/src/lib/utils/resize.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/crop.service.ts","../../../projects/ngx-image-cropper/src/lib/services/cropper-position.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/exif.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/load-image.service.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.ts","../../../projects/ngx-image-cropper/src/lib/utils/keyboard.utils.ts","../../../projects/ngx-image-cropper/src/lib/image-cropper.module.ts","../../../projects/ngx-image-cropper/src/lib/utils/blob.utils.ts"],"names":["CropperSettings","this","format","maintainAspectRatio","transform","aspectRatio","resizeToWidth","resizeToHeight","cropperMinWidth","cropperMinHeight","cropperMaxHeight","cropperMaxWidth","cropperStaticWidth","cropperStaticHeight","canvasRotation","initialStepSize","roundCropper","onlyScaleDown","imageQuality","autoCrop","backgroundColor","undefined","containWithinAspectRatio","hideResizeSquares","alignImage","cropperScaledMinWidth","cropperScaledMinHeight","cropperScaledMaxWidth","cropperScaledMaxHeight","stepSize","prototype","setOptions","options","_this","Object","keys","filter","k","forEach","validateOptions","setOptionsFromChanges","changes","currentValue","Error","MoveTypes","Move","Resize","Pinch","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","TypeError","call","pop","length","push","create","__read","o","m","r","i","ar","error","resizeCanvas","canvas","width","height","width_source","height_source","ratio_w","Math","round","ratio_h","ratio_w_half","ceil","ratio_h_half","ctx","getContext","img","getImageData","img2","createImageData","data","data2","j","x2","center_y","weight","weights","weights_alpha","gx_r","gx_g","gx_b","gx_a","xx_start","floor","yy_start","xx_stop","yy_stop","min","yy","dy","abs","center_x","w0","xx","dx","w","sqrt","pos_x","putImageData","CropService","crop","sourceImage","loadedImage","cropper","settings","imagePosition","getImagePosition","x1","y2","y1","cropCanvas","document","createElement","fillStyle","fillRect","scaleX","scale","flipH","scaleY","flipV","transformedImage","transformed","setTransform","size","translate","rotate","PI","drawImage","image","output","cropperPosition","assign","offsetImagePosition","getOffsetImagePosition","resizeRatio","getResizeRatio","base64","toDataURL","getQuality","sourceImageElement","nativeElement","ratio","offsetWidth","out","max","offsetX","offsetY","exifTransform","original","ratioWidth","ratioHeight","ratios","Array","arguments","concat","__spread","Injectable","args","providedIn","CropperPositionService","resetCropperPosition","offsetHeight","cropperWidth","cropperHeight","cropperHeightWithAspectRatio","cropperWidthWithAspectRatio","move","event","moveStart","diffX","getClientX","clientX","diffY","getClientY","clientY","resize","maxSize","moveX","moveY","position","newWidth","newHeight","checkAspectRatio","overflowX","overflowY","overflowX1","overflowX2","overflowY1","overflowY2","_a","touches","getTransformationsFromExifData","exifRotationOrBase64Image","imageBase64","view","DataView","replace","binaryString","atob","len","bytes","Uint8Array","charCodeAt","buffer","base64ToArrayBuffer","getUint16","byteLength","offset","marker","getUint32","little","tags","getExifRotation","flip","LoadImageService","autoRotateSupported","Image","onload","supported","src","loadImageFile","file","cropperSettings","fileReader","FileReader","loadImage","target","type","catch","readAsDataURL","imageType","isValidImageType","loadBase64Image","test","loadImageFromURL","url","onerror","context","crossOrigin","originalImage","originalBase64","res","transformImageBase64","complete","naturalWidth","naturalHeight","transformLoadedImage","originalSize","transformedSize","getTransformedSize","transformedBase64","loadImageFromBase64","minWidthToContain","minHeightToContain","ImageCropperComponent","cropService","cropperPositionService","loadImageService","sanitizer","cd","Hammer","window","setImageMaxSizeRetries","marginLeft","moveTypes","imageVisible","disabled","imageCropped","EventEmitter","startCropImage","imageLoaded","cropperReady","loadImageFailed","reset","ngOnChanges","onChangesUpdateSettings","onChangesInputImage","setLoadedImage","err","loadImageError","setMaxSize","setCropperScaledMinSize","setCropperScaledMaxSize","checkCropperPosition","doAutoCrop","markForCheck","setCssTransform","imageChangedEvent","imageURL","imageFile","isValidImageChangedEvent","files","_c","_b","safeTransformStyle","bypassSecurityTrustStyle","ngOnInit","activatePinchGesture","safeImgDataUrl","active","bypassSecurityTrustResourceUrl","console","emit","imageLoadedInView","setTimeout","checkImageMaxSizeRecursively","sourceImageLoaded","onResize","resizeCropperPosition","hammer","wrapper","get","set","enable","on","onPinch","bind","pinchStop","startPinch","isDevMode","warn","keyboardAccess","changeKeyboardStepSize","keyboardMoveCropper","key","includes","moveType","shiftKey","altKey","getInvertedPositionForKey","getPositionForKey","moveEvent","getEventForKey","preventDefault","stopPropagation","startMove","moveImg","moveStop","detectChanges","setCropperScaledMinWidth","setCropperScaledMinHeight","maintainSize","Component","selector","template","changeDetection","ChangeDetectionStrategy","OnPush","DomSanitizer","ChangeDetectorRef","ViewChild","static","Input","HostBinding","Output","HostListener","NgModule","imports","CommonModule","declarations","exports","base64Image","split","byteString","ab","ArrayBuffer","ia","Blob"],"mappings":"wdAIA,IAAAA,EAAA,WAAA,SAAAA,IAGEC,KAAAC,OAAuB,MACvBD,KAAAE,qBAAsB,EACtBF,KAAAG,UAA4B,GAC5BH,KAAAI,YAAc,EACdJ,KAAAK,cAAgB,EAChBL,KAAAM,eAAiB,EACjBN,KAAAO,gBAAkB,EAClBP,KAAAQ,iBAAmB,EACnBR,KAAAS,iBAAmB,EACnBT,KAAAU,gBAAkB,EAClBV,KAAAW,mBAAqB,EACrBX,KAAAY,oBAAsB,EACtBZ,KAAAa,eAAiB,EACjBb,KAAAc,gBAAkB,EAClBd,KAAAe,cAAe,EACff,KAAAgB,eAAgB,EAChBhB,KAAAiB,aAAe,GACfjB,KAAAkB,UAAW,EACXlB,KAAAmB,qBAA0BC,EAC1BpB,KAAAqB,0BAA2B,EAC3BrB,KAAAsB,mBAAoB,EACpBtB,KAAAuB,WAAgC,SAGhCvB,KAAAwB,sBAAwB,GACxBxB,KAAAyB,uBAAyB,GACzBzB,KAAA0B,sBAAwB,GACxB1B,KAAA2B,uBAAyB,GACzB3B,KAAA4B,SAAW5B,KAAKc,uBAEhBf,EAAA8B,UAAAC,WAAA,SAAWC,GAAX,IAAAC,EAAAhC,KACEiC,OAAOC,KAAKH,GACTI,QAAM,SAAEC,GAAM,OAAAA,KAAKJ,KACnBK,SAAO,SAAED,GAAM,OAAAJ,EAAKI,GAAKL,EAAQK,MACpCpC,KAAKsC,mBAGPvC,EAAA8B,UAAAU,sBAAA,SAAsBC,GAAtB,IAAAR,EAAAhC,KACEiC,OAAOC,KAAKM,GACTL,QAAM,SAAEC,GAAM,OAAAA,KAAKJ,KACnBK,SAAO,SAAED,GAAM,OAAAJ,EAAKI,GAAKI,EAAQJ,GAAGK,gBACvCzC,KAAKsC,mBAGCvC,EAAA8B,UAAAS,gBAAA,WACN,GAAItC,KAAKE,sBAAwBF,KAAKI,YACpC,MAAM,IAAIsC,MAAM,qEAjDtB,GCQA,IAAYC,EAAS,CACnBC,KAAI,OACJC,OAAM,SACNC,MAAK;;;;;;;;;;;;;;6FCsDSC,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,IAAW,MAAOG,GAAKL,EAAOK,IACpF,SAASC,EAASJ,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,IAAW,MAAOG,GAAKL,EAAOK,IACvF,SAASF,EAAKI,GAJlB,IAAeL,EAIaK,EAAOC,KAAOT,EAAQQ,EAAOL,QAJ1CA,EAIyDK,EAAOL,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,OAITO,KAAKR,EAAWK,GAClGH,GAAMN,EAAYA,EAAUa,MAAMhB,EAASC,GAAc,KAAKS,oBAItDO,EAAYjB,EAASkB,GACjC,IAAsGC,EAAGC,EAAGC,EAAGC,EAA3GC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPJ,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,IAAOK,KAAM,GAAIC,IAAK,IAChG,OAAOL,EAAI,CAAEZ,KAAMkB,EAAK,GAAIC,MAASD,EAAK,GAAIE,OAAUF,EAAK,IAAwB,mBAAXG,SAA0BT,EAAES,OAAOC,UAAY,WAAa,OAAOhF,OAAUsE,EACvJ,SAASM,EAAKK,GAAK,OAAO,SAAUC,GAAK,OACzC,SAAcC,GACV,GAAIhB,EAAG,MAAM,IAAIiB,UAAU,mCAC3B,KAAOb,OACH,GAAIJ,EAAI,EAAGC,IAAMC,EAAY,EAARc,EAAG,GAASf,EAAU,OAAIe,EAAG,GAAKf,EAAS,SAAOC,EAAID,EAAU,SAAMC,EAAEgB,KAAKjB,GAAI,GAAKA,EAAEV,SAAWW,EAAIA,EAAEgB,KAAKjB,EAAGe,EAAG,KAAKrB,KAAM,OAAOO,EAE3J,OADID,EAAI,EAAGC,IAAGc,EAAK,CAAS,EAARA,EAAG,GAAQd,EAAEb,QACzB2B,EAAG,IACP,KAAK,EAAG,KAAK,EAAGd,EAAIc,EAAI,MACxB,KAAK,EAAc,OAAXZ,EAAEC,QAAgB,CAAEhB,MAAO2B,EAAG,GAAIrB,MAAM,GAChD,KAAK,EAAGS,EAAEC,QAASJ,EAAIe,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKZ,EAAEI,IAAIW,MAAOf,EAAEG,KAAKY,MAAO,SACxC,QACI,KAAMjB,EAAIE,EAAEG,MAAML,EAAIA,EAAEkB,OAAS,GAAKlB,EAAEA,EAAEkB,OAAS,KAAkB,IAAVJ,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEZ,EAAI,EAAG,SACjG,GAAc,IAAVY,EAAG,MAAcd,GAAMc,EAAG,GAAKd,EAAE,IAAMc,EAAG,GAAKd,EAAE,IAAM,CAAEE,EAAEC,MAAQW,EAAG,GAAI,MAC9E,GAAc,IAAVA,EAAG,IAAYZ,EAAEC,MAAQH,EAAE,GAAI,CAAEE,EAAEC,MAAQH,EAAE,GAAIA,EAAIc,EAAI,MAC7D,GAAId,GAAKE,EAAEC,MAAQH,EAAE,GAAI,CAAEE,EAAEC,MAAQH,EAAE,GAAIE,EAAEI,IAAIa,KAAKL,GAAK,MACvDd,EAAE,IAAIE,EAAEI,IAAIW,MAChBf,EAAEG,KAAKY,MAAO,SAEtBH,EAAKjB,EAAKmB,KAAKrC,EAASuB,GAC1B,MAAOZ,GAAKwB,EAAK,CAAC,EAAGxB,GAAIS,EAAI,UAAeD,EAAIE,EAAI,EACtD,GAAY,EAARc,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAE3B,MAAO2B,EAAG,GAAKA,EAAG,QAAK,EAAQrB,MAAM,GArB9BL,CAAK,CAACwB,EAAGC,MAyBhCjD,OAAOwD,gBAwBpBC,EAAOC,EAAGV,GACtB,IAAIW,EAAsB,mBAAXb,QAAyBY,EAAEZ,OAAOC,UACjD,IAAKY,EAAG,OAAOD,EACf,IAAmBE,EAAYlC,EAA3BmC,EAAIF,EAAEP,KAAKM,GAAOI,EAAK,GAC3B,IACI,WAAc,IAANd,GAAgBA,KAAM,MAAQY,EAAIC,EAAEpC,QAAQI,MAAMiC,EAAGP,KAAKK,EAAErC,OAExE,MAAOwC,GAASrC,EAAI,CAAEqC,MAAOA,WAEzB,IACQH,IAAMA,EAAE/B,OAAS8B,EAAIE,EAAU,SAAIF,EAAEP,KAAKS,WAExC,GAAInC,EAAG,MAAMA,EAAEqC,OAE7B,OAAOD,EAgEc9D,OAAOwD,gBC5MhBQ,EAAaC,EAA2BC,EAAeC,OAC/DC,EAAeH,EAAOC,MACtBG,EAAgBJ,EAAOE,OAIvBG,EAAUF,GAHhBF,EAAQK,KAAKC,MAAMN,IAIbO,EAAUJ,GAHhBF,EAASI,KAAKC,MAAML,IAIdO,EAAeH,KAAKI,KAAKL,EAAU,GACnCM,EAAeL,KAAKI,KAAKF,EAAU,GAEnCI,EAAMZ,EAAOa,WAAW,MAC9B,GAAID,EAAK,CAMP,QALME,EAAMF,EAAIG,aAAa,EAAG,EAAGZ,EAAcC,GAC3CY,EAAOJ,EAAIK,gBAAgBhB,EAAOC,GAClCgB,EAAOJ,EAAII,KACXC,EAAQH,EAAKE,KAEVE,EAAI,EAAGA,EAAIlB,EAAQkB,IAC1B,IAAK,IAAIxB,EAAI,EAAGA,EAAIK,EAAOL,IAAK,KACxByB,EAAuB,GAAjBzB,EAAIwB,EAAInB,GACdqB,EAAWF,EAAIZ,EACjBe,EAAS,EACTC,EAAU,EACVC,EAAgB,EAChBC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EAELC,EAAWxB,KAAKyB,MAAMnC,EAAIS,GAC1B2B,EAAW1B,KAAKyB,MAAMX,EAAIZ,GAC5ByB,EAAU3B,KAAKI,MAAMd,EAAI,GAAKS,GAC9B6B,EAAU5B,KAAKI,MAAMU,EAAI,GAAKZ,GAClCyB,EAAU3B,KAAK6B,IAAIF,EAAS9B,GAC5B+B,EAAU5B,KAAK6B,IAAID,EAAS9B,GAE5B,IAAK,IAAIgC,EAAKJ,EAAUI,EAAKF,EAASE,IAIpC,QAHMC,EAAK/B,KAAKgC,IAAIhB,EAAWc,GAAMzB,EAC/B4B,EAAW3C,EAAIS,EACfmC,EAAKH,EAAKA,EACPI,EAAKX,EAAUW,EAAKR,EAASQ,IAAM,KACpCC,EAAKpC,KAAKgC,IAAIC,EAAWE,GAAMhC,EAC/BkC,EAAIrC,KAAKsC,KAAKJ,EAAKE,EAAKA,GAC9B,KAAIC,GAAK,GAAT,KAMME,EAAQ,GAAKJ,EAAKL,EAAKjC,GAE7B0B,IAHAN,EAAS,EAAIoB,EAAIA,EAAIA,EAAI,EAAIA,EAAIA,EAAI,GAGpBzB,EAAK2B,EAAQ,GAC9BpB,GAAiBF,EAEbL,EAAK2B,EAAQ,GAAK,MACpBtB,EAASA,EAASL,EAAK2B,EAAQ,GAAK,KACtCnB,GAAQH,EAASL,EAAK2B,GACtBlB,GAAQJ,EAASL,EAAK2B,EAAQ,GAC9BjB,GAAQL,EAASL,EAAK2B,EAAQ,GAC9BrB,GAAWD,GAGfJ,EAAME,GAAMK,EAAOF,EACnBL,EAAME,EAAK,GAAKM,EAAOH,EACvBL,EAAME,EAAK,GAAKO,EAAOJ,EACvBL,EAAME,EAAK,GAAKQ,EAAOJ,EAK3BzB,EAAOC,MAAQA,EACfD,EAAOE,OAASA,EAGhBU,EAAIkC,aAAa9B,EAAM,EAAG,qBC1E9B,SAAA+B,YAEEA,EAAApH,UAAAqH,KAAA,SAAKC,EAAyBC,EAA0BC,EAA0BC,OAC1EC,EAAgBvJ,KAAKwJ,iBAAiBL,EAAaC,EAAaC,EAASC,GACzEnD,EAAQoD,EAAchC,GAAKgC,EAAcE,GACzCrD,EAASmD,EAAcG,GAAKH,EAAcI,GAC1CC,EAAaC,SAASC,cAAc,UAC1CF,EAAWzD,MAAQA,EACnByD,EAAWxD,OAASA,MAEdU,EAAM8C,EAAW7C,WAAW,MAClC,GAAKD,EAAL,CAGgC,MAA5BwC,EAASnI,kBACX2F,EAAIiD,UAAYT,EAASnI,gBACzB2F,EAAIkD,SAAS,EAAG,EAAG7D,EAAOC,QAGtB6D,GAAUX,EAASnJ,UAAU+J,OAAS,IAAMZ,EAASnJ,UAAUgK,OAAS,EAAI,GAC5EC,GAAUd,EAASnJ,UAAU+J,OAAS,IAAMZ,EAASnJ,UAAUkK,OAAS,EAAI,GAE5EC,EAAmBlB,EAAYmB,YACrCzD,EAAI0D,aAAaP,EAAQ,EAAG,EAAGG,EAAQE,EAAiBG,KAAKtE,MAAQ,EAAGmE,EAAiBG,KAAKrE,OAAS,GACvGU,EAAI4D,WAAWnB,EAAcE,GAAKQ,GAASV,EAAcI,GAAKS,GAC9DtD,EAAI6D,QAAQrB,EAASnJ,UAAUwK,QAAU,GAAKnE,KAAKoE,GAAK,KACxD9D,EAAI+D,UAAUP,EAAiBQ,OAAQR,EAAiBG,KAAKtE,MAAQ,GAAImE,EAAiBG,KAAKrE,OAAS,OAElG2E,EAA4B,CAChC5E,MAAKA,EAAEC,OAAMA,EACbmD,cAAaA,EACbyB,gBAAe/I,OAAAgJ,OAAA,GAAO5B,IAEpBC,EAASjI,2BACX0J,EAAOG,oBAAsBlL,KAAKmL,uBAAuBhC,EAAaC,EAAaC,EAASC,QAExF8B,EAAcpL,KAAKqL,eAAelF,EAAOC,EAAQkD,GASvD,OARoB,IAAhB8B,IACFL,EAAO5E,MAAQK,KAAKC,MAAMN,EAAQiF,GAClCL,EAAO3E,OAASkD,EAASpJ,oBACrBsG,KAAKC,MAAMsE,EAAO5E,MAAQmD,EAASlJ,aACnCoG,KAAKC,MAAML,EAASgF,GACxBnF,EAAa2D,EAAYmB,EAAO5E,MAAO4E,EAAO3E,SAEhD2E,EAAOO,OAAS1B,EAAW2B,UAAU,SAAWjC,EAASrJ,OAAQD,KAAKwL,WAAWlC,IAC1EyB,IAGD9B,EAAApH,UAAA2H,iBAAA,SAAiBL,EAAyBC,EAA0BC,EAA0BC,OAC9FmC,EAAqBtC,EAAYuC,cACjCC,EAAQvC,EAAYmB,YAAYE,KAAKtE,MAAQsF,EAAmBG,YAEhEC,EAAuB,CAC3BpC,GAAIjD,KAAKC,MAAM4C,EAAQI,GAAKkC,GAC5BhC,GAAInD,KAAKC,MAAM4C,EAAQM,GAAKgC,GAC5BpE,GAAIf,KAAKC,MAAM4C,EAAQ9B,GAAKoE,GAC5BjC,GAAIlD,KAAKC,MAAM4C,EAAQK,GAAKiC,IAU9B,OAPKrC,EAASjI,2BACZwK,EAAIpC,GAAKjD,KAAKsF,IAAID,EAAIpC,GAAI,GAC1BoC,EAAIlC,GAAKnD,KAAKsF,IAAID,EAAIlC,GAAI,GAC1BkC,EAAItE,GAAKf,KAAK6B,IAAIwD,EAAItE,GAAI6B,EAAYmB,YAAYE,KAAKtE,OACvD0F,EAAInC,GAAKlD,KAAK6B,IAAIwD,EAAInC,GAAIN,EAAYmB,YAAYE,KAAKrE,SAGlDyF,GAGD5C,EAAApH,UAAAsJ,uBAAA,SAAuBhC,EAAyBC,EAA0BC,EAA0BC,OAItGyC,EACAC,EAJEnL,EAAiByI,EAASzI,eAAiBuI,EAAY6C,cAActB,OACrEc,EAAqBtC,EAAYuC,cACjCC,EAAQvC,EAAYmB,YAAYE,KAAKtE,MAAQsF,EAAmBG,YAIlE/K,EAAiB,GACnBkL,GAAW3C,EAAYmB,YAAYE,KAAKtE,MAAQiD,EAAY8C,SAASzB,KAAKrE,QAAU,EACpF4F,GAAW5C,EAAYmB,YAAYE,KAAKrE,OAASgD,EAAY8C,SAASzB,KAAKtE,OAAS,IAEpF4F,GAAW3C,EAAYmB,YAAYE,KAAKtE,MAAQiD,EAAY8C,SAASzB,KAAKtE,OAAS,EACnF6F,GAAW5C,EAAYmB,YAAYE,KAAKrE,OAASgD,EAAY8C,SAASzB,KAAKrE,QAAU,OAGjFyF,EAAuB,CAC3BpC,GAAIjD,KAAKC,MAAM4C,EAAQI,GAAKkC,GAASI,EACrCpC,GAAInD,KAAKC,MAAM4C,EAAQM,GAAKgC,GAASK,EACrCzE,GAAIf,KAAKC,MAAM4C,EAAQ9B,GAAKoE,GAASI,EACrCrC,GAAIlD,KAAKC,MAAM4C,EAAQK,GAAKiC,GAASK,GAUvC,OAPK1C,EAASjI,2BACZwK,EAAIpC,GAAKjD,KAAKsF,IAAID,EAAIpC,GAAI,GAC1BoC,EAAIlC,GAAKnD,KAAKsF,IAAID,EAAIlC,GAAI,GAC1BkC,EAAItE,GAAKf,KAAK6B,IAAIwD,EAAItE,GAAI6B,EAAYmB,YAAYE,KAAKtE,OACvD0F,EAAInC,GAAKlD,KAAK6B,IAAIwD,EAAInC,GAAIN,EAAYmB,YAAYE,KAAKrE,SAGlDyF,GAGT5C,EAAApH,UAAAwJ,eAAA,SAAelF,EAAeC,EAAgBkD,OACtC6C,EAAa7C,EAASjJ,cAAgB8F,EACtCiG,EAAc9C,EAAShJ,eAAiB8F,EACxCiG,EAAS,IAAIC,MAEfhD,EAASjJ,cAAgB,GAC3BgM,EAAO7G,KAAK2G,GAEV7C,EAAShJ,eAAiB,GAC5B+L,EAAO7G,KAAK4G,OAGRvI,EAA2B,IAAlBwI,EAAO9G,OAAe,EAAIiB,KAAK6B,IAAGrE,MAARwC,gBF+BzC,IAAK,IAAIT,EAAK,GAAID,EAAI,EAAGA,EAAIyG,UAAUhH,OAAQO,IAC3CC,EAAKA,EAAGyG,OAAO9G,EAAO6G,UAAUzG,KACpC,OAAOC,EEjCsC0G,CAAQJ,IAErD,OAAIxI,EAAS,IAAMyF,EAAStI,cACnB6C,EAEF2C,KAAK6B,IAAIxE,EAAQ,IAG1BoF,EAAApH,UAAA2J,WAAA,SAAWlC,GACT,OAAO9C,KAAK6B,IAAI,EAAG7B,KAAKsF,IAAI,EAAGxC,EAASrI,aAAe,gCA3H1DyL,EAAAA,WAAUC,KAAA,CAAC,CAAEC,WAAY,uHCA1B,SAAAC,YAEEA,EAAAhL,UAAAiL,qBAAA,SAAqB3D,EAAyB6B,EAAkC1B,GAC9E,GAAKH,MAAAA,OAAW,EAAXA,EAAauC,cAAlB,KAGMD,EAAqBtC,EAAYuC,cACvC,GAAIpC,EAAS1I,qBAAuB0I,EAAS3I,mBAC3CqK,EAAgBvB,GAAK,EACrBuB,EAAgBzD,GAAKkE,EAAmBG,YAActC,EAAS3I,mBAC7D2I,EAAS3I,mBAAqB8K,EAAmBG,YACnDZ,EAAgBrB,GAAK,EACrBqB,EAAgBtB,GAAK+B,EAAmBsB,aAAezD,EAAS1I,oBAC9D0I,EAAS1I,oBAAsB6K,EAAmBsB,iBAC/C,KACCC,EAAexG,KAAK6B,IAAIiB,EAAS5H,sBAAuB+J,EAAmBG,aAC3EqB,EAAgBzG,KAAK6B,IAAIiB,EAAS3H,uBAAwB8J,EAAmBsB,cACnF,GAAKzD,EAASpJ,oBAKP,GAAIuL,EAAmBG,YAActC,EAASlJ,YAAcqL,EAAmBsB,aAAc,CAClG/B,EAAgBvB,GAAK,EACrBuB,EAAgBzD,GAAKyF,MACfE,EAA+BF,EAAe1D,EAASlJ,YAC7D4K,EAAgBrB,IAAM8B,EAAmBsB,aAAeG,GAAgC,EACxFlC,EAAgBtB,GAAKsB,EAAgBrB,GAAKuD,MACrC,CACLlC,EAAgBrB,GAAK,EACrBqB,EAAgBtB,GAAKuD,MACfE,EAA8BF,EAAgB3D,EAASlJ,YAC7D4K,EAAgBvB,IAAMgC,EAAmBG,YAAcuB,GAA+B,EACtFnC,EAAgBzD,GAAKyD,EAAgBvB,GAAK0D,OAf1CnC,EAAgBvB,GAAK,EACrBuB,EAAgBzD,GAAKyF,EACrBhC,EAAgBrB,GAAK,EACrBqB,EAAgBtB,GAAKuD,KAiB3BJ,EAAAhL,UAAAuL,KAAA,SAAKC,EAAYC,EAAsBtC,OAC/BuC,EAAQvN,KAAKwN,WAAWH,GAASC,EAAUG,QAC3CC,EAAQ1N,KAAK2N,WAAWN,GAASC,EAAUM,QAEjD5C,EAAgBvB,GAAK6D,EAAU7D,GAAK8D,EACpCvC,EAAgBrB,GAAK2D,EAAU3D,GAAK+D,EACpC1C,EAAgBzD,GAAK+F,EAAU/F,GAAKgG,EACpCvC,EAAgBtB,GAAK4D,EAAU5D,GAAKgE,GAGtCb,EAAAhL,UAAAgM,OAAA,SAAOR,EAAYC,EAAsBtC,EAAkC8C,EAAqBxE,OACxFyE,EAAQ/N,KAAKwN,WAAWH,GAASC,EAAUG,QAC3CO,EAAQhO,KAAK2N,WAAWN,GAASC,EAAUM,QACjD,OAAQN,EAAUW,UAChB,IAAK,OACHjD,EAAgBvB,GAAKjD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU7D,GAAKsE,EAAO/C,EAAgBzD,GAAK+B,EAAS5H,uBACzFsJ,EAAgBzD,GAAK+B,EAAS9H,uBAChC,MACF,IAAK,UACHwJ,EAAgBvB,GAAKjD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU7D,GAAKsE,EAAO/C,EAAgBzD,GAAK+B,EAAS5H,uBACzFsJ,EAAgBzD,GAAK+B,EAAS9H,uBAChCwJ,EAAgBrB,GAAKnD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU3D,GAAKqE,EAAOhD,EAAgBtB,GAAKJ,EAAS3H,wBACzFqJ,EAAgBtB,GAAKJ,EAAS7H,wBAChC,MACF,IAAK,MACHuJ,EAAgBrB,GAAKnD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU3D,GAAKqE,EAAOhD,EAAgBtB,GAAKJ,EAAS3H,wBACzFqJ,EAAgBtB,GAAKJ,EAAS7H,wBAChC,MACF,IAAK,WACHuJ,EAAgBzD,GAAKf,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU/F,GAAKwG,EAAO/C,EAAgBvB,GAAKH,EAAS5H,uBACzFsJ,EAAgBvB,GAAKH,EAAS9H,uBAChCwJ,EAAgBrB,GAAKnD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU3D,GAAKqE,EAAOhD,EAAgBtB,GAAKJ,EAAS3H,wBACzFqJ,EAAgBtB,GAAKJ,EAAS7H,wBAChC,MACF,IAAK,QACHuJ,EAAgBzD,GAAKf,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU/F,GAAKwG,EAAO/C,EAAgBvB,GAAKH,EAAS5H,uBACzFsJ,EAAgBvB,GAAKH,EAAS9H,uBAChC,MACF,IAAK,cACHwJ,EAAgBzD,GAAKf,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU/F,GAAKwG,EAAO/C,EAAgBvB,GAAKH,EAAS5H,uBACzFsJ,EAAgBvB,GAAKH,EAAS9H,uBAChCwJ,EAAgBtB,GAAKlD,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU5D,GAAKsE,EAAOhD,EAAgBrB,GAAKL,EAAS3H,wBACzFqJ,EAAgBrB,GAAKL,EAAS7H,wBAChC,MACF,IAAK,SACHuJ,EAAgBtB,GAAKlD,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU5D,GAAKsE,EAAOhD,EAAgBrB,GAAKL,EAAS3H,wBACzFqJ,EAAgBrB,GAAKL,EAAS7H,wBAChC,MACF,IAAK,aACHuJ,EAAgBvB,GAAKjD,KAAK6B,IAAI7B,KAAKsF,IAAIwB,EAAU7D,GAAKsE,EAAO/C,EAAgBzD,GAAK+B,EAAS5H,uBACzFsJ,EAAgBzD,GAAK+B,EAAS9H,uBAChCwJ,EAAgBtB,GAAKlD,KAAKsF,IAAItF,KAAK6B,IAAIiF,EAAU5D,GAAKsE,EAAOhD,EAAgBrB,GAAKL,EAAS3H,wBACzFqJ,EAAgBrB,GAAKL,EAAS7H,wBAChC,MACF,IAAK,aACGyI,EAAQmD,EAAMnD,MACdgE,EAAW1H,KAAK6B,IACpB7B,KAAKsF,IAAIxC,EAAS9H,sBAAwBgF,KAAKgC,IAAI8E,EAAU/F,GAAK+F,EAAU7D,IAAOS,GACnFZ,EAAS5H,uBACLyM,EAAY3H,KAAK6B,IACrB7B,KAAKsF,IAAIxC,EAAS7H,uBAAyB+E,KAAKgC,IAAI8E,EAAU5D,GAAK4D,EAAU3D,IAAOO,GACpFZ,EAAS3H,wBACXqJ,EAAgBvB,GAAK6D,EAAUG,QAAUS,EAAW,EACpDlD,EAAgBzD,GAAK+F,EAAUG,QAAUS,EAAW,EACpDlD,EAAgBrB,GAAK2D,EAAUM,QAAUO,EAAY,EACrDnD,EAAgBtB,GAAK4D,EAAUM,QAAUO,EAAY,EACjDnD,EAAgBvB,GAAK,GACvBuB,EAAgBzD,IAAMyD,EAAgBvB,GACtCuB,EAAgBvB,GAAK,GACZuB,EAAgBzD,GAAKuG,EAAQ3H,QACtC6E,EAAgBvB,IAAOuB,EAAgBzD,GAAKuG,EAAQ3H,MACpD6E,EAAgBzD,GAAKuG,EAAQ3H,OAE3B6E,EAAgBrB,GAAK,GACvBqB,EAAgBtB,IAAMsB,EAAgBrB,GACtCqB,EAAgBrB,GAAK,GACZqB,EAAgBtB,GAAKoE,EAAQ1H,SACtC4E,EAAgBrB,IAAOqB,EAAgBtB,GAAKoE,EAAQ1H,OACpD4E,EAAgBtB,GAAKoE,EAAQ1H,QAK/BkD,EAASpJ,qBACXF,KAAKoO,iBAAiBd,EAAUW,SAAUjD,EAAiB8C,EAASxE,IAIxEuD,EAAAhL,UAAAuM,iBAAA,SAAiBH,EAAkBjD,EAAkC8C,EAAqBxE,OACpF+E,EAAY,EACZC,EAAY,EAEhB,OAAQL,GACN,IAAK,MACHjD,EAAgBzD,GAAKyD,EAAgBvB,IAAMuB,EAAgBtB,GAAKsB,EAAgBrB,IAAML,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAId,EAAgBzD,GAAKuG,EAAQ3H,MAAO,GACzDmI,EAAY9H,KAAKsF,IAAI,EAAId,EAAgBrB,GAAI,IACzC0E,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBzD,IAAO+G,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBrB,IAAO2E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAYD,EAAY/E,EAASlJ,aAE1G,MACF,IAAK,SACH4K,EAAgBzD,GAAKyD,EAAgBvB,IAAMuB,EAAgBtB,GAAKsB,EAAgBrB,IAAML,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAId,EAAgBzD,GAAKuG,EAAQ3H,MAAO,GACzDmI,EAAY9H,KAAKsF,IAAId,EAAgBtB,GAAKoE,EAAQ1H,OAAQ,IACtDiI,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBzD,IAAO+G,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBtB,IAAO4E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAaD,EAAY/E,EAASlJ,aAE3G,MACF,IAAK,UACH4K,EAAgBrB,GAAKqB,EAAgBtB,IAAMsB,EAAgBzD,GAAKyD,EAAgBvB,IAAMH,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAI,EAAId,EAAgBvB,GAAI,GAC7C6E,EAAY9H,KAAKsF,IAAI,EAAId,EAAgBrB,GAAI,IACzC0E,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBvB,IAAO6E,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBrB,IAAO2E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAYD,EAAY/E,EAASlJ,aAE1G,MACF,IAAK,WACH4K,EAAgBrB,GAAKqB,EAAgBtB,IAAMsB,EAAgBzD,GAAKyD,EAAgBvB,IAAMH,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAId,EAAgBzD,GAAKuG,EAAQ3H,MAAO,GACzDmI,EAAY9H,KAAKsF,IAAI,EAAId,EAAgBrB,GAAI,IACzC0E,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBzD,IAAO+G,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBrB,IAAO2E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAYD,EAAY/E,EAASlJ,aAE1G,MACF,IAAK,QACL,IAAK,cACH4K,EAAgBtB,GAAKsB,EAAgBrB,IAAMqB,EAAgBzD,GAAKyD,EAAgBvB,IAAMH,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAId,EAAgBzD,GAAKuG,EAAQ3H,MAAO,GACzDmI,EAAY9H,KAAKsF,IAAId,EAAgBtB,GAAKoE,EAAQ1H,OAAQ,IACtDiI,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBzD,IAAO+G,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBtB,IAAO4E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAYD,EAAY/E,EAASlJ,aAE1G,MACF,IAAK,OACL,IAAK,aACH4K,EAAgBtB,GAAKsB,EAAgBrB,IAAMqB,EAAgBzD,GAAKyD,EAAgBvB,IAAMH,EAASlJ,YAC/FiO,EAAY7H,KAAKsF,IAAI,EAAId,EAAgBvB,GAAI,GAC7C6E,EAAY9H,KAAKsF,IAAId,EAAgBtB,GAAKoE,EAAQ1H,OAAQ,IACtDiI,EAAY,GAAKC,EAAY,KAC/BtD,EAAgBvB,IAAO6E,EAAYhF,EAASlJ,YAAeiO,EAAaC,EAAYhF,EAASlJ,YAAeiO,EAC5GrD,EAAgBtB,IAAO4E,EAAYhF,EAASlJ,YAAeiO,EAAYC,EAAYD,EAAY/E,EAASlJ,aAE1G,MACF,IAAK,SACH4K,EAAgBzD,GAAKyD,EAAgBvB,IAAMuB,EAAgBtB,GAAKsB,EAAgBrB,IAAML,EAASlJ,YAC/F4K,EAAgBtB,GAAKsB,EAAgBrB,IAAMqB,EAAgBzD,GAAKyD,EAAgBvB,IAAMH,EAASlJ,gBACzFmO,EAAa/H,KAAKsF,IAAI,EAAId,EAAgBvB,GAAI,GAC9C+E,EAAahI,KAAKsF,IAAId,EAAgBzD,GAAKuG,EAAQ3H,MAAO,GAC1DsI,EAAajI,KAAKsF,IAAId,EAAgBtB,GAAKoE,EAAQ1H,OAAQ,GAC3DsI,EAAalI,KAAKsF,IAAI,EAAId,EAAgBrB,GAAI,IAChD4E,EAAa,GAAKC,EAAa,GAAKC,EAAa,GAAKC,EAAa,KACrE1D,EAAgBvB,IAAOgF,EAAanF,EAASlJ,YAAemO,EAAcE,EAAanF,EAASlJ,YAAemO,EAC/GvD,EAAgBzD,IAAOmH,EAAapF,EAASlJ,YAAeoO,EAAcE,EAAapF,EAASlJ,YAAeoO,EAC/GxD,EAAgBrB,IAAO+E,EAAapF,EAASlJ,YAAeoO,EAAaE,EAAaF,EAAalF,EAASlJ,YAC5G4K,EAAgBtB,IAAO+E,EAAanF,EAASlJ,YAAemO,EAAaE,EAAaF,EAAajF,EAASlJ,eAMpHyM,EAAAhL,UAAA2L,WAAA,SAAWH,SACT,OAAoB,QAAbsB,EAAAtB,EAAMuB,eAAO,IAAAD,OAAA,EAAAA,EAAG,GAAGlB,UAAWJ,EAAMI,SAAW,GAGxDZ,EAAAhL,UAAA8L,WAAA,SAAWN,SACT,OAAoB,QAAbsB,EAAAtB,EAAMuB,eAAO,IAAAD,OAAA,EAAAA,EAAG,GAAGf,UAAWP,EAAMO,SAAW,4BAlNzDlB,EAAAA,WAAUC,KAAA,CAAC,CAAEC,WAAY,+GCqBViC,EAA+BC,GAI7C,OAHyC,iBAA9BA,IACTA,EAsBJ,SAAyBC,OACjBC,EAAO,IAAIC,SAiCnB,SAA6BF,GAC3BA,EAAcA,EAAYG,QAAQ,8BAA+B,IAIjE,QAHMC,EAAeC,KAAKL,GACpBM,EAAMF,EAAa5J,OACnB+J,EAAQ,IAAIC,WAAWF,GACpBvJ,EAAI,EAAGA,EAAIuJ,EAAKvJ,IACvBwJ,EAAMxJ,GAAKqJ,EAAaK,WAAW1J,GAErC,OAAOwJ,EAAMG,OAzCaC,CAAoBX,IAC9C,GAAiC,QAA7BC,EAAKW,UAAU,GAAG,GACpB,OAAQ,MAEJpK,EAASyJ,EAAKY,WAChBC,EAAS,EACb,KAAOA,EAAStK,GAAQ,CACtB,GAAIyJ,EAAKW,UAAUE,EAAS,GAAG,IAAU,EAAG,OAAQ,MAC9CC,EAASd,EAAKW,UAAUE,GAAQ,GAEtC,GADAA,GAAU,EACI,OAAVC,EAAkB,CACpB,GAA2C,aAAvCd,EAAKe,UAAUF,GAAU,GAAG,GAC9B,OAAQ,MAGJG,EAA+C,OAAtChB,EAAKW,UAAUE,GAAU,GAAG,GAC3CA,GAAUb,EAAKe,UAAUF,EAAS,EAAGG,OAC/BC,EAAOjB,EAAKW,UAAUE,EAAQG,GACpCH,GAAU,EACV,IAAK,IAAI/J,EAAI,EAAGA,EAAImK,EAAMnK,IACxB,GAAiD,KAA7CkJ,EAAKW,UAAUE,EAAc,GAAJ/J,EAASkK,GACpC,OAAOhB,EAAKW,UAAUE,EAAc,GAAJ/J,EAAU,EAAGkK,OAG5C,CAAA,GAA0B,QAAZ,MAATF,GACV,MAEAD,GAAUb,EAAKW,UAAUE,GAAQ,IAGrC,OAAQ,EArDsBK,CAAgBpB,IAEtCA,GACN,KAAK,EACH,MAAO,CAAEnE,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,KAAK,EACH,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,GAC5B,QACE,MAAO,CAAExF,OAAQ,EAAGwF,MAAM,qBClChC,SAAAC,IAGUpQ,KAAAqQ,oBDAD,IAAIjN,SAAO,SAAEC,OACZ2D,EAAM,IAAIsJ,MAChBtJ,EAAIuJ,OAAM,eAEFC,EAA0B,IAAdxJ,EAAIb,OAA8B,IAAfa,EAAIZ,OACzC/C,EAAQmN,IAEVxJ,EAAIyJ,IAfN,oaCUAL,EAAAvO,UAAA6O,cAAA,SAAcC,EAAYC,GAA1B,IAAA5O,EAAAhC,KACE,OAAO,IAAIoD,SAAO,SAAEC,EAASC,OACrBuN,EAAa,IAAIC,WACvBD,EAAWN,OAAM,SAAIlD,GACnBrL,EAAK+O,UAAU1D,EAAM2D,OAAOnN,OAAQ8M,EAAKM,KAAML,GAC5C7M,KAAKV,GACL6N,MAAM5N,IAEXuN,EAAWM,cAAcR,OAIrBP,EAAAvO,UAAAkP,UAAA,SAAUhC,EAAqBqC,EAAmBR,GACxD,OAAK5Q,KAAKqR,iBAAiBD,GAGpBpR,KAAKsR,gBAAgBvC,EAAa6B,GAFhCxN,QAAQE,OAAO,IAAIZ,MAAM,wBAK5B0N,EAAAvO,UAAAwP,iBAAA,SAAiBJ,GACvB,MAAO,0CAA0CM,KAAKN,IAGxDb,EAAAvO,UAAA2P,iBAAA,SAAiBC,EAAab,GAA9B,IAAA5O,EAAAhC,KACE,OAAO,IAAIoD,SAAO,SAAEC,EAASC,OACrB0D,EAAM,IAAIsJ,MAChBtJ,EAAI0K,QAAO,WAAS,OAAApO,GACpB0D,EAAIuJ,OAAM,eACFrK,EAAS2D,SAASC,cAAc,UAChC6H,EAAUzL,EAAOa,WAAW,MAClCb,EAAOC,MAAQa,EAAIb,MACnBD,EAAOE,OAASY,EAAIZ,OACpBuL,EAAQ9G,UAAU7D,EAAK,EAAG,GAC1BhF,EAAKsP,gBAAgBpL,EAAOqF,YAAaqF,GAAiB7M,KAAKV,IAEjE2D,EAAI4K,YAAc,YAClB5K,EAAIyJ,IAAMgB,MAIdrB,EAAAvO,UAAAyP,gBAAA,SAAgBvC,EAAqB6B,GAArC,IAAA5O,EAAAhC,KACE,OAAO,IAAIoD,SAAO,SAAmBC,EAASC,OACtCuO,EAAgB,IAAIvB,MAC1BuB,EAActB,OAAM,WAAS,OAAAlN,EAAQ,CACnCwO,cAAaA,EACbC,eAAgB/C,KAElB8C,EAAcH,QAAUpO,EACxBuO,EAAcpB,IAAM1B,KACnBhL,MAAI,SAAEgO,GAAyB,OAAA/P,EAAKgQ,qBAAqBD,EAAKnB,OAGrDR,EAAAvO,UAAAmQ,qBAAA,SAAqBD,EAAsBnB,qGACpC,MAAA,CAAA,EAAM5Q,KAAKqQ,4BACR,MAAA,CAAA,EAAMxB,EADTF,EAAAlK,QACsD,EAAIsN,EAAID,wBACjF,OADM7F,EAAgB0C,EAAAlK,OACjBsN,EAAIF,eAAkBE,EAAIF,cAAcI,UAGvC7I,EAAc,CAClB8C,SAAU,CACRZ,OAAQyG,EAAID,eACZhH,MAAOiH,EAAIF,cACXpH,KAAM,CACJtE,MAAO4L,EAAIF,cAAcK,aACzB9L,OAAQ2L,EAAIF,cAAcM,gBAG9BlG,cAAaA,GAEf,CAAA,EAAOjM,KAAKoS,qBAAqBhJ,EAAawH,KAb5C,CAAA,EAAOxN,QAAQE,OAAO,IAAIZ,MAAM,6BAgB9B0N,EAAAvO,UAAAuQ,qBAAA,SAAqBhJ,EAAmCwH,+GAM5D,OALM/P,EAAiB+P,EAAgB/P,eAAiBuI,EAAY6C,cAActB,OAC5E0H,EAAe,CACnBlM,MAAOiD,EAAY8C,SAASpB,MAAMoH,aAClC9L,OAAQgD,EAAY8C,SAASpB,MAAMqH,eAEd,IAAnBtR,GAAyBuI,EAAY6C,cAAckE,MAASS,EAAgBvP,0BAgB1EiR,EAAkBtS,KAAKuS,mBAAmBF,EAAcjJ,EAAY6C,cAAe2E,IACnF1K,EAAS2D,SAASC,cAAc,WAC/B3D,MAAQmM,EAAgBnM,MAC/BD,EAAOE,OAASkM,EAAgBlM,QAC1BU,EAAMZ,EAAOa,WAAW,OAC1ByD,aACFpB,EAAY6C,cAAckE,MAAQ,EAAI,EACtC,EACA,EACA,EACAjK,EAAOC,MAAQ,EACfD,EAAOE,OAAS,GAElBU,EAAI6D,OAAOnE,KAAKoE,IAAM/J,EAAiB,IACvCiG,EAAI+D,UACFzB,EAAY8C,SAASpB,OACpBuH,EAAalM,MAAQ,GACrBkM,EAAajM,OAAS,GAEnBoM,EAAoBtM,EAAOqF,YACR,CAAA,EAAMvL,KAAKyS,oBAAoBD,KAnCtD,CAAA,EAAO,CACLtG,SAAU,CACRZ,OAAQlC,EAAY8C,SAASZ,OAC7BR,MAAO1B,EAAY8C,SAASpB,MAC5BL,KAAIxI,OAAAgJ,OAAA,GAAMoH,IAEZ9H,YAAa,CACXe,OAAQlC,EAAY8C,SAASZ,OAC7BR,MAAO1B,EAAY8C,SAASpB,MAC5BL,KAAIxI,OAAAgJ,OAAA,GAAMoH,IAEZpG,cAAe7C,EAAY6C,uBAyB/B,OADM3B,EAAmBqE,EAAAlK,OACzB,CAAA,EAAO,CACLyH,SAAU,CACRZ,OAAQlC,EAAY8C,SAASZ,OAC7BR,MAAO1B,EAAY8C,SAASpB,MAC5BL,KAAIxI,OAAAgJ,OAAA,GAAMoH,IAEZ9H,YAAa,CACXe,OAAQkH,EACR1H,MAAOR,EACPG,KAAM,CACJtE,MAAOmE,EAAiBnE,MACxBC,OAAQkE,EAAiBlE,SAG7B6F,cAAe7C,EAAY6C,wBAIvBmE,EAAAvO,UAAA4Q,oBAAA,SAAoB1D,GAC1B,OAAO,IAAI3L,SAAO,SAAqBC,EAASC,OACxCwH,EAAQ,IAAIwF,MAClBxF,EAAMyF,OAAM,WAAS,OAAAlN,EAAQyH,IAC7BA,EAAM4G,QAAUpO,EAChBwH,EAAM2F,IAAM1B,MAIRqB,EAAAvO,UAAA0Q,mBAAA,SACNF,EACApG,EACA2E,OAEM/P,EAAiB+P,EAAgB/P,eAAiBoL,EAActB,OACtE,GAAIiG,EAAgBvP,yBAA0B,CAC5C,GAAIR,EAAiB,EAAG,KAChB6R,EAAoBL,EAAalM,MAAQyK,EAAgBxQ,YACzDuS,EAAqBN,EAAajM,OAASwK,EAAgBxQ,YACjE,MAAO,CACL+F,MAAOK,KAAKsF,IAAIuG,EAAajM,OAAQsM,GACrCtM,OAAQI,KAAKsF,IAAIuG,EAAalM,MAAOwM,IAGjCD,EAAoBL,EAAajM,OAASwK,EAAgBxQ,YAC1DuS,EAAqBN,EAAalM,MAAQyK,EAAgBxQ,YAChE,MAAO,CACL+F,MAAOK,KAAKsF,IAAIuG,EAAalM,MAAOuM,GACpCtM,OAAQI,KAAKsF,IAAIuG,EAAajM,OAAQuM,IAK5C,OAAI9R,EAAiB,EACZ,CACLuF,OAAQiM,EAAalM,MACrBA,MAAOkM,EAAajM,QAGjB,CACLD,MAAOkM,EAAalM,MACpBC,OAAQiM,EAAajM,kCAnL1BsG,EAAAA,WAAUC,KAAA,CAAC,CAACC,WAAY,uHCkFvB,SAAAgG,EACUC,EACAC,EACAC,EACAC,EACAC,GAJAjT,KAAA6S,YAAAA,EACA7S,KAAA8S,uBAAAA,EACA9S,KAAA+S,iBAAAA,EACA/S,KAAAgT,UAAAA,EACAhT,KAAAiT,GAAAA,EAhEFjT,KAAAkT,QAA6B,OAANC,aAAM,IAANA,YAAM,EAANA,OAAiB,SAAK,KAC7CnT,KAAAsJ,SAAW,IAAIvJ,EACfC,KAAAoT,uBAAyB,EAMjCpT,KAAAqT,WAAiC,MAEjCrT,KAAAsT,UAAY3Q,EACZ3C,KAAAuT,cAAe,EAUNvT,KAAAC,OAAuBD,KAAKsJ,SAASrJ,OACrCD,KAAAG,UAA4B,GAC5BH,KAAAE,oBAAsBF,KAAKsJ,SAASpJ,oBACpCF,KAAAI,YAAcJ,KAAKsJ,SAASlJ,YAC5BJ,KAAAK,cAAgBL,KAAKsJ,SAASjJ,cAC9BL,KAAAM,eAAiBN,KAAKsJ,SAAShJ,eAC/BN,KAAAO,gBAAkBP,KAAKsJ,SAAS/I,gBAChCP,KAAAQ,iBAAmBR,KAAKsJ,SAAS9I,iBACjCR,KAAAS,iBAAmBT,KAAKsJ,SAAS7I,iBACjCT,KAAAU,gBAAkBV,KAAKsJ,SAAS5I,gBAChCV,KAAAW,mBAAqBX,KAAKsJ,SAAS3I,mBACnCX,KAAAY,oBAAsBZ,KAAKsJ,SAAS1I,oBACpCZ,KAAAa,eAAiBb,KAAKsJ,SAASzI,eAC/Bb,KAAAc,gBAAkBd,KAAKsJ,SAASxI,gBAChCd,KAAAe,aAAef,KAAKsJ,SAASvI,aAC7Bf,KAAAgB,cAAgBhB,KAAKsJ,SAAStI,cAC9BhB,KAAAiB,aAAejB,KAAKsJ,SAASrI,aAC7BjB,KAAAkB,SAAWlB,KAAKsJ,SAASpI,SACzBlB,KAAAmB,gBAAkBnB,KAAKsJ,SAASnI,gBAChCnB,KAAAqB,yBAA2BrB,KAAKsJ,SAASjI,yBACzCrB,KAAAsB,kBAAoBtB,KAAKsJ,SAAShI,kBAClCtB,KAAAqJ,QAA2B,CAClCI,IAAK,IACLE,IAAK,IACLpC,GAAI,IACJmC,GAAI,KAGG1J,KAAAuB,WAAgCvB,KAAKsJ,SAAS/H,WAE9CvB,KAAAwT,UAAW,EAEVxT,KAAAyT,aAAe,IAAIC,EAAAA,aACnB1T,KAAA2T,eAAiB,IAAID,EAAAA,aACrB1T,KAAA4T,YAAc,IAAIF,EAAAA,aAClB1T,KAAA6T,aAAe,IAAIH,EAAAA,aACnB1T,KAAA8T,gBAAkB,IAAIJ,EAAAA,aAS9B1T,KAAK+T,eAGPnB,EAAA/Q,UAAAmS,YAAA,SAAYxR,GAAZ,MAAAR,EAAAhC,KACEA,KAAKiU,wBAAwBzR,GAC7BxC,KAAKkU,oBAAoB1R,IAEL,QAAhBmM,EAAA3O,KAAKoJ,mBAAW,IAAAuF,OAAA,EAAAA,EAAEzC,SAASpB,MAAMmH,YAAazP,EAAQnB,0BAA4BmB,EAAQ3B,iBAC5Fb,KAAK+S,iBACFX,qBAAqBpS,KAAKoJ,YAAapJ,KAAKsJ,UAC5CvF,MAAI,SAAEgO,GAAQ,OAAA/P,EAAKmS,eAAepC,MAClCb,OAAK,SAAEkD,GAAQ,OAAApS,EAAKqS,eAAeD,OAEpC5R,EAAQ6G,SAAW7G,EAAQtC,qBAAuBsC,EAAQpC,eAC5DJ,KAAKsU,aACLtU,KAAKuU,0BACLvU,KAAKwU,0BACDxU,KAAKE,sBAAwBsC,EAAQtC,qBAAuBsC,EAAQpC,aACtEJ,KAAK8M,uBACItK,EAAQ6G,UACjBrJ,KAAKyU,sBAAqB,GAC1BzU,KAAK0U,cAEP1U,KAAKiT,GAAG0B,gBAENnS,EAAQrC,YACVH,KAAKG,UAAYH,KAAKG,WAAa,GACnCH,KAAK4U,kBACL5U,KAAK0U,eAID9B,EAAA/Q,UAAAoS,wBAAA,SAAwBzR,GAC9BxC,KAAKsJ,SAAS/G,sBAAsBC,GAEhCxC,KAAKsJ,SAAS1I,qBAAuBZ,KAAKsJ,SAAS3I,oBACrDX,KAAKsJ,SAASxH,WAAW,CACvBR,mBAAmB,EACnBf,gBAAiBP,KAAKsJ,SAAS3I,mBAC/BH,iBAAkBR,KAAKsJ,SAAS1I,oBAChCH,iBAAkBT,KAAKsJ,SAAS1I,oBAChCF,gBAAiBV,KAAKsJ,SAAS3I,mBAC/BT,qBAAqB,KAKnB0S,EAAA/Q,UAAAqS,oBAAA,SAAoB1R,IACtBA,EAAQqS,mBAAqBrS,EAAQsS,UAAYtS,EAAQuM,aAAevM,EAAQuS,YAClF/U,KAAK+T,QAEHvR,EAAQqS,mBAAqB7U,KAAKgV,4BACpChV,KAAK0Q,cAAc1Q,KAAK6U,kBAAkB7D,OAAOiE,MAAM,IAErDzS,EAAQsS,UAAY9U,KAAK8U,UAC3B9U,KAAKwR,iBAAiBxR,KAAK8U,UAEzBtS,EAAQuM,aAAe/O,KAAK+O,aAC9B/O,KAAKsR,gBAAgBtR,KAAK+O,aAExBvM,EAAQuS,WAAa/U,KAAK+U,WAC5B/U,KAAK0Q,cAAc1Q,KAAK+U,YAIpBnC,EAAA/Q,UAAAmT,yBAAA,qBACN,OAA4C,QAArCE,EAA8B,QAA9BC,EAAsB,QAAtBxG,EAAA3O,KAAK6U,yBAAiB,IAAAlG,OAAA,EAAAA,EAAEqC,cAAM,IAAAmE,OAAA,EAAAA,EAAEF,aAAK,IAAAC,OAAA,EAAAA,EAAE3P,QAAS,GAGjDqN,EAAA/Q,UAAA+S,gBAAA,WACN5U,KAAKoV,mBAAqBpV,KAAKgT,UAAUqC,yBACvC,WAAarV,KAAKG,UAAU+J,OAAS,IAAMlK,KAAKG,UAAUgK,OAAS,EAAI,GAAvE,YACanK,KAAKG,UAAU+J,OAAS,IAAMlK,KAAKG,UAAUkK,OAAS,EAAI,GADvE,YAEarK,KAAKG,UAAUwK,QAAU,GAAK,SAI/CiI,EAAA/Q,UAAAyT,SAAA,WACEtV,KAAKsJ,SAAS1H,SAAW5B,KAAKc,gBAC9Bd,KAAKuV,wBAGC3C,EAAA/Q,UAAAkS,MAAA,WACN/T,KAAKuT,cAAe,EACpBvT,KAAKoJ,YAAc,KACnBpJ,KAAKwV,eAAiB,qHAGtBxV,KAAKsN,UAAY,CACfmI,QAAQ,EACRxE,KAAM,KACNhD,SAAU,KACVxE,GAAI,EACJE,GAAI,EACJpC,GAAI,EACJmC,GAAI,EACJ+D,QAAS,EACTG,QAAS,GAEX5N,KAAK8N,QAAU,CACb3H,MAAO,EACPC,OAAQ,GAEVpG,KAAKqJ,QAAQI,IAAM,IACnBzJ,KAAKqJ,QAAQM,IAAM,IACnB3J,KAAKqJ,QAAQ9B,GAAK,IAClBvH,KAAKqJ,QAAQK,GAAK,KAGZkJ,EAAA/Q,UAAA6O,cAAA,SAAcC,GAAd,IAAA3O,EAAAhC,KACNA,KAAK+S,iBACFrC,cAAcC,EAAM3Q,KAAKsJ,UACzBvF,MAAI,SAAEgO,GAAQ,OAAA/P,EAAKmS,eAAepC,MAClCb,OAAK,SAAEkD,GAAQ,OAAApS,EAAKqS,eAAeD,OAGhCxB,EAAA/Q,UAAAyP,gBAAA,SAAgBvC,GAAhB,IAAA/M,EAAAhC,KACNA,KAAK+S,iBACFzB,gBAAgBvC,EAAa/O,KAAKsJ,UAClCvF,MAAI,SAAEgO,GAAQ,OAAA/P,EAAKmS,eAAepC,MAClCb,OAAK,SAAEkD,GAAQ,OAAApS,EAAKqS,eAAeD,OAGhCxB,EAAA/Q,UAAA2P,iBAAA,SAAiBC,GAAjB,IAAAzP,EAAAhC,KACNA,KAAK+S,iBACFvB,iBAAiBC,EAAKzR,KAAKsJ,UAC3BvF,MAAI,SAAEgO,GAAQ,OAAA/P,EAAKmS,eAAepC,MAClCb,OAAK,SAAEkD,GAAQ,OAAApS,EAAKqS,eAAeD,OAGhCxB,EAAA/Q,UAAAsS,eAAA,SAAe/K,GACrBpJ,KAAKoJ,YAAcA,EACnBpJ,KAAKwV,eAAiBxV,KAAKgT,UAAU0C,+BAA+BtM,EAAYmB,YAAYe,QAC5FtL,KAAKiT,GAAG0B,gBAGF/B,EAAA/Q,UAAAwS,eAAA,SAAerO,GACrB2P,QAAQ3P,MAAMA,GACdhG,KAAK8T,gBAAgB8B,QAGvBhD,EAAA/Q,UAAAgU,kBAAA,WAAA,IAAA7T,EAAAhC,KAC0B,MAApBA,KAAKoJ,cACPpJ,KAAK4T,YAAYgC,KAAK5V,KAAKoJ,aAC3BpJ,KAAKoT,uBAAyB,EAC9B0C,YAAU,WAAO,OAAA9T,EAAK+T,oCAIlBnD,EAAA/Q,UAAAkU,6BAAA,WAAA,IAAA/T,EAAAhC,KACFA,KAAKoT,uBAAyB,GAChCpT,KAAK8T,gBAAgB8B,OACZ5V,KAAKgW,qBACdhW,KAAKsU,aACLtU,KAAKuU,0BACLvU,KAAKwU,0BACLxU,KAAK8M,uBACL9M,KAAK6T,aAAa+B,KAAI3T,OAAAgJ,OAAA,GAAMjL,KAAK8N,UACjC9N,KAAKiT,GAAG0B,iBAER3U,KAAKoT,yBACL0C,YAAU,WAAO,OAAA9T,EAAK+T,iCAAgC,MAIlDnD,EAAA/Q,UAAAmU,kBAAA,mBACN,OAAsC,QAA/Bb,EAAgB,QAAhBxG,EAAA3O,KAAKmJ,mBAAW,IAAAwF,OAAA,EAAAA,EAAEjD,qBAAa,IAAAyJ,OAAA,EAAAA,EAAEvJ,aAAc,GAIxDgH,EAAA/Q,UAAAoU,SAAA,WACOjW,KAAKoJ,cAGVpJ,KAAKkW,wBACLlW,KAAKsU,aACLtU,KAAKuU,0BACLvU,KAAKwU,4BAGC5B,EAAA/Q,UAAA0T,qBAAA,WACN,GAAIvV,KAAKkT,OAAQ,KACTiD,EAAS,IAAInW,KAAKkT,OAAOlT,KAAKoW,QAAQ1K,eAC5CyK,EAAOE,IAAI,SAASC,IAAI,CAAEC,QAAQ,IAClCJ,EAAOK,GAAG,YAAaxW,KAAKyW,QAAQC,KAAK1W,OACzCmW,EAAOK,GAAG,WAAYxW,KAAK2W,UAAUD,KAAK1W,OAC1CmW,EAAOK,GAAG,aAAcxW,KAAK4W,WAAWF,KAAK1W,YACpC6W,EAAAA,aACTlB,QAAQmB,KAAK,yEAITlE,EAAA/Q,UAAAqU,sBAAA,eACAzK,EAAqBzL,KAAKmJ,YAAYuC,cACxC1L,KAAK8N,QAAQ3H,QAAUsF,EAAmBG,aAAe5L,KAAK8N,QAAQ1H,SAAWqF,EAAmBsB,eACtG/M,KAAKqJ,QAAQI,GAAKzJ,KAAKqJ,QAAQI,GAAKgC,EAAmBG,YAAc5L,KAAK8N,QAAQ3H,MAClFnG,KAAKqJ,QAAQ9B,GAAKvH,KAAKqJ,QAAQ9B,GAAKkE,EAAmBG,YAAc5L,KAAK8N,QAAQ3H,MAClFnG,KAAKqJ,QAAQM,GAAK3J,KAAKqJ,QAAQM,GAAK8B,EAAmBsB,aAAe/M,KAAK8N,QAAQ1H,OACnFpG,KAAKqJ,QAAQK,GAAK1J,KAAKqJ,QAAQK,GAAK+B,EAAmBsB,aAAe/M,KAAK8N,QAAQ1H,SAIvFwM,EAAA/Q,UAAAiL,qBAAA,WACE9M,KAAK8S,uBAAuBhG,qBAAqB9M,KAAKmJ,YAAanJ,KAAKqJ,QAASrJ,KAAKsJ,UACtFtJ,KAAK0U,aACL1U,KAAKuT,cAAe,GAGtBX,EAAA/Q,UAAAkV,eAAA,SAAe1J,GACbrN,KAAKgX,uBAAuB3J,GAC5BrN,KAAKiX,oBAAoB5J,IAGnBuF,EAAA/Q,UAAAmV,uBAAA,SAAuB3J,OACvB6J,GAAO7J,EAAM6J,IACfA,GAAO,GAAKA,GAAO,IACrBlX,KAAKsJ,SAAS1H,SAAWsV,IAIrBtE,EAAA/Q,UAAAoV,oBAAA,SAAoB5J,GAE1B,GADoC,CAAC,UAAW,YAAa,aAAc,aACnD8J,SAAS9J,EAAM6J,KAAvC,KAGME,EAAW/J,EAAMgK,SAAW1U,EAAUE,OAASF,EAAUC,KACzDqL,EAAWZ,EAAMiK,gBCxTeJ,GACxC,OAAQA,GACN,IAAK,UACH,MAAO,SACT,IAAK,aACH,MAAO,OACT,IAAK,YACH,MAAO,MACT,IAAK,YACL,QACE,MAAO,SD8SuBK,CAA0BlK,EAAM6J,cCtUlCA,GAChC,OAAQA,GACN,IAAK,UACH,MAAO,MACT,IAAK,aACH,MAAO,QACT,IAAK,YACH,MAAO,SACT,IAAK,YACL,QACE,MAAO,QD4T8DM,CAAkBnK,EAAM6J,KACzFO,WC3SqBP,EAAatV,GAC1C,OAAQsV,GACN,IAAK,UACH,MAAO,CAACzJ,QAAS,EAAGG,SAAqB,EAAZhM,GAC/B,IAAK,aACH,MAAO,CAAC6L,QAAS7L,EAAUgM,QAAS,GACtC,IAAK,YACH,MAAO,CAACH,QAAS,EAAGG,QAAShM,GAC/B,IAAK,YACL,QACE,MAAO,CAAC6L,SAAqB,EAAZ7L,EAAegM,QAAS,IDiSzB8J,CAAerK,EAAM6J,IAAKlX,KAAKsJ,SAAS1H,UAC1DyL,EAAMsK,iBACNtK,EAAMuK,kBACN5X,KAAK6X,UAAU,CAAEpK,QAAS,EAAGG,QAAS,GAAKwJ,EAAUnJ,GACrDjO,KAAK8X,QAAQL,GACbzX,KAAK+X,aAGPnF,EAAA/Q,UAAAgW,UAAA,SAAUxK,EAAY+J,EAAqBnJ,gBAAA,IAAAA,IAAAA,EAAA,OACvB,QAAdU,EAAA3O,KAAKsN,iBAAS,IAAAqB,OAAA,EAAAA,EAAE8G,UAAwB,QAAdN,EAAAnV,KAAKsN,iBAAS,IAAA6H,OAAA,EAAAA,EAAElE,QAAStO,EAAUG,QAG7DuK,EAAMsK,gBACRtK,EAAMsK,iBAER3X,KAAKsN,UAASrL,OAAAgJ,OAAA,CACZwK,QAAQ,EACRxE,KAAMmG,EACNnJ,SAAQA,EACRR,QAASzN,KAAK8S,uBAAuBtF,WAAWH,GAChDO,QAAS5N,KAAK8S,uBAAuBnF,WAAWN,IAC7CrN,KAAKqJ,WAIZuJ,EAAA/Q,UAAA+U,WAAA,SAAWvJ,GACJrN,KAAKwV,iBAGNnI,EAAMsK,gBACRtK,EAAMsK,iBAER3X,KAAKsN,UAASrL,OAAAgJ,OAAA,CACZwK,QAAQ,EACRxE,KAAMtO,EAAUG,MAChBmL,SAAU,SACVR,QAASzN,KAAKqJ,QAAQI,IAAMzJ,KAAKqJ,QAAQ9B,GAAKvH,KAAKqJ,QAAQI,IAAM,EACjEmE,QAAS5N,KAAKqJ,QAAQM,IAAM3J,KAAKqJ,QAAQK,GAAK1J,KAAKqJ,QAAQM,IAAM,GAC9D3J,KAAKqJ,WAMZuJ,EAAA/Q,UAAAiW,QAAA,SAAQzK,GACFrN,KAAKsN,UAAUmI,SACbpI,EAAMuK,iBACRvK,EAAMuK,kBAEJvK,EAAMsK,gBACRtK,EAAMsK,iBAEJ3X,KAAKsN,UAAU2D,OAAStO,EAAUC,MACpC5C,KAAK8S,uBAAuB1F,KAAKC,EAAOrN,KAAKsN,UAAWtN,KAAKqJ,SAC7DrJ,KAAKyU,sBAAqB,IACjBzU,KAAKsN,UAAU2D,OAAStO,EAAUE,SACtC7C,KAAKW,oBAAuBX,KAAKY,qBACpCZ,KAAK8S,uBAAuBjF,OAAOR,EAAOrN,KAAKsN,UAAWtN,KAAKqJ,QAASrJ,KAAK8N,QAAS9N,KAAKsJ,UAE7FtJ,KAAKyU,sBAAqB,IAE5BzU,KAAKiT,GAAG+E,kBAIZpF,EAAA/Q,UAAA4U,QAAA,SAAQpJ,GACFrN,KAAKsN,UAAUmI,SACbpI,EAAMuK,iBACRvK,EAAMuK,kBAEJvK,EAAMsK,gBACRtK,EAAMsK,iBAEJ3X,KAAKsN,UAAU2D,OAAStO,EAAUG,QACpC9C,KAAK8S,uBAAuBjF,OAAOR,EAAOrN,KAAKsN,UAAWtN,KAAKqJ,QAASrJ,KAAK8N,QAAS9N,KAAKsJ,UAC3FtJ,KAAKyU,sBAAqB,IAE5BzU,KAAKiT,GAAG+E,kBAIJpF,EAAA/Q,UAAAyS,WAAA,WACN,GAAItU,KAAKmJ,YAAa,KACdsC,EAAqBzL,KAAKmJ,YAAYuC,cAC5C1L,KAAK8N,QAAQ3H,MAAQsF,EAAmBG,YACxC5L,KAAK8N,QAAQ1H,OAASqF,EAAmBsB,aACzC/M,KAAKqT,WAAarT,KAAKgT,UAAUqC,yBAAyB,cAAgBrV,KAAK8N,QAAQ3H,MAAQ,EAAI,SAI/FyM,EAAA/Q,UAAA0S,wBAAA,oBAC2B,QAAjCY,EAAoB,QAApBxG,EAAI3O,KAAKoJ,mBAAW,IAAAuF,OAAA,EAAAA,EAAEpE,mBAAW,IAAA4K,OAAA,EAAAA,EAAErK,QACjC9K,KAAKiY,2BACLjY,KAAKkY,8BAELlY,KAAKsJ,SAAS9H,sBAAwB,GACtCxB,KAAKsJ,SAAS7H,uBAAyB,KAInCmR,EAAA/Q,UAAAoW,yBAAA,WACNjY,KAAKsJ,SAAS9H,sBAAwBxB,KAAKO,gBAAkB,EACzDiG,KAAKsF,IAAI,GAAI9L,KAAKO,gBAAkBP,KAAKoJ,YAAYmB,YAAYO,MAAM3E,MAAQnG,KAAK8N,QAAQ3H,OAC5F,IAGEyM,EAAA/Q,UAAAqW,0BAAA,WACFlY,KAAKE,oBACPF,KAAKsJ,SAAS7H,uBAAyB+E,KAAKsF,IAAI,GAAI9L,KAAKsJ,SAAS9H,sBAAwBxB,KAAKI,aACtFJ,KAAKQ,iBAAmB,EACjCR,KAAKsJ,SAAS7H,uBAAyB+E,KAAKsF,IAC1C,GACA9L,KAAKQ,iBAAmBR,KAAKoJ,YAAYmB,YAAYO,MAAM1E,OAASpG,KAAK8N,QAAQ1H,QAGnFpG,KAAKsJ,SAAS7H,uBAAyB,IAInCmR,EAAA/Q,UAAA2S,wBAAA,mBACN,GAAiC,QAAjCW,EAAoB,QAApBxG,EAAI3O,KAAKoJ,mBAAW,IAAAuF,OAAA,EAAAA,EAAEpE,mBAAW,IAAA4K,OAAA,EAAAA,EAAErK,MAAO,KAClCa,EAAQ3L,KAAKoJ,YAAYmB,YAAYE,KAAKtE,MAAQnG,KAAK8N,QAAQ3H,MACrEnG,KAAKsJ,SAAS5H,sBAAwB1B,KAAKU,gBAAkB,GAAKV,KAAKU,gBAAkBiL,EAAQ3L,KAAK8N,QAAQ3H,MAC9GnG,KAAKsJ,SAAS3H,uBAAyB3B,KAAKS,iBAAmB,GAAKT,KAAKS,iBAAmBkL,EAAQ3L,KAAK8N,QAAQ1H,OAC7GpG,KAAKE,sBACHF,KAAKsJ,SAAS5H,sBAAwB1B,KAAKsJ,SAAS3H,uBAAyB3B,KAAKI,YACpFJ,KAAKsJ,SAAS5H,sBAAwB1B,KAAKsJ,SAAS3H,uBAAyB3B,KAAKI,YACzEJ,KAAKsJ,SAAS5H,sBAAwB1B,KAAKsJ,SAAS3H,uBAAyB3B,KAAKI,cAC3FJ,KAAKsJ,SAAS3H,uBAAyB3B,KAAKsJ,SAAS5H,sBAAwB1B,KAAKI,mBAItFJ,KAAKsJ,SAAS5H,sBAAwB1B,KAAK8N,QAAQ3H,MACnDnG,KAAKsJ,SAAS3H,uBAAyB3B,KAAK8N,QAAQ1H,QAIhDwM,EAAA/Q,UAAA4S,qBAAA,SAAqB0D,QAAA,IAAAA,IAAAA,GAAA,GACvBnY,KAAKqJ,QAAQI,GAAK,IACpBzJ,KAAKqJ,QAAQ9B,IAAM4Q,EAAenY,KAAKqJ,QAAQI,GAAK,EACpDzJ,KAAKqJ,QAAQI,GAAK,GAEhBzJ,KAAKqJ,QAAQM,GAAK,IACpB3J,KAAKqJ,QAAQK,IAAMyO,EAAenY,KAAKqJ,QAAQM,GAAK,EACpD3J,KAAKqJ,QAAQM,GAAK,GAEhB3J,KAAKqJ,QAAQ9B,GAAKvH,KAAK8N,QAAQ3H,QACjCnG,KAAKqJ,QAAQI,IAAM0O,EAAgBnY,KAAKqJ,QAAQ9B,GAAKvH,KAAK8N,QAAQ3H,MAAS,EAC3EnG,KAAKqJ,QAAQ9B,GAAKvH,KAAK8N,QAAQ3H,OAE7BnG,KAAKqJ,QAAQK,GAAK1J,KAAK8N,QAAQ1H,SACjCpG,KAAKqJ,QAAQM,IAAMwO,EAAgBnY,KAAKqJ,QAAQK,GAAK1J,KAAK8N,QAAQ1H,OAAU,EAC5EpG,KAAKqJ,QAAQK,GAAK1J,KAAK8N,QAAQ1H,SAMnCwM,EAAA/Q,UAAAkW,SAAA,WACM/X,KAAKsN,UAAUmI,SACjBzV,KAAKsN,UAAUmI,QAAS,EACxBzV,KAAK0U,eAIT9B,EAAA/Q,UAAA8U,UAAA,WACM3W,KAAKsN,UAAUmI,SACjBzV,KAAKsN,UAAUmI,QAAS,EACxBzV,KAAK0U,eAID9B,EAAA/Q,UAAA6S,WAAA,WACF1U,KAAKkB,UACPlB,KAAKkJ,QAIT0J,EAAA/Q,UAAAqH,KAAA,mBACE,GAA4C,OAAX,QAA7BiM,EAAgB,QAAhBxG,EAAA3O,KAAKoJ,mBAAW,IAAAuF,OAAA,EAAAA,EAAEpE,mBAAW,IAAA4K,OAAA,EAAAA,EAAErK,OAAe,CAChD9K,KAAK2T,eAAeiC,WACd7K,EAAS/K,KAAK6S,YAAY3J,KAAKlJ,KAAKmJ,YAAanJ,KAAKoJ,YAAapJ,KAAKqJ,QAASrJ,KAAKsJ,UAI5F,OAHc,MAAVyB,GACF/K,KAAKyT,aAAamC,KAAK7K,GAElBA,EAET,OAAO,+BAveVqN,EAAAA,UAASzL,KAAA,CAAC,CACT0L,SAAU,gBACVC,SAAA,89HAEAC,gBAAiBC,EAAAA,wBAAwBC,+xGAVlCxP,SACA4D,SACAuD,SAPAsI,EAAAA,oBAdPC,EAAAA,sDA6CCC,EAAAA,UAASjM,KAAA,CAAC,UAAW,CAAEkM,QAAQ,yBAC/BD,EAAAA,UAASjM,KAAA,CAAC,cAAe,CAAEkM,QAAQ,+BAEnCC,EAAAA,wBACAA,EAAAA,2BACAA,EAAAA,yBACAA,EAAAA,sBAEAA,EAAAA,yBACAA,EAAAA,mCACAA,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,8BACAA,EAAAA,+BACAA,EAAAA,gCACAA,EAAAA,gCACAA,EAAAA,+BACAA,EAAAA,kCACAA,EAAAA,mCACAA,EAAAA,8BACAA,EAAAA,+BACAA,EAAAA,4BACAA,EAAAA,6BACAA,EAAAA,4BACAA,EAAAA,wBACAA,EAAAA,+BACAA,EAAAA,wCACAA,EAAAA,iCACAA,EAAAA,uBACAA,EAAAA,0BAMAC,EAAAA,YAAWpM,KAAA,CAAC,qBAAkB,CAAAsE,KAC9B6H,EAAAA,wBACAC,EAAAA,YAAWpM,KAAA,CAAC,mBAAgB,CAAAsE,KAC5B6H,EAAAA,4BAEAE,EAAAA,+BACAA,EAAAA,4BACAA,EAAAA,6BACAA,EAAAA,gCACAA,EAAAA,yBAkLAC,EAAAA,aAAYtM,KAAA,CAAC,kCAoGbsM,EAAAA,aAAYtM,KAAA,CAAC,qBAAsB,CAAC,YAAS,CAAAsE,KAC7CgI,EAAAA,aAAYtM,KAAA,CAAC,qBAAsB,CAAC,6BAiHpCsM,EAAAA,aAAYtM,KAAA,CAAC,qBAAkB,CAAAsE,KAC/BgI,EAAAA,aAAYtM,KAAA,CAAC,8BErdhB,iCAXCuM,EAAAA,SAAQvM,KAAA,CAAC,CACRwM,QAAS,CACPC,EAAAA,cAEFC,aAAc,CACZzG,GAEF0G,QAAS,CACP1G,gFCZyB2G,GAM3B,QALMC,EAAQD,EAAYC,MAAM,KAC1BvI,EAAOuI,EAAM,GAAGtK,QAAQ,QAAS,IAAIA,QAAQ,UAAW,IACxDuK,EAAarK,KAAKoK,EAAM,IACxBE,EAAK,IAAIC,YAAYF,EAAWlU,QAChCqU,EAAK,IAAIrK,WAAWmK,GACjB5T,EAAI,EAAGA,EAAI2T,EAAWlU,OAAQO,GAAK,EAC1C8T,EAAG9T,GAAK2T,EAAWjK,WAAW1J,GAEhC,OAAO,IAAI+T,KAAK,CAACH,GAAK,CAACzI,KAAIA","sourcesContent":["import { CropperOptions, OutputFormat } from './cropper-options.interface';\nimport { ImageTransform } from './image-transform.interface';\nimport { SimpleChanges } from '@angular/core';\n\nexport class CropperSettings {\n\n // From options\n format: OutputFormat = 'png';\n maintainAspectRatio = true;\n transform: ImageTransform = {};\n aspectRatio = 1;\n resizeToWidth = 0;\n resizeToHeight = 0;\n cropperMinWidth = 0;\n cropperMinHeight = 0;\n cropperMaxHeight = 0;\n cropperMaxWidth = 0;\n cropperStaticWidth = 0;\n cropperStaticHeight = 0;\n canvasRotation = 0;\n initialStepSize = 3;\n roundCropper = false;\n onlyScaleDown = false;\n imageQuality = 92;\n autoCrop = true;\n backgroundColor: string = undefined;\n containWithinAspectRatio = false;\n hideResizeSquares = false;\n alignImage: 'left' | 'center' = 'center';\n\n // Internal\n cropperScaledMinWidth = 20;\n cropperScaledMinHeight = 20;\n cropperScaledMaxWidth = 20;\n cropperScaledMaxHeight = 20;\n stepSize = this.initialStepSize;\n\n setOptions(options: Partial<CropperOptions>): void {\n Object.keys(options)\n .filter((k) => k in this)\n .forEach((k) => this[k] = options[k]);\n this.validateOptions();\n }\n\n setOptionsFromChanges(changes: SimpleChanges): void {\n Object.keys(changes)\n .filter((k) => k in this)\n .forEach((k) => this[k] = changes[k].currentValue);\n this.validateOptions();\n }\n\n private validateOptions(): void {\n if (this.maintainAspectRatio && !this.aspectRatio) {\n throw new Error('`aspectRatio` should > 0 when `maintainAspectRatio` is enabled');\n }\n }\n}\n","export interface MoveStart {\n active: boolean;\n type: MoveTypes | null;\n position: string | null;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n clientX: number;\n clientY: number;\n}\n\nexport enum MoveTypes {\n Move = 'move',\n Resize = 'resize',\n Pinch = 'pinch'\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/*\n * Hermite resize - fast image resize/resample using Hermite filter.\n * https://github.com/viliusle/Hermite-resize\n */\n\nexport function resizeCanvas(canvas: HTMLCanvasElement, width: number, height: number) {\n const width_source = canvas.width;\n const height_source = canvas.height;\n width = Math.round(width);\n height = Math.round(height);\n\n const ratio_w = width_source / width;\n const ratio_h = height_source / height;\n const ratio_w_half = Math.ceil(ratio_w / 2);\n const ratio_h_half = Math.ceil(ratio_h / 2);\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n const img = ctx.getImageData(0, 0, width_source, height_source);\n const img2 = ctx.createImageData(width, height);\n const data = img.data;\n const data2 = img2.data;\n\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const x2 = (i + j * width) * 4;\n const center_y = j * ratio_h;\n let weight = 0;\n let weights = 0;\n let weights_alpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n\n const xx_start = Math.floor(i * ratio_w);\n const yy_start = Math.floor(j * ratio_h);\n let xx_stop = Math.ceil((i + 1) * ratio_w);\n let yy_stop = Math.ceil((j + 1) * ratio_h);\n xx_stop = Math.min(xx_stop, width_source);\n yy_stop = Math.min(yy_stop, height_source);\n\n for (let yy = yy_start; yy < yy_stop; yy++) {\n const dy = Math.abs(center_y - yy) / ratio_h_half;\n const center_x = i * ratio_w;\n const w0 = dy * dy; //pre-calc part of w\n for (let xx = xx_start; xx < xx_stop; xx++) {\n const dx = Math.abs(center_x - xx) / ratio_w_half;\n const w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n const pos_x = 4 * (xx + yy * width_source);\n //alpha\n gx_a += weight * data[pos_x + 3];\n weights_alpha += weight;\n //colors\n if (data[pos_x + 3] < 255)\n weight = weight * data[pos_x + 3] / 250;\n gx_r += weight * data[pos_x];\n gx_g += weight * data[pos_x + 1];\n gx_b += weight * data[pos_x + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weights_alpha;\n }\n }\n\n\n canvas.width = width;\n canvas.height = height;\n\n //draw\n ctx.putImageData(img2, 0, 0);\n }\n}\n","import { ElementRef, Injectable } from '@angular/core';\nimport { CropperPosition, ImageCroppedEvent, LoadedImage } from '../interfaces';\nimport { CropperSettings } from '../interfaces/cropper.settings';\nimport { resizeCanvas } from '../utils/resize.utils';\n\n@Injectable({ providedIn: 'root' })\nexport class CropService {\n\n crop(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): ImageCroppedEvent | null {\n const imagePosition = this.getImagePosition(sourceImage, loadedImage, cropper, settings);\n const width = imagePosition.x2 - imagePosition.x1;\n const height = imagePosition.y2 - imagePosition.y1;\n const cropCanvas = document.createElement('canvas') as HTMLCanvasElement;\n cropCanvas.width = width;\n cropCanvas.height = height;\n\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n if (settings.backgroundColor != null) {\n ctx.fillStyle = settings.backgroundColor;\n ctx.fillRect(0, 0, width, height);\n }\n\n const scaleX = (settings.transform.scale || 1) * (settings.transform.flipH ? -1 : 1);\n const scaleY = (settings.transform.scale || 1) * (settings.transform.flipV ? -1 : 1);\n\n const transformedImage = loadedImage.transformed;\n ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2, transformedImage.size.height / 2);\n ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);\n ctx.rotate((settings.transform.rotate || 0) * Math.PI / 180);\n ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);\n\n const output: ImageCroppedEvent = {\n width, height,\n imagePosition,\n cropperPosition: { ...cropper }\n };\n if (settings.containWithinAspectRatio) {\n output.offsetImagePosition = this.getOffsetImagePosition(sourceImage, loadedImage, cropper, settings);\n }\n const resizeRatio = this.getResizeRatio(width, height, settings);\n if (resizeRatio !== 1) {\n output.width = Math.round(width * resizeRatio);\n output.height = settings.maintainAspectRatio\n ? Math.round(output.width / settings.aspectRatio)\n : Math.round(height * resizeRatio);\n resizeCanvas(cropCanvas, output.width, output.height);\n }\n output.base64 = cropCanvas.toDataURL('image/' + settings.format, this.getQuality(settings));\n return output;\n }\n\n private getImagePosition(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): CropperPosition {\n const sourceImageElement = sourceImage.nativeElement;\n const ratio = loadedImage.transformed.size.width / sourceImageElement.offsetWidth;\n\n const out: CropperPosition = {\n x1: Math.round(cropper.x1 * ratio),\n y1: Math.round(cropper.y1 * ratio),\n x2: Math.round(cropper.x2 * ratio),\n y2: Math.round(cropper.y2 * ratio)\n };\n\n if (!settings.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\n out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\n }\n\n return out;\n }\n\n private getOffsetImagePosition(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): CropperPosition {\n const canvasRotation = settings.canvasRotation + loadedImage.exifTransform.rotate;\n const sourceImageElement = sourceImage.nativeElement;\n const ratio = loadedImage.transformed.size.width / sourceImageElement.offsetWidth;\n let offsetX: number;\n let offsetY: number;\n\n if (canvasRotation % 2) {\n offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.height) / 2;\n offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.width) / 2;\n } else {\n offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.width) / 2;\n offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.height) / 2;\n }\n\n const out: CropperPosition = {\n x1: Math.round(cropper.x1 * ratio) - offsetX,\n y1: Math.round(cropper.y1 * ratio) - offsetY,\n x2: Math.round(cropper.x2 * ratio) - offsetX,\n y2: Math.round(cropper.y2 * ratio) - offsetY\n };\n\n if (!settings.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\n out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\n }\n\n return out;\n }\n\n getResizeRatio(width: number, height: number, settings: CropperSettings): number {\n const ratioWidth = settings.resizeToWidth / width;\n const ratioHeight = settings.resizeToHeight / height;\n const ratios = new Array<number>();\n\n if (settings.resizeToWidth > 0) {\n ratios.push(ratioWidth);\n }\n if (settings.resizeToHeight > 0) {\n ratios.push(ratioHeight);\n }\n\n const result = ratios.length === 0 ? 1 : Math.min(...ratios);\n\n if (result > 1 && !settings.onlyScaleDown) {\n return result;\n }\n return Math.min(result, 1);\n }\n\n getQuality(settings: CropperSettings): number {\n return Math.min(1, Math.max(0, settings.imageQuality / 100));\n }\n}\n","import { ElementRef, Injectable } from '@angular/core';\nimport { CropperPosition, Dimensions, MoveStart } from '../interfaces';\nimport { CropperSettings } from '../interfaces/cropper.settings';\n\n@Injectable({ providedIn: 'root' })\nexport class CropperPositionService {\n\n resetCropperPosition(sourceImage: ElementRef, cropperPosition: CropperPosition, settings: CropperSettings): void {\n if (!sourceImage?.nativeElement) {\n return;\n }\n const sourceImageElement = sourceImage.nativeElement;\n if (settings.cropperStaticHeight && settings.cropperStaticWidth) {\n cropperPosition.x1 = 0;\n cropperPosition.x2 = sourceImageElement.offsetWidth > settings.cropperStaticWidth ?\n settings.cropperStaticWidth : sourceImageElement.offsetWidth;\n cropperPosition.y1 = 0;\n cropperPosition.y2 = sourceImageElement.offsetHeight > settings.cropperStaticHeight ?\n settings.cropperStaticHeight : sourceImageElement.offsetHeight;\n } else {\n const cropperWidth = Math.min(settings.cropperScaledMaxWidth, sourceImageElement.offsetWidth);\n const cropperHeight = Math.min(settings.cropperScaledMaxHeight, sourceImageElement.offsetHeight);\n if (!settings.maintainAspectRatio) {\n cropperPosition.x1 = 0;\n cropperPosition.x2 = cropperWidth;\n cropperPosition.y1 = 0;\n cropperPosition.y2 = cropperHeight;\n } else if (sourceImageElement.offsetWidth / settings.aspectRatio < sourceImageElement.offsetHeight) {\n cropperPosition.x1 = 0;\n cropperPosition.x2 = cropperWidth;\n const cropperHeightWithAspectRatio = cropperWidth / settings.aspectRatio;\n cropperPosition.y1 = (sourceImageElement.offsetHeight - cropperHeightWithAspectRatio) / 2;\n cropperPosition.y2 = cropperPosition.y1 + cropperHeightWithAspectRatio;\n } else {\n cropperPosition.y1 = 0;\n cropperPosition.y2 = cropperHeight;\n const cropperWidthWithAspectRatio = cropperHeight * settings.aspectRatio;\n cropperPosition.x1 = (sourceImageElement.offsetWidth - cropperWidthWithAspectRatio) / 2;\n cropperPosition.x2 = cropperPosition.x1 + cropperWidthWithAspectRatio;\n }\n }\n }\n\n move(event: any, moveStart: MoveStart, cropperPosition: CropperPosition) {\n const diffX = this.getClientX(event) - moveStart.clientX;\n const diffY = this.getClientY(event) - moveStart.clientY;\n\n cropperPosition.x1 = moveStart.x1 + diffX;\n cropperPosition.y1 = moveStart.y1 + diffY;\n cropperPosition.x2 = moveStart.x2 + diffX;\n cropperPosition.y2 = moveStart.y2 + diffY;\n }\n\n resize(event: any, moveStart: MoveStart, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\n const moveX = this.getClientX(event) - moveStart.clientX;\n const moveY = this.getClientY(event) - moveStart.clientY;\n switch (moveStart.position) {\n case 'left':\n cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\n cropperPosition.x2 - settings.cropperScaledMinWidth);\n break;\n case 'topleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\n cropperPosition.x2 - settings.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\n cropperPosition.y2 - settings.cropperScaledMinHeight);\n break;\n case 'top':\n cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\n cropperPosition.y2 - settings.cropperScaledMinHeight);\n break;\n case 'topright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\n cropperPosition.x1 + settings.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\n cropperPosition.y2 - settings.cropperScaledMinHeight);\n break;\n case 'right':\n cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\n cropperPosition.x1 + settings.cropperScaledMinWidth);\n break;\n case 'bottomright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\n cropperPosition.x1 + settings.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\n cropperPosition.y1 + settings.cropperScaledMinHeight);\n break;\n case 'bottom':\n cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\n cropperPosition.y1 + settings.cropperScaledMinHeight);\n break;\n case 'bottomleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\n cropperPosition.x2 - settings.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\n cropperPosition.y1 + settings.cropperScaledMinHeight);\n break;\n case 'center':\n const scale = event.scale;\n const newWidth = Math.min(\n Math.max(settings.cropperScaledMinWidth, (Math.abs(moveStart.x2 - moveStart.x1)) * scale),\n settings.cropperScaledMaxWidth);\n const newHeight = Math.min(\n Math.max(settings.cropperScaledMinHeight, (Math.abs(moveStart.y2 - moveStart.y1)) * scale),\n settings.cropperScaledMaxHeight);\n cropperPosition.x1 = moveStart.clientX - newWidth / 2;\n cropperPosition.x2 = moveStart.clientX + newWidth / 2;\n cropperPosition.y1 = moveStart.clientY - newHeight / 2;\n cropperPosition.y2 = moveStart.clientY + newHeight / 2;\n if (cropperPosition.x1 < 0) {\n cropperPosition.x2 -= cropperPosition.x1;\n cropperPosition.x1 = 0;\n } else if (cropperPosition.x2 > maxSize.width) {\n cropperPosition.x1 -= (cropperPosition.x2 - maxSize.width);\n cropperPosition.x2 = maxSize.width;\n }\n if (cropperPosition.y1 < 0) {\n cropperPosition.y2 -= cropperPosition.y1;\n cropperPosition.y1 = 0;\n } else if (cropperPosition.y2 > maxSize.height) {\n cropperPosition.y1 -= (cropperPosition.y2 - maxSize.height);\n cropperPosition.y2 = maxSize.height;\n }\n break;\n }\n\n if (settings.maintainAspectRatio) {\n this.checkAspectRatio(moveStart.position, cropperPosition, maxSize, settings);\n }\n }\n\n checkAspectRatio(position: string, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\n let overflowX = 0;\n let overflowY = 0;\n\n switch (position) {\n case 'top':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\n }\n break;\n case 'bottom':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : (overflowX / settings.aspectRatio);\n }\n break;\n case 'topleft':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\n }\n break;\n case 'topright':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\n }\n break;\n case 'right':\n case 'bottomright':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\n }\n break;\n case 'left':\n case 'bottomleft':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\n }\n break;\n case 'center':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n const overflowX1 = Math.max(0 - cropperPosition.x1, 0);\n const overflowX2 = Math.max(cropperPosition.x2 - maxSize.width, 0);\n const overflowY1 = Math.max(cropperPosition.y2 - maxSize.height, 0);\n const overflowY2 = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {\n cropperPosition.x1 += (overflowY1 * settings.aspectRatio) > overflowX1 ? (overflowY1 * settings.aspectRatio) : overflowX1;\n cropperPosition.x2 -= (overflowY2 * settings.aspectRatio) > overflowX2 ? (overflowY2 * settings.aspectRatio) : overflowX2;\n cropperPosition.y1 += (overflowY2 * settings.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / settings.aspectRatio;\n cropperPosition.y2 -= (overflowY1 * settings.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / settings.aspectRatio;\n }\n break;\n }\n }\n\n getClientX(event: any): number {\n return event.touches?.[0].clientX || event.clientX || 0;\n }\n\n getClientY(event: any): number {\n return event.touches?.[0].clientY || event.clientY || 0;\n }\n}\n","import { ExifTransform } from '../interfaces/exif-transform.interface';\n\n// Black 2x1 JPEG, with the following meta information set:\n// - EXIF Orientation: 6 (Rotated 90° CCW)\n// Source: https://github.com/blueimp/JavaScript-Load-Image\nconst testAutoOrientationImageURL =\n 'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +\n 'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +\n 'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +\n 'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +\n 'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +\n 'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';\n\nexport function supportsAutomaticRotation(): Promise<boolean> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n // Check if browser supports automatic image orientation:\n const supported = img.width === 1 && img.height === 2;\n resolve(supported);\n };\n img.src = testAutoOrientationImageURL;\n });\n}\n\nexport function getTransformationsFromExifData(exifRotationOrBase64Image: number | string): ExifTransform {\n if (typeof exifRotationOrBase64Image === 'string') {\n exifRotationOrBase64Image = getExifRotation(exifRotationOrBase64Image);\n }\n switch (exifRotationOrBase64Image) {\n case 2:\n return { rotate: 0, flip: true };\n case 3:\n return { rotate: 2, flip: false };\n case 4:\n return { rotate: 2, flip: true };\n case 5:\n return { rotate: 1, flip: true };\n case 6:\n return { rotate: 1, flip: false };\n case 7:\n return { rotate: 3, flip: true };\n case 8:\n return { rotate: 3, flip: false };\n default:\n return { rotate: 0, flip: false };\n }\n}\n\nfunction getExifRotation(imageBase64: string): number {\n const view = new DataView(base64ToArrayBuffer(imageBase64));\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n const length = view.byteLength;\n let offset = 2;\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) return -1;\n const marker = view.getUint16(offset, false);\n offset += 2;\n if (marker == 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) == 0x4949;\n offset += view.getUint32(offset + 4, little);\n const tags = view.getUint16(offset, little);\n offset += 2;\n for (let i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) == 0x0112) {\n return view.getUint16(offset + (i * 12) + 8, little);\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n return -1;\n}\n\nfunction base64ToArrayBuffer(imageBase64: string) {\n imageBase64 = imageBase64.replace(/^data\\:([^\\;]+)\\;base64,/gmi, '');\n const binaryString = atob(imageBase64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","import { Injectable } from '@angular/core';\nimport { Dimensions, LoadedImage } from '../interfaces';\nimport { CropperSettings } from '../interfaces/cropper.settings';\nimport { ExifTransform } from '../interfaces/exif-transform.interface';\nimport { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';\n\ninterface LoadImageBase64 {\n originalImage: HTMLImageElement;\n originalBase64: string;\n}\n\n@Injectable({providedIn: 'root'})\nexport class LoadImageService {\n\n private autoRotateSupported: Promise<boolean> = supportsAutomaticRotation();\n\n loadImageFile(file: File, cropperSettings: CropperSettings): Promise<LoadedImage> {\n return new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n fileReader.onload = (event: any) => {\n this.loadImage(event.target.result, file.type, cropperSettings)\n .then(resolve)\n .catch(reject);\n };\n fileReader.readAsDataURL(file);\n });\n }\n\n private loadImage(imageBase64: string, imageType: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n if (!this.isValidImageType(imageType)) {\n return Promise.reject(new Error('Invalid image type'));\n }\n return this.loadBase64Image(imageBase64, cropperSettings);\n }\n\n private isValidImageType(type: string): boolean {\n return /image\\/(png|jpg|jpeg|bmp|gif|tiff|webp)/.test(type);\n }\n\n loadImageFromURL(url: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = () => reject;\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0);\n this.loadBase64Image(canvas.toDataURL(), cropperSettings).then(resolve);\n };\n img.crossOrigin = 'anonymous';\n img.src = url;\n });\n }\n\n loadBase64Image(imageBase64: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n return new Promise<LoadImageBase64>((resolve, reject) => {\n const originalImage = new Image();\n originalImage.onload = () => resolve({\n originalImage,\n originalBase64: imageBase64\n });\n originalImage.onerror = reject;\n originalImage.src = imageBase64;\n }).then((res: LoadImageBase64) => this.transformImageBase64(res, cropperSettings));\n }\n\n private async transformImageBase64(res: LoadImageBase64, cropperSettings: CropperSettings): Promise<LoadedImage> {\n const autoRotate = await this.autoRotateSupported;\n const exifTransform = await getTransformationsFromExifData(autoRotate ? -1 : res.originalBase64);\n if (!res.originalImage || !res.originalImage.complete) {\n return Promise.reject(new Error('No image loaded'));\n }\n const loadedImage = {\n original: {\n base64: res.originalBase64,\n image: res.originalImage,\n size: {\n width: res.originalImage.naturalWidth,\n height: res.originalImage.naturalHeight\n }\n },\n exifTransform\n };\n return this.transformLoadedImage(loadedImage, cropperSettings);\n }\n\n async transformLoadedImage(loadedImage: Partial<LoadedImage>, cropperSettings: CropperSettings): Promise<LoadedImage> {\n const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;\n const originalSize = {\n width: loadedImage.original.image.naturalWidth,\n height: loadedImage.original.image.naturalHeight\n };\n if (canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {\n return {\n original: {\n base64: loadedImage.original.base64,\n image: loadedImage.original.image,\n size: {...originalSize}\n },\n transformed: {\n base64: loadedImage.original.base64,\n image: loadedImage.original.image,\n size: {...originalSize}\n },\n exifTransform: loadedImage.exifTransform\n };\n }\n\n const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);\n const canvas = document.createElement('canvas');\n canvas.width = transformedSize.width;\n canvas.height = transformedSize.height;\n const ctx = canvas.getContext('2d');\n ctx.setTransform(\n loadedImage.exifTransform.flip ? -1 : 1,\n 0,\n 0,\n 1,\n canvas.width / 2,\n canvas.height / 2\n );\n ctx.rotate(Math.PI * (canvasRotation / 2));\n ctx.drawImage(\n loadedImage.original.image,\n -originalSize.width / 2,\n -originalSize.height / 2\n );\n const transformedBase64 = canvas.toDataURL();\n const transformedImage = await this.loadImageFromBase64(transformedBase64);\n return {\n original: {\n base64: loadedImage.original.base64,\n image: loadedImage.original.image,\n size: {...originalSize}\n },\n transformed: {\n base64: transformedBase64,\n image: transformedImage,\n size: {\n width: transformedImage.width,\n height: transformedImage.height\n }\n },\n exifTransform: loadedImage.exifTransform\n };\n }\n\n private loadImageFromBase64(imageBase64: string): Promise<HTMLImageElement> {\n return new Promise<HTMLImageElement>(((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = reject;\n image.src = imageBase64;\n }));\n }\n\n private getTransformedSize(\n originalSize: { width: number, height: number },\n exifTransform: ExifTransform,\n cropperSettings: CropperSettings\n ): Dimensions {\n const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;\n if (cropperSettings.containWithinAspectRatio) {\n if (canvasRotation % 2) {\n const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;\n const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;\n return {\n width: Math.max(originalSize.height, minWidthToContain),\n height: Math.max(originalSize.width, minHeightToContain)\n };\n } else {\n const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;\n const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;\n return {\n width: Math.max(originalSize.width, minWidthToContain),\n height: Math.max(originalSize.height, minHeightToContain)\n };\n }\n }\n\n if (canvasRotation % 2) {\n return {\n height: originalSize.width,\n width: originalSize.height\n };\n }\n return {\n width: originalSize.width,\n height: originalSize.height\n };\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n isDevMode,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { DomSanitizer, SafeStyle, SafeUrl } from '@angular/platform-browser';\nimport { CropperPosition, Dimensions, ImageCroppedEvent, ImageTransform, LoadedImage, MoveStart } from '../interfaces';\nimport { OutputFormat } from '../interfaces/cropper-options.interface';\nimport { CropperSettings } from '../interfaces/cropper.settings';\nimport { MoveTypes } from '../interfaces/move-start.interface';\nimport { CropService } from '../services/crop.service';\nimport { CropperPositionService } from '../services/cropper-position.service';\nimport { LoadImageService } from '../services/load-image.service';\nimport { HammerStatic } from '../utils/hammer.utils';\nimport { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';\n\n@Component({\n selector: 'image-cropper',\n templateUrl: './image-cropper.component.html',\n styleUrls: ['./image-cropper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ImageCropperComponent implements OnChanges, OnInit {\n private Hammer: HammerStatic = window?.['Hammer'] || null;\n private settings = new CropperSettings();\n private setImageMaxSizeRetries = 0;\n private moveStart: MoveStart;\n private loadedImage: LoadedImage;\n\n safeImgDataUrl: SafeUrl | string;\n safeTransformStyle: SafeStyle | string;\n marginLeft: SafeStyle | string = '0px';\n maxSize: Dimensions;\n moveTypes = MoveTypes;\n imageVisible = false;\n\n @ViewChild('wrapper', { static: true }) wrapper: ElementRef<HTMLDivElement>;\n @ViewChild('sourceImage', { static: false }) sourceImage: ElementRef<HTMLDivElement>;\n\n @Input() imageChangedEvent: any;\n @Input() imageURL: string;\n @Input() imageBase64: string;\n @Input() imageFile: File;\n\n @Input() format: OutputFormat = this.settings.format;\n @Input() transform: ImageTransform = {};\n @Input() maintainAspectRatio = this.settings.maintainAspectRatio;\n @Input() aspectRatio = this.settings.aspectRatio;\n @Input() resizeToWidth = this.settings.resizeToWidth;\n @Input() resizeToHeight = this.settings.resizeToHeight;\n @Input() cropperMinWidth = this.settings.cropperMinWidth;\n @Input() cropperMinHeight = this.settings.cropperMinHeight;\n @Input() cropperMaxHeight = this.settings.cropperMaxHeight;\n @Input() cropperMaxWidth = this.settings.cropperMaxWidth;\n @Input() cropperStaticWidth = this.settings.cropperStaticWidth;\n @Input() cropperStaticHeight = this.settings.cropperStaticHeight;\n @Input() canvasRotation = this.settings.canvasRotation;\n @Input() initialStepSize = this.settings.initialStepSize;\n @Input() roundCropper = this.settings.roundCropper;\n @Input() onlyScaleDown = this.settings.onlyScaleDown;\n @Input() imageQuality = this.settings.imageQuality;\n @Input() autoCrop = this.settings.autoCrop;\n @Input() backgroundColor = this.settings.backgroundColor;\n @Input() containWithinAspectRatio = this.settings.containWithinAspectRatio;\n @Input() hideResizeSquares = this.settings.hideResizeSquares;\n @Input() cropper: CropperPosition = {\n x1: -100,\n y1: -100,\n x2: 10000,\n y2: 10000\n };\n @HostBinding('style.text-align')\n @Input() alignImage: 'left' | 'center' = this.settings.alignImage;\n @HostBinding('class.disabled')\n @Input() disabled = false;\n\n @Output() imageCropped = new EventEmitter<ImageCroppedEvent>();\n @Output() startCropImage = new EventEmitter<void>();\n @Output() imageLoaded = new EventEmitter<LoadedImage>();\n @Output() cropperReady = new EventEmitter<Dimensions>();\n @Output() loadImageFailed = new EventEmitter<void>();\n\n constructor(\n private cropService: CropService,\n private cropperPositionService: CropperPositionService,\n private loadImageService: LoadImageService,\n private sanitizer: DomSanitizer,\n private cd: ChangeDetectorRef\n ) {\n this.reset();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n this.onChangesUpdateSettings(changes);\n this.onChangesInputImage(changes);\n\n if (this.loadedImage?.original.image.complete && (changes.containWithinAspectRatio || changes.canvasRotation)) {\n this.loadImageService\n .transformLoadedImage(this.loadedImage, this.settings)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n if (changes.cropper || changes.maintainAspectRatio || changes.aspectRatio) {\n this.setMaxSize();\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n if (this.maintainAspectRatio && (changes.maintainAspectRatio || changes.aspectRatio)) {\n this.resetCropperPosition();\n } else if (changes.cropper) {\n this.checkCropperPosition(false);\n this.doAutoCrop();\n }\n this.cd.markForCheck();\n }\n if (changes.transform) {\n this.transform = this.transform || {};\n this.setCssTransform();\n this.doAutoCrop();\n }\n }\n\n private onChangesUpdateSettings(changes: SimpleChanges) {\n this.settings.setOptionsFromChanges(changes);\n\n if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) {\n this.settings.setOptions({\n hideResizeSquares: true,\n cropperMinWidth: this.settings.cropperStaticWidth,\n cropperMinHeight: this.settings.cropperStaticHeight,\n cropperMaxHeight: this.settings.cropperStaticHeight,\n cropperMaxWidth: this.settings.cropperStaticWidth,\n maintainAspectRatio: false\n });\n }\n }\n\n private onChangesInputImage(changes: SimpleChanges): void {\n if (changes.imageChangedEvent || changes.imageURL || changes.imageBase64 || changes.imageFile) {\n this.reset();\n }\n if (changes.imageChangedEvent && this.isValidImageChangedEvent()) {\n this.loadImageFile(this.imageChangedEvent.target.files[0]);\n }\n if (changes.imageURL && this.imageURL) {\n this.loadImageFromURL(this.imageURL);\n }\n if (changes.imageBase64 && this.imageBase64) {\n this.loadBase64Image(this.imageBase64);\n }\n if (changes.imageFile && this.imageFile) {\n this.loadImageFile(this.imageFile);\n }\n }\n\n private isValidImageChangedEvent(): boolean {\n return this.imageChangedEvent?.target?.files?.length > 0;\n }\n\n private setCssTransform() {\n this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle(\n 'scaleX(' + (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) + ')' +\n 'scaleY(' + (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) + ')' +\n 'rotate(' + (this.transform.rotate || 0) + 'deg)'\n );\n }\n\n ngOnInit(): void {\n this.settings.stepSize = this.initialStepSize;\n this.activatePinchGesture();\n }\n\n private reset(): void {\n this.imageVisible = false;\n this.loadedImage = null;\n this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg'\n + 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU'\n + 'AAarVyFEAAAAASUVORK5CYII=';\n this.moveStart = {\n active: false,\n type: null,\n position: null,\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n clientX: 0,\n clientY: 0\n };\n this.maxSize = {\n width: 0,\n height: 0\n };\n this.cropper.x1 = -100;\n this.cropper.y1 = -100;\n this.cropper.x2 = 10000;\n this.cropper.y2 = 10000;\n }\n\n private loadImageFile(file: File): void {\n this.loadImageService\n .loadImageFile(file, this.settings)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadBase64Image(imageBase64: string): void {\n this.loadImageService\n .loadBase64Image(imageBase64, this.settings)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadImageFromURL(url: string): void {\n this.loadImageService\n .loadImageFromURL(url, this.settings)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private setLoadedImage(loadedImage: LoadedImage): void {\n this.loadedImage = loadedImage;\n this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.base64);\n this.cd.markForCheck();\n }\n\n private loadImageError(error: any): void {\n console.error(error);\n this.loadImageFailed.emit();\n }\n\n imageLoadedInView(): void {\n if (this.loadedImage != null) {\n this.imageLoaded.emit(this.loadedImage);\n this.setImageMaxSizeRetries = 0;\n setTimeout(() => this.checkImageMaxSizeRecursively());\n }\n }\n\n private checkImageMaxSizeRecursively(): void {\n if (this.setImageMaxSizeRetries > 40) {\n this.loadImageFailed.emit();\n } else if (this.sourceImageLoaded()) {\n this.setMaxSize();\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n this.resetCropperPosition();\n this.cropperReady.emit({ ...this.maxSize });\n this.cd.markForCheck();\n } else {\n this.setImageMaxSizeRetries++;\n setTimeout(() => this.checkImageMaxSizeRecursively(), 50);\n }\n }\n\n private sourceImageLoaded(): boolean {\n return this.sourceImage?.nativeElement?.offsetWidth > 0;\n }\n\n @HostListener('window:resize')\n onResize(): void {\n if (!this.loadedImage) {\n return;\n }\n this.resizeCropperPosition();\n this.setMaxSize();\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n }\n\n private activatePinchGesture() {\n if (this.Hammer) {\n const hammer = new this.Hammer(this.wrapper.nativeElement);\n hammer.get('pinch').set({ enable: true });\n hammer.on('pinchmove', this.onPinch.bind(this));\n hammer.on('pinchend', this.pinchStop.bind(this));\n hammer.on('pinchstart', this.startPinch.bind(this));\n } else if (isDevMode()) {\n console.warn('[NgxImageCropper] Could not find HammerJS - Pinch Gesture won\\'t work');\n }\n }\n\n private resizeCropperPosition(): void {\n const sourceImageElement = this.sourceImage.nativeElement;\n if (this.maxSize.width !== sourceImageElement.offsetWidth || this.maxSize.height !== sourceImageElement.offsetHeight) {\n this.cropper.x1 = this.cropper.x1 * sourceImageElement.offsetWidth / this.maxSize.width;\n this.cropper.x2 = this.cropper.x2 * sourceImageElement.offsetWidth / this.maxSize.width;\n this.cropper.y1 = this.cropper.y1 * sourceImageElement.offsetHeight / this.maxSize.height;\n this.cropper.y2 = this.cropper.y2 * sourceImageElement.offsetHeight / this.maxSize.height;\n }\n }\n\n resetCropperPosition(): void {\n this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings);\n this.doAutoCrop();\n this.imageVisible = true;\n }\n\n keyboardAccess(event: KeyboardEvent) {\n this.changeKeyboardStepSize(event);\n this.keyboardMoveCropper(event);\n }\n\n private changeKeyboardStepSize(event: KeyboardEvent): void {\n const key = +event.key;\n if (key >= 1 && key <= 9) {\n this.settings.stepSize = key;\n }\n }\n\n private keyboardMoveCropper(event) {\n const keyboardWhiteList: string[] = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];\n if (!(keyboardWhiteList.includes(event.key))) {\n return;\n }\n const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;\n const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);\n const moveEvent = getEventForKey(event.key, this.settings.stepSize);\n event.preventDefault();\n event.stopPropagation();\n this.startMove({ clientX: 0, clientY: 0 }, moveType, position);\n this.moveImg(moveEvent);\n this.moveStop();\n }\n\n startMove(event: any, moveType: MoveTypes, position: string | null = null): void {\n if (this.moveStart?.active && this.moveStart?.type === MoveTypes.Pinch) {\n return;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n this.moveStart = {\n active: true,\n type: moveType,\n position,\n clientX: this.cropperPositionService.getClientX(event),\n clientY: this.cropperPositionService.getClientY(event),\n ...this.cropper\n };\n }\n\n startPinch(event: any) {\n if (!this.safeImgDataUrl) {\n return;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n this.moveStart = {\n active: true,\n type: MoveTypes.Pinch,\n position: 'center',\n clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2,\n clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2,\n ...this.cropper\n };\n }\n\n @HostListener('document:mousemove', ['$event'])\n @HostListener('document:touchmove', ['$event'])\n moveImg(event: any): void {\n if (this.moveStart.active) {\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Move) {\n this.cropperPositionService.move(event, this.moveStart, this.cropper);\n this.checkCropperPosition(true);\n } else if (this.moveStart.type === MoveTypes.Resize) {\n if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);\n }\n this.checkCropperPosition(false);\n }\n this.cd.detectChanges();\n }\n }\n\n onPinch(event: any) {\n if (this.moveStart.active) {\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Pinch) {\n this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);\n this.checkCropperPosition(false);\n }\n this.cd.detectChanges();\n }\n }\n\n private setMaxSize(): void {\n if (this.sourceImage) {\n const sourceImageElement = this.sourceImage.nativeElement;\n this.maxSize.width = sourceImageElement.offsetWidth;\n this.maxSize.height = sourceImageElement.offsetHeight;\n this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)');\n }\n }\n\n private setCropperScaledMinSize(): void {\n if (this.loadedImage?.transformed?.image) {\n this.setCropperScaledMinWidth();\n this.setCropperScaledMinHeight();\n } else {\n this.settings.cropperScaledMinWidth = 20;\n this.settings.cropperScaledMinHeight = 20;\n }\n }\n\n private setCropperScaledMinWidth(): void {\n this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0\n ? Math.max(20, this.cropperMinWidth / this.loadedImage.transformed.image.width * this.maxSize.width)\n : 20;\n }\n\n private setCropperScaledMinHeight(): void {\n if (this.maintainAspectRatio) {\n this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio);\n } else if (this.cropperMinHeight > 0) {\n this.settings.cropperScaledMinHeight = Math.max(\n 20,\n this.cropperMinHeight / this.loadedImage.transformed.image.height * this.maxSize.height\n );\n } else {\n this.settings.cropperScaledMinHeight = 20;\n }\n }\n\n private setCropperScaledMaxSize(): void {\n if (this.loadedImage?.transformed?.image) {\n const ratio = this.loadedImage.transformed.size.width / this.maxSize.width;\n this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width;\n this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height;\n if (this.maintainAspectRatio) {\n if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) {\n this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio;\n } else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) {\n this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio;\n }\n }\n } else {\n this.settings.cropperScaledMaxWidth = this.maxSize.width;\n this.settings.cropperScaledMaxHeight = this.maxSize.height;\n }\n }\n\n private checkCropperPosition(maintainSize = false): void {\n if (this.cropper.x1 < 0) {\n this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0;\n this.cropper.x1 = 0;\n }\n if (this.cropper.y1 < 0) {\n this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0;\n this.cropper.y1 = 0;\n }\n if (this.cropper.x2 > this.maxSize.width) {\n this.cropper.x1 -= maintainSize ? (this.cropper.x2 - this.maxSize.width) : 0;\n this.cropper.x2 = this.maxSize.width;\n }\n if (this.cropper.y2 > this.maxSize.height) {\n this.cropper.y1 -= maintainSize ? (this.cropper.y2 - this.maxSize.height) : 0;\n this.cropper.y2 = this.maxSize.height;\n }\n }\n\n @HostListener('document:mouseup')\n @HostListener('document:touchend')\n moveStop(): void {\n if (this.moveStart.active) {\n this.moveStart.active = false;\n this.doAutoCrop();\n }\n }\n\n pinchStop(): void {\n if (this.moveStart.active) {\n this.moveStart.active = false;\n this.doAutoCrop();\n }\n }\n\n private doAutoCrop(): void {\n if (this.autoCrop) {\n this.crop();\n }\n }\n\n crop(): ImageCroppedEvent | null {\n if (this.loadedImage?.transformed?.image != null) {\n this.startCropImage.emit();\n const output = this.cropService.crop(this.sourceImage, this.loadedImage, this.cropper, this.settings);\n if (output != null) {\n this.imageCropped.emit(output);\n }\n return output;\n }\n return null;\n }\n}\n","export function getPositionForKey(key: string): string {\n switch (key) {\n case 'ArrowUp':\n return 'top';\n case 'ArrowRight':\n return 'right';\n case 'ArrowDown':\n return 'bottom';\n case 'ArrowLeft':\n default:\n return 'left';\n }\n}\n\nexport function getInvertedPositionForKey(key: string): string {\n switch (key) {\n case 'ArrowUp':\n return 'bottom';\n case 'ArrowRight':\n return 'left';\n case 'ArrowDown':\n return 'top';\n case 'ArrowLeft':\n default:\n return 'right';\n }\n}\n\nexport function getEventForKey(key: string, stepSize: number): any {\n switch (key) {\n case 'ArrowUp':\n return {clientX: 0, clientY: stepSize * -1};\n case 'ArrowRight':\n return {clientX: stepSize, clientY: 0};\n case 'ArrowDown':\n return {clientX: 0, clientY: stepSize};\n case 'ArrowLeft':\n default:\n return {clientX: stepSize * -1, clientY: 0};\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ImageCropperComponent } from './component/image-cropper.component';\n\n@NgModule({\n imports: [\n CommonModule\n ],\n declarations: [\n ImageCropperComponent\n ],\n exports: [\n ImageCropperComponent\n ]\n})\nexport class ImageCropperModule {\n}\n","export function base64ToFile(base64Image: string): Blob {\n const split = base64Image.split(',');\n const type = split[0].replace('data:', '').replace(';base64', '');\n const byteString = atob(split[1]);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i += 1) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ab], {type});\n}\n"]}
|