{"version":3,"sources":["webpack:///./node_modules/cropperjs/dist/cropper.js","webpack:///./node_modules/@uppy/compressor/lib/index.js","webpack:///./node_modules/@uppy/compressor/node_modules/@transloadit/prettier-bytes/prettierBytes.js","webpack:///./node_modules/compressorjs/dist/compressor.common.js","webpack:///./node_modules/@uppy/compressor/lib/locale.js","webpack:///./node_modules/@uppy/image-editor/lib/index.js","webpack:///./node_modules/@uppy/image-editor/lib/ImageEditor.js","webpack:///./node_modules/@uppy/image-editor/lib/Editor.js","webpack:///./node_modules/@uppy/image-editor/lib/locale.js"],"names":["module","exports","_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","_defineProperty","value","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","o","minLen","n","toString","call","slice","name","test","len","arr2","IS_BROWSER","window","document","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","concat","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","DEFAULTS","viewMode","dragMode","initialAspectRatio","NaN","aspectRatio","data","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","crop","zoom","TEMPLATE","isNaN","Number","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","toArray","callback","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","Math","round","REGEXP_SUFFIX","setStyle","element","styles","style","property","hasClass","classList","contains","className","indexOf","addClass","elem","add","trim","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","toLowerCase","getData","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","type","handler","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","detail","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","transform","join","WebkitTransform","msTransform","getMaxZoomRatio","pointers","pointers2","ratios","pointer","pointerId","pointer2","x1","abs","startX","y1","startY","x2","endX","y2","endY","z1","sqrt","ratio","sort","a","b","getPointer","_ref2","endOnly","pageX","pageY","end","getPointersCenter","count","_ref3","getAdjustedSizes","_ref4","height","width","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getSourceCanvas","image","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","naturalWidth","imageNaturalHeight","naturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","createElement","context","getContext","maxSizes","minSizes","min","max","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","drawImage","map","param","floor","fromCharCode","String","getStringFromCharCode","dataView","start","str","getUint8","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","atob","arrayBuffer","ArrayBuffer","uint8","Uint8Array","charCodeAt","arrayBufferToDataURL","mimeType","chunks","chunkSize","subarray","btoa","resetAndGetOrientation","orientation","DataView","littleEndian","app1Start","ifdStart","byteLength","offset","tiffOffset","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","parseOrientation","render","this","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","cropper","containerData","offsetWidth","offsetHeight","imageData","rotated","canvasWidth","canvasHeight","canvasData","oldLeft","oldTop","limited","limitCanvas","initialImageData","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","output","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","src","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","getElementsByTagName","events","bind","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","_this","delta","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","right","bottom","renderable","shiftKey","range","x","y","check","side","move","p","methods","reset","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","destroy","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","mode","croppable","AnotherCropper","Cropper","tagName","Error","reloading","sizing","init","toDataURL","read","clone","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","onload","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","isIOSWebKit","navigator","userAgent","done","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild","factory","_core","_RateLimitedQueue2","_classPrivateFieldLooseBase","receiver","privateKey","id","_classPrivateFieldLooseKey","getFileNameAndExtension","prettierBytes","CompressorJS","locale","_RateLimitedQueue","Compressor","BasePlugin","uppy","opts","super","defaultLocale","quality","limit","RateLimitedQueue","i18nInit","prepareUpload","compress","blob","Promise","resolve","reject","success","async","fileIDs","totalCompressedSize","compressedFiles","compressAndApplyResult","wrapPromiseFunction","compressedBlob","file","compressedSavingsSize","size","log","extension","setFileState","setFileMeta","err","promises","fileID","getFile","emit","message","i18n","isRemote","startsWith","all","info","install","addPreProcessor","uninstall","removePreProcessor","num","neg","units","exponent","pow","unit","toFixed","_extends","canvasToBlob","CanvasPrototype","hasBlobConstructor","Blob","Boolean","e","hasArrayBufferViewSupport","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","dataURIPattern","dataURLtoBlob","dataURI","matches","mediaType","isBase64","dataString","byteString","intArray","bb","decodeURIComponent","append","getBlob","toBlob","mozGetAsFile","self","msToBlob","strict","convertTypes","convertSize","beforeDraw","drew","REGEXP_IMAGE_TYPE","isImageType","ArrayBuffer$1","FileReader","URL","webkitURL","REGEXP_EXTENSION","AnotherCompressor","Image","aborted","result","createObjectURL","reader","fail","readAsArrayBuffer","readAsDataURL","draw","_this3","_ref2$rotate","_ref2$scaleX","_ref2$scaleY","is90DegreesRotated","resizable","_getAdjustedSizes2","_getAdjustedSizes3","_getAdjustedSizes4","_getAdjustedSizes4$wi","_getAdjustedSizes4$he","destX","destY","_getAdjustedSizes5","contain","cover","revokeObjectURL","date","lastModified","lastModifiedDate","substr","complete","strings","compressingImages","compressedX","_preact","Editor","ImageEditor","UIPlugin","currentImage","getPluginState","cropperOptions","croppedCanvasOptions","updatedFile","setPluginState","storeCropperInstance","selectFile","title","actions","revert","granularRotate","flip","zoomIn","zoomOut","cropSquare","cropWidescreen","cropWidescreenVertical","canEditFile","fileTypeSpecific","mount","unmount","h","VERSION","default","Component","granularRotateOnChange","ev","rotationAngle","rotationDelta","state","pendingRotationDelta","cancelAnimationFrame","granularRotateOnInputNextFrame","pendingRotationAngle","requestAnimationFrame","componentDidMount","imgElement","setState","componentWillUnmount","renderGranularRotate","role","onInput","onChange","renderRevert","onClick","d","fill","renderRotate","renderFlip","renderZoomIn","renderZoomOut","renderCropSquare","renderCropWidescreen","renderCropWidescreenVertical","imageURL","ref","flipHorizontal","aspectRatioSquare","aspectRatioLandscape","aspectRatioPortrait"],"mappings":";6EAWiEA,EAAOC,QAGhE,WAAe,aAErB,SAASC,EAAQC,GAaf,OATED,EADoB,oBAAXE,QAAoD,kBAApBA,OAAOC,SACtC,SAAUF,GAClB,cAAcA,CAChB,EAEU,SAAUA,GAClB,OAAOA,GAAyB,oBAAXC,QAAyBD,EAAIG,cAAgBF,QAAUD,IAAQC,OAAOG,UAAY,gBAAkBJ,CAC3H,EAGKD,EAAQC,EACjB,CAEA,SAASK,EAAgBC,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,oCAExB,CAEA,SAASC,EAAkBC,EAAQC,GACjC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CACrC,IAAIE,EAAaH,EAAMC,GACvBE,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWE,cAAe,EACtB,UAAWF,IAAYA,EAAWG,UAAW,GACjDC,OAAOC,eAAeT,EAAQI,EAAWM,IAAKN,EAChD,CACF,CAEA,SAASO,EAAad,EAAae,EAAYC,GAG7C,OAFID,GAAYb,EAAkBF,EAAYH,UAAWkB,GACrDC,GAAad,EAAkBF,EAAagB,GACzChB,CACT,CAEA,SAASiB,EAAgBxB,EAAKoB,EAAKK,GAYjC,OAXIL,KAAOpB,EACTkB,OAAOC,eAAenB,EAAKoB,EAAK,CAC9BK,MAAOA,EACPV,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZjB,EAAIoB,GAAOK,EAGNzB,CACT,CAEA,SAAS0B,EAAQC,EAAQC,GACvB,IAAIC,EAAOX,OAAOW,KAAKF,GAEvB,GAAIT,OAAOY,sBAAuB,CAChC,IAAIC,EAAUb,OAAOY,sBAAsBH,GACvCC,IAAgBG,EAAUA,EAAQC,QAAO,SAAUC,GACrD,OAAOf,OAAOgB,yBAAyBP,EAAQM,GAAKlB,UACtD,KACAc,EAAKM,KAAKC,MAAMP,EAAME,EACxB,CAEA,OAAOF,CACT,CAEA,SAASQ,EAAe3B,GACtB,IAAK,IAAIE,EAAI,EAAGA,EAAI0B,UAAUzB,OAAQD,IAAK,CACzC,IAAI2B,EAAyB,MAAhBD,UAAU1B,GAAa0B,UAAU1B,GAAK,CAAC,EAEhDA,EAAI,EACNc,EAAQR,OAAOqB,IAAS,GAAMC,SAAQ,SAAUpB,GAC9CI,EAAgBd,EAAQU,EAAKmB,EAAOnB,GACtC,IACSF,OAAOuB,0BAChBvB,OAAOwB,iBAAiBhC,EAAQQ,OAAOuB,0BAA0BF,IAEjEb,EAAQR,OAAOqB,IAASC,SAAQ,SAAUpB,GACxCF,OAAOC,eAAeT,EAAQU,EAAKF,OAAOgB,yBAAyBK,EAAQnB,GAC7E,GAEJ,CAEA,OAAOV,CACT,CAEA,SAASiC,EAAmBC,GAC1B,OAAOC,EAAmBD,IAAQE,EAAiBF,IAAQG,EAA4BH,IAAQI,GACjG,CAEA,SAASH,EAAmBD,GAC1B,GAAIK,MAAMC,QAAQN,GAAM,OAAOO,EAAkBP,EACnD,CAEA,SAASE,EAAiBM,GACxB,GAAsB,qBAAXnD,QAA0BA,OAAOC,YAAYgB,OAAOkC,GAAO,OAAOH,MAAMI,KAAKD,EAC1F,CAEA,SAASL,EAA4BO,EAAGC,GACtC,GAAKD,EAAL,CACA,GAAiB,kBAANA,EAAgB,OAAOH,EAAkBG,EAAGC,GACvD,IAAIC,EAAItC,OAAOd,UAAUqD,SAASC,KAAKJ,GAAGK,MAAM,GAAI,GAEpD,MADU,WAANH,GAAkBF,EAAEnD,cAAaqD,EAAIF,EAAEnD,YAAYyD,MAC7C,QAANJ,GAAqB,QAANA,EAAoBP,MAAMI,KAAKC,GACxC,cAANE,GAAqB,2CAA2CK,KAAKL,GAAWL,EAAkBG,EAAGC,QAAzG,CALc,CAMhB,CAEA,SAASJ,EAAkBP,EAAKkB,IACnB,MAAPA,GAAeA,EAAMlB,EAAI/B,UAAQiD,EAAMlB,EAAI/B,QAE/C,IAAK,IAAID,EAAI,EAAGmD,EAAO,IAAId,MAAMa,GAAMlD,EAAIkD,EAAKlD,IAAKmD,EAAKnD,GAAKgC,EAAIhC,GAEnE,OAAOmD,CACT,CAEA,SAASf,IACP,MAAM,IAAIxC,UAAU,uIACtB,CAEA,IAAIwD,EAA+B,qBAAXC,QAAqD,qBAApBA,OAAOC,SAC5DC,EAASH,EAAaC,OAAS,CAAC,EAChCG,KAAkBJ,IAAcG,EAAOD,SAASG,kBAAkB,iBAAkBF,EAAOD,SAASG,gBACpGC,IAAoBN,GAAa,iBAAkBG,EACnDI,EAAY,UAEZC,EAAa,MACbC,EAAc,OACdC,EAAc,OACdC,EAAc,OACdC,EAAc,IACdC,EAAc,IACdC,EAAe,IACfC,EAAe,IACfC,EAAoB,KACpBC,EAAoB,KACpBC,EAAoB,KACpBC,EAAoB,KAEpBC,EAAa,GAAGC,OAAOd,EAAW,SAClCe,EAAiB,GAAGD,OAAOd,EAAW,aACtCgB,EAAe,GAAGF,OAAOd,EAAW,WACpCiB,EAAa,GAAGH,OAAOd,EAAW,SAClCkB,EAAkB,GAAGJ,OAAOd,EAAW,cACvCmB,EAAc,GAAGL,OAAOd,EAAW,UACnCoB,EAAa,GAAGN,OAAOd,EAAW,SAElCqB,EAAc,GAAGP,OAAOd,EAAW,UACnCsB,EAAe,GAAGR,OAAOd,EAAW,WAEpCuB,EAAiB,OACjBC,EAAiB,OACjBC,EAAiB,OAEjBC,EAAa,OACbC,EAAiB,UACjBC,EAAkB,WAClBC,EAAmB,YACnBC,EAAiB,WACjBC,EAAoBlC,EAAkB,aAAe,YACrDmC,EAAmBnC,EAAkB,YAAc,YACnDoC,EAAkBpC,EAAkB,uBAAyB,UAC7DqC,EAAqBnC,EAAoB,cAAgBgC,EACzDI,EAAqBpC,EAAoB,cAAgBiC,EACzDI,EAAmBrC,EAAoB,0BAA4BkC,EACnEI,EAAc,QACdC,GAAe,SACfC,GAAc,QACdC,GAAa,OAEbC,GAAiB,aAEjBC,GAAiB,2CACjBC,GAAkB,SAClBC,GAAuB,4BACvBC,GAAkB,gBAElBC,GAAW,CAEbC,SAAU,EAGVC,SAAUzB,EAGV0B,mBAAoBC,IAEpBC,YAAaD,IAEbE,KAAM,KAENC,QAAS,GAETC,YAAY,EAEZC,SAAS,EAETC,kBAAkB,EAElBC,kBAAkB,EAElBC,OAAO,EAEPC,QAAQ,EAERC,QAAQ,EAERC,WAAW,EAEXC,YAAY,EAEZC,UAAU,EAEVC,aAAc,GAEdC,SAAS,EAETC,WAAW,EAEXC,UAAU,EAEVC,UAAU,EAEVC,aAAa,EAEbC,aAAa,EAEbC,eAAgB,GAEhBC,gBAAgB,EAEhBC,kBAAkB,EAElBC,0BAA0B,EAE1BC,eAAgB,EAChBC,gBAAiB,EACjBC,gBAAiB,EACjBC,iBAAkB,EAClBC,kBAAmB,IACnBC,mBAAoB,IAEpBC,MAAO,KACPC,UAAW,KACXC,SAAU,KACVC,QAAS,KACTC,KAAM,KACNC,KAAM,MAGJC,GAAW,orCAMXC,GAAQC,OAAOD,OAAS5F,EAAO4F,MAOnC,SAASE,GAASxI,GAChB,MAAwB,kBAAVA,IAAuBsI,GAAMtI,EAC7C,CAOA,IAAIyI,GAAmB,SAA0BzI,GAC/C,OAAOA,EAAQ,GAAKA,EAAQ0I,GAC9B,EAOA,SAASC,GAAY3I,GACnB,MAAwB,qBAAVA,CAChB,CAOA,SAAS4I,GAAS5I,GAChB,MAA0B,WAAnB1B,EAAQ0B,IAAiC,OAAVA,CACxC,CACA,IAAI6I,GAAiBpJ,OAAOd,UAAUkK,eAOtC,SAASC,GAAc9I,GACrB,IAAK4I,GAAS5I,GACZ,OAAO,EAGT,IACE,IAAI+I,EAAe/I,EAAMtB,YACrBC,EAAYoK,EAAapK,UAC7B,OAAOoK,GAAgBpK,GAAakK,GAAe5G,KAAKtD,EAAW,gBAGrE,CAFE,MAAOqK,GACP,OAAO,CACT,CACF,CAOA,SAASC,GAAWjJ,GAClB,MAAwB,oBAAVA,CAChB,CACA,IAAIkC,GAAQV,MAAM7C,UAAUuD,MAO5B,SAASgH,GAAQlJ,GACf,OAAOwB,MAAMI,KAAOJ,MAAMI,KAAK5B,GAASkC,GAAMD,KAAKjC,EACrD,CAQA,SAASe,GAAQmF,EAAMiD,GAerB,OAdIjD,GAAQ+C,GAAWE,KACjB3H,MAAMC,QAAQyE,IAASsC,GAAStC,EAAK9G,QAGrC8J,GAAQhD,GAAMnF,SAAQ,SAAUf,EAAOL,GACrCwJ,EAASlH,KAAKiE,EAAMlG,EAAOL,EAAKuG,EAClC,IACS0C,GAAS1C,IACpBzG,OAAOW,KAAK8F,GAAMnF,SAAQ,SAAUpB,GAClCwJ,EAASlH,KAAKiE,EAAMA,EAAKvG,GAAMA,EAAKuG,EACtC,KAIGA,CACT,CAQA,IAAIkD,GAAS3J,OAAO2J,QAAU,SAAgBnK,GAC5C,IAAK,IAAIoK,EAAOxI,UAAUzB,OAAQkK,EAAO,IAAI9H,MAAM6H,EAAO,EAAIA,EAAO,EAAI,GAAIE,EAAO,EAAGA,EAAOF,EAAME,IAClGD,EAAKC,EAAO,GAAK1I,UAAU0I,GAa7B,OAVIX,GAAS3J,IAAWqK,EAAKlK,OAAS,GACpCkK,EAAKvI,SAAQ,SAAUyI,GACjBZ,GAASY,IACX/J,OAAOW,KAAKoJ,GAAKzI,SAAQ,SAAUpB,GACjCV,EAAOU,GAAO6J,EAAI7J,EACpB,GAEJ,IAGKV,CACT,EACIwK,GAAkB,uBAStB,SAASC,GAAuB1J,GAC9B,IAAI2J,EAAQ9I,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,KAChF,OAAO4I,GAAgBrH,KAAKpC,GAAS6J,KAAKC,MAAM9J,EAAQ2J,GAASA,EAAQ3J,CAC3E,CACA,IAAI+J,GAAgB,+CAOpB,SAASC,GAASC,EAASC,GACzB,IAAIC,EAAQF,EAAQE,MACpBpJ,GAAQmJ,GAAQ,SAAUlK,EAAOoK,GAC3BL,GAAc3H,KAAKgI,IAAa5B,GAASxI,KAC3CA,EAAQ,GAAG4D,OAAO5D,EAAO,OAG3BmK,EAAMC,GAAYpK,CACpB,GACF,CAQA,SAASqK,GAASJ,EAASjK,GACzB,OAAOiK,EAAQK,UAAYL,EAAQK,UAAUC,SAASvK,GAASiK,EAAQO,UAAUC,QAAQzK,IAAU,CACrG,CAOA,SAAS0K,GAAST,EAASjK,GACzB,GAAKA,EAIL,GAAIwI,GAASyB,EAAQ7K,QACnB2B,GAAQkJ,GAAS,SAAUU,GACzBD,GAASC,EAAM3K,EACjB,SAIF,GAAIiK,EAAQK,UACVL,EAAQK,UAAUM,IAAI5K,OADxB,CAKA,IAAIwK,EAAYP,EAAQO,UAAUK,OAE7BL,EAEMA,EAAUC,QAAQzK,GAAS,IACpCiK,EAAQO,UAAY,GAAG5G,OAAO4G,EAAW,KAAK5G,OAAO5D,IAFrDiK,EAAQO,UAAYxK,CALtB,CASF,CAOA,SAAS8K,GAAYb,EAASjK,GACvBA,IAIDwI,GAASyB,EAAQ7K,QACnB2B,GAAQkJ,GAAS,SAAUU,GACzBG,GAAYH,EAAM3K,EACpB,IAIEiK,EAAQK,UACVL,EAAQK,UAAUS,OAAO/K,GAIvBiK,EAAQO,UAAUC,QAAQzK,IAAU,IACtCiK,EAAQO,UAAYP,EAAQO,UAAUQ,QAAQhL,EAAO,KAEzD,CAQA,SAASiL,GAAYhB,EAASjK,EAAOkL,GAC9BlL,IAIDwI,GAASyB,EAAQ7K,QACnB2B,GAAQkJ,GAAS,SAAUU,GACzBM,GAAYN,EAAM3K,EAAOkL,EAC3B,IAKEA,EACFR,GAAST,EAASjK,GAElB8K,GAAYb,EAASjK,GAEzB,CACA,IAAImL,GAAoB,oBAOxB,SAASC,GAAYpL,GACnB,OAAOA,EAAMgL,QAAQG,GAAmB,SAASE,aACnD,CAQA,SAASC,GAAQrB,EAAS9H,GACxB,OAAIyG,GAASqB,EAAQ9H,IACZ8H,EAAQ9H,GAGb8H,EAAQsB,QACHtB,EAAQsB,QAAQpJ,GAGlB8H,EAAQuB,aAAa,QAAQ5H,OAAOwH,GAAYjJ,IACzD,CAQA,SAASsJ,GAAQxB,EAAS9H,EAAM+D,GAC1B0C,GAAS1C,GACX+D,EAAQ9H,GAAQ+D,EACP+D,EAAQsB,QACjBtB,EAAQsB,QAAQpJ,GAAQ+D,EAExB+D,EAAQyB,aAAa,QAAQ9H,OAAOwH,GAAYjJ,IAAQ+D,EAE5D,CAOA,SAASyF,GAAW1B,EAAS9H,GAC3B,GAAIyG,GAASqB,EAAQ9H,IACnB,WACS8H,EAAQ9H,EAGjB,CAFE,MAAO6G,GACPiB,EAAQ9H,QAAQyH,CAClB,MACK,GAAIK,EAAQsB,QAEjB,WACStB,EAAQsB,QAAQpJ,EAGzB,CAFE,MAAO6G,GACPiB,EAAQsB,QAAQpJ,QAAQyH,CAC1B,MAEAK,EAAQ2B,gBAAgB,QAAQhI,OAAOwH,GAAYjJ,IAEvD,CACA,IAAI0J,GAAgB,QAEhBC,GAAgB,WAClB,IAAIC,GAAY,EAEhB,GAAIxJ,EAAY,CACd,IAAIyJ,GAAO,EAEPC,EAAW,WAAqB,EAEhCC,EAAUzM,OAAOC,eAAe,CAAC,EAAG,OAAQ,CAC9CyM,IAAK,WAEH,OADAJ,GAAY,EACLC,CACT,EAOAI,IAAK,SAAapM,GAChBgM,EAAOhM,CACT,IAEF0C,EAAO2J,iBAAiB,OAAQJ,EAAUC,GAC1CxJ,EAAO4J,oBAAoB,OAAQL,EAAUC,EAC/C,CAEA,OAAOH,CACT,CA5BoB,GAsCpB,SAASQ,GAAetC,EAASuC,EAAMP,GACrC,IAAIC,EAAUrL,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC/E4L,EAAUR,EACdO,EAAK3B,OAAO6B,MAAMb,IAAe9K,SAAQ,SAAU4L,GACjD,IAAKb,GAAe,CAClB,IAAIc,EAAY3C,EAAQ2C,UAEpBA,GAAaA,EAAUD,IAAUC,EAAUD,GAAOV,KACpDQ,EAAUG,EAAUD,GAAOV,UACpBW,EAAUD,GAAOV,GAEqB,IAAzCxM,OAAOW,KAAKwM,EAAUD,IAAQvN,eACzBwN,EAAUD,GAGmB,IAAlClN,OAAOW,KAAKwM,GAAWxN,eAClB6K,EAAQ2C,UAGrB,CAEA3C,EAAQqC,oBAAoBK,EAAOF,EAASP,EAC9C,GACF,CASA,SAASW,GAAY5C,EAASuC,EAAMP,GAClC,IAAIC,EAAUrL,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC/EiM,EAAWb,EACfO,EAAK3B,OAAO6B,MAAMb,IAAe9K,SAAQ,SAAU4L,GACjD,GAAIT,EAAQF,OAASF,GAAe,CAClC,IAAIiB,EAAqB9C,EAAQ2C,UAC7BA,OAAmC,IAAvBG,EAAgC,CAAC,EAAIA,EAErDD,EAAW,kBACFF,EAAUD,GAAOV,GACxBhC,EAAQqC,oBAAoBK,EAAOG,EAAUZ,GAE7C,IAAK,IAAIc,EAAQnM,UAAUzB,OAAQkK,EAAO,IAAI9H,MAAMwL,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IACpF3D,EAAK2D,GAASpM,UAAUoM,GAG1BhB,EAAStL,MAAMsJ,EAASX,EAC1B,EAEKsD,EAAUD,KACbC,EAAUD,GAAS,CAAC,GAGlBC,EAAUD,GAAOV,IACnBhC,EAAQqC,oBAAoBK,EAAOC,EAAUD,GAAOV,GAAWC,GAGjEU,EAAUD,GAAOV,GAAYa,EAC7B7C,EAAQ2C,UAAYA,CACtB,CAEA3C,EAAQoC,iBAAiBM,EAAOG,EAAUZ,EAC5C,GACF,CASA,SAASgB,GAAcjD,EAASuC,EAAMtG,GACpC,IAAIyG,EAaJ,OAXI1D,GAAWkE,QAAUlE,GAAWmE,aAClCT,EAAQ,IAAIS,YAAYZ,EAAM,CAC5Ba,OAAQnH,EACRoH,SAAS,EACTC,YAAY,KAGdZ,EAAQlK,SAAS+K,YAAY,gBACvBC,gBAAgBjB,GAAM,GAAM,EAAMtG,GAGnC+D,EAAQiD,cAAcP,EAC/B,CAOA,SAASe,GAAUzD,GACjB,IAAI0D,EAAM1D,EAAQ2D,wBAClB,MAAO,CACLC,KAAMF,EAAIE,MAAQrL,OAAOsL,YAAcrL,SAASG,gBAAgBmL,YAChEC,IAAKL,EAAIK,KAAOxL,OAAOyL,YAAcxL,SAASG,gBAAgBsL,WAElE,CACA,IAAIC,GAAWzL,EAAOyL,SAClBC,GAAiB,gCAOrB,SAASC,GAAiBC,GACxB,IAAIC,EAAQD,EAAIE,MAAMJ,IACtB,OAAiB,OAAVG,IAAmBA,EAAM,KAAOJ,GAASM,UAAYF,EAAM,KAAOJ,GAASO,UAAYH,EAAM,KAAOJ,GAASQ,KACtH,CAOA,SAASC,GAAaN,GACpB,IAAIO,EAAY,aAAajL,QAAO,IAAIkL,MAAOC,WAC/C,OAAOT,IAA6B,IAAtBA,EAAI7D,QAAQ,KAAc,IAAM,KAAOoE,CACvD,CAOA,SAASG,GAAcC,GACrB,IAAIC,EAASD,EAAKC,OACdC,EAASF,EAAKE,OACdC,EAASH,EAAKG,OACdC,EAAaJ,EAAKI,WAClBC,EAAaL,EAAKK,WAClBC,EAAS,GAET/G,GAAS6G,IAA8B,IAAfA,GAC1BE,EAAO7O,KAAK,cAAckD,OAAOyL,EAAY,QAG3C7G,GAAS8G,IAA8B,IAAfA,GAC1BC,EAAO7O,KAAK,cAAckD,OAAO0L,EAAY,QAI3C9G,GAAS0G,IAAsB,IAAXA,GACtBK,EAAO7O,KAAK,UAAUkD,OAAOsL,EAAQ,SAGnC1G,GAAS2G,IAAsB,IAAXA,GACtBI,EAAO7O,KAAK,UAAUkD,OAAOuL,EAAQ,MAGnC3G,GAAS4G,IAAsB,IAAXA,GACtBG,EAAO7O,KAAK,UAAUkD,OAAOwL,EAAQ,MAGvC,IAAII,EAAYD,EAAOnQ,OAASmQ,EAAOE,KAAK,KAAO,OACnD,MAAO,CACLC,gBAAiBF,EACjBG,YAAaH,EACbA,UAAWA,EAEf,CAOA,SAASI,GAAgBC,GACvB,IAAIC,EAAYlP,EAAe,CAAC,EAAGiP,GAE/BE,EAAS,GAiBb,OAhBAhP,GAAQ8O,GAAU,SAAUG,EAASC,UAC5BH,EAAUG,GACjBlP,GAAQ+O,GAAW,SAAUI,GAC3B,IAAIC,EAAKtG,KAAKuG,IAAIJ,EAAQK,OAASH,EAASG,QACxCC,EAAKzG,KAAKuG,IAAIJ,EAAQO,OAASL,EAASK,QACxCC,EAAK3G,KAAKuG,IAAIJ,EAAQS,KAAOP,EAASO,MACtCC,EAAK7G,KAAKuG,IAAIJ,EAAQW,KAAOT,EAASS,MACtCC,EAAK/G,KAAKgH,KAAKV,EAAKA,EAAKG,EAAKA,GAE9BQ,GADKjH,KAAKgH,KAAKL,EAAKA,EAAKE,EAAKA,GAChBE,GAAMA,EACxBb,EAAOrP,KAAKoQ,EACd,GACF,IACAf,EAAOgB,MAAK,SAAUC,EAAGC,GACvB,OAAOpH,KAAKuG,IAAIY,GAAKnH,KAAKuG,IAAIa,EAChC,IACOlB,EAAO,EAChB,CAQA,SAASmB,GAAWC,EAAOC,GACzB,IAAIC,EAAQF,EAAME,MACdC,EAAQH,EAAMG,MACdC,EAAM,CACRd,KAAMY,EACNV,KAAMW,GAER,OAAOF,EAAUG,EAAM3Q,EAAe,CACpCyP,OAAQgB,EACRd,OAAQe,GACPC,EACL,CAOA,SAASC,GAAkB3B,GACzB,IAAIwB,EAAQ,EACRC,EAAQ,EACRG,EAAQ,EAUZ,OATA1Q,GAAQ8O,GAAU,SAAU6B,GAC1B,IAAIrB,EAASqB,EAAMrB,OACfE,EAASmB,EAAMnB,OACnBc,GAAShB,EACTiB,GAASf,EACTkB,GAAS,CACX,IAGO,CACLJ,MAHFA,GAASI,EAIPH,MAHFA,GAASG,EAKX,CAQA,SAASE,GAAiBC,GAExB,IAAI3L,EAAc2L,EAAM3L,YACpB4L,EAASD,EAAMC,OACfC,EAAQF,EAAME,MACdtF,EAAO3L,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,UAC3EkR,EAAetJ,GAAiBqJ,GAChCE,EAAgBvJ,GAAiBoJ,GAErC,GAAIE,GAAgBC,EAAe,CACjC,IAAIC,EAAgBJ,EAAS5L,EAEhB,YAATuG,GAAsByF,EAAgBH,GAAkB,UAATtF,GAAoByF,EAAgBH,EACrFD,EAASC,EAAQ7L,EAEjB6L,EAAQD,EAAS5L,CAErB,MAAW8L,EACTF,EAASC,EAAQ7L,EACR+L,IACTF,EAAQD,EAAS5L,GAGnB,MAAO,CACL6L,MAAOA,EACPD,OAAQA,EAEZ,CAOA,SAASK,GAAgBC,GACvB,IAAIL,EAAQK,EAAML,MACdD,EAASM,EAAMN,OACfO,EAASD,EAAMC,OAGnB,GAAe,MAFfA,EAASvI,KAAKuG,IAAIgC,GAAU,KAG1B,MAAO,CACLN,MAAOD,EACPA,OAAQC,GAIZ,IAAIO,EAAMD,EAAS,GAAKvI,KAAKyI,GAAK,IAC9BC,EAAS1I,KAAK2I,IAAIH,GAClBI,EAAS5I,KAAK6I,IAAIL,GAClBM,EAAWb,EAAQW,EAASZ,EAASU,EACrCK,EAAYd,EAAQS,EAASV,EAASY,EAC1C,OAAOL,EAAS,GAAK,CACnBN,MAAOc,EACPf,OAAQc,GACN,CACFb,MAAOa,EACPd,OAAQe,EAEZ,CAUA,SAASC,GAAgBC,EAAOC,EAAOC,EAAOC,GAC5C,IAAIC,EAAmBH,EAAM9M,YACzBkN,EAAoBJ,EAAMK,aAC1BC,EAAqBN,EAAMO,cAC3BC,EAAeR,EAAM7D,OACrBA,OAA0B,IAAjBqE,EAA0B,EAAIA,EACvCC,EAAeT,EAAM5D,OACrBA,OAA0B,IAAjBqE,EAA0B,EAAIA,EACvCC,EAAeV,EAAM3D,OACrBA,OAA0B,IAAjBqE,EAA0B,EAAIA,EACvCxN,EAAc+M,EAAM/M,YACpBmN,EAAeJ,EAAMI,aACrBE,EAAgBN,EAAMM,cACtBI,EAAkBT,EAAMU,UACxBA,OAAgC,IAApBD,EAA6B,cAAgBA,EACzDE,EAAwBX,EAAMY,sBAC9BA,OAAkD,IAA1BD,GAA0CA,EAClEE,EAAwBb,EAAMc,sBAC9BA,OAAkD,IAA1BD,EAAmC,MAAQA,EACnEE,EAAiBf,EAAMgB,SACvBA,OAA8B,IAAnBD,EAA4BtL,IAAWsL,EAClDE,EAAkBjB,EAAMkB,UACxBA,OAAgC,IAApBD,EAA6BxL,IAAWwL,EACpDE,EAAiBnB,EAAMoB,SACvBA,OAA8B,IAAnBD,EAA4B,EAAIA,EAC3CE,EAAkBrB,EAAMsB,UACxBA,OAAgC,IAApBD,EAA6B,EAAIA,EAC7CE,EAAS/R,SAASgS,cAAc,UAChCC,EAAUF,EAAOG,WAAW,MAC5BC,EAAWjD,GAAiB,CAC9B1L,YAAaA,EACb6L,MAAOmC,EACPpC,OAAQsC,IAENU,EAAWlD,GAAiB,CAC9B1L,YAAaA,EACb6L,MAAOuC,EACPxC,OAAQ0C,GACP,SACCzC,EAAQjI,KAAKiL,IAAIF,EAAS9C,MAAOjI,KAAKkL,IAAIF,EAAS/C,MAAOsB,IAC1DvB,EAAShI,KAAKiL,IAAIF,EAAS/C,OAAQhI,KAAKkL,IAAIF,EAAShD,OAAQyB,IAG7D0B,EAAerD,GAAiB,CAClC1L,YAAaiN,EACbpB,MAAOmC,EACPpC,OAAQsC,IAENc,EAAetD,GAAiB,CAClC1L,YAAaiN,EACbpB,MAAOuC,EACPxC,OAAQ0C,GACP,SACCW,EAAYrL,KAAKiL,IAAIE,EAAalD,MAAOjI,KAAKkL,IAAIE,EAAanD,MAAOqB,IACtEgC,EAAatL,KAAKiL,IAAIE,EAAanD,OAAQhI,KAAKkL,IAAIE,EAAapD,OAAQwB,IACzE+B,EAAS,EAAEF,EAAY,GAAIC,EAAa,EAAGD,EAAWC,GAe1D,OAdAX,EAAO1C,MAAQpI,GAAuBoI,GACtC0C,EAAO3C,OAASnI,GAAuBmI,GACvC6C,EAAQW,UAAY1B,EACpBe,EAAQY,SAAS,EAAG,EAAGxD,EAAOD,GAC9B6C,EAAQa,OACRb,EAAQc,UAAU1D,EAAQ,EAAGD,EAAS,GACtC6C,EAAQxF,OAAOA,EAASrF,KAAKyI,GAAK,KAClCoC,EAAQe,MAAMtG,EAAQC,GACtBsF,EAAQb,sBAAwBA,EAChCa,EAAQX,sBAAwBA,EAChCW,EAAQgB,UAAU/U,MAAM+T,EAAS,CAAC5B,GAAOlP,OAAO1C,EAAmBkU,EAAOO,KAAI,SAAUC,GACtF,OAAO/L,KAAKgM,MAAMnM,GAAuBkM,GAC3C,OACAlB,EAAQrO,UACDmO,CACT,CACA,IAAIsB,GAAeC,OAAOD,aAS1B,SAASE,GAAsBC,EAAUC,EAAO9W,GAC9C,IAAI+W,EAAM,GACV/W,GAAU8W,EAEV,IAAK,IAAI/W,EAAI+W,EAAO/W,EAAIC,EAAQD,GAAK,EACnCgX,GAAOL,GAAaG,EAASG,SAASjX,IAGxC,OAAOgX,CACT,CACA,IAAIE,GAAuB,YAO3B,SAASC,GAAqBC,GAC5B,IAAIC,EAASD,EAAQvL,QAAQqL,GAAsB,IAC/CI,EAASC,KAAKF,GACdG,EAAc,IAAIC,YAAYH,EAAOrX,QACrCyX,EAAQ,IAAIC,WAAWH,GAI3B,OAHA5V,GAAQ8V,GAAO,SAAU7W,EAAOb,GAC9B0X,EAAM1X,GAAKsX,EAAOM,WAAW5X,EAC/B,IACOwX,CACT,CAQA,SAASK,GAAqBL,EAAaM,GAMzC,IALA,IAAIC,EAAS,GAETC,EAAY,KACZN,EAAQ,IAAIC,WAAWH,GAEpBE,EAAMzX,OAAS,GAGpB8X,EAAOxW,KAAKoV,GAAanV,MAAM,KAAMuI,GAAQ2N,EAAMO,SAAS,EAAGD,MAC/DN,EAAQA,EAAMO,SAASD,GAGzB,MAAO,QAAQvT,OAAOqT,EAAU,YAAYrT,OAAOyT,KAAKH,EAAOzH,KAAK,KACtE,CAOA,SAAS6H,GAAuBX,GAC9B,IACIY,EADAtB,EAAW,IAAIuB,SAASb,GAG5B,IACE,IAAIc,EACAC,EACAC,EAEJ,GAA6B,MAAzB1B,EAASG,SAAS,IAAwC,MAAzBH,EAASG,SAAS,GAIrD,IAHA,IAAIhX,EAAS6W,EAAS2B,WAClBC,EAAS,EAENA,EAAS,EAAIzY,GAAQ,CAC1B,GAAkC,MAA9B6W,EAASG,SAASyB,IAAsD,MAAlC5B,EAASG,SAASyB,EAAS,GAAa,CAChFH,EAAYG,EACZ,KACF,CAEAA,GAAU,CACZ,CAGF,GAAIH,EAAW,CACb,IACII,EAAaJ,EAAY,GAE7B,GAAuD,SAAnD1B,GAAsBC,EAHTyB,EAAY,EAGmB,GAAe,CAC7D,IAAIK,EAAa9B,EAAS+B,UAAUF,GAGpC,KAFAL,EAA8B,QAAfM,IAEoB,QAAfA,IAGyC,KAArD9B,EAAS+B,UAAUF,EAAa,EAAGL,GAA0B,CAC/D,IAAIQ,EAAiBhC,EAASiC,UAAUJ,EAAa,EAAGL,GAEpDQ,GAAkB,IACpBN,EAAWG,EAAaG,EAE5B,CAEN,CACF,CAEA,GAAIN,EAAU,CACZ,IAEIQ,EAEAhZ,EAJAiZ,EAAUnC,EAAS+B,UAAUL,EAAUF,GAM3C,IAAKtY,EAAI,EAAGA,EAAIiZ,EAASjZ,GAAK,EAG5B,GAFAgZ,EAAUR,EAAe,GAAJxY,EAAS,EAEoB,MAA9C8W,EAAS+B,UAAUG,EAASV,GAE9B,CAEEU,GAAW,EAEXZ,EAActB,EAAS+B,UAAUG,EAASV,GAE1CxB,EAASoC,UAAUF,EAAS,EAAGV,GAC/B,KACF,CAEN,CAGF,CAFE,MAAOzO,GACPuO,EAAc,CAChB,CAEA,OAAOA,CACT,CAOA,SAASe,GAAiBf,GACxB,IAAIrI,EAAS,EACTC,EAAS,EACTC,EAAS,EAEb,OAAQmI,GAEN,KAAK,EACHpI,GAAU,EACV,MAGF,KAAK,EACHD,GAAU,IACV,MAGF,KAAK,EACHE,GAAU,EACV,MAGF,KAAK,EACHF,EAAS,GACTE,GAAU,EACV,MAGF,KAAK,EACHF,EAAS,GACT,MAGF,KAAK,EACHA,EAAS,GACTC,GAAU,EACV,MAGF,KAAK,EACHD,GAAU,GAId,MAAO,CACLA,OAAQA,EACRC,OAAQA,EACRC,OAAQA,EAEZ,CAEA,IAAImJ,GAAS,CACXA,OAAQ,WACNC,KAAKC,gBACLD,KAAKE,aACLF,KAAKG,cACLH,KAAKI,eAEDJ,KAAKK,SACPL,KAAKM,eAET,EACAL,cAAe,WACb,IAAIxO,EAAUuO,KAAKvO,QACfiC,EAAUsM,KAAKtM,QACf6M,EAAYP,KAAKO,UACjBC,EAAUR,KAAKQ,QACnBtO,GAASsO,EAASlV,GAClBgH,GAAYb,EAASnG,GACrB,IAAImV,EAAgB,CAClBnH,MAAOjI,KAAKkL,IAAIgE,EAAUG,YAAa3Q,OAAO2D,EAAQrE,oBAAsB,KAC5EgK,OAAQhI,KAAKkL,IAAIgE,EAAUI,aAAc5Q,OAAO2D,EAAQpE,qBAAuB,MAEjF0Q,KAAKS,cAAgBA,EACrBjP,GAASgP,EAAS,CAChBlH,MAAOmH,EAAcnH,MACrBD,OAAQoH,EAAcpH,SAExBnH,GAAST,EAASnG,GAClBgH,GAAYkO,EAASlV,EACvB,EAEA4U,WAAY,WACV,IAAIO,EAAgBT,KAAKS,cACrBG,EAAYZ,KAAKY,UACjBvT,EAAW2S,KAAKtM,QAAQrG,SACxBwT,EAAUxP,KAAKuG,IAAIgJ,EAAUlK,QAAU,MAAQ,GAC/CkE,EAAeiG,EAAUD,EAAU9F,cAAgB8F,EAAUhG,aAC7DE,EAAgB+F,EAAUD,EAAUhG,aAAegG,EAAU9F,cAC7DrN,EAAcmN,EAAeE,EAC7BgG,EAAcL,EAAcnH,MAC5ByH,EAAeN,EAAcpH,OAE7BoH,EAAcpH,OAAS5L,EAAcgT,EAAcnH,MACpC,IAAbjM,EACFyT,EAAcL,EAAcpH,OAAS5L,EAErCsT,EAAeN,EAAcnH,MAAQ7L,EAEjB,IAAbJ,EACT0T,EAAeN,EAAcnH,MAAQ7L,EAErCqT,EAAcL,EAAcpH,OAAS5L,EAGvC,IAAIuT,EAAa,CACfvT,YAAaA,EACbmN,aAAcA,EACdE,cAAeA,EACfxB,MAAOwH,EACPzH,OAAQ0H,GAEVC,EAAW3L,MAAQoL,EAAcnH,MAAQwH,GAAe,EACxDE,EAAWxL,KAAOiL,EAAcpH,OAAS0H,GAAgB,EACzDC,EAAWC,QAAUD,EAAW3L,KAChC2L,EAAWE,OAASF,EAAWxL,IAC/BwK,KAAKgB,WAAaA,EAClBhB,KAAKmB,QAAuB,IAAb9T,GAA+B,IAAbA,EACjC2S,KAAKoB,aAAY,GAAM,GACvBpB,KAAKqB,iBAAmBzQ,GAAO,CAAC,EAAGgQ,GACnCZ,KAAKsB,kBAAoB1Q,GAAO,CAAC,EAAGoQ,EACtC,EACAI,YAAa,SAAqBG,EAAaC,GAC7C,IAAI9N,EAAUsM,KAAKtM,QACf+M,EAAgBT,KAAKS,cACrBO,EAAahB,KAAKgB,WAClBS,EAAczB,KAAKyB,YACnBpU,EAAWqG,EAAQrG,SACnBI,EAAcuT,EAAWvT,YACzB4S,EAAUL,KAAKK,SAAWoB,EAE9B,GAAIF,EAAa,CACf,IAAItS,EAAiBc,OAAO2D,EAAQzE,iBAAmB,EACnDC,EAAkBa,OAAO2D,EAAQxE,kBAAoB,EAErD7B,EAAW,GACb4B,EAAiBoC,KAAKkL,IAAItN,EAAgBwR,EAAcnH,OACxDpK,EAAkBmC,KAAKkL,IAAIrN,EAAiBuR,EAAcpH,QAEzC,IAAbhM,IACE6B,EAAkBzB,EAAcwB,EAClCA,EAAiBC,EAAkBzB,EAEnCyB,EAAkBD,EAAiBxB,IAG9BJ,EAAW,IAChB4B,EACFA,EAAiBoC,KAAKkL,IAAItN,EAAgBoR,EAAUoB,EAAYnI,MAAQ,GAC/DpK,EACTA,EAAkBmC,KAAKkL,IAAIrN,EAAiBmR,EAAUoB,EAAYpI,OAAS,GAClEgH,IACTpR,EAAiBwS,EAAYnI,OAC7BpK,EAAkBuS,EAAYpI,QAER5L,EAAcwB,EAClCA,EAAiBC,EAAkBzB,EAEnCyB,EAAkBD,EAAiBxB,IAKzC,IAAIiU,EAAoBvI,GAAiB,CACvC1L,YAAaA,EACb6L,MAAOrK,EACPoK,OAAQnK,IAGVD,EAAiByS,EAAkBpI,MACnCpK,EAAkBwS,EAAkBrI,OACpC2H,EAAWnF,SAAW5M,EACtB+R,EAAWjF,UAAY7M,EACvB8R,EAAWvF,SAAWvL,IACtB8Q,EAAWrF,UAAYzL,GACzB,CAEA,GAAIsR,EACF,GAAInU,GAAYgT,EAAU,EAAI,GAAI,CAChC,IAAIsB,EAAgBlB,EAAcnH,MAAQ0H,EAAW1H,MACjDsI,EAAenB,EAAcpH,OAAS2H,EAAW3H,OACrD2H,EAAWa,QAAUxQ,KAAKiL,IAAI,EAAGqF,GACjCX,EAAWc,OAASzQ,KAAKiL,IAAI,EAAGsF,GAChCZ,EAAWe,QAAU1Q,KAAKkL,IAAI,EAAGoF,GACjCX,EAAWgB,OAAS3Q,KAAKkL,IAAI,EAAGqF,GAE5BvB,GAAWL,KAAKmB,UAClBH,EAAWa,QAAUxQ,KAAKiL,IAAImF,EAAYpM,KAAMoM,EAAYpM,MAAQoM,EAAYnI,MAAQ0H,EAAW1H,QACnG0H,EAAWc,OAASzQ,KAAKiL,IAAImF,EAAYjM,IAAKiM,EAAYjM,KAAOiM,EAAYpI,OAAS2H,EAAW3H,SACjG2H,EAAWe,QAAUN,EAAYpM,KACjC2L,EAAWgB,OAASP,EAAYjM,IAEf,IAAbnI,IACE2T,EAAW1H,OAASmH,EAAcnH,QACpC0H,EAAWa,QAAUxQ,KAAKiL,IAAI,EAAGqF,GACjCX,EAAWe,QAAU1Q,KAAKkL,IAAI,EAAGoF,IAG/BX,EAAW3H,QAAUoH,EAAcpH,SACrC2H,EAAWc,OAASzQ,KAAKiL,IAAI,EAAGsF,GAChCZ,EAAWgB,OAAS3Q,KAAKkL,IAAI,EAAGqF,KAIxC,MACEZ,EAAWa,SAAWb,EAAW1H,MACjC0H,EAAWc,QAAUd,EAAW3H,OAChC2H,EAAWe,QAAUtB,EAAcnH,MACnC0H,EAAWgB,OAASvB,EAAcpH,MAGxC,EACA+G,aAAc,SAAsB6B,EAASC,GAC3C,IAAIlB,EAAahB,KAAKgB,WAClBJ,EAAYZ,KAAKY,UAErB,GAAIsB,EAAa,CACf,IAAIC,EAAmBzI,GAAgB,CACrCJ,MAAOsH,EAAUhG,aAAevJ,KAAKuG,IAAIgJ,EAAUjK,QAAU,GAC7D0C,OAAQuH,EAAU9F,cAAgBzJ,KAAKuG,IAAIgJ,EAAUhK,QAAU,GAC/DgD,OAAQgH,EAAUlK,QAAU,IAE1BkE,EAAeuH,EAAiB7I,MAChCwB,EAAgBqH,EAAiB9I,OAEjCC,EAAQ0H,EAAW1H,OAASsB,EAAeoG,EAAWpG,cACtDvB,EAAS2H,EAAW3H,QAAUyB,EAAgBkG,EAAWlG,eAC7DkG,EAAW3L,OAASiE,EAAQ0H,EAAW1H,OAAS,EAChD0H,EAAWxL,MAAQ6D,EAAS2H,EAAW3H,QAAU,EACjD2H,EAAW1H,MAAQA,EACnB0H,EAAW3H,OAASA,EACpB2H,EAAWvT,YAAcmN,EAAeE,EACxCkG,EAAWpG,aAAeA,EAC1BoG,EAAWlG,cAAgBA,EAC3BkF,KAAKoB,aAAY,GAAM,EACzB,EAEIJ,EAAW1H,MAAQ0H,EAAWvF,UAAYuF,EAAW1H,MAAQ0H,EAAWnF,YAC1EmF,EAAW3L,KAAO2L,EAAWC,UAG3BD,EAAW3H,OAAS2H,EAAWrF,WAAaqF,EAAW3H,OAAS2H,EAAWjF,aAC7EiF,EAAWxL,IAAMwL,EAAWE,QAG9BF,EAAW1H,MAAQjI,KAAKiL,IAAIjL,KAAKkL,IAAIyE,EAAW1H,MAAO0H,EAAWnF,UAAWmF,EAAWvF,UACxFuF,EAAW3H,OAAShI,KAAKiL,IAAIjL,KAAKkL,IAAIyE,EAAW3H,OAAQ2H,EAAWjF,WAAYiF,EAAWrF,WAC3FqE,KAAKoB,aAAY,GAAO,GACxBJ,EAAW3L,KAAOhE,KAAKiL,IAAIjL,KAAKkL,IAAIyE,EAAW3L,KAAM2L,EAAWa,SAAUb,EAAWe,SACrFf,EAAWxL,IAAMnE,KAAKiL,IAAIjL,KAAKkL,IAAIyE,EAAWxL,IAAKwL,EAAWc,QAASd,EAAWgB,QAClFhB,EAAWC,QAAUD,EAAW3L,KAChC2L,EAAWE,OAASF,EAAWxL,IAC/BhE,GAASwO,KAAKhE,OAAQpL,GAAO,CAC3B0I,MAAO0H,EAAW1H,MAClBD,OAAQ2H,EAAW3H,QAClB7C,GAAc,CACfK,WAAYmK,EAAW3L,KACvByB,WAAYkK,EAAWxL,QAEzBwK,KAAKoC,YAAYH,GAEbjC,KAAKK,SAAWL,KAAKmB,SACvBnB,KAAKqC,cAAa,GAAM,EAE5B,EACAD,YAAa,SAAqBH,GAChC,IAAIjB,EAAahB,KAAKgB,WAClBJ,EAAYZ,KAAKY,UACjBtH,EAAQsH,EAAUhG,cAAgBoG,EAAW1H,MAAQ0H,EAAWpG,cAChEvB,EAASuH,EAAU9F,eAAiBkG,EAAW3H,OAAS2H,EAAWlG,eACvElK,GAAOgQ,EAAW,CAChBtH,MAAOA,EACPD,OAAQA,EACRhE,MAAO2L,EAAW1H,MAAQA,GAAS,EACnC9D,KAAMwL,EAAW3H,OAASA,GAAU,IAEtC7H,GAASwO,KAAK1F,MAAO1J,GAAO,CAC1B0I,MAAOsH,EAAUtH,MACjBD,OAAQuH,EAAUvH,QACjB7C,GAAc5F,GAAO,CACtBiG,WAAY+J,EAAUvL,KACtByB,WAAY8J,EAAUpL,KACrBoL,MAECqB,GACFjC,KAAKsC,QAET,EACAnC,YAAa,WACX,IAAIzM,EAAUsM,KAAKtM,QACfsN,EAAahB,KAAKgB,WAClBvT,EAAciG,EAAQjG,aAAeiG,EAAQnG,mBAC7Ce,EAAeyB,OAAO2D,EAAQpF,eAAiB,GAC/CmT,EAAc,CAChBnI,MAAO0H,EAAW1H,MAClBD,OAAQ2H,EAAW3H,QAGjB5L,IACEuT,EAAW3H,OAAS5L,EAAcuT,EAAW1H,MAC/CmI,EAAYpI,OAASoI,EAAYnI,MAAQ7L,EAEzCgU,EAAYnI,MAAQmI,EAAYpI,OAAS5L,GAI7CuS,KAAKyB,YAAcA,EACnBzB,KAAKqC,cAAa,GAAM,GAExBZ,EAAYnI,MAAQjI,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYnI,MAAOmI,EAAY5F,UAAW4F,EAAYhG,UAC5FgG,EAAYpI,OAAShI,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYpI,OAAQoI,EAAY1F,WAAY0F,EAAY9F,WAE/F8F,EAAYnI,MAAQjI,KAAKkL,IAAIkF,EAAY5F,SAAU4F,EAAYnI,MAAQhL,GACvEmT,EAAYpI,OAAShI,KAAKkL,IAAIkF,EAAY1F,UAAW0F,EAAYpI,OAAS/K,GAC1EmT,EAAYpM,KAAO2L,EAAW3L,MAAQ2L,EAAW1H,MAAQmI,EAAYnI,OAAS,EAC9EmI,EAAYjM,IAAMwL,EAAWxL,KAAOwL,EAAW3H,OAASoI,EAAYpI,QAAU,EAC9EoI,EAAYR,QAAUQ,EAAYpM,KAClCoM,EAAYP,OAASO,EAAYjM,IACjCwK,KAAKuC,mBAAqB3R,GAAO,CAAC,EAAG6Q,EACvC,EACAY,aAAc,SAAsBd,EAAaC,GAC/C,IAAI9N,EAAUsM,KAAKtM,QACf+M,EAAgBT,KAAKS,cACrBO,EAAahB,KAAKgB,WAClBS,EAAczB,KAAKyB,YACnBN,EAAUnB,KAAKmB,QACf1T,EAAciG,EAAQjG,YAE1B,GAAI8T,EAAa,CACf,IAAIpS,EAAkBY,OAAO2D,EAAQvE,kBAAoB,EACrDC,EAAmBW,OAAO2D,EAAQtE,mBAAqB,EACvDoT,EAAkBrB,EAAU9P,KAAKiL,IAAImE,EAAcnH,MAAO0H,EAAW1H,MAAO0H,EAAW1H,MAAQ0H,EAAW3L,KAAMoL,EAAcnH,MAAQ0H,EAAW3L,MAAQoL,EAAcnH,MACvKmJ,EAAmBtB,EAAU9P,KAAKiL,IAAImE,EAAcpH,OAAQ2H,EAAW3H,OAAQ2H,EAAW3H,OAAS2H,EAAWxL,IAAKiL,EAAcpH,OAAS2H,EAAWxL,KAAOiL,EAAcpH,OAE9KlK,EAAkBkC,KAAKiL,IAAInN,EAAiBsR,EAAcnH,OAC1DlK,EAAmBiC,KAAKiL,IAAIlN,EAAkBqR,EAAcpH,QAExD5L,IACE0B,GAAmBC,EACjBA,EAAmB3B,EAAc0B,EACnCC,EAAmBD,EAAkB1B,EAErC0B,EAAkBC,EAAmB3B,EAE9B0B,EACTC,EAAmBD,EAAkB1B,EAC5B2B,IACTD,EAAkBC,EAAmB3B,GAGnCgV,EAAmBhV,EAAc+U,EACnCC,EAAmBD,EAAkB/U,EAErC+U,EAAkBC,EAAmBhV,GAKzCgU,EAAY5F,SAAWxK,KAAKiL,IAAInN,EAAiBqT,GACjDf,EAAY1F,UAAY1K,KAAKiL,IAAIlN,EAAkBqT,GACnDhB,EAAYhG,SAAW+G,EACvBf,EAAY9F,UAAY8G,CAC1B,CAEIjB,IACEL,GACFM,EAAYI,QAAUxQ,KAAKkL,IAAI,EAAGyE,EAAW3L,MAC7CoM,EAAYK,OAASzQ,KAAKkL,IAAI,EAAGyE,EAAWxL,KAC5CiM,EAAYM,QAAU1Q,KAAKiL,IAAImE,EAAcnH,MAAO0H,EAAW3L,KAAO2L,EAAW1H,OAASmI,EAAYnI,MACtGmI,EAAYO,OAAS3Q,KAAKiL,IAAImE,EAAcpH,OAAQ2H,EAAWxL,IAAMwL,EAAW3H,QAAUoI,EAAYpI,SAEtGoI,EAAYI,QAAU,EACtBJ,EAAYK,OAAS,EACrBL,EAAYM,QAAUtB,EAAcnH,MAAQmI,EAAYnI,MACxDmI,EAAYO,OAASvB,EAAcpH,OAASoI,EAAYpI,QAG9D,EACAiH,cAAe,WACb,IAAI5M,EAAUsM,KAAKtM,QACf+M,EAAgBT,KAAKS,cACrBgB,EAAczB,KAAKyB,aAEnBA,EAAYnI,MAAQmI,EAAYhG,UAAYgG,EAAYnI,MAAQmI,EAAY5F,YAC9E4F,EAAYpM,KAAOoM,EAAYR,UAG7BQ,EAAYpI,OAASoI,EAAY9F,WAAa8F,EAAYpI,OAASoI,EAAY1F,aACjF0F,EAAYjM,IAAMiM,EAAYP,QAGhCO,EAAYnI,MAAQjI,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYnI,MAAOmI,EAAY5F,UAAW4F,EAAYhG,UAC5FgG,EAAYpI,OAAShI,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYpI,OAAQoI,EAAY1F,WAAY0F,EAAY9F,WAC/FqE,KAAKqC,cAAa,GAAO,GACzBZ,EAAYpM,KAAOhE,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYpM,KAAMoM,EAAYI,SAAUJ,EAAYM,SACzFN,EAAYjM,IAAMnE,KAAKiL,IAAIjL,KAAKkL,IAAIkF,EAAYjM,IAAKiM,EAAYK,QAASL,EAAYO,QACtFP,EAAYR,QAAUQ,EAAYpM,KAClCoM,EAAYP,OAASO,EAAYjM,IAE7B9B,EAAQnF,SAAWmF,EAAQ5E,gBAE7BmE,GAAQ+M,KAAK0C,KAAM/W,EAAa8V,EAAYnI,OAASmH,EAAcnH,OAASmI,EAAYpI,QAAUoH,EAAcpH,OAAS5O,EAAcF,GAGzIiH,GAASwO,KAAK2C,QAAS/R,GAAO,CAC5B0I,MAAOmI,EAAYnI,MACnBD,OAAQoI,EAAYpI,QACnB7C,GAAc,CACfK,WAAY4K,EAAYpM,KACxByB,WAAY2K,EAAYjM,QAGtBwK,KAAKK,SAAWL,KAAKmB,SACvBnB,KAAKoB,aAAY,GAAM,GAGpBpB,KAAK4C,UACR5C,KAAKsC,QAET,EACAA,OAAQ,WACNtC,KAAKrS,UACL+G,GAAcsL,KAAKvO,QAASzF,EAAYgU,KAAKlN,UAC/C,GAGEnF,GAAU,CACZkV,YAAa,WACX,IAAIpR,EAAUuO,KAAKvO,QACfqR,EAAc9C,KAAK8C,YACnBnV,EAAUqS,KAAKtM,QAAQ/F,QACvBmI,EAAMgN,EAAc9C,KAAK+C,eAAiB/C,KAAKlK,IAC/CkN,EAAMvR,EAAQuR,KAAO,uBACrB1I,EAAQrQ,SAASgS,cAAc,OAWnC,GATI6G,IACFxI,EAAMwI,YAAcA,GAGtBxI,EAAM2I,IAAMnN,EACZwE,EAAM0I,IAAMA,EACZhD,KAAKkD,QAAQC,YAAY7I,GACzB0F,KAAKoD,aAAe9I,EAEf3M,EAAL,CAIA,IAAI0V,EAAW1V,EAEQ,kBAAZA,EACT0V,EAAW5R,EAAQ6R,cAAcC,iBAAiB5V,GACzCA,EAAQ6V,gBACjBH,EAAW,CAAC1V,IAGdqS,KAAKqD,SAAWA,EAChB9a,GAAQ8a,GAAU,SAAUI,GAC1B,IAAIC,EAAMzZ,SAASgS,cAAc,OAEjChJ,GAAQwQ,EAAI7X,EAAc,CACxB0N,MAAOmK,EAAG/C,YACVrH,OAAQoK,EAAG9C,aACXgD,KAAMF,EAAGG,YAGPd,IACFY,EAAIZ,YAAcA,GAGpBY,EAAIT,IAAMnN,EACV4N,EAAIV,IAAMA,EAQVU,EAAI/R,MAAMkS,QAAU,0KACpBJ,EAAGG,UAAY,GACfH,EAAGN,YAAYO,EACjB,GApCA,CAqCF,EACAI,aAAc,WACZvb,GAAQyX,KAAKqD,UAAU,SAAU5R,GAC/B,IAAI/D,EAAOoF,GAAQrB,EAAS7F,GAC5B4F,GAASC,EAAS,CAChB6H,MAAO5L,EAAK4L,MACZD,OAAQ3L,EAAK2L,SAEf5H,EAAQmS,UAAYlW,EAAKiW,KACzBxQ,GAAW1B,EAAS7F,EACtB,GACF,EACA+B,QAAS,WACP,IAAIiT,EAAYZ,KAAKY,UACjBI,EAAahB,KAAKgB,WAClBS,EAAczB,KAAKyB,YACnBsC,EAAetC,EAAYnI,MAC3B0K,EAAgBvC,EAAYpI,OAC5BC,EAAQsH,EAAUtH,MAClBD,EAASuH,EAAUvH,OACnBhE,EAAOoM,EAAYpM,KAAO2L,EAAW3L,KAAOuL,EAAUvL,KACtDG,EAAMiM,EAAYjM,IAAMwL,EAAWxL,IAAMoL,EAAUpL,IAElDwK,KAAKK,UAAWL,KAAK4C,WAI1BpR,GAASwO,KAAKoD,aAAcxS,GAAO,CACjC0I,MAAOA,EACPD,OAAQA,GACP7C,GAAc5F,GAAO,CACtBiG,YAAaxB,EACbyB,YAAatB,GACZoL,MACHrY,GAAQyX,KAAKqD,UAAU,SAAU5R,GAC/B,IAAI/D,EAAOoF,GAAQrB,EAAS7F,GACxBqY,EAAgBvW,EAAK4L,MACrB4K,EAAiBxW,EAAK2L,OACtBc,EAAW8J,EACX7J,EAAY8J,EACZ5L,EAAQ,EAERyL,IAEF3J,EAAY4J,GADZ1L,EAAQ2L,EAAgBF,IAItBC,GAAiB5J,EAAY8J,IAE/B/J,EAAW4J,GADXzL,EAAQ4L,EAAiBF,GAEzB5J,EAAY8J,GAGd1S,GAASC,EAAS,CAChB6H,MAAOa,EACPd,OAAQe,IAEV5I,GAASC,EAAQ0S,qBAAqB,OAAO,GAAIvT,GAAO,CACtD0I,MAAOA,EAAQhB,EACfe,OAAQA,EAASf,GAChB9B,GAAc5F,GAAO,CACtBiG,YAAaxB,EAAOiD,EACpBxB,YAAatB,EAAM8C,GAClBsI,KACL,IACF,GAGEwD,GAAS,CACXC,KAAM,WACJ,IAAI5S,EAAUuO,KAAKvO,QACfiC,EAAUsM,KAAKtM,QACf8M,EAAUR,KAAKQ,QAEf/P,GAAWiD,EAAQlE,YACrB6E,GAAY5C,EAAStF,EAAkBuH,EAAQlE,WAG7CiB,GAAWiD,EAAQjE,WACrB4E,GAAY5C,EAASvF,EAAiBwH,EAAQjE,UAG5CgB,GAAWiD,EAAQhE,UACrB2E,GAAY5C,EAASxF,EAAgByH,EAAQhE,SAG3Ce,GAAWiD,EAAQ/D,OACrB0E,GAAY5C,EAASzF,EAAY0H,EAAQ/D,MAGvCc,GAAWiD,EAAQ9D,OACrByE,GAAY5C,EAAS3E,GAAY4G,EAAQ9D,MAG3CyE,GAAYmM,EAAShU,EAAoBwT,KAAKsE,YAActE,KAAKuE,UAAUF,KAAKrE,OAE5EtM,EAAQhF,UAAYgF,EAAQ9E,aAC9ByF,GAAYmM,EAAS3T,GAAamT,KAAKwE,QAAUxE,KAAKyE,MAAMJ,KAAKrE,MAAO,CACtE0E,SAAS,EACTC,SAAS,IAITjR,EAAQ1E,0BACVqF,GAAYmM,EAASpU,EAAgB4T,KAAK4E,WAAa5E,KAAK6E,SAASR,KAAKrE,OAG5E3L,GAAY5C,EAAQ6R,cAAe7W,EAAoBuT,KAAK8E,WAAa9E,KAAK+E,SAASV,KAAKrE,OAC5F3L,GAAY5C,EAAQ6R,cAAe5W,EAAkBsT,KAAKgF,UAAYhF,KAAKiF,QAAQZ,KAAKrE,OAEpFtM,EAAQ9F,YACVyG,GAAYrK,OAAQ4C,GAAcoT,KAAKkF,SAAWlF,KAAKmF,OAAOd,KAAKrE,MAEvE,EACAoF,OAAQ,WACN,IAAI3T,EAAUuO,KAAKvO,QACfiC,EAAUsM,KAAKtM,QACf8M,EAAUR,KAAKQ,QAEf/P,GAAWiD,EAAQlE,YACrBuE,GAAetC,EAAStF,EAAkBuH,EAAQlE,WAGhDiB,GAAWiD,EAAQjE,WACrBsE,GAAetC,EAASvF,EAAiBwH,EAAQjE,UAG/CgB,GAAWiD,EAAQhE,UACrBqE,GAAetC,EAASxF,EAAgByH,EAAQhE,SAG9Ce,GAAWiD,EAAQ/D,OACrBoE,GAAetC,EAASzF,EAAY0H,EAAQ/D,MAG1Cc,GAAWiD,EAAQ9D,OACrBmE,GAAetC,EAAS3E,GAAY4G,EAAQ9D,MAG9CmE,GAAeyM,EAAShU,EAAoBwT,KAAKsE,aAE7C5Q,EAAQhF,UAAYgF,EAAQ9E,aAC9BmF,GAAeyM,EAAS3T,GAAamT,KAAKwE,QAAS,CACjDE,SAAS,EACTC,SAAS,IAITjR,EAAQ1E,0BACV+E,GAAeyM,EAASpU,EAAgB4T,KAAK4E,YAG/C7Q,GAAetC,EAAQ6R,cAAe7W,EAAoBuT,KAAK8E,YAC/D/Q,GAAetC,EAAQ6R,cAAe5W,EAAkBsT,KAAKgF,WAEzDtR,EAAQ9F,YACVmG,GAAe/J,OAAQ4C,GAAcoT,KAAKkF,SAE9C,GAGEG,GAAW,CACbF,OAAQ,WACN,IAAInF,KAAK4C,SAAT,CAIA,IAMM5B,EACAS,EAPF/N,EAAUsM,KAAKtM,QACf6M,EAAYP,KAAKO,UACjBE,EAAgBT,KAAKS,cACrBnI,EAAQiI,EAAUG,YAAcD,EAAcnH,MAEpC,IAAVhB,GAAeiI,EAAUI,eAAiBF,EAAcpH,SAItD3F,EAAQ7F,UACVmT,EAAahB,KAAKsF,gBAClB7D,EAAczB,KAAKuF,kBAGrBvF,KAAKD,SAEDrM,EAAQ7F,UACVmS,KAAKwF,cAAcjd,GAAQyY,GAAY,SAAUzX,EAAG5C,GAClDqa,EAAWra,GAAK4C,EAAI+O,CACtB,KACA0H,KAAKyF,eAAeld,GAAQkZ,GAAa,SAAUlY,EAAG5C,GACpD8a,EAAY9a,GAAK4C,EAAI+O,CACvB,MAxBJ,CA2BF,EACAuM,SAAU,WACJ7E,KAAK4C,UAAY5C,KAAKtM,QAAQpG,WAAavB,GAI/CiU,KAAK0F,YAAY7T,GAASmO,KAAK2F,QAASxa,GAAcW,EAAiBD,EACzE,EACA4Y,MAAO,SAAetQ,GACpB,IAAIyR,EAAQ5F,KAER1H,EAAQvI,OAAOiQ,KAAKtM,QAAQ7E,iBAAmB,GAC/CgX,EAAQ,EAER7F,KAAK4C,WAITzO,EAAM2R,iBAEF9F,KAAK+F,WAIT/F,KAAK+F,UAAW,EAChBC,YAAW,WACTJ,EAAMG,UAAW,CACnB,GAAG,IAEC5R,EAAM8R,OACRJ,EAAQ1R,EAAM8R,OAAS,EAAI,GAAK,EACvB9R,EAAM+R,WACfL,GAAS1R,EAAM+R,WAAa,IACnB/R,EAAMU,SACfgR,EAAQ1R,EAAMU,OAAS,EAAI,GAAK,GAGlCmL,KAAKpQ,MAAMiW,EAAQvN,EAAOnE,IAC5B,EACAoQ,UAAW,SAAmBpQ,GAC5B,IAAIgS,EAAUhS,EAAMgS,QAChBC,EAASjS,EAAMiS,OAEnB,KAAIpG,KAAK4C,WACU,cAAfzO,EAAMH,MAAuC,gBAAfG,EAAMH,MAAgD,UAAtBG,EAAMkS,eACxErW,GAASmW,IAAwB,IAAZA,GAAiBnW,GAASoW,IAAsB,IAAXA,GACvDjS,EAAMmS,UAHT,CAOA,IAEIC,EAFA7S,EAAUsM,KAAKtM,QACf2D,EAAW2I,KAAK3I,SAGhBlD,EAAMqS,eAERje,GAAQ4L,EAAMqS,gBAAgB,SAAUC,GACtCpP,EAASoP,EAAMC,YAAchO,GAAW+N,EAC1C,IAGApP,EAASlD,EAAMsD,WAAa,GAAKiB,GAAWvE,GAI5CoS,EADEtf,OAAOW,KAAKyP,GAAUzQ,OAAS,GAAK8M,EAAQhF,UAAYgF,EAAQ/E,YACzDjE,EAEAoI,GAAQqB,EAAM1N,OAAQkF,GAG5BqB,GAAepD,KAAK2c,KAOlB,IAHH7R,GAAcsL,KAAKvO,QAAStF,EAAkB,CAChDwa,cAAexS,EACfoS,OAAQA,MAMVpS,EAAM2R,iBACN9F,KAAKuG,OAASA,EACdvG,KAAK4G,UAAW,EAEZL,IAAW/b,IACbwV,KAAK4G,UAAW,EAChB1U,GAAS8N,KAAK2F,QAASla,IAxCzB,CA0CF,EACAsZ,SAAU,SAAkB5Q,GAC1B,IAAIoS,EAASvG,KAAKuG,OAElB,IAAIvG,KAAK4C,UAAa2D,EAAtB,CAIA,IAAIlP,EAAW2I,KAAK3I,SACpBlD,EAAM2R,kBAKC,IAHHpR,GAAcsL,KAAKvO,QAASvF,EAAiB,CAC/Cya,cAAexS,EACfoS,OAAQA,MAKNpS,EAAMqS,eACRje,GAAQ4L,EAAMqS,gBAAgB,SAAUC,GAEtC7V,GAAOyG,EAASoP,EAAMC,aAAe,CAAC,EAAGhO,GAAW+N,GAAO,GAC7D,IAEA7V,GAAOyG,EAASlD,EAAMsD,WAAa,IAAM,CAAC,EAAGiB,GAAWvE,GAAO,IAGjE6L,KAAK6G,OAAO1S,GArBZ,CAsBF,EACA8Q,QAAS,SAAiB9Q,GACxB,IAAI6L,KAAK4C,SAAT,CAIA,IAAI2D,EAASvG,KAAKuG,OACdlP,EAAW2I,KAAK3I,SAEhBlD,EAAMqS,eACRje,GAAQ4L,EAAMqS,gBAAgB,SAAUC,UAC/BpP,EAASoP,EAAMC,WACxB,WAEOrP,EAASlD,EAAMsD,WAAa,GAGhC8O,IAILpS,EAAM2R,iBAED7e,OAAOW,KAAKyP,GAAUzQ,SACzBoZ,KAAKuG,OAAS,IAGZvG,KAAK4G,WACP5G,KAAK4G,UAAW,EAChBnU,GAAYuN,KAAK2F,QAASla,EAAauU,KAAKK,SAAWL,KAAKtM,QAAQ1F,QAGtE0G,GAAcsL,KAAKvO,QAASxF,EAAgB,CAC1C0a,cAAexS,EACfoS,OAAQA,IA9BV,CAgCF,GAGEM,GAAS,CACXA,OAAQ,SAAgB1S,GACtB,IAkBIkL,EAlBA3L,EAAUsM,KAAKtM,QACfsN,EAAahB,KAAKgB,WAClBP,EAAgBT,KAAKS,cACrBgB,EAAczB,KAAKyB,YACnBpK,EAAW2I,KAAK3I,SAChBkP,EAASvG,KAAKuG,OACd9Y,EAAciG,EAAQjG,YACtB4H,EAAOoM,EAAYpM,KACnBG,EAAMiM,EAAYjM,IAClB8D,EAAQmI,EAAYnI,MACpBD,EAASoI,EAAYpI,OACrByN,EAAQzR,EAAOiE,EACfyN,EAASvR,EAAM6D,EACfwI,EAAU,EACVC,EAAS,EACTrG,EAAWgF,EAAcnH,MACzBqC,EAAY8E,EAAcpH,OAC1B2N,GAAa,GAGZvZ,GAAe0G,EAAM8S,WACxBxZ,EAAc6L,GAASD,EAASC,EAAQD,EAAS,GAG/C2G,KAAKmB,UACPU,EAAUJ,EAAYI,QACtBC,EAASL,EAAYK,OACrBrG,EAAWoG,EAAUxQ,KAAKiL,IAAImE,EAAcnH,MAAO0H,EAAW1H,MAAO0H,EAAW3L,KAAO2L,EAAW1H,OAClGqC,EAAYmG,EAASzQ,KAAKiL,IAAImE,EAAcpH,OAAQ2H,EAAW3H,OAAQ2H,EAAWxL,IAAMwL,EAAW3H,SAGrG,IAAI7B,EAAUH,EAASpQ,OAAOW,KAAKyP,GAAU,IACzC6P,EAAQ,CACVC,EAAG3P,EAAQS,KAAOT,EAAQK,OAC1BuP,EAAG5P,EAAQW,KAAOX,EAAQO,QAGxBsP,EAAQ,SAAeC,GACzB,OAAQA,GACN,KAAK3c,EACCmc,EAAQI,EAAMC,EAAI1L,IACpByL,EAAMC,EAAI1L,EAAWqL,GAGvB,MAEF,KAAKlc,EACCyK,EAAO6R,EAAMC,EAAItF,IACnBqF,EAAMC,EAAItF,EAAUxM,GAGtB,MAEF,KAAKvK,EACC0K,EAAM0R,EAAME,EAAItF,IAClBoF,EAAME,EAAItF,EAAStM,GAGrB,MAEF,KAAK3K,EACCkc,EAASG,EAAME,EAAIzL,IACrBuL,EAAME,EAAIzL,EAAYoL,GAK9B,EAEA,OAAQR,GAEN,KAAKhc,EACH8K,GAAQ6R,EAAMC,EACd3R,GAAO0R,EAAME,EACb,MAGF,KAAKzc,EACH,GAAIuc,EAAMC,GAAK,IAAML,GAASrL,GAAYhO,IAAgB+H,GAAOsM,GAAUiF,GAAUpL,IAAa,CAChGqL,GAAa,EACb,KACF,CAEAK,EAAM1c,IACN2O,GAAS4N,EAAMC,GAEH,IACVZ,EAAS3b,EAETyK,GADAiE,GAASA,GAIP7L,IACF4L,EAASC,EAAQ7L,EACjB+H,IAAQiM,EAAYpI,OAASA,GAAU,GAGzC,MAEF,KAAKvO,EACH,GAAIoc,EAAME,GAAK,IAAM5R,GAAOsM,GAAUrU,IAAgB4H,GAAQwM,GAAWiF,GAASrL,IAAY,CAC5FuL,GAAa,EACb,KACF,CAEAK,EAAMvc,GACNuO,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,EAET/N,EAAS,IACXkN,EAAS1b,EAET2K,GADA6D,GAAUA,GAIR5L,IACF6L,EAAQD,EAAS5L,EACjB4H,IAASoM,EAAYnI,MAAQA,GAAS,GAGxC,MAEF,KAAK1O,EACH,GAAIsc,EAAMC,GAAK,IAAM9R,GAAQwM,GAAWpU,IAAgB+H,GAAOsM,GAAUiF,GAAUpL,IAAa,CAC9FqL,GAAa,EACb,KACF,CAEAK,EAAMzc,GACN0O,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,EAEV7N,EAAQ,IACViN,EAAS5b,EAET0K,GADAiE,GAASA,GAIP7L,IACF4L,EAASC,EAAQ7L,EACjB+H,IAAQiM,EAAYpI,OAASA,GAAU,GAGzC,MAEF,KAAKxO,EACH,GAAIqc,EAAME,GAAK,IAAML,GAAUpL,GAAalO,IAAgB4H,GAAQwM,GAAWiF,GAASrL,IAAY,CAClGuL,GAAa,EACb,KACF,CAEAK,EAAMxc,IACNwO,GAAU6N,EAAME,GAEH,IACXb,EAASzb,EAET0K,GADA6D,GAAUA,GAIR5L,IACF6L,EAAQD,EAAS5L,EACjB4H,IAASoM,EAAYnI,MAAQA,GAAS,GAGxC,MAEF,KAAKvO,EACH,GAAI0C,EAAa,CACf,GAAIyZ,EAAME,GAAK,IAAM5R,GAAOsM,GAAUgF,GAASrL,GAAW,CACxDuL,GAAa,EACb,KACF,CAEAK,EAAMvc,GACNuO,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,EACb9N,EAAQD,EAAS5L,CACnB,MACE4Z,EAAMvc,GACNuc,EAAM1c,GAEFuc,EAAMC,GAAK,EACTL,EAAQrL,EACVnC,GAAS4N,EAAMC,EACND,EAAME,GAAK,GAAK5R,GAAOsM,IAChCkF,GAAa,GAGf1N,GAAS4N,EAAMC,EAGbD,EAAME,GAAK,EACT5R,EAAMsM,IACRzI,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,IAGf/N,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,GAIb9N,EAAQ,GAAKD,EAAS,GACxBkN,EAASrb,EAGTsK,GAFA6D,GAAUA,EAGVhE,GAFAiE,GAASA,GAGAA,EAAQ,GACjBiN,EAASvb,EAETqK,GADAiE,GAASA,GAEAD,EAAS,IAClBkN,EAAStb,EAETuK,GADA6D,GAAUA,GAIZ,MAEF,KAAKrO,EACH,GAAIyC,EAAa,CACf,GAAIyZ,EAAME,GAAK,IAAM5R,GAAOsM,GAAUzM,GAAQwM,GAAU,CACtDmF,GAAa,EACb,KACF,CAEAK,EAAMvc,GACNuO,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,EACb9N,EAAQD,EAAS5L,EACjB4H,GAAQoM,EAAYnI,MAAQA,CAC9B,MACE+N,EAAMvc,GACNuc,EAAMzc,GAEFsc,EAAMC,GAAK,EACT9R,EAAOwM,GACTvI,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,GACLD,EAAME,GAAK,GAAK5R,GAAOsM,IAChCkF,GAAa,IAGf1N,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,GAGZD,EAAME,GAAK,EACT5R,EAAMsM,IACRzI,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,IAGf/N,GAAU6N,EAAME,EAChB5R,GAAO0R,EAAME,GAIb9N,EAAQ,GAAKD,EAAS,GACxBkN,EAAStb,EAGTuK,GAFA6D,GAAUA,EAGVhE,GAFAiE,GAASA,GAGAA,EAAQ,GACjBiN,EAASxb,EAETsK,GADAiE,GAASA,GAEAD,EAAS,IAClBkN,EAASrb,EAETsK,GADA6D,GAAUA,GAIZ,MAEF,KAAKnO,EACH,GAAIuC,EAAa,CACf,GAAIyZ,EAAMC,GAAK,IAAM9R,GAAQwM,GAAWkF,GAAUpL,GAAY,CAC5DqL,GAAa,EACb,KACF,CAEAK,EAAMzc,GACN0O,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,EACd9N,EAASC,EAAQ7L,CACnB,MACE4Z,EAAMxc,GACNwc,EAAMzc,GAEFsc,EAAMC,GAAK,EACT9R,EAAOwM,GACTvI,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,GACLD,EAAME,GAAK,GAAKL,GAAUpL,IACnCqL,GAAa,IAGf1N,GAAS4N,EAAMC,EACf9R,GAAQ6R,EAAMC,GAGZD,EAAME,GAAK,EACTL,EAASpL,IACXtC,GAAU6N,EAAME,GAGlB/N,GAAU6N,EAAME,EAIhB9N,EAAQ,GAAKD,EAAS,GACxBkN,EAASxb,EAGTyK,GAFA6D,GAAUA,EAGVhE,GAFAiE,GAASA,GAGAA,EAAQ,GACjBiN,EAAStb,EAEToK,GADAiE,GAASA,GAEAD,EAAS,IAClBkN,EAASvb,EAETwK,GADA6D,GAAUA,GAIZ,MAEF,KAAKpO,EACH,GAAIwC,EAAa,CACf,GAAIyZ,EAAMC,GAAK,IAAML,GAASrL,GAAYsL,GAAUpL,GAAY,CAC9DqL,GAAa,EACb,KACF,CAEAK,EAAM1c,GAEN0O,GADAC,GAAS4N,EAAMC,GACE1Z,CACnB,MACE4Z,EAAMxc,GACNwc,EAAM1c,GAEFuc,EAAMC,GAAK,EACTL,EAAQrL,EACVnC,GAAS4N,EAAMC,EACND,EAAME,GAAK,GAAKL,GAAUpL,IACnCqL,GAAa,GAGf1N,GAAS4N,EAAMC,EAGbD,EAAME,GAAK,EACTL,EAASpL,IACXtC,GAAU6N,EAAME,GAGlB/N,GAAU6N,EAAME,EAIhB9N,EAAQ,GAAKD,EAAS,GACxBkN,EAASvb,EAGTwK,GAFA6D,GAAUA,EAGVhE,GAFAiE,GAASA,GAGAA,EAAQ,GACjBiN,EAASrb,EAETmK,GADAiE,GAASA,GAEAD,EAAS,IAClBkN,EAASxb,EAETyK,GADA6D,GAAUA,GAIZ,MAGF,KAAK5O,EACHuV,KAAKuH,KAAKL,EAAMC,EAAGD,EAAME,GACzBJ,GAAa,EACb,MAGF,KAAKtc,EACHsV,KAAKpQ,KAAKwH,GAAgBC,GAAWlD,GACrC6S,GAAa,EACb,MAGF,KAAKxc,EACH,IAAK0c,EAAMC,IAAMD,EAAME,EAAG,CACxBJ,GAAa,EACb,KACF,CAEA3H,EAASnK,GAAU8K,KAAKQ,SACxBnL,EAAOmC,EAAQK,OAASwH,EAAOhK,KAC/BG,EAAMgC,EAAQO,OAASsH,EAAO7J,IAC9B8D,EAAQmI,EAAY5F,SACpBxC,EAASoI,EAAY1F,UAEjBmL,EAAMC,EAAI,EACZZ,EAASW,EAAME,EAAI,EAAInc,EAAoBF,EAClCmc,EAAMC,EAAI,IACnB9R,GAAQiE,EACRiN,EAASW,EAAME,EAAI,EAAIlc,EAAoBF,GAGzCkc,EAAME,EAAI,IACZ5R,GAAO6D,GAIJ2G,KAAKK,UACR/N,GAAY0N,KAAK2C,QAASrX,GAC1B0U,KAAKK,SAAU,EAEXL,KAAKmB,SACPnB,KAAKqC,cAAa,GAAM,IAO5B2E,IACFvF,EAAYnI,MAAQA,EACpBmI,EAAYpI,OAASA,EACrBoI,EAAYpM,KAAOA,EACnBoM,EAAYjM,IAAMA,EAClBwK,KAAKuG,OAASA,EACdvG,KAAKM,iBAIP/X,GAAQ8O,GAAU,SAAUmQ,GAC1BA,EAAE3P,OAAS2P,EAAEvP,KACbuP,EAAEzP,OAASyP,EAAErP,IACf,GACF,GAGEsP,GAAU,CAEZ9X,KAAM,WAaJ,OAZIqQ,KAAKzQ,OAAUyQ,KAAKK,SAAYL,KAAK4C,WACvC5C,KAAKK,SAAU,EACfL,KAAKqC,cAAa,GAAM,GAEpBrC,KAAKtM,QAAQ1F,OACfkE,GAAS8N,KAAK2F,QAASla,GAGzB6G,GAAY0N,KAAK2C,QAASrX,GAC1B0U,KAAKyF,eAAezF,KAAKuC,qBAGpBvC,IACT,EAEA0H,MAAO,WAYL,OAXI1H,KAAKzQ,QAAUyQ,KAAK4C,WACtB5C,KAAKY,UAAYhQ,GAAO,CAAC,EAAGoP,KAAKqB,kBACjCrB,KAAKgB,WAAapQ,GAAO,CAAC,EAAGoP,KAAKsB,mBAClCtB,KAAKyB,YAAc7Q,GAAO,CAAC,EAAGoP,KAAKuC,oBACnCvC,KAAKI,eAEDJ,KAAKK,SACPL,KAAKM,iBAIFN,IACT,EAEA2H,MAAO,WAiBL,OAhBI3H,KAAKK,UAAYL,KAAK4C,WACxBhS,GAAOoP,KAAKyB,YAAa,CACvBpM,KAAM,EACNG,IAAK,EACL8D,MAAO,EACPD,OAAQ,IAEV2G,KAAKK,SAAU,EACfL,KAAKM,gBACLN,KAAKoB,aAAY,GAAM,GAEvBpB,KAAKI,eACL9N,GAAY0N,KAAK2F,QAASla,GAC1ByG,GAAS8N,KAAK2C,QAASrX,IAGlB0U,IACT,EAQAxN,QAAS,SAAiBsD,GACxB,IAAI8R,EAAcvf,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,IAAmBA,UAAU,GA4BjF,OA1BK2X,KAAK4C,UAAY9M,IAChBkK,KAAK6H,QACP7H,KAAKvO,QAAQwR,IAAMnN,GAGjB8R,GACF5H,KAAKlK,IAAMA,EACXkK,KAAK1F,MAAM2I,IAAMnN,EAEbkK,KAAKzQ,QACPyQ,KAAKoD,aAAaH,IAAMnN,EACxBvN,GAAQyX,KAAKqD,UAAU,SAAU5R,GAC/BA,EAAQ0S,qBAAqB,OAAO,GAAGlB,IAAMnN,CAC/C,OAGEkK,KAAK6H,QACP7H,KAAK8H,UAAW,GAGlB9H,KAAKtM,QAAQhG,KAAO,KACpBsS,KAAK+H,WACL/H,KAAKgI,KAAKlS,KAIPkK,IACT,EAEAiI,OAAQ,WAMN,OALIjI,KAAKzQ,OAASyQ,KAAK4C,WACrB5C,KAAK4C,UAAW,EAChBtQ,GAAY0N,KAAKQ,QAASnV,IAGrB2U,IACT,EAEAkI,QAAS,WAMP,OALIlI,KAAKzQ,QAAUyQ,KAAK4C,WACtB5C,KAAK4C,UAAW,EAChB1Q,GAAS8N,KAAKQ,QAASnV,IAGlB2U,IACT,EAMAmI,QAAS,WACP,IAAI1W,EAAUuO,KAAKvO,QAEnB,OAAKA,EAAQnH,IAIbmH,EAAQnH,QAAa8G,EAEjB4O,KAAK6H,OAAS7H,KAAK8H,WACrBrW,EAAQwR,IAAMjD,KAAKoI,aAGrBpI,KAAK+H,WACE/H,MAVEA,IAWX,EAQAuH,KAAM,SAAcc,GAClB,IAAIC,EAAUjgB,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAKggB,EAC9EE,EAAmBvI,KAAKgB,WACxB3L,EAAOkT,EAAiBlT,KACxBG,EAAM+S,EAAiB/S,IAC3B,OAAOwK,KAAKwI,OAAOrY,GAAYkY,GAAWA,EAAUhT,EAAOtF,OAAOsY,GAAUlY,GAAYmY,GAAWA,EAAU9S,EAAMzF,OAAOuY,GAC5H,EAQAE,OAAQ,SAAgBrB,GACtB,IAAIC,EAAI/e,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK8e,EACxEnG,EAAahB,KAAKgB,WAClBiB,GAAU,EAoBd,OAnBAkF,EAAIpX,OAAOoX,GACXC,EAAIrX,OAAOqX,GAEPpH,KAAKzQ,QAAUyQ,KAAK4C,UAAY5C,KAAKtM,QAAQnF,UAC3CyB,GAASmX,KACXnG,EAAW3L,KAAO8R,EAClBlF,GAAU,GAGRjS,GAASoX,KACXpG,EAAWxL,IAAM4R,EACjBnF,GAAU,GAGRA,GACFjC,KAAKI,cAAa,IAIfJ,IACT,EAQApQ,KAAM,SAAc0I,EAAOmQ,GACzB,IAAIzH,EAAahB,KAAKgB,WAStB,OALE1I,GAHFA,EAAQvI,OAAOuI,IAEH,EACF,GAAK,EAAIA,GAET,EAAIA,EAGP0H,KAAK0I,OAAO1H,EAAW1H,MAAQhB,EAAQ0I,EAAWpG,aAAc,KAAM6N,EAC/E,EASAC,OAAQ,SAAgBpQ,EAAOqQ,EAAOF,GACpC,IAAI/U,EAAUsM,KAAKtM,QACfsN,EAAahB,KAAKgB,WAClB1H,EAAQ0H,EAAW1H,MACnBD,EAAS2H,EAAW3H,OACpBuB,EAAeoG,EAAWpG,aAC1BE,EAAgBkG,EAAWlG,cAG/B,IAFAxC,EAAQvI,OAAOuI,KAEF,GAAK0H,KAAKzQ,QAAUyQ,KAAK4C,UAAYlP,EAAQhF,SAAU,CAClE,IAAIyL,EAAWS,EAAetC,EAC1B8B,EAAYU,EAAgBxC,EAEhC,IAIO,IAJH5D,GAAcsL,KAAKvO,QAAS3E,GAAY,CAC1CwL,MAAOA,EACPsQ,SAAUtP,EAAQsB,EAClB+L,cAAe8B,IAEf,OAAOzI,KAGT,GAAIyI,EAAgB,CAClB,IAAIpR,EAAW2I,KAAK3I,SAChBgI,EAASnK,GAAU8K,KAAKQ,SACxBtS,EAASmJ,GAAYpQ,OAAOW,KAAKyP,GAAUzQ,OAASoS,GAAkB3B,GAAY,CACpFwB,MAAO4P,EAAe5P,MACtBC,MAAO2P,EAAe3P,OAGxBkI,EAAW3L,OAAS8E,EAAWb,KAAWpL,EAAO2K,MAAQwG,EAAOhK,KAAO2L,EAAW3L,MAAQiE,GAC1F0H,EAAWxL,MAAQ4E,EAAYf,KAAYnL,EAAO4K,MAAQuG,EAAO7J,IAAMwL,EAAWxL,KAAO6D,EAC3F,MAAW/I,GAAcqY,IAAU3Y,GAAS2Y,EAAMxB,IAAMnX,GAAS2Y,EAAMvB,IACrEpG,EAAW3L,OAAS8E,EAAWb,KAAWqP,EAAMxB,EAAInG,EAAW3L,MAAQiE,GACvE0H,EAAWxL,MAAQ4E,EAAYf,KAAYsP,EAAMvB,EAAIpG,EAAWxL,KAAO6D,KAGvE2H,EAAW3L,OAAS8E,EAAWb,GAAS,EACxC0H,EAAWxL,MAAQ4E,EAAYf,GAAU,GAG3C2H,EAAW1H,MAAQa,EACnB6G,EAAW3H,OAASe,EACpB4F,KAAKI,cAAa,EACpB,CAEA,OAAOJ,IACT,EAOAtJ,OAAQ,SAAgBkD,GACtB,OAAOoG,KAAK6I,UAAU7I,KAAKY,UAAUlK,QAAU,GAAK3G,OAAO6J,GAC7D,EAOAiP,SAAU,SAAkBjP,GAQ1B,OALI5J,GAFJ4J,EAAS7J,OAAO6J,KAEQoG,KAAKzQ,QAAUyQ,KAAK4C,UAAY5C,KAAKtM,QAAQlF,YACnEwR,KAAKY,UAAUlK,OAASkD,EAAS,IACjCoG,KAAKI,cAAa,GAAM,IAGnBJ,IACT,EAOArJ,OAAQ,SAAgBmS,GACtB,IAAIlS,EAASoJ,KAAKY,UAAUhK,OAC5B,OAAOoJ,KAAK/C,MAAM6L,EAAS9Y,GAAS4G,GAAUA,EAAS,EACzD,EAOAA,OAAQ,SAAgBmS,GACtB,IAAIpS,EAASqJ,KAAKY,UAAUjK,OAC5B,OAAOqJ,KAAK/C,MAAMjN,GAAS2G,GAAUA,EAAS,EAAGoS,EACnD,EAQA9L,MAAO,SAAetG,GACpB,IAAIC,EAASvO,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAKsO,EAC7EiK,EAAYZ,KAAKY,UACjBsB,GAAc,EAoBlB,OAnBAvL,EAAS5G,OAAO4G,GAChBC,EAAS7G,OAAO6G,GAEZoJ,KAAKzQ,QAAUyQ,KAAK4C,UAAY5C,KAAKtM,QAAQjF,WAC3CuB,GAAS2G,KACXiK,EAAUjK,OAASA,EACnBuL,GAAc,GAGZlS,GAAS4G,KACXgK,EAAUhK,OAASA,EACnBsL,GAAc,GAGZA,GACFlC,KAAKI,cAAa,GAAM,IAIrBJ,IACT,EAOAlN,QAAS,WACP,IAKIpF,EALAsb,EAAU3gB,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,IAAmBA,UAAU,GACzEqL,EAAUsM,KAAKtM,QACfkN,EAAYZ,KAAKY,UACjBI,EAAahB,KAAKgB,WAClBS,EAAczB,KAAKyB,YAGvB,GAAIzB,KAAKzQ,OAASyQ,KAAKK,QAAS,CAC9B3S,EAAO,CACLyZ,EAAG1F,EAAYpM,KAAO2L,EAAW3L,KACjC+R,EAAG3F,EAAYjM,IAAMwL,EAAWxL,IAChC8D,MAAOmI,EAAYnI,MACnBD,OAAQoI,EAAYpI,QAEtB,IAAIf,EAAQsI,EAAUtH,MAAQsH,EAAUhG,aAKxC,GAJArS,GAAQmF,GAAM,SAAUnE,EAAG5C,GACzB+G,EAAK/G,GAAK4C,EAAI+O,CAChB,IAEI0Q,EAAS,CAGX,IAAIjC,EAAS1V,KAAKC,MAAM5D,EAAK0Z,EAAI1Z,EAAK2L,QAClCyN,EAAQzV,KAAKC,MAAM5D,EAAKyZ,EAAIzZ,EAAK4L,OACrC5L,EAAKyZ,EAAI9V,KAAKC,MAAM5D,EAAKyZ,GACzBzZ,EAAK0Z,EAAI/V,KAAKC,MAAM5D,EAAK0Z,GACzB1Z,EAAK4L,MAAQwN,EAAQpZ,EAAKyZ,EAC1BzZ,EAAK2L,OAAS0N,EAASrZ,EAAK0Z,CAC9B,CACF,MACE1Z,EAAO,CACLyZ,EAAG,EACHC,EAAG,EACH9N,MAAO,EACPD,OAAQ,GAaZ,OATI3F,EAAQlF,YACVd,EAAKgJ,OAASkK,EAAUlK,QAAU,GAGhChD,EAAQjF,WACVf,EAAKiJ,OAASiK,EAAUjK,QAAU,EAClCjJ,EAAKkJ,OAASgK,EAAUhK,QAAU,GAG7BlJ,CACT,EAOAuF,QAAS,SAAiBvF,GACxB,IAAIgG,EAAUsM,KAAKtM,QACfkN,EAAYZ,KAAKY,UACjBI,EAAahB,KAAKgB,WAClBS,EAAc,CAAC,EAEnB,GAAIzB,KAAKzQ,QAAUyQ,KAAK4C,UAAYtS,GAAc5C,GAAO,CACvD,IAAIwU,GAAc,EAEdxO,EAAQlF,WACNwB,GAAStC,EAAKgJ,SAAWhJ,EAAKgJ,SAAWkK,EAAUlK,SACrDkK,EAAUlK,OAAShJ,EAAKgJ,OACxBwL,GAAc,GAIdxO,EAAQjF,WACNuB,GAAStC,EAAKiJ,SAAWjJ,EAAKiJ,SAAWiK,EAAUjK,SACrDiK,EAAUjK,OAASjJ,EAAKiJ,OACxBuL,GAAc,GAGZlS,GAAStC,EAAKkJ,SAAWlJ,EAAKkJ,SAAWgK,EAAUhK,SACrDgK,EAAUhK,OAASlJ,EAAKkJ,OACxBsL,GAAc,IAIdA,GACFlC,KAAKI,cAAa,GAAM,GAG1B,IAAI9H,EAAQsI,EAAUtH,MAAQsH,EAAUhG,aAEpC5K,GAAStC,EAAKyZ,KAChB1F,EAAYpM,KAAO3H,EAAKyZ,EAAI7O,EAAQ0I,EAAW3L,MAG7CrF,GAAStC,EAAK0Z,KAChB3F,EAAYjM,IAAM9H,EAAK0Z,EAAI9O,EAAQ0I,EAAWxL,KAG5CxF,GAAStC,EAAK4L,SAChBmI,EAAYnI,MAAQ5L,EAAK4L,MAAQhB,GAG/BtI,GAAStC,EAAK2L,UAChBoI,EAAYpI,OAAS3L,EAAK2L,OAASf,GAGrC0H,KAAKyF,eAAehE,EACtB,CAEA,OAAOzB,IACT,EAMAiJ,iBAAkB,WAChB,OAAOjJ,KAAKzQ,MAAQqB,GAAO,CAAC,EAAGoP,KAAKS,eAAiB,CAAC,CACxD,EAMAyI,aAAc,WACZ,OAAOlJ,KAAKmJ,MAAQvY,GAAO,CAAC,EAAGoP,KAAKY,WAAa,CAAC,CACpD,EAMA0E,cAAe,WACb,IAAItE,EAAahB,KAAKgB,WAClBtT,EAAO,CAAC,EAQZ,OANIsS,KAAKzQ,OACPhH,GAAQ,CAAC,OAAQ,MAAO,QAAS,SAAU,eAAgB,kBAAkB,SAAUgB,GACrFmE,EAAKnE,GAAKyX,EAAWzX,EACvB,IAGKmE,CACT,EAOA8X,cAAe,SAAuB9X,GACpC,IAAIsT,EAAahB,KAAKgB,WAClBvT,EAAcuT,EAAWvT,YAsB7B,OApBIuS,KAAKzQ,QAAUyQ,KAAK4C,UAAYtS,GAAc5C,KAC5CsC,GAAStC,EAAK2H,QAChB2L,EAAW3L,KAAO3H,EAAK2H,MAGrBrF,GAAStC,EAAK8H,OAChBwL,EAAWxL,IAAM9H,EAAK8H,KAGpBxF,GAAStC,EAAK4L,QAChB0H,EAAW1H,MAAQ5L,EAAK4L,MACxB0H,EAAW3H,OAAS3L,EAAK4L,MAAQ7L,GACxBuC,GAAStC,EAAK2L,UACvB2H,EAAW3H,OAAS3L,EAAK2L,OACzB2H,EAAW1H,MAAQ5L,EAAK2L,OAAS5L,GAGnCuS,KAAKI,cAAa,IAGbJ,IACT,EAMAuF,eAAgB,WACd,IACI7X,EADA+T,EAAczB,KAAKyB,YAYvB,OATIzB,KAAKzQ,OAASyQ,KAAKK,UACrB3S,EAAO,CACL2H,KAAMoM,EAAYpM,KAClBG,IAAKiM,EAAYjM,IACjB8D,MAAOmI,EAAYnI,MACnBD,OAAQoI,EAAYpI,SAIjB3L,GAAQ,CAAC,CAClB,EAOA+X,eAAgB,SAAwB/X,GACtC,IAEI0b,EACAC,EAHA5H,EAAczB,KAAKyB,YACnBhU,EAAcuS,KAAKtM,QAAQjG,YAkC/B,OA9BIuS,KAAKzQ,OAASyQ,KAAKK,UAAYL,KAAK4C,UAAYtS,GAAc5C,KAC5DsC,GAAStC,EAAK2H,QAChBoM,EAAYpM,KAAO3H,EAAK2H,MAGtBrF,GAAStC,EAAK8H,OAChBiM,EAAYjM,IAAM9H,EAAK8H,KAGrBxF,GAAStC,EAAK4L,QAAU5L,EAAK4L,QAAUmI,EAAYnI,QACrD8P,GAAe,EACf3H,EAAYnI,MAAQ5L,EAAK4L,OAGvBtJ,GAAStC,EAAK2L,SAAW3L,EAAK2L,SAAWoI,EAAYpI,SACvDgQ,GAAgB,EAChB5H,EAAYpI,OAAS3L,EAAK2L,QAGxB5L,IACE2b,EACF3H,EAAYpI,OAASoI,EAAYnI,MAAQ7L,EAChC4b,IACT5H,EAAYnI,MAAQmI,EAAYpI,OAAS5L,IAI7CuS,KAAKM,iBAGAN,IACT,EAOAsJ,iBAAkB,WAChB,IAAI5V,EAAUrL,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAEnF,IAAK2X,KAAKzQ,QAAUvF,OAAOuf,kBACzB,OAAO,KAGT,IAAIvI,EAAahB,KAAKgB,WAClB1Y,EAAS+R,GAAgB2F,KAAK1F,MAAO0F,KAAKY,UAAWI,EAAYtN,GAErE,IAAKsM,KAAKK,QACR,OAAO/X,EAGT,IAAIkhB,EAAgBxJ,KAAKlN,UACrB2W,EAAWD,EAAcrC,EACzBuC,EAAWF,EAAcpC,EACzBuC,EAAeH,EAAclQ,MAC7BsQ,EAAgBJ,EAAcnQ,OAE9Bf,EAAQhQ,EAAOgR,MAAQjI,KAAKgM,MAAM2D,EAAWpG,cAEnC,IAAVtC,IACFmR,GAAYnR,EACZoR,GAAYpR,EACZqR,GAAgBrR,EAChBsR,GAAiBtR,GAGnB,IAAI7K,EAAckc,EAAeC,EAC7BxN,EAAWjD,GAAiB,CAC9B1L,YAAaA,EACb6L,MAAO5F,EAAQ+H,UAAYvL,IAC3BmJ,OAAQ3F,EAAQiI,WAAazL,MAE3BmM,EAAWlD,GAAiB,CAC9B1L,YAAaA,EACb6L,MAAO5F,EAAQmI,UAAY,EAC3BxC,OAAQ3F,EAAQqI,WAAa,GAC5B,SAEC2F,EAAoBvI,GAAiB,CACvC1L,YAAaA,EACb6L,MAAO5F,EAAQ4F,QAAoB,IAAVhB,EAAchQ,EAAOgR,MAAQqQ,GACtDtQ,OAAQ3F,EAAQ2F,SAAqB,IAAVf,EAAchQ,EAAO+Q,OAASuQ,KAEvDtQ,EAAQoI,EAAkBpI,MAC1BD,EAASqI,EAAkBrI,OAE/BC,EAAQjI,KAAKiL,IAAIF,EAAS9C,MAAOjI,KAAKkL,IAAIF,EAAS/C,MAAOA,IAC1DD,EAAShI,KAAKiL,IAAIF,EAAS/C,OAAQhI,KAAKkL,IAAIF,EAAShD,OAAQA,IAC7D,IAAI2C,EAAS/R,SAASgS,cAAc,UAChCC,EAAUF,EAAOG,WAAW,MAChCH,EAAO1C,MAAQpI,GAAuBoI,GACtC0C,EAAO3C,OAASnI,GAAuBmI,GACvC6C,EAAQW,UAAYnJ,EAAQyH,WAAa,cACzCe,EAAQY,SAAS,EAAG,EAAGxD,EAAOD,GAC9B,IAAIwQ,EAAwBnW,EAAQ2H,sBAChCA,OAAkD,IAA1BwO,GAA0CA,EAClEtO,EAAwB7H,EAAQ6H,sBACpCW,EAAQb,sBAAwBA,EAE5BE,IACFW,EAAQX,sBAAwBA,GAIlC,IAKIuO,EACAC,EAEAC,EACAC,EACAC,EACAC,EAXAC,EAAc9hB,EAAOgR,MACrB+Q,EAAe/hB,EAAO+Q,OAEtBiR,EAAOb,EACPc,EAAOb,EASPY,IAASX,GAAgBW,EAAOF,GAClCE,EAAO,EACPR,EAAW,EACXE,EAAO,EACPE,EAAW,GACFI,GAAQ,GACjBN,GAAQM,EACRA,EAAO,EAEPJ,EADAJ,EAAWzY,KAAKiL,IAAI8N,EAAaT,EAAeW,IAEvCA,GAAQF,IACjBJ,EAAO,EAEPE,EADAJ,EAAWzY,KAAKiL,IAAIqN,EAAcS,EAAcE,IAI9CR,GAAY,GAAKS,IAASX,GAAiBW,EAAOF,GACpDE,EAAO,EACPR,EAAY,EACZE,EAAO,EACPE,EAAY,GACHI,GAAQ,GACjBN,GAAQM,EACRA,EAAO,EAEPJ,EADAJ,EAAY1Y,KAAKiL,IAAI+N,EAAcT,EAAgBW,IAE1CA,GAAQF,IACjBJ,EAAO,EAEPE,EADAJ,EAAY1Y,KAAKiL,IAAIsN,EAAeS,EAAeE,IAIrD,IAAI3N,EAAS,CAAC0N,EAAMC,EAAMT,EAAUC,GAEpC,GAAIG,EAAW,GAAKC,EAAY,EAAG,CACjC,IAAIlN,EAAQ3D,EAAQqQ,EACpB/M,EAAO1U,KAAK8hB,EAAO/M,EAAOgN,EAAOhN,EAAOiN,EAAWjN,EAAOkN,EAAYlN,EACxE,CAOA,OAHAf,EAAQgB,UAAU/U,MAAM+T,EAAS,CAAC5T,GAAQ8C,OAAO1C,EAAmBkU,EAAOO,KAAI,SAAUC,GACvF,OAAO/L,KAAKgM,MAAMnM,GAAuBkM,GAC3C,OACOpB,CACT,EAOAwO,eAAgB,SAAwB/c,GACtC,IAAIiG,EAAUsM,KAAKtM,QAenB,OAbKsM,KAAK4C,UAAazS,GAAY1C,KAEjCiG,EAAQjG,YAAc4D,KAAKkL,IAAI,EAAG9O,IAAgBD,IAE9CwS,KAAKzQ,QACPyQ,KAAKG,cAEDH,KAAKK,SACPL,KAAKM,kBAKJN,IACT,EAOA0F,YAAa,SAAqB+E,GAChC,IAAI/W,EAAUsM,KAAKtM,QACfiS,EAAU3F,KAAK2F,QACfjD,EAAO1C,KAAK0C,KAEhB,GAAI1C,KAAKzQ,QAAUyQ,KAAK4C,SAAU,CAChC,IAAI8H,EAAYD,IAAS5e,EACrB0C,EAAUmF,EAAQnF,SAAWkc,IAAS3e,EAC1C2e,EAAOC,GAAanc,EAAUkc,EAAO1e,EACrC2H,EAAQpG,SAAWmd,EACnBxX,GAAQ0S,EAASha,EAAa8e,GAC9BhY,GAAYkT,EAASxa,EAAYuf,GACjCjY,GAAYkT,EAASja,EAAY6C,GAE5BmF,EAAQ5E,iBAEXmE,GAAQyP,EAAM/W,EAAa8e,GAC3BhY,GAAYiQ,EAAMvX,EAAYuf,GAC9BjY,GAAYiQ,EAAMhX,EAAY6C,GAElC,CAEA,OAAOyR,IACT,GAGE2K,GAAiBzgB,EAAO0gB,QAExBA,GAAuB,WAMzB,SAASA,EAAQnZ,GACf,IAAIiC,EAAUrL,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAInF,GAFAjC,EAAgB4Z,KAAM4K,IAEjBnZ,IAAYtE,GAAgBvD,KAAK6H,EAAQoZ,SAC5C,MAAM,IAAIC,MAAM,4EAGlB9K,KAAKvO,QAAUA,EACfuO,KAAKtM,QAAU9C,GAAO,CAAC,EAAGxD,GAAUkD,GAAcoD,IAAYA,GAC9DsM,KAAKK,SAAU,EACfL,KAAK4C,UAAW,EAChB5C,KAAK3I,SAAW,CAAC,EACjB2I,KAAKzQ,OAAQ,EACbyQ,KAAK+K,WAAY,EACjB/K,KAAK8H,UAAW,EAChB9H,KAAKmJ,OAAQ,EACbnJ,KAAKgL,QAAS,EACdhL,KAAKiL,MACP,CA2XA,OAzXA7jB,EAAawjB,EAAS,CAAC,CACrBzjB,IAAK,OACLK,MAAO,WACL,IAEIsO,EAFArE,EAAUuO,KAAKvO,QACfoZ,EAAUpZ,EAAQoZ,QAAQhY,cAG9B,IAAIpB,EAAQnH,GAAZ,CAMA,GAFAmH,EAAQnH,GAAa0V,KAEL,QAAZ6K,EAAmB,CAMrB,GALA7K,KAAK6H,OAAQ,EAEb/R,EAAMrE,EAAQuB,aAAa,QAAU,GACrCgN,KAAKoI,YAActS,GAEdA,EACH,OAIFA,EAAMrE,EAAQwR,GAChB,KAAuB,WAAZ4H,GAAwB7gB,OAAOuf,oBACxCzT,EAAMrE,EAAQyZ,aAGhBlL,KAAKgI,KAAKlS,EApBV,CAqBF,GACC,CACD3O,IAAK,OACLK,MAAO,SAAcsO,GACnB,IAAI8P,EAAQ5F,KAEZ,GAAKlK,EAAL,CAIAkK,KAAKlK,IAAMA,EACXkK,KAAKY,UAAY,CAAC,EAClB,IAAInP,EAAUuO,KAAKvO,QACfiC,EAAUsM,KAAKtM,QAOnB,GALKA,EAAQlF,WAAckF,EAAQjF,WACjCiF,EAAQ3F,kBAAmB,GAIxB2F,EAAQ3F,kBAAqB/D,OAAOoU,YAMzC,GAAInR,GAAgBrD,KAAKkM,GAEnB5I,GAAqBtD,KAAKkM,GAC5BkK,KAAKmL,KAAKrN,GAAqBhI,IAI/BkK,KAAKoL,YAPT,CAeA,IAAIC,EAAM,IAAIC,eACVF,EAAQpL,KAAKoL,MAAM/G,KAAKrE,MAC5BA,KAAK+K,WAAY,EACjB/K,KAAKqL,IAAMA,EAKXA,EAAIE,QAAUH,EACdC,EAAIG,QAAUJ,EACdC,EAAII,UAAYL,EAEhBC,EAAIK,WAAa,WAEXL,EAAIM,kBAAkB,kBAAoB5e,IAC5Cse,EAAIO,OAER,EAEAP,EAAIQ,OAAS,WACXjG,EAAMuF,KAAKE,EAAIS,SACjB,EAEAT,EAAIU,UAAY,WACdnG,EAAMmF,WAAY,EAClBnF,EAAMyF,IAAM,IACd,EAGI3X,EAAQ5F,kBAAoB+H,GAAiBC,IAAQrE,EAAQqR,cAC/DhN,EAAMM,GAAaN,IAGrBuV,EAAIW,KAAK,MAAOlW,GAChBuV,EAAIY,aAAe,cACnBZ,EAAIa,gBAA0C,oBAAxBza,EAAQqR,YAC9BuI,EAAIc,MAxCJ,MAhBEnM,KAAKoL,OAbP,CAsEF,GACC,CACDjkB,IAAK,OACLK,MAAO,SAAc2W,GACnB,IAAIzK,EAAUsM,KAAKtM,QACfkN,EAAYZ,KAAKY,UAGjB7B,EAAcD,GAAuBX,GACrCzH,EAAS,EACTC,EAAS,EACTC,EAAS,EAEb,GAAImI,EAAc,EAAG,CAEnBiB,KAAKlK,IAAM0I,GAAqBL,EAAapR,IAE7C,IAAIqf,EAAoBtM,GAAiBf,GAEzCrI,EAAS0V,EAAkB1V,OAC3BC,EAASyV,EAAkBzV,OAC3BC,EAASwV,EAAkBxV,MAC7B,CAEIlD,EAAQlF,YACVoS,EAAUlK,OAASA,GAGjBhD,EAAQjF,WACVmS,EAAUjK,OAASA,EACnBiK,EAAUhK,OAASA,GAGrBoJ,KAAKoL,OACP,GACC,CACDjkB,IAAK,QACLK,MAAO,WACL,IAAIiK,EAAUuO,KAAKvO,QACfqE,EAAMkK,KAAKlK,IACXgN,EAAcrR,EAAQqR,YACtBC,EAAiBjN,EAEjBkK,KAAKtM,QAAQ5F,kBAAoB+H,GAAiBC,KAC/CgN,IACHA,EAAc,aAIhBC,EAAiB3M,GAAaN,IAGhCkK,KAAK8C,YAAcA,EACnB9C,KAAK+C,eAAiBA,EACtB,IAAIzI,EAAQrQ,SAASgS,cAAc,OAE/B6G,IACFxI,EAAMwI,YAAcA,GAGtBxI,EAAM2I,IAAMF,GAAkBjN,EAC9BwE,EAAM0I,IAAMvR,EAAQuR,KAAO,oBAC3BhD,KAAK1F,MAAQA,EACbA,EAAMuR,OAAS7L,KAAKtC,MAAM2G,KAAKrE,MAC/B1F,EAAMkR,QAAUxL,KAAKqM,KAAKhI,KAAKrE,MAC/B9N,GAASoI,EAAO/O,GAChBkG,EAAQ6a,WAAWC,aAAajS,EAAO7I,EAAQ+a,YACjD,GACC,CACDrlB,IAAK,QACLK,MAAO,WACL,IAAIilB,EAASzM,KAET1F,EAAQ0F,KAAK1F,MACjBA,EAAMuR,OAAS,KACfvR,EAAMkR,QAAU,KAChBxL,KAAKgL,QAAS,EAGd,IAAI0B,EAAcxiB,EAAOyiB,WAAa,sCAAsC/iB,KAAKM,EAAOyiB,UAAUC,WAE9FC,EAAO,SAAcjS,EAAcE,GACrClK,GAAO6b,EAAO7L,UAAW,CACvBhG,aAAcA,EACdE,cAAeA,EACfrN,YAAamN,EAAeE,IAE9B2R,EAAOzB,QAAS,EAChByB,EAAOtD,OAAQ,EAEfsD,EAAOK,OACT,EAGA,IAAIxS,EAAMM,cAAiB8R,EAA3B,CAKA,IAAIK,EAAc9iB,SAASgS,cAAc,OACrC+Q,EAAO/iB,SAAS+iB,MAAQ/iB,SAASG,gBACrC4V,KAAK+M,YAAcA,EAEnBA,EAAYlB,OAAS,WACnBgB,EAAKE,EAAYzT,MAAOyT,EAAY1T,QAE/BqT,GACHM,EAAKC,YAAYF,EAErB,EAEAA,EAAY9J,IAAM3I,EAAM2I,IAGnByJ,IACHK,EAAYpb,MAAMkS,QAAU,uJAC5BmJ,EAAK7J,YAAY4J,GAnBnB,MAFEF,EAAKvS,EAAMM,aAAcN,EAAMQ,cAuBnC,GACC,CACD3T,IAAK,OACLK,MAAO,WACL,IAAI8S,EAAQ0F,KAAK1F,MACjBA,EAAMuR,OAAS,KACfvR,EAAMkR,QAAU,KAChBlR,EAAMgS,WAAWW,YAAY3S,GAC7B0F,KAAK1F,MAAQ,IACf,GACC,CACDnT,IAAK,QACLK,MAAO,WACL,GAAKwY,KAAKmJ,QAASnJ,KAAKzQ,MAAxB,CAIA,IAAIkC,EAAUuO,KAAKvO,QACfiC,EAAUsM,KAAKtM,QACf4G,EAAQ0F,KAAK1F,MAEbiG,EAAY9O,EAAQ6a,WACpBY,EAAWjjB,SAASgS,cAAc,OACtCiR,EAAStJ,UAAY/T,GACrB,IAAI2Q,EAAU0M,EAAS1J,cAAc,IAAIpY,OAAOd,EAAW,eACvD0R,EAASwE,EAAQgD,cAAc,IAAIpY,OAAOd,EAAW,YACrDqb,EAAUnF,EAAQgD,cAAc,IAAIpY,OAAOd,EAAW,cACtDqY,EAAUnC,EAAQgD,cAAc,IAAIpY,OAAOd,EAAW,cACtDoY,EAAOC,EAAQa,cAAc,IAAIpY,OAAOd,EAAW,UACvD0V,KAAKO,UAAYA,EACjBP,KAAKQ,QAAUA,EACfR,KAAKhE,OAASA,EACdgE,KAAK2F,QAAUA,EACf3F,KAAK2C,QAAUA,EACf3C,KAAKkD,QAAU1C,EAAQgD,cAAc,IAAIpY,OAAOd,EAAW,cAC3D0V,KAAK0C,KAAOA,EACZ1G,EAAOmH,YAAY7I,GAEnBpI,GAAST,EAASnG,GAElBiV,EAAUgM,aAAa/L,EAAS/O,EAAQ+a,aAEnCxM,KAAK6H,OACRvV,GAAYgI,EAAO/O,GAGrByU,KAAK6C,cACL7C,KAAKqE,OACL3Q,EAAQnG,mBAAqB8D,KAAKkL,IAAI,EAAG7I,EAAQnG,qBAAuBC,IACxEkG,EAAQjG,YAAc4D,KAAKkL,IAAI,EAAG7I,EAAQjG,cAAgBD,IAC1DkG,EAAQrG,SAAWgE,KAAKkL,IAAI,EAAGlL,KAAKiL,IAAI,EAAGjL,KAAKC,MAAMoC,EAAQrG,aAAe,EAC7E6E,GAASyQ,EAASrX,GAEboI,EAAQzF,QACXiE,GAASyQ,EAAQwK,uBAAuB,GAAG/hB,OAAOd,EAAW,YAAagB,GAGvEoI,EAAQxF,QACXgE,GAASyQ,EAAQwK,uBAAuB,GAAG/hB,OAAOd,EAAW,YAAagB,GAGxEoI,EAAQtF,YACV8D,GAASsO,EAAS,GAAGpV,OAAOd,EAAW,QAGpCoJ,EAAQvF,WACX+D,GAASwQ,EAAMlX,GAGbkI,EAAQ5E,iBACVoD,GAASwQ,EAAMhX,GACfuH,GAAQyP,EAAM/W,EAAapB,IAGxBmJ,EAAQ3E,mBACXmD,GAASyQ,EAAQwK,uBAAuB,GAAG/hB,OAAOd,EAAW,UAAWgB,GACxE4G,GAASyQ,EAAQwK,uBAAuB,GAAG/hB,OAAOd,EAAW,WAAYgB,IAG3E0U,KAAKD,SACLC,KAAKzQ,OAAQ,EACbyQ,KAAK0F,YAAYhS,EAAQpG,UAErBoG,EAAQrF,UACV2R,KAAKrQ,OAGPqQ,KAAK/M,QAAQS,EAAQhG,MAEjB+C,GAAWiD,EAAQnE,QACrB8E,GAAY5C,EAAS9E,EAAa+G,EAAQnE,MAAO,CAC/CiE,MAAM,IAIVkB,GAAcjD,EAAS9E,EAhFvB,CAiFF,GACC,CACDxF,IAAK,UACLK,MAAO,WACAwY,KAAKzQ,QAIVyQ,KAAKzQ,OAAQ,EACbyQ,KAAKoF,SACLpF,KAAK8D,eACL9D,KAAKQ,QAAQ8L,WAAWW,YAAYjN,KAAKQ,SACzClO,GAAY0N,KAAKvO,QAASnG,GAC5B,GACC,CACDnE,IAAK,WACLK,MAAO,WACDwY,KAAKzQ,OACPyQ,KAAKoN,UACLpN,KAAKzQ,OAAQ,EACbyQ,KAAKK,SAAU,GACNL,KAAKgL,QACdhL,KAAK+M,YAAYlB,OAAS,KAC1B7L,KAAKgL,QAAS,EACdhL,KAAKmJ,OAAQ,GACJnJ,KAAK+K,WACd/K,KAAKqL,IAAIE,QAAU,KACnBvL,KAAKqL,IAAIO,SACA5L,KAAK1F,OACd0F,KAAKqM,MAET,IAME,CAAC,CACHllB,IAAK,aACLK,MAAO,WAEL,OADAwC,OAAO4gB,QAAUD,GACVC,CACT,GAMC,CACDzjB,IAAK,cACLK,MAAO,SAAqBkM,GAC1B9C,GAAOxD,GAAUkD,GAAcoD,IAAYA,EAC7C,KAGKkX,CACT,CAtZ2B,GA0Z3B,OAFAha,GAAOga,GAAQzkB,UAAW4Z,GAAQpS,GAASyW,GAAQiB,GAAUwB,GAAQY,IAE9DmD,EAER,CAphHiFyC,E,mCCTlF,IAAIC,EAAQ,EAAQ,KAEhBC,EAAqB,EAAQ,KAEjC,SAASC,EAA4BC,EAAUC,GAAc,IAAKzmB,OAAOd,UAAUkK,eAAe5G,KAAKgkB,EAAUC,GAAe,MAAM,IAAInnB,UAAU,kDAAqD,OAAOknB,CAAU,CAE1N,IAAIE,EAAK,EAET,SAASC,EAA2BjkB,GAAQ,MAAO,aAAegkB,IAAO,IAAMhkB,CAAM,CAErF,MAAMkkB,EAA0B,EAAQ,KAElCC,EAAgB,EAAQ,KAExBC,EAAe,EAAQ,KAEvBC,EAAS,EAAQ,KAEvB,IAAIC,EAAiCL,EAA2B,oBAEhE,MAAMM,UAAmBZ,EAAMa,WAC7BjoB,YAAYkoB,EAAMC,GAChBC,MAAMF,EAAMC,GACZpnB,OAAOC,eAAe8Y,KAAMiO,EAAmB,CAC7CjnB,UAAU,EACVQ,WAAO,IAETwY,KAAK2N,GAAK3N,KAAKqO,KAAKV,IAAM,aAC1B3N,KAAKhM,KAAO,WACZgM,KAAKuO,cAAgBP,EAKrBhO,KAAKqO,KAAO,CAHVG,QAAS,GACTC,MAAO,MAGJJ,GAELb,EAA4BxN,KAAMiO,GAAmBA,GAAqB,IAAIV,EAAmBmB,iBAAiB1O,KAAKqO,KAAKI,OAC5HzO,KAAK2O,WACL3O,KAAK4O,cAAgB5O,KAAK4O,cAAcvK,KAAKrE,MAC7CA,KAAK6O,SAAW7O,KAAK6O,SAASxK,KAAKrE,KACrC,CAEA6O,SAASC,GACP,OAAO,IAAIC,SAAQ,CAACC,EAASC,KAE3B,IAAIlB,EAAae,EAAM,IAAK9O,KAAKqO,KAC/Ba,QAASF,EACTxe,MAAOye,GACP,GAEN,CAEAE,oBAAoBC,GAClB,IAAIC,EAAsB,EAC1B,MAAMC,EAAkB,GAElBC,EAAyB/B,EAA4BxN,KAAMiO,GAAmBA,GAAmBuB,qBAAoBL,UACzH,IACE,MAAMM,QAAuBzP,KAAK6O,SAASa,EAAKhiB,MAC1CiiB,EAAwBD,EAAKhiB,KAAKkiB,KAAOH,EAAeG,KAC9D5P,KAAKoO,KAAKyB,IAAI,4BAA4BH,EAAK/B,oBAAoBG,EAAc6B,MACjFN,GAAuBM,EACvB,MAAM,KACJhmB,EAAI,KACJqK,EAAI,KACJ4b,GACEH,EACEK,EAAYnmB,GAAQkkB,EAAwBlkB,GAAMmmB,UACxD9P,KAAKoO,KAAK2B,aAAaL,EAAK/B,GAAI,IAAMhkB,GAAQ,CAC1CA,WAEEmmB,GAAa,CACfA,gBAEE9b,GAAQ,CACVA,WAEE4b,GAAQ,CACVA,QAEFliB,KAAM+hB,IAERzP,KAAKoO,KAAK4B,YAAYN,EAAK/B,GAAI,CAC7B3Z,SAEFsb,EAAgBpnB,KAAKwnB,EAIvB,CAHE,MAAOO,GACPjQ,KAAKoO,KAAKyB,IAAI,yCAAyCH,EAAK/B,MAAO,WACnE3N,KAAKoO,KAAKyB,IAAII,EAAK,UACrB,KAGIC,EAAWd,EAAQjS,KAAIgT,IAC3B,MAAMT,EAAO1P,KAAKoO,KAAKgC,QAAQD,GAM/B,OALAnQ,KAAKoO,KAAKiC,KAAK,sBAAuBX,EAAM,CAC1CjF,KAAM,gBACN6F,QAAStQ,KAAKuQ,KAAK,uBAGjBb,EAAKc,SACAzB,QAAQC,WAMZU,EAAKhiB,KAAKsG,OACb0b,EAAKhiB,KAAOgiB,EAAKhiB,KAAKhE,MAAM,EAAGgmB,EAAKhiB,KAAKkiB,KAAMF,EAAK1b,OAGjD0b,EAAK1b,KAAKyc,WAAW,UAInBlB,EAAuBG,GAHrBX,QAAQC,UAGkB,UAM/BD,QAAQ2B,IAAIR,GAClBlQ,KAAKoO,KAAKiC,KAAK,sBAAuBf,GAElCD,EAAsB,MACxBrP,KAAKoO,KAAKuC,KAAK3Q,KAAKuQ,KAAK,cAAe,CACtCX,KAAM9B,EAAcuB,KAClB,QAGN,IAAK,MAAMc,KAAUf,EAAS,CAC5B,MAAMM,EAAO1P,KAAKoO,KAAKgC,QAAQD,GAC/BnQ,KAAKoO,KAAKiC,KAAK,sBAAuBX,EACxC,CACF,CAEAkB,UACE5Q,KAAKoO,KAAKyC,gBAAgB7Q,KAAK4O,cACjC,CAEAkC,YACE9Q,KAAKoO,KAAK2C,mBAAmB/Q,KAAK4O,cACpC,EAIFhpB,EAAOC,QAAUqoB,C,oBCjJjBtoB,EAAOC,QAAU,SAAwBmrB,GACvC,GAAmB,kBAARA,GAAoBlhB,MAAMkhB,GACnC,MAAM,IAAIzqB,UAAU,iCAAiCyqB,GAGvD,MAAMC,EAAMD,EAAM,EACZE,EAAQ,CAAC,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAM9D,GAJID,IACFD,GAAOA,GAGLA,EAAM,EACR,OAAWC,EAAM,IAAM,IAAMD,EAAtB,KAGT,MAAMG,EAAW9f,KAAKiL,IAAIjL,KAAKgM,MAAMhM,KAAKwe,IAAImB,GAAO3f,KAAKwe,IAAI,OAAQqB,EAAMtqB,OAAS,GACrFoqB,EAAMjhB,OAAOihB,EAAM3f,KAAK+f,IAAI,KAAMD,IAClC,MAAME,EAAOH,EAAMC,GAEnB,OAAIH,GAAO,IAAMA,EAAM,IAAM,EAGpB,IAAIC,EAAM,IAAM,IAAMD,EAAIM,QAAQ,MAAMD,IAE1C,IAAIJ,EAAM,IAAM,IAAMD,EAAIM,QAAQ,MAAMD,GACjD,C,mCCjBA,SAAS5pB,EAAQC,EAAQC,GACvB,IAAIC,EAAOX,OAAOW,KAAKF,GAEvB,GAAIT,OAAOY,sBAAuB,CAChC,IAAIC,EAAUb,OAAOY,sBAAsBH,GAEvCC,IACFG,EAAUA,EAAQC,QAAO,SAAUC,GACjC,OAAOf,OAAOgB,yBAAyBP,EAAQM,GAAKlB,UACtD,KAGFc,EAAKM,KAAKC,MAAMP,EAAME,EACxB,CAEA,OAAOF,CACT,CAEA,SAASQ,EAAe3B,GACtB,IAAK,IAAIE,EAAI,EAAGA,EAAI0B,UAAUzB,OAAQD,IAAK,CACzC,IAAI2B,EAAyB,MAAhBD,UAAU1B,GAAa0B,UAAU1B,GAAK,CAAC,EAEhDA,EAAI,EACNc,EAAQR,OAAOqB,IAAS,GAAMC,SAAQ,SAAUpB,GAC9CI,EAAgBd,EAAQU,EAAKmB,EAAOnB,GACtC,IACSF,OAAOuB,0BAChBvB,OAAOwB,iBAAiBhC,EAAQQ,OAAOuB,0BAA0BF,IAEjEb,EAAQR,OAAOqB,IAASC,SAAQ,SAAUpB,GACxCF,OAAOC,eAAeT,EAAQU,EAAKF,OAAOgB,yBAAyBK,EAAQnB,GAC7E,GAEJ,CAEA,OAAOV,CACT,CAQA,SAASD,EAAkBC,EAAQC,GACjC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CACrC,IAAIE,EAAaH,EAAMC,GACvBE,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWE,cAAe,EACtB,UAAWF,IAAYA,EAAWG,UAAW,GACjDC,OAAOC,eAAeT,EAAQI,EAAWM,IAAKN,EAChD,CACF,CAQA,SAASU,EAAgBxB,EAAKoB,EAAKK,GAYjC,OAXIL,KAAOpB,EACTkB,OAAOC,eAAenB,EAAKoB,EAAK,CAC9BK,MAAOA,EACPV,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZjB,EAAIoB,GAAOK,EAGNzB,CACT,CAEA,SAASwrB,IAeP,OAdAA,EAAWtqB,OAAO2J,QAAU,SAAUnK,GACpC,IAAK,IAAIE,EAAI,EAAGA,EAAI0B,UAAUzB,OAAQD,IAAK,CACzC,IAAI2B,EAASD,UAAU1B,GAEvB,IAAK,IAAIQ,KAAOmB,EACVrB,OAAOd,UAAUkK,eAAe5G,KAAKnB,EAAQnB,KAC/CV,EAAOU,GAAOmB,EAAOnB,GAG3B,CAEA,OAAOV,CACT,EAEO8qB,EAASppB,MAAM6X,KAAM3X,UAC9B,CAEA,IAAImpB,EAAe,CAAC3rB,QAAS,CAAC,IAgB9B,SAAWD,GACa,qBAAXoE,QAIX,SAAWA,GAET,IAAIynB,EAAkBznB,EAAOuf,mBAAqBvf,EAAOuf,kBAAkBpjB,UAEvEurB,EAAqB1nB,EAAO2nB,MAAQ,WACtC,IACE,OAAOC,QAAQ,IAAID,KAGrB,CAFE,MAAOE,GACP,OAAO,CACT,CACF,CANwC,GAQpCC,EAA4BJ,GAAsB1nB,EAAOsU,YAAc,WACzE,IACE,OAAgD,MAAzC,IAAIqT,KAAK,CAAC,IAAIrT,WAAW,OAAOsR,IAGzC,CAFE,MAAOiC,GACP,OAAO,CACT,CACF,CAN2E,GAQvEE,EAAc/nB,EAAO+nB,aAAe/nB,EAAOgoB,mBAAqBhoB,EAAOioB,gBAAkBjoB,EAAOkoB,cAChGC,EAAiB,0CAEjBC,GAAiBV,GAAsBK,IAAgB/nB,EAAOkU,MAAQlU,EAAOoU,aAAepU,EAAOsU,YAAc,SAAU+T,GAC7H,IAAIC,EAASC,EAAWC,EAAUC,EAAYC,EAAYvU,EAAawU,EAAUhsB,EAAGisB,EAIpF,KAFAN,EAAUD,EAAQrc,MAAMmc,IAGtB,MAAM,IAAIrH,MAAM,oBAoBlB,IAhBAyH,EAAYD,EAAQ,GAAKA,EAAQ,GAAK,cAAgBA,EAAQ,IAAM,qBACpEE,IAAaF,EAAQ,GACrBG,EAAaJ,EAAQ3oB,MAAM4oB,EAAQ,GAAG1rB,QAIpC8rB,EAFEF,EAEWtU,KAAKuU,GAGLI,mBAAmBJ,GAIlCtU,EAAc,IAAIC,YAAYsU,EAAW9rB,QACzC+rB,EAAW,IAAIrU,WAAWH,GAErBxX,EAAI,EAAGA,EAAI+rB,EAAW9rB,OAAQD,GAAK,EACtCgsB,EAAShsB,GAAK+rB,EAAWnU,WAAW5X,GAItC,OAAI+qB,EACK,IAAIC,KAAK,CAACG,EAA4Ba,EAAWxU,GAAc,CACpEnK,KAAMue,MAIVK,EAAK,IAAIb,GACNe,OAAO3U,GACHyU,EAAGG,QAAQR,GACpB,EAEIvoB,EAAOuf,oBAAsBkI,EAAgBuB,SAC3CvB,EAAgBwB,aAClBxB,EAAgBuB,OAAS,SAAUriB,EAAUqD,EAAMwa,GACjD,IAAI0E,EAAOlT,KACXgG,YAAW,WACLwI,GAAWiD,EAAgBvG,WAAakH,EAC1CzhB,EAASyhB,EAAcc,EAAKhI,UAAUlX,EAAMwa,KAE5C7d,EAASuiB,EAAKD,aAAa,OAAQjf,GAEvC,GACF,EACSyd,EAAgBvG,WAAakH,IAClCX,EAAgB0B,SAClB1B,EAAgBuB,OAAS,SAAUriB,EAAUqD,EAAMwa,GACjD,IAAI0E,EAAOlT,KACXgG,YAAW,YACJhS,GAAiB,cAATA,GAAwBwa,IAAYiD,EAAgBvG,WAAakH,EAC5EzhB,EAASyhB,EAAcc,EAAKhI,UAAUlX,EAAMwa,KAE5C7d,EAASuiB,EAAKC,SAASnf,GAE3B,GACF,EAEAyd,EAAgBuB,OAAS,SAAUriB,EAAUqD,EAAMwa,GACjD,IAAI0E,EAAOlT,KACXgG,YAAW,WACTrV,EAASyhB,EAAcc,EAAKhI,UAAUlX,EAAMwa,IAC9C,GACF,IAKF5oB,EAAOC,QACTD,EAAOC,QAAUusB,EAEjBpoB,EAAOooB,cAAgBA,CAE1B,CAzGD,CAyGGpoB,OACJ,CA/GD,CA+GGwnB,GAEH,IAAIwB,EAASxB,EAAa3rB,QAUtBuH,EAAW,CAMbgmB,QAAQ,EAORrlB,kBAAkB,EAMlB0N,SAAUvL,IAMVyL,UAAWzL,IAMX2L,SAAU,EAMVE,UAAW,EAOXzC,WAAOlI,EAOPiI,YAAQjI,EAOR+T,OAAQ,OASRqJ,QAAS,GAOT/P,SAAU,OAOV4U,aAAc,CAAC,aAOfC,YAAa,IAYbC,WAAY,KAYZC,KAAM,KAWNtE,QAAS,KAWT1e,MAAO,MAILtG,EAD+B,qBAAXF,QAAqD,qBAApBA,OAAOC,SACtCD,OAAS,CAAC,EAQhCiG,EAAmB,SAA0BzI,GAC/C,OAAOA,EAAQ,GAAKA,EAAQ0I,GAC9B,EACIxG,EAAQV,MAAM7C,UAAUuD,MAU5B,IAAI+pB,EAAoB,cAOxB,SAASC,EAAYlsB,GACnB,OAAOisB,EAAkB7pB,KAAKpC,EAChC,CAgBA,IAAI8V,EAAeC,OAAOD,aAoB1B,IAAIuB,EAAO3U,EAAO2U,KA4BlB,SAASC,EAAuBX,GAC9B,IACIY,EADAtB,EAAW,IAAIuB,SAASb,GAG5B,IACE,IAAIc,EACAC,EACAC,EAEJ,GAA6B,MAAzB1B,EAASG,SAAS,IAAwC,MAAzBH,EAASG,SAAS,GAIrD,IAHA,IAAIhX,EAAS6W,EAAS2B,WAClBC,EAAS,EAENA,EAAS,EAAIzY,GAAQ,CAC1B,GAAkC,MAA9B6W,EAASG,SAASyB,IAAsD,MAAlC5B,EAASG,SAASyB,EAAS,GAAa,CAChFH,EAAYG,EACZ,KACF,CAEAA,GAAU,CACZ,CAGF,GAAIH,EAAW,CACb,IACII,EAAaJ,EAAY,GAE7B,GAAuD,SAlE7D,SAA+BzB,EAAUC,EAAO9W,GAC9C,IACID,EADAgX,EAAM,GAIV,IAFA/W,GAAU8W,EAEL/W,EAAI+W,EAAO/W,EAAIC,EAAQD,GAAK,EAC/BgX,GAAOL,EAAaG,EAASG,SAASjX,IAGxC,OAAOgX,CACT,CAwDUH,CAAsBC,EAHTyB,EAAY,EAGmB,GAAe,CAC7D,IAAIK,EAAa9B,EAAS+B,UAAUF,GAGpC,KAFAL,EAA8B,QAAfM,IAEoB,QAAfA,IAGuC,KAArD9B,EAAS+B,UAAUF,EAAa,EAAGL,GAA0B,CAC/D,IAAIQ,EAAiBhC,EAASiC,UAAUJ,EAAa,EAAGL,GAEpDQ,GAAkB,IACpBN,EAAWG,EAAaG,EAE5B,CAEJ,CACF,CAEA,GAAIN,EAAU,CACZ,IAEIQ,EAEAhZ,EAJAiZ,EAAUnC,EAAS+B,UAAUL,EAAUF,GAM3C,IAAKtY,EAAI,EAAGA,EAAIiZ,EAASjZ,GAAK,EAG5B,GAFAgZ,EAAUR,EAAe,GAAJxY,EAAS,EAEoB,MAA9C8W,EAAS+B,UAAUG,EAASV,GAE9B,CAEAU,GAAW,EAEXZ,EAActB,EAAS+B,UAAUG,EAASV,GAE1CxB,EAASoC,UAAUF,EAAS,EAAGV,GAC/B,KACF,CAEJ,CAGF,CAFE,MAAO4S,GACP9S,EAAc,CAChB,CAEA,OAAOA,CACT,CAyDA,IAAI9N,EAAkB,uBAStB,SAASC,EAAuB1J,GAC9B,IAAI2J,EAAQ9I,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,KAChF,OAAO4I,EAAgBrH,KAAKpC,GAAS6J,KAAKC,MAAM9J,EAAQ2J,GAASA,EAAQ3J,CAC3E,CAQA,SAAS2R,EAAiB1C,GACxB,IAAIhJ,EAAcgJ,EAAKhJ,YACnB4L,EAAS5C,EAAK4C,OACdC,EAAQ7C,EAAK6C,MACbtF,EAAO3L,UAAUzB,OAAS,QAAsBwK,IAAjB/I,UAAU,GAAmBA,UAAU,GAAK,OAC3EkR,EAAetJ,EAAiBqJ,GAChCE,EAAgBvJ,EAAiBoJ,GAErC,GAAIE,GAAgBC,EAAe,CACjC,IAAIC,EAAgBJ,EAAS5L,GAEf,YAATuG,GAA+B,SAATA,IAAoByF,EAAgBH,GAAkB,UAATtF,GAAoByF,EAAgBH,EAC1GD,EAASC,EAAQ7L,EAEjB6L,EAAQD,EAAS5L,CAErB,MAAW8L,EACTF,EAASC,EAAQ7L,EACR+L,IACTF,EAAQD,EAAS5L,GAGnB,MAAO,CACL6L,MAAOA,EACPD,OAAQA,EAEZ,CAEA,IAAIsa,EAAgBzpB,EAAOkU,YACvBwV,EAAa1pB,EAAO0pB,WACpBC,EAAM3pB,EAAO2pB,KAAO3pB,EAAO4pB,UAC3BC,EAAmB,SACnBC,EAAoB9pB,EAAOgkB,WAM3BA,EAA0B,WAM5B,SAASA,EAAWwB,EAAMhc,IA5mB5B,SAAyBrN,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,oCAExB,CAymBIH,CAAgB4Z,KAAMkO,GAEtBlO,KAAK0P,KAAOA,EACZ1P,KAAK1F,MAAQ,IAAI2Z,MACjBjU,KAAKtM,QAAUtL,EAAeA,EAAe,CAAC,EAAGgF,GAAWsG,GAC5DsM,KAAKkU,SAAU,EACflU,KAAKmU,OAAS,KACdnU,KAAKiL,MACP,CArmBF,IAAsB3kB,EAAae,EAAYC,EA2+B7C,OA3+BoBhB,EAumBP4nB,EAvmBgC5mB,EAy9BzC,CAAC,CACHH,IAAK,aACLK,MAAO,WAEL,OADAwC,OAAOkkB,WAAa8F,EACb9F,CACT,GAMC,CACD/mB,IAAK,cACLK,MAAO,SAAqBkM,GAC1B6d,EAASnkB,EAAUsG,EACrB,KAx+B+BrM,EAumBR,CAAC,CACxBF,IAAK,OACLK,MAAO,WACL,IAAIoe,EAAQ5F,KAER0P,EAAO1P,KAAK0P,KACZhc,EAAUsM,KAAKtM,QAEnB,GArcuBlM,EAqcXkoB,EApcI,qBAATiC,OAIJnqB,aAAiBmqB,MAAkD,kBAA1C1qB,OAAOd,UAAUqD,SAASC,KAAKjC,IAgc3D,CArcO,IAAgBA,EA0cnBiX,EAAWiR,EAAK1b,KAEpB,GAAK0f,EAAYjV,GAKjB,GAAKoV,GAAQD,EASb,GAJKD,IACHjgB,EAAQ3F,kBAAmB,GAGzB8lB,IAAQngB,EAAQ3F,iBAClBiS,KAAKgI,KAAK,CACRlS,IAAK+d,EAAIO,gBAAgB1E,SAEtB,CACL,IAAI2E,EAAS,IAAIT,EACb7lB,EAAmB2F,EAAQ3F,kBAAiC,eAAb0Q,EACnDuB,KAAKqU,OAASA,EAEdA,EAAOxI,OAAS,SAAUpV,GACxB,IACI0d,EADS1d,EAAKhQ,OACE0tB,OAChBzmB,EAAO,CAAC,EAEZ,GAAIK,EAAkB,CAGpB,IAAIgR,EAAcD,EAAuBqV,GAErCpV,EAAc,IAAM8U,GAEtBnmB,EAAKoI,IAnRnB,SAA8BqI,EAAaM,GAKzC,IAJA,IAzDejX,EAyDXkX,EAAS,GAETL,EAAQ,IAAIC,WAAWH,GAEpBE,EAAMzX,OAAS,GAGpB8X,EAAOxW,KAAKoV,EAAanV,MAAM,MAhElBX,EAgEgC6W,EAAMO,SAAS,EAN9C,MAzDT5V,MAAMI,KAAOJ,MAAMI,KAAK5B,GAASkC,EAAMD,KAAKjC,MAgEjD6W,EAAQA,EAAMO,SAPA,MAUhB,MAAO,QAAQxT,OAAOqT,EAAU,YAAYrT,OAAOyT,EAAKH,EAAOzH,KAAK,KACtE,CAsQyBuH,CAAqB2V,EAAQ1V,GAEpCM,EAAc,GAChBwS,EAAS7jB,EAlLzB,SAA0BqR,GACxB,IAAIrI,EAAS,EACTC,EAAS,EACTC,EAAS,EAEb,OAAQmI,GAEN,KAAK,EACHpI,GAAU,EACV,MAGF,KAAK,EACHD,GAAU,IACV,MAGF,KAAK,EACHE,GAAU,EACV,MAGF,KAAK,EACHF,EAAS,GACTE,GAAU,EACV,MAGF,KAAK,EACHF,EAAS,GACT,MAGF,KAAK,EACHA,EAAS,GACTC,GAAU,EACV,MAGF,KAAK,EACHD,GAAU,GAId,MAAO,CACLA,OAAQA,EACRC,OAAQA,EACRC,OAAQA,EAEZ,CAiI+BkJ,CAAiBf,KAGlCrR,EAAKoI,IAAM+d,EAAIO,gBAAgB1E,EAEnC,MACEhiB,EAAKoI,IAAMqe,EAGbvO,EAAMoC,KAAKta,EACb,EAEA2mB,EAAO9I,QAAU,WACf3F,EAAM0O,KAAK,IAAIxJ,MAAM,8CACvB,EAEAuJ,EAAO7I,QAAU,WACf5F,EAAM0O,KAAK,IAAIxJ,MAAM,6CACvB,EAEAuJ,EAAOtI,UAAY,WACjBnG,EAAMyO,OAAS,IACjB,EAEItmB,EACFsmB,EAAOE,kBAAkB7E,GAEzB2E,EAAOG,cAAc9E,EAEzB,MA7DE1P,KAAKsU,KAAK,IAAIxJ,MAAM,iEALpB9K,KAAKsU,KAAK,IAAIxJ,MAAM,4DALtB,MAFE9K,KAAKsU,KAAK,IAAIxJ,MAAM,qDA0ExB,GACC,CACD3jB,IAAK,OACLK,MAAO,SAAckG,GACnB,IAAI+e,EAASzM,KAET0P,EAAO1P,KAAK0P,KACZpV,EAAQ0F,KAAK1F,MAEjBA,EAAMuR,OAAS,WACbY,EAAOgI,KAAKrsB,EAAeA,EAAe,CAAC,EAAGsF,GAAO,CAAC,EAAG,CACvDkN,aAAcN,EAAMM,aACpBE,cAAeR,EAAMQ,gBAEzB,EAEAR,EAAMiR,QAAU,WACdkB,EAAO6H,KAAK,IAAIxJ,MAAM,8BACxB,EAEAxQ,EAAMkR,QAAU,WACdiB,EAAO6H,KAAK,IAAIxJ,MAAM,6BACxB,EAII5gB,EAAOyiB,WAAa,sCAAsC/iB,KAAKM,EAAOyiB,UAAUC,aAElFtS,EAAMwI,YAAc,aAGtBxI,EAAM0I,IAAM0M,EAAK/lB,KACjB2Q,EAAM2I,IAAMvV,EAAKoI,GACnB,GACC,CACD3O,IAAK,OACLK,MAAO,SAAcmR,GACnB,IAAI+b,EAAS1U,KAETpF,EAAejC,EAAMiC,aACrBE,EAAgBnC,EAAMmC,cACtB6Z,EAAehc,EAAMjC,OACrBA,OAA0B,IAAjBie,EAA0B,EAAIA,EACvCC,EAAejc,EAAMhC,OACrBA,OAA0B,IAAjBie,EAA0B,EAAIA,EACvCC,EAAelc,EAAM/B,OACrBA,OAA0B,IAAjBie,EAA0B,EAAIA,EACvCnF,EAAO1P,KAAK0P,KACZpV,EAAQ0F,KAAK1F,MACb5G,EAAUsM,KAAKtM,QACfsI,EAAS/R,SAASgS,cAAc,UAChCC,EAAUF,EAAOG,WAAW,MAC5B2Y,EAAqBzjB,KAAKuG,IAAIlB,GAAU,MAAQ,GAChDqe,GAAgC,YAAnBrhB,EAAQyR,QAA2C,UAAnBzR,EAAQyR,SAAuBlV,EAAiByD,EAAQ4F,QAAUrJ,EAAiByD,EAAQ2F,QACxIoC,EAAWpK,KAAKkL,IAAI7I,EAAQ+H,SAAU,IAAMvL,IAC5CyL,EAAYtK,KAAKkL,IAAI7I,EAAQiI,UAAW,IAAMzL,IAC9C2L,EAAWxK,KAAKkL,IAAI7I,EAAQmI,SAAU,IAAM,EAC5CE,EAAY1K,KAAKkL,IAAI7I,EAAQqI,UAAW,IAAM,EAC9CtO,EAAcmN,EAAeE,EAC7BxB,EAAQ5F,EAAQ4F,MAChBD,EAAS3F,EAAQ2F,OAErB,GAAIyb,EAAoB,CACtB,IAAI5b,EAAQ,CAACyC,EAAWF,GACxBA,EAAWvC,EAAM,GACjByC,EAAYzC,EAAM,GAClB,IAAIE,EAAQ,CAAC2C,EAAWF,GACxBA,EAAWzC,EAAM,GACjB2C,EAAY3C,EAAM,GAClB,IAAIO,EAAQ,CAACN,EAAQC,GACrBA,EAAQK,EAAM,GACdN,EAASM,EAAM,EACjB,CAEIob,IACFtnB,EAAc6L,EAAQD,GAGxB,IAAIqI,EAAoBvI,EAAiB,CACvC1L,YAAaA,EACb6L,MAAOmC,EACPpC,OAAQsC,GACP,WAEHF,EAAWiG,EAAkBpI,MAC7BqC,EAAY+F,EAAkBrI,OAE9B,IAAI2b,EAAqB7b,EAAiB,CACxC1L,YAAaA,EACb6L,MAAOuC,EACPxC,OAAQ0C,GACP,SAKH,GAHAF,EAAWmZ,EAAmB1b,MAC9ByC,EAAYiZ,EAAmB3b,OAE3B0b,EAAW,CACb,IAAIE,EAAqB9b,EAAiB,CACxC1L,YAAaA,EACb6L,MAAOA,EACPD,OAAQA,GACP3F,EAAQyR,QAEX7L,EAAQ2b,EAAmB3b,MAC3BD,EAAS4b,EAAmB5b,MAC9B,KAAO,CACL,IAAI6b,EAAqB/b,EAAiB,CACxC1L,YAAaA,EACb6L,MAAOA,EACPD,OAAQA,IAGN8b,EAAwBD,EAAmB5b,MAC/CA,OAAkC,IAA1B6b,EAAmCva,EAAeua,EAC1D,IAAIC,EAAwBF,EAAmB7b,OAC/CA,OAAmC,IAA1B+b,EAAmCta,EAAgBsa,CAC9D,CAIA,IAAIC,IAFJ/b,EAAQjI,KAAKgM,MAAMnM,EAAuBG,KAAKiL,IAAIjL,KAAKkL,IAAIjD,EAAOuC,GAAWJ,MAEzD,EACjB6Z,IAFJjc,EAAShI,KAAKgM,MAAMnM,EAAuBG,KAAKiL,IAAIjL,KAAKkL,IAAIlD,EAAQ0C,GAAYJ,MAE3D,EAClBe,EAAYpD,EACZqD,EAAatD,EACbuD,EAAS,GAEb,GAAImY,EAAW,CACb,IAAIzK,EACAC,EACAT,EACAC,EAEAwL,EAAqBpc,EAAiB,CACxC1L,YAAaA,EACb6L,MAAOsB,EACPvB,OAAQyB,GACP,CACD0a,QAAS,QACTC,MAAO,WACP/hB,EAAQyR,SAEV2E,EAAWyL,EAAmBjc,MAC9ByQ,EAAYwL,EAAmBlc,OAC/BiR,GAAQ1P,EAAekP,GAAY,EACnCS,GAAQzP,EAAgBiP,GAAa,EACrCnN,EAAO1U,KAAKoiB,EAAMC,EAAMT,EAAUC,EACpC,CAIA,GAFAnN,EAAO1U,KAAKmtB,EAAOC,EAAO5Y,EAAWC,GAEjCmY,EAAoB,CACtB,IAAIva,EAAQ,CAAClB,EAAQC,GACrBA,EAAQiB,EAAM,GACdlB,EAASkB,EAAM,EACjB,CAEAyB,EAAO1C,MAAQA,EACf0C,EAAO3C,OAASA,EAEXqa,EAAYhgB,EAAQ+K,YACvB/K,EAAQ+K,SAAWiR,EAAK1b,MAG1B,IAAI6I,EAAY,cAkBhB,GAhBI6S,EAAKE,KAAOlc,EAAQ4f,aAAe5f,EAAQ2f,aAAaphB,QAAQyB,EAAQ+K,WAAa,IACvF/K,EAAQ+K,SAAW,cAGI,eAArB/K,EAAQ+K,WACV5B,EAAY,QAIdX,EAAQW,UAAYA,EACpBX,EAAQY,SAAS,EAAG,EAAGxD,EAAOD,GAE1B3F,EAAQ6f,YACV7f,EAAQ6f,WAAW9pB,KAAKuW,KAAM9D,EAASF,IAGrCgE,KAAKkU,UAIThY,EAAQa,OACRb,EAAQc,UAAU1D,EAAQ,EAAGD,EAAS,GACtC6C,EAAQxF,OAAOA,EAASrF,KAAKyI,GAAK,KAClCoC,EAAQe,MAAMtG,EAAQC,GACtBsF,EAAQgB,UAAU/U,MAAM+T,EAAS,CAAC5B,GAAOlP,OAAOwR,IAChDV,EAAQrO,UAEJ6F,EAAQ8f,MACV9f,EAAQ8f,KAAK/pB,KAAKuW,KAAM9D,EAASF,IAG/BgE,KAAKkU,SAAT,CAIA,IAAIrH,EAAO,SAAcsH,GAClBO,EAAOR,SACVQ,EAAO7H,KAAK,CACVjS,aAAcA,EACdE,cAAeA,EACfqZ,OAAQA,GAGd,EAEInY,EAAOgX,OACThX,EAAOgX,OAAOnG,EAAMnZ,EAAQ+K,SAAU/K,EAAQ8a,SAE9C3B,EAAKmG,EAAOhX,EAAOkP,UAAUxX,EAAQ+K,SAAU/K,EAAQ8a,UAfzD,CAiBF,GACC,CACDrnB,IAAK,OACLK,MAAO,SAAcgT,GACnB,IApjBwBhT,EACxBsoB,EAmjBIlV,EAAeJ,EAAMI,aACrBE,EAAgBN,EAAMM,cACtBqZ,EAAS3Z,EAAM2Z,OACfzE,EAAO1P,KAAK0P,KACZpV,EAAQ0F,KAAK1F,MACb5G,EAAUsM,KAAKtM,QAMnB,GAJImgB,IAAQngB,EAAQ3F,kBAClB8lB,EAAI6B,gBAAgBpb,EAAM2I,KAGxBkR,EAEF,GAAIzgB,EAAQ0f,QAAUe,EAAOvE,KAAOF,EAAKE,MAAQlc,EAAQ+K,WAAaiR,EAAK1b,QAAUN,EAAQ4F,MAAQsB,GAAgBlH,EAAQ2F,OAASyB,GAAiBpH,EAAQmI,SAAWjB,GAAgBlH,EAAQqI,UAAYjB,GAAiBpH,EAAQ+H,SAAWb,GAAgBlH,EAAQiI,UAAYb,GACpRqZ,EAASzE,MACJ,CACL,IAAIiG,EAAO,IAAIrf,KACf6d,EAAOyB,aAAeD,EAAKpf,UAC3B4d,EAAO0B,iBAAmBF,EAC1BxB,EAAOxqB,KAAO+lB,EAAK/lB,KAEfwqB,EAAOxqB,MAAQwqB,EAAOngB,OAAS0b,EAAK1b,OACtCmgB,EAAOxqB,KAAOwqB,EAAOxqB,KAAK6I,QAAQuhB,GA1kBhBvsB,EA0kBuD2sB,EAAOngB,KAvkBxE,UAFd8b,EAAY4D,EAAYlsB,GAASA,EAAMsuB,OAAO,GAAK,MAGrDhG,EAAY,OAGP,IAAI1kB,OAAO0kB,KAqkBZ,MAGAqE,EAASzE,EAGX1P,KAAKmU,OAASA,EAEVzgB,EAAQwb,SACVxb,EAAQwb,QAAQzlB,KAAKuW,KAAMmU,EAE/B,GACC,CACDhtB,IAAK,OACLK,MAAO,SAAcyoB,GACnB,IAAIvc,EAAUsM,KAAKtM,QAEnB,IAAIA,EAAQlD,MAGV,MAAMyf,EAFNvc,EAAQlD,MAAM/G,KAAKuW,KAAMiQ,EAI7B,GACC,CACD9oB,IAAK,QACLK,MAAO,WACAwY,KAAKkU,UACRlU,KAAKkU,SAAU,EAEXlU,KAAKqU,OACPrU,KAAKqU,OAAOzI,QACF5L,KAAK1F,MAAMyb,SAIrB/V,KAAKsU,KAAK,IAAIxJ,MAAM,+CAHpB9K,KAAK1F,MAAMuR,OAAS,KACpB7L,KAAK1F,MAAMiR,WAKjB,MAl9Bc/kB,EAAkBF,EAAYH,UAAWkB,GACrDC,GAAad,EAAkBF,EAAagB,GAy+BzC4mB,CACT,CAtZ8B,GAwZ9BtoB,EAAOC,QAAUqoB,C,mCC9iCjBtoB,EAAOC,QAAU,CACfmwB,QAAS,CAEPC,kBAAmB,wBACnBC,YAAa,uC,mCCJjBtwB,EAAOC,QAAU,EAAQ,I,mCCAzB,IAAIynB,EAAQ,EAAQ,KAEhB6I,EAAU,EAAQ,KAEtB,MAAMC,EAAS,EAAQ,KAMjBpI,EAAS,EAAQ,KAEvB,MAAMqI,UAAoB/I,EAAMgJ,SAC9BpwB,YAAYkoB,EAAMC,GAChBC,MAAMF,EAAMC,GAEZrO,KAAKjD,KAAO,KACV,MAiBM,aACJwZ,GACEvW,KAAKwW,iBACTxW,KAAKQ,QAAQ8I,iBAAiBtJ,KAAKqO,KAAKoI,eAAeC,sBAAsB1D,QApBpDlE,IACvB,MAAM,aACJyH,GACEvW,KAAKwW,iBACTxW,KAAKoO,KAAK2B,aAAawG,EAAa5I,GAAI,CACtCjgB,KAAMohB,EACNc,KAAMd,EAAKc,KACXjiB,QAAS,OAEX,MAAMgpB,EAAc3W,KAAKoO,KAAKgC,QAAQmG,EAAa5I,IACnD3N,KAAKoO,KAAKiC,KAAK,oBAAqBsG,GACpC3W,KAAK4W,eAAe,CAClBL,aAAcI,IAEhB3W,KAAKoO,KAAKiC,KAAK,uBAAwBsG,EAAY,GAMiDJ,EAAaviB,KAAMgM,KAAKqO,KAAKG,QAAQ,EAG7IxO,KAAK6W,qBAAuBrW,IAC1BR,KAAKQ,QAAUA,CAAO,EAGxBR,KAAK8W,WAAapH,IAChB1P,KAAKoO,KAAKiC,KAAK,oBAAqBX,GACpC1P,KAAK4W,eAAe,CAClBL,aAAc7G,GACd,EAGJ1P,KAAK2N,GAAK3N,KAAKqO,KAAKV,IAAM,cAC1B3N,KAAK+W,MAAQ,eACb/W,KAAKhM,KAAO,SACZgM,KAAKuO,cAAgBP,EAsBrBhO,KAAKqO,KAAO,CAFVG,QAAS,MAGNH,EACH2I,QAAS,CAfTC,QAAQ,EACRvgB,QAAQ,EACRwgB,gBAAgB,EAChBC,MAAM,EACNC,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,wBAAwB,KAQnBnJ,EAAK2I,SAEVP,eAAgB,CAzBhBppB,SAAU,EACVe,YAAY,EACZE,aAAc,EACdV,YAAY,EACZ8oB,qBAAsB,CAAC,KAsBlBrI,EAAKoI,iBAGZzW,KAAK2O,UACP,CAGA8I,YAAY/H,GACV,IAAKA,EAAK1b,MAAQ0b,EAAKc,SACrB,OAAO,EAGT,MAAMkH,EAAmBhI,EAAK1b,KAAKE,MAAM,KAAK,GAE9C,QAAI,6BAA6BtK,KAAK8tB,EAKxC,CAEA9G,UACE5Q,KAAK4W,eAAe,CAClBL,aAAc,OAEhB,MAAM,OACJ9vB,GACEuZ,KAAKqO,KAEL5nB,GACFuZ,KAAK2X,MAAMlxB,EAAQuZ,KAEvB,CAEA8Q,YACE,MAAM,aACJyF,GACEvW,KAAKwW,iBAET,GAAID,EAAc,CAChB,MAAM7G,EAAO1P,KAAKoO,KAAKgC,QAAQmG,EAAa5I,IAC5C3N,KAAKoO,KAAKiC,KAAK,qBAAsBX,EACvC,CAEA1P,KAAK4X,SACP,CAEA7X,SACE,MAAM,aACJwW,GACEvW,KAAKwW,iBAET,OAAqB,OAAjBD,GAAyBA,EAAa/F,SACjC,MAGF,EAAI2F,EAAQ0B,GAAGzB,EAAQ,CAC5BG,aAAcA,EACdM,qBAAsB7W,KAAK6W,qBAC3B9Z,KAAMiD,KAAKjD,KACXsR,KAAMrO,KAAKqO,KACXkC,KAAMvQ,KAAKuQ,MAEf,EAIF8F,EAAYyB,QA9IC,QA+IblyB,EAAOC,QAAUwwB,C,mCCtJjB,IAAIF,EAAU,EAAQ,KAEtB,MAAMvL,EAAU,EAAQ,KAAamN,SAAW,EAAQ,KAExD,MAAM3B,UAAeD,EAAQ6B,UAC3B9xB,YAAYQ,GACV4nB,MAAM5nB,GAENsZ,KAAKiY,uBAAyBC,IAC5B,MAAM,cACJC,EAAa,cACbC,GACEpY,KAAKqY,MACHC,EAAuBvoB,OAAOmoB,EAAGzxB,OAAOe,OAAS4wB,EAGvD,GAFAG,qBAAqBvY,KAAKwY,gCAEG,IAAzBF,EAA4B,CAC9B,MAAMG,EAAuBN,EAAgBG,EAC7CtY,KAAKwY,+BAAiCE,uBAAsB,KAC1D1Y,KAAKQ,QAAQqI,SAAS4P,EAAqB,GAE/C,GAGFzY,KAAKqY,MAAQ,CACXF,cAAe,EACfC,cAAe,EAEnB,CAEAO,oBACE,MAAM,KACJtK,EAAI,qBACJwI,GACE7W,KAAKtZ,MACTsZ,KAAKQ,QAAU,IAAIoK,EAAQ5K,KAAK4Y,WAAYvK,EAAKoI,gBACjDI,EAAqB7W,KAAKQ,SAEtB6N,EAAK2I,QAAQE,gBACflX,KAAK4Y,WAAW/kB,iBAAiB,QAAQqkB,IACvC,MAAMC,EAAgBD,EAAGrjB,OAAO6B,OAChCsJ,KAAK6Y,SAAS,CACZV,gBAEAC,eAAgBD,EAAgB,KAAO,GAAK,IAC5C,GAGR,CAEAW,uBACE9Y,KAAKQ,QAAQ2H,SACf,CAEA4Q,uBACE,MAAM,KACJxI,GACEvQ,KAAKtZ,OACH,cACJ0xB,EAAa,cACbD,GACEnY,KAAKqY,MACT,OACE,EAAIlC,EAAQ0B,GAAG,QAAS,CACtB,yBAA0B,MAC1BmB,KAAM,UACN,aAAc,GAAGb,QACjBnmB,UAAW,gDACV,EAAImkB,EAAQ0B,GAAG,QAAS,CACzB7lB,UAAW,uCACXgC,KAAM,QACNilB,QAASjZ,KAAKiY,uBACdiB,SAAUlZ,KAAKiY,uBACfzwB,MAAO4wB,EACP9b,IAAK,MACLC,IAAK,KACL,aAAcgU,EAAK,YAGzB,CAEA4I,eACE,MAAM,KACJ5I,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,UACnB,yBAA0B,MAC1B6I,QAAS,KACPpZ,KAAKQ,QAAQkH,QACb1H,KAAKQ,QAAQgK,eAAe,EAAE,IAE/B,EAAI2L,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,gBACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,sOAEP,CAEAE,eACE,MAAM,KACJhJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACXonB,QAAS,IAAMpZ,KAAKQ,QAAQ9J,QAAQ,IACpC,aAAc6Z,EAAK,UACnB,yBAA0B,QACzB,EAAI4F,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,iCACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,+XAEP,CAEAG,aACE,MAAM,KACJjJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,kBACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQ7J,QAAQqJ,KAAKQ,QAAQ1N,UAAU6D,SAAW,KACrE,EAAIwf,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,gBACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,2MAEP,CAEAI,eACE,MAAM,KACJlJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,UACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQ5Q,KAAK,MAChC,EAAIumB,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXqH,OAAQ,KACR6J,QAAS,YACT5J,MAAO,OACN,EAAI6c,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,kBACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,gPACD,EAAIlD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,uCAEP,CAEAK,gBACE,MAAM,KACJnJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,WACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQ5Q,MAAM,MACjC,EAAIumB,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,kBACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,2PAEP,CAEAM,mBACE,MAAM,KACJpJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,qBACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQgK,eAAe,KAC1C,EAAI2L,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,gBACHC,KAAM,UACJ,EAAInD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,gGAEP,CAEAO,uBACE,MAAM,KACJrJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,wBACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQgK,eAAe,GAAK,KAC/C,EAAI2L,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,2OACD,EAAIlD,EAAQ0B,GAAG,OAAQ,CACzByB,KAAM,OACND,EAAG,mBAEP,CAEAQ,+BACE,MAAM,KACJtJ,GACEvQ,KAAKtZ,MACT,OAAO,EAAIyvB,EAAQ0B,GAAG,SAAU,CAC9B7jB,KAAM,SACNhC,UAAW,0BACX,aAAcue,EAAK,uBACnB,yBAA0B,MAC1B6I,QAAS,IAAMpZ,KAAKQ,QAAQgK,eAAe,EAAI,MAC9C,EAAI2L,EAAQ0B,GAAG,MAAO,CACvB,cAAe,OACf7lB,UAAW,cACXsH,MAAO,KACPD,OAAQ,KACR6J,QAAS,cACR,EAAIiT,EAAQ0B,GAAG,OAAQ,CACxBwB,EAAG,4MACD,EAAIlD,EAAQ0B,GAAG,OAAQ,CACzBwB,EAAG,gBACHC,KAAM,UAEV,CAEAvZ,SACE,MAAM,aACJwW,EAAY,KACZlI,GACErO,KAAKtZ,OACH,QACJswB,GACE3I,EACEyL,EAAWjG,IAAIO,gBAAgBmC,EAAa7oB,MAClD,OAAO,EAAIyoB,EAAQ0B,GAAG,MAAO,CAC3B7lB,UAAW,sBACV,EAAImkB,EAAQ0B,GAAG,MAAO,CACvB7lB,UAAW,gCACV,EAAImkB,EAAQ0B,GAAG,MAAO,CACvB7lB,UAAW,0BACXgR,IAAKuT,EAAa5sB,KAClBsZ,IAAK6W,EACLC,IAAKA,IACH/Z,KAAK4Y,WAAamB,CAAG,MAEpB,EAAI5D,EAAQ0B,GAAG,MAAO,CACzB7lB,UAAW,8BACVglB,EAAQC,QAAUjX,KAAKmZ,eAAgBnC,EAAQtgB,QAAUsJ,KAAKuZ,eAAgBvC,EAAQE,gBAAkBlX,KAAK+Y,uBAAwB/B,EAAQG,MAAQnX,KAAKwZ,aAAcxC,EAAQI,QAAUpX,KAAKyZ,eAAgBzC,EAAQK,SAAWrX,KAAK0Z,gBAAiB1C,EAAQM,YAActX,KAAK2Z,mBAAoB3C,EAAQO,gBAAkBvX,KAAK4Z,uBAAwB5C,EAAQQ,wBAA0BxX,KAAK6Z,gCAC1Y,EAIFj0B,EAAOC,QAAUuwB,C,mCCjTjBxwB,EAAOC,QAAU,CACfmwB,QAAS,CACPiB,OAAQ,SACRvgB,OAAQ,SACR0gB,OAAQ,UACRC,QAAS,WACT2C,eAAgB,kBAChBC,kBAAmB,cACnBC,qBAAsB,wBACtBC,oBAAqB,wB","file":"js/3-3a05e640287a25048d43.chunk.js","sourcesContent":["/*!\n * Cropper.js v1.5.7\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2020-05-23T05:23:00.081Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.Cropper = factory());\n}(this, (function () { 'use strict';\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n\n    if (Object.getOwnPropertySymbols) {\n      var symbols = Object.getOwnPropertySymbols(object);\n      if (enumerableOnly) symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n      keys.push.apply(keys, symbols);\n    }\n\n    return keys;\n  }\n\n  function _objectSpread2(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n\n      if (i % 2) {\n        ownKeys(Object(source), true).forEach(function (key) {\n          _defineProperty(target, key, source[key]);\n        });\n      } else if (Object.getOwnPropertyDescriptors) {\n        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n      } else {\n        ownKeys(Object(source)).forEach(function (key) {\n          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n      }\n    }\n\n    return target;\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n  }\n\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n    return arr2;\n  }\n\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'cropper'; // Actions\n\n  var ACTION_ALL = 'all';\n  var ACTION_CROP = 'crop';\n  var ACTION_MOVE = 'move';\n  var ACTION_ZOOM = 'zoom';\n  var ACTION_EAST = 'e';\n  var ACTION_WEST = 'w';\n  var ACTION_SOUTH = 's';\n  var ACTION_NORTH = 'n';\n  var ACTION_NORTH_EAST = 'ne';\n  var ACTION_NORTH_WEST = 'nw';\n  var ACTION_SOUTH_EAST = 'se';\n  var ACTION_SOUTH_WEST = 'sw'; // Classes\n\n  var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n  var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n  var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\"); // Data keys\n\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n  var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\"); // Drag modes\n\n  var DRAG_MODE_CROP = 'crop';\n  var DRAG_MODE_MOVE = 'move';\n  var DRAG_MODE_NONE = 'none'; // Events\n\n  var EVENT_CROP = 'crop';\n  var EVENT_CROP_END = 'cropend';\n  var EVENT_CROP_MOVE = 'cropmove';\n  var EVENT_CROP_START = 'cropstart';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_READY = 'ready';\n  var EVENT_RESIZE = 'resize';\n  var EVENT_WHEEL = 'wheel';\n  var EVENT_ZOOM = 'zoom'; // Mime types\n\n  var MIME_TYPE_JPEG = 'image/jpeg'; // RegExps\n\n  var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n  var REGEXP_DATA_URL = /^data:/;\n  var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n  var REGEXP_TAG_NAME = /^img|canvas$/i; // Misc\n\n  var DEFAULTS = {\n    // Define the view mode of the cropper\n    viewMode: 0,\n    // 0, 1, 2, 3\n    // Define the dragging mode of the cropper\n    dragMode: DRAG_MODE_CROP,\n    // 'crop', 'move' or 'none'\n    // Define the initial aspect ratio of the crop box\n    initialAspectRatio: NaN,\n    // Define the aspect ratio of the crop box\n    aspectRatio: NaN,\n    // An object with the previous cropping result data\n    data: null,\n    // A selector for adding extra containers to preview\n    preview: '',\n    // Re-render the cropper when resize the window\n    responsive: true,\n    // Restore the cropped area after resize the window\n    restore: true,\n    // Check if the current image is a cross-origin image\n    checkCrossOrigin: true,\n    // Check the current image's Exif Orientation information\n    checkOrientation: true,\n    // Show the black modal\n    modal: true,\n    // Show the dashed lines for guiding\n    guides: true,\n    // Show the center indicator for guiding\n    center: true,\n    // Show the white modal to highlight the crop box\n    highlight: true,\n    // Show the grid background\n    background: true,\n    // Enable to crop the image automatically when initialize\n    autoCrop: true,\n    // Define the percentage of automatic cropping area when initializes\n    autoCropArea: 0.8,\n    // Enable to move the image\n    movable: true,\n    // Enable to rotate the image\n    rotatable: true,\n    // Enable to scale the image\n    scalable: true,\n    // Enable to zoom the image\n    zoomable: true,\n    // Enable to zoom the image by dragging touch\n    zoomOnTouch: true,\n    // Enable to zoom the image by wheeling mouse\n    zoomOnWheel: true,\n    // Define zoom ratio when zoom the image by wheeling mouse\n    wheelZoomRatio: 0.1,\n    // Enable to move the crop box\n    cropBoxMovable: true,\n    // Enable to resize the crop box\n    cropBoxResizable: true,\n    // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n    toggleDragModeOnDblclick: true,\n    // Size limitation\n    minCanvasWidth: 0,\n    minCanvasHeight: 0,\n    minCropBoxWidth: 0,\n    minCropBoxHeight: 0,\n    minContainerWidth: 200,\n    minContainerHeight: 100,\n    // Shortcuts of events\n    ready: null,\n    cropstart: null,\n    cropmove: null,\n    cropend: null,\n    crop: null,\n    zoom: null\n  };\n\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n  /**\n   * Check if the given value is not a number.\n   */\n\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n  /**\n   * Check if the given value is a positive number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n   */\n\n  var isPositiveNumber = function isPositiveNumber(value) {\n    return value > 0 && value < Infinity;\n  };\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  var slice = Array.prototype.slice;\n  /**\n   * Convert array-like or iterable object to an array.\n   * @param {*} value - The value to convert.\n   * @returns {Array} Returns a new array.\n   */\n\n  function toArray(value) {\n    return Array.from ? Array.from(value) : slice.call(value);\n  }\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length)\n      /* array-like */\n      ) {\n          toArray(data).forEach(function (value, key) {\n            callback.call(data, value, key, data);\n          });\n        } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n\n    return data;\n  }\n  /**\n   * Extend the given object.\n   * @param {*} target - The target object to extend.\n   * @param {*} args - The rest objects for merging to the target object.\n   * @returns {Object} The extended object.\n   */\n\n  var assign = Object.assign || function assign(target) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    if (isObject(target) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            target[key] = arg[key];\n          });\n        }\n      });\n    }\n\n    return target;\n  };\n  var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n  /**\n   * Normalize decimal number.\n   * Check out {@link https://0.30000000000000004.com/}\n   * @param {number} value - The value to normalize.\n   * @param {number} [times=100000000000] - The times for normalizing.\n   * @returns {number} Returns the normalized number.\n   */\n\n  function normalizeDecimalNumber(value) {\n    var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n    return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n  }\n  var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value = \"\".concat(value, \"px\");\n      }\n\n      style[property] = value;\n    });\n  }\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n\n  function hasClass(element, value) {\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n\n  function addClass(element, value) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n\n    var className = element.className.trim();\n\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n\n  function removeClass(element, value) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    } // IE10-11 doesn't support the second parameter of `classList.toggle`\n\n\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n\n  function toParamCase(value) {\n    return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n  }\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n\n    return element.getAttribute(\"data-\".concat(toParamCase(name)));\n  }\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n    }\n  }\n  /**\n   * Remove data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to remove.\n   */\n\n  function removeData(element, name) {\n    if (isObject(element[name])) {\n      try {\n        delete element[name];\n      } catch (error) {\n        element[name] = undefined;\n      }\n    } else if (element.dataset) {\n      // #128 Safari not allows to delete dataset property\n      try {\n        delete element.dataset[name];\n      } catch (error) {\n        element.dataset[name] = undefined;\n      }\n    } else {\n      element.removeAttribute(\"data-\".concat(toParamCase(name)));\n    }\n  }\n  var REGEXP_SPACES = /\\s\\s*/;\n\n  var onceSupported = function () {\n    var supported = false;\n\n    if (IS_BROWSER) {\n      var once = false;\n\n      var listener = function listener() {};\n\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n\n    return supported;\n  }();\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n\n\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n\n      element.removeEventListener(event, handler, options);\n    });\n  }\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n            listeners = _element$listeners === void 0 ? {} : _element$listeners;\n\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n\n          listener.apply(element, args);\n        };\n\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n\n      element.addEventListener(event, _handler, options);\n    });\n  }\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n\n  function dispatchEvent(element, type, data) {\n    var event; // Event and CustomEvent on IE9-11 are global objects, not constructors\n\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, {\n        detail: data,\n        bubbles: true,\n        cancelable: true\n      });\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n\n    return element.dispatchEvent(event);\n  }\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n  var location = WINDOW.location;\n  var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n  /**\n   * Check if the given URL is a cross origin URL.\n   * @param {string} url - The target URL.\n   * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n   */\n\n  function isCrossOriginURL(url) {\n    var parts = url.match(REGEXP_ORIGINS);\n    return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n  }\n  /**\n   * Add timestamp to the given URL.\n   * @param {string} url - The target URL.\n   * @returns {string} The result URL.\n   */\n\n  function addTimestamp(url) {\n    var timestamp = \"timestamp=\".concat(new Date().getTime());\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n  }\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n        scaleX = _ref.scaleX,\n        scaleY = _ref.scaleY,\n        translateX = _ref.translateX,\n        translateY = _ref.translateY;\n    var values = [];\n\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    } // Rotate should come first before scale to match orientation transform\n\n\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n\n    var ratios = [];\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n        ratios.push(ratio);\n      });\n    });\n    ratios.sort(function (a, b) {\n      return Math.abs(a) < Math.abs(b);\n    });\n    return ratios[0];\n  }\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n        pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n          startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n  /**\n   * Get the max sizes in a rectangle under the given aspect ratio.\n   * @param {Object} data - The original sizes.\n   * @param {string} [type='contain'] - The adjust type.\n   * @returns {Object} The result sizes.\n   */\n\n  function getAdjustedSizes(_ref4) // or 'cover'\n  {\n    var aspectRatio = _ref4.aspectRatio,\n        height = _ref4.height,\n        width = _ref4.width;\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n    var isValidWidth = isPositiveNumber(width);\n    var isValidHeight = isPositiveNumber(height);\n\n    if (isValidWidth && isValidHeight) {\n      var adjustedWidth = height * aspectRatio;\n\n      if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n        height = width / aspectRatio;\n      } else {\n        width = height * aspectRatio;\n      }\n    } else if (isValidWidth) {\n      height = width / aspectRatio;\n    } else if (isValidHeight) {\n      width = height * aspectRatio;\n    }\n\n    return {\n      width: width,\n      height: height\n    };\n  }\n  /**\n   * Get the new sizes of a rectangle after rotated.\n   * @param {Object} data - The original sizes.\n   * @returns {Object} The result sizes.\n   */\n\n  function getRotatedSizes(_ref5) {\n    var width = _ref5.width,\n        height = _ref5.height,\n        degree = _ref5.degree;\n    degree = Math.abs(degree) % 180;\n\n    if (degree === 90) {\n      return {\n        width: height,\n        height: width\n      };\n    }\n\n    var arc = degree % 90 * Math.PI / 180;\n    var sinArc = Math.sin(arc);\n    var cosArc = Math.cos(arc);\n    var newWidth = width * cosArc + height * sinArc;\n    var newHeight = width * sinArc + height * cosArc;\n    return degree > 90 ? {\n      width: newHeight,\n      height: newWidth\n    } : {\n      width: newWidth,\n      height: newHeight\n    };\n  }\n  /**\n   * Get a canvas which drew the given image.\n   * @param {HTMLImageElement} image - The image for drawing.\n   * @param {Object} imageData - The image data.\n   * @param {Object} canvasData - The canvas data.\n   * @param {Object} options - The options.\n   * @returns {HTMLCanvasElement} The result canvas.\n   */\n\n  function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n    var imageAspectRatio = _ref6.aspectRatio,\n        imageNaturalWidth = _ref6.naturalWidth,\n        imageNaturalHeight = _ref6.naturalHeight,\n        _ref6$rotate = _ref6.rotate,\n        rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n        _ref6$scaleX = _ref6.scaleX,\n        scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n        _ref6$scaleY = _ref6.scaleY,\n        scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n    var aspectRatio = _ref7.aspectRatio,\n        naturalWidth = _ref7.naturalWidth,\n        naturalHeight = _ref7.naturalHeight;\n    var _ref8$fillColor = _ref8.fillColor,\n        fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n        _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n        imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n        _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n        imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n        _ref8$maxWidth = _ref8.maxWidth,\n        maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n        _ref8$maxHeight = _ref8.maxHeight,\n        maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n        _ref8$minWidth = _ref8.minWidth,\n        minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n        _ref8$minHeight = _ref8.minHeight,\n        minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n    var canvas = document.createElement('canvas');\n    var context = canvas.getContext('2d');\n    var maxSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var minSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n    var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); // Note: should always use image's natural sizes for drawing as\n    // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n\n    var destMaxSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var destMinSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n    var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n    var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n    canvas.width = normalizeDecimalNumber(width);\n    canvas.height = normalizeDecimalNumber(height);\n    context.fillStyle = fillColor;\n    context.fillRect(0, 0, width, height);\n    context.save();\n    context.translate(width / 2, height / 2);\n    context.rotate(rotate * Math.PI / 180);\n    context.scale(scaleX, scaleY);\n    context.imageSmoothingEnabled = imageSmoothingEnabled;\n    context.imageSmoothingQuality = imageSmoothingQuality;\n    context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n      return Math.floor(normalizeDecimalNumber(param));\n    }))));\n    context.restore();\n    return canvas;\n  }\n  var fromCharCode = String.fromCharCode;\n  /**\n   * Get string from char code in data view.\n   * @param {DataView} dataView - The data view for read.\n   * @param {number} start - The start index.\n   * @param {number} length - The read length.\n   * @returns {string} The read result.\n   */\n\n  function getStringFromCharCode(dataView, start, length) {\n    var str = '';\n    length += start;\n\n    for (var i = start; i < length; i += 1) {\n      str += fromCharCode(dataView.getUint8(i));\n    }\n\n    return str;\n  }\n  var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n  /**\n   * Transform Data URL to array buffer.\n   * @param {string} dataURL - The Data URL to transform.\n   * @returns {ArrayBuffer} The result array buffer.\n   */\n\n  function dataURLToArrayBuffer(dataURL) {\n    var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n    var binary = atob(base64);\n    var arrayBuffer = new ArrayBuffer(binary.length);\n    var uint8 = new Uint8Array(arrayBuffer);\n    forEach(uint8, function (value, i) {\n      uint8[i] = binary.charCodeAt(i);\n    });\n    return arrayBuffer;\n  }\n  /**\n   * Transform array buffer to Data URL.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n   * @param {string} mimeType - The mime type of the Data URL.\n   * @returns {string} The result Data URL.\n   */\n\n  function arrayBufferToDataURL(arrayBuffer, mimeType) {\n    var chunks = []; // Chunk Typed Array for better performance (#435)\n\n    var chunkSize = 8192;\n    var uint8 = new Uint8Array(arrayBuffer);\n\n    while (uint8.length > 0) {\n      // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n      // eslint-disable-next-line prefer-spread\n      chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n      uint8 = uint8.subarray(chunkSize);\n    }\n\n    return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n  }\n  /**\n   * Get orientation value from given array buffer.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n   * @returns {number} The read orientation value.\n   */\n\n  function resetAndGetOrientation(arrayBuffer) {\n    var dataView = new DataView(arrayBuffer);\n    var orientation; // Ignores range error when the image does not have correct Exif information\n\n    try {\n      var littleEndian;\n      var app1Start;\n      var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n      if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n        var length = dataView.byteLength;\n        var offset = 2;\n\n        while (offset + 1 < length) {\n          if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n            app1Start = offset;\n            break;\n          }\n\n          offset += 1;\n        }\n      }\n\n      if (app1Start) {\n        var exifIDCode = app1Start + 4;\n        var tiffOffset = app1Start + 10;\n\n        if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n          var endianness = dataView.getUint16(tiffOffset);\n          littleEndian = endianness === 0x4949;\n\n          if (littleEndian || endianness === 0x4D4D\n          /* bigEndian */\n          ) {\n              if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n                var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n                if (firstIFDOffset >= 0x00000008) {\n                  ifdStart = tiffOffset + firstIFDOffset;\n                }\n              }\n            }\n        }\n      }\n\n      if (ifdStart) {\n        var _length = dataView.getUint16(ifdStart, littleEndian);\n\n        var _offset;\n\n        var i;\n\n        for (i = 0; i < _length; i += 1) {\n          _offset = ifdStart + i * 12 + 2;\n\n          if (dataView.getUint16(_offset, littleEndian) === 0x0112\n          /* Orientation */\n          ) {\n              // 8 is the offset of the current tag's value\n              _offset += 8; // Get the original orientation value\n\n              orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n              dataView.setUint16(_offset, 1, littleEndian);\n              break;\n            }\n        }\n      }\n    } catch (error) {\n      orientation = 1;\n    }\n\n    return orientation;\n  }\n  /**\n   * Parse Exif Orientation value.\n   * @param {number} orientation - The orientation to parse.\n   * @returns {Object} The parsed result.\n   */\n\n  function parseOrientation(orientation) {\n    var rotate = 0;\n    var scaleX = 1;\n    var scaleY = 1;\n\n    switch (orientation) {\n      // Flip horizontal\n      case 2:\n        scaleX = -1;\n        break;\n      // Rotate left 180°\n\n      case 3:\n        rotate = -180;\n        break;\n      // Flip vertical\n\n      case 4:\n        scaleY = -1;\n        break;\n      // Flip vertical and rotate right 90°\n\n      case 5:\n        rotate = 90;\n        scaleY = -1;\n        break;\n      // Rotate right 90°\n\n      case 6:\n        rotate = 90;\n        break;\n      // Flip horizontal and rotate right 90°\n\n      case 7:\n        rotate = 90;\n        scaleX = -1;\n        break;\n      // Rotate left 90°\n\n      case 8:\n        rotate = -90;\n        break;\n    }\n\n    return {\n      rotate: rotate,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initCanvas();\n      this.initCropBox();\n      this.renderCanvas();\n\n      if (this.cropped) {\n        this.renderCropBox();\n      }\n    },\n    initContainer: function initContainer() {\n      var element = this.element,\n          options = this.options,\n          container = this.container,\n          cropper = this.cropper;\n      addClass(cropper, CLASS_HIDDEN);\n      removeClass(element, CLASS_HIDDEN);\n      var containerData = {\n        width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200),\n        height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100)\n      };\n      this.containerData = containerData;\n      setStyle(cropper, {\n        width: containerData.width,\n        height: containerData.height\n      });\n      addClass(element, CLASS_HIDDEN);\n      removeClass(cropper, CLASS_HIDDEN);\n    },\n    // Canvas (image wrapper)\n    initCanvas: function initCanvas() {\n      var containerData = this.containerData,\n          imageData = this.imageData;\n      var viewMode = this.options.viewMode;\n      var rotated = Math.abs(imageData.rotate) % 180 === 90;\n      var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n      var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var canvasWidth = containerData.width;\n      var canvasHeight = containerData.height;\n\n      if (containerData.height * aspectRatio > containerData.width) {\n        if (viewMode === 3) {\n          canvasWidth = containerData.height * aspectRatio;\n        } else {\n          canvasHeight = containerData.width / aspectRatio;\n        }\n      } else if (viewMode === 3) {\n        canvasHeight = containerData.width / aspectRatio;\n      } else {\n        canvasWidth = containerData.height * aspectRatio;\n      }\n\n      var canvasData = {\n        aspectRatio: aspectRatio,\n        naturalWidth: naturalWidth,\n        naturalHeight: naturalHeight,\n        width: canvasWidth,\n        height: canvasHeight\n      };\n      canvasData.left = (containerData.width - canvasWidth) / 2;\n      canvasData.top = (containerData.height - canvasHeight) / 2;\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      this.canvasData = canvasData;\n      this.limited = viewMode === 1 || viewMode === 2;\n      this.limitCanvas(true, true);\n      this.initialImageData = assign({}, imageData);\n      this.initialCanvasData = assign({}, canvasData);\n    },\n    limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n      var options = this.options,\n          containerData = this.containerData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var viewMode = options.viewMode;\n      var aspectRatio = canvasData.aspectRatio;\n      var cropped = this.cropped && cropBoxData;\n\n      if (sizeLimited) {\n        var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n        var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n\n        if (viewMode > 1) {\n          minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n          minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n\n          if (viewMode === 3) {\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        } else if (viewMode > 0) {\n          if (minCanvasWidth) {\n            minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n          } else if (minCanvasHeight) {\n            minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n          } else if (cropped) {\n            minCanvasWidth = cropBoxData.width;\n            minCanvasHeight = cropBoxData.height;\n\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        }\n\n        var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: minCanvasWidth,\n          height: minCanvasHeight\n        });\n\n        minCanvasWidth = _getAdjustedSizes.width;\n        minCanvasHeight = _getAdjustedSizes.height;\n        canvasData.minWidth = minCanvasWidth;\n        canvasData.minHeight = minCanvasHeight;\n        canvasData.maxWidth = Infinity;\n        canvasData.maxHeight = Infinity;\n      }\n\n      if (positionLimited) {\n        if (viewMode > (cropped ? 0 : 1)) {\n          var newCanvasLeft = containerData.width - canvasData.width;\n          var newCanvasTop = containerData.height - canvasData.height;\n          canvasData.minLeft = Math.min(0, newCanvasLeft);\n          canvasData.minTop = Math.min(0, newCanvasTop);\n          canvasData.maxLeft = Math.max(0, newCanvasLeft);\n          canvasData.maxTop = Math.max(0, newCanvasTop);\n\n          if (cropped && this.limited) {\n            canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n            canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n            canvasData.maxLeft = cropBoxData.left;\n            canvasData.maxTop = cropBoxData.top;\n\n            if (viewMode === 2) {\n              if (canvasData.width >= containerData.width) {\n                canvasData.minLeft = Math.min(0, newCanvasLeft);\n                canvasData.maxLeft = Math.max(0, newCanvasLeft);\n              }\n\n              if (canvasData.height >= containerData.height) {\n                canvasData.minTop = Math.min(0, newCanvasTop);\n                canvasData.maxTop = Math.max(0, newCanvasTop);\n              }\n            }\n          }\n        } else {\n          canvasData.minLeft = -canvasData.width;\n          canvasData.minTop = -canvasData.height;\n          canvasData.maxLeft = containerData.width;\n          canvasData.maxTop = containerData.height;\n        }\n      }\n    },\n    renderCanvas: function renderCanvas(changed, transformed) {\n      var canvasData = this.canvasData,\n          imageData = this.imageData;\n\n      if (transformed) {\n        var _getRotatedSizes = getRotatedSizes({\n          width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n          height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n          degree: imageData.rotate || 0\n        }),\n            naturalWidth = _getRotatedSizes.width,\n            naturalHeight = _getRotatedSizes.height;\n\n        var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n        var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n        canvasData.left -= (width - canvasData.width) / 2;\n        canvasData.top -= (height - canvasData.height) / 2;\n        canvasData.width = width;\n        canvasData.height = height;\n        canvasData.aspectRatio = naturalWidth / naturalHeight;\n        canvasData.naturalWidth = naturalWidth;\n        canvasData.naturalHeight = naturalHeight;\n        this.limitCanvas(true, false);\n      }\n\n      if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n        canvasData.left = canvasData.oldLeft;\n      }\n\n      if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n        canvasData.top = canvasData.oldTop;\n      }\n\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      this.limitCanvas(false, true);\n      canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n      canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      setStyle(this.canvas, assign({\n        width: canvasData.width,\n        height: canvasData.height\n      }, getTransforms({\n        translateX: canvasData.left,\n        translateY: canvasData.top\n      })));\n      this.renderImage(changed);\n\n      if (this.cropped && this.limited) {\n        this.limitCropBox(true, true);\n      }\n    },\n    renderImage: function renderImage(changed) {\n      var canvasData = this.canvasData,\n          imageData = this.imageData;\n      var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n      var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n      assign(imageData, {\n        width: width,\n        height: height,\n        left: (canvasData.width - width) / 2,\n        top: (canvasData.height - height) / 2\n      });\n      setStyle(this.image, assign({\n        width: imageData.width,\n        height: imageData.height\n      }, getTransforms(assign({\n        translateX: imageData.left,\n        translateY: imageData.top\n      }, imageData))));\n\n      if (changed) {\n        this.output();\n      }\n    },\n    initCropBox: function initCropBox() {\n      var options = this.options,\n          canvasData = this.canvasData;\n      var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n      var autoCropArea = Number(options.autoCropArea) || 0.8;\n      var cropBoxData = {\n        width: canvasData.width,\n        height: canvasData.height\n      };\n\n      if (aspectRatio) {\n        if (canvasData.height * aspectRatio > canvasData.width) {\n          cropBoxData.height = cropBoxData.width / aspectRatio;\n        } else {\n          cropBoxData.width = cropBoxData.height * aspectRatio;\n        }\n      }\n\n      this.cropBoxData = cropBoxData;\n      this.limitCropBox(true, true); // Initialize auto crop area\n\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); // The width/height of auto crop area must large than \"minWidth/Height\"\n\n      cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n      cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n      cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n      cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      this.initialCropBoxData = assign({}, cropBoxData);\n    },\n    limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n      var options = this.options,\n          containerData = this.containerData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData,\n          limited = this.limited;\n      var aspectRatio = options.aspectRatio;\n\n      if (sizeLimited) {\n        var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n        var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n        var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n        var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height; // The min/maxCropBoxWidth/Height must be less than container's width/height\n\n        minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n        minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n\n        if (aspectRatio) {\n          if (minCropBoxWidth && minCropBoxHeight) {\n            if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n              minCropBoxHeight = minCropBoxWidth / aspectRatio;\n            } else {\n              minCropBoxWidth = minCropBoxHeight * aspectRatio;\n            }\n          } else if (minCropBoxWidth) {\n            minCropBoxHeight = minCropBoxWidth / aspectRatio;\n          } else if (minCropBoxHeight) {\n            minCropBoxWidth = minCropBoxHeight * aspectRatio;\n          }\n\n          if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n            maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n          } else {\n            maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n          }\n        } // The minWidth/Height must be less than maxWidth/Height\n\n\n        cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n        cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n        cropBoxData.maxWidth = maxCropBoxWidth;\n        cropBoxData.maxHeight = maxCropBoxHeight;\n      }\n\n      if (positionLimited) {\n        if (limited) {\n          cropBoxData.minLeft = Math.max(0, canvasData.left);\n          cropBoxData.minTop = Math.max(0, canvasData.top);\n          cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n          cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n        } else {\n          cropBoxData.minLeft = 0;\n          cropBoxData.minTop = 0;\n          cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n          cropBoxData.maxTop = containerData.height - cropBoxData.height;\n        }\n      }\n    },\n    renderCropBox: function renderCropBox() {\n      var options = this.options,\n          containerData = this.containerData,\n          cropBoxData = this.cropBoxData;\n\n      if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n        cropBoxData.left = cropBoxData.oldLeft;\n      }\n\n      if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n        cropBoxData.top = cropBoxData.oldTop;\n      }\n\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n      this.limitCropBox(false, true);\n      cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n      cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n\n      if (options.movable && options.cropBoxMovable) {\n        // Turn to move the canvas when the crop box is equal to the container\n        setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n      }\n\n      setStyle(this.cropBox, assign({\n        width: cropBoxData.width,\n        height: cropBoxData.height\n      }, getTransforms({\n        translateX: cropBoxData.left,\n        translateY: cropBoxData.top\n      })));\n\n      if (this.cropped && this.limited) {\n        this.limitCanvas(true, true);\n      }\n\n      if (!this.disabled) {\n        this.output();\n      }\n    },\n    output: function output() {\n      this.preview();\n      dispatchEvent(this.element, EVENT_CROP, this.getData());\n    }\n  };\n\n  var preview = {\n    initPreview: function initPreview() {\n      var element = this.element,\n          crossOrigin = this.crossOrigin;\n      var preview = this.options.preview;\n      var url = crossOrigin ? this.crossOriginUrl : this.url;\n      var alt = element.alt || 'The image to preview';\n      var image = document.createElement('img');\n\n      if (crossOrigin) {\n        image.crossOrigin = crossOrigin;\n      }\n\n      image.src = url;\n      image.alt = alt;\n      this.viewBox.appendChild(image);\n      this.viewBoxImage = image;\n\n      if (!preview) {\n        return;\n      }\n\n      var previews = preview;\n\n      if (typeof preview === 'string') {\n        previews = element.ownerDocument.querySelectorAll(preview);\n      } else if (preview.querySelector) {\n        previews = [preview];\n      }\n\n      this.previews = previews;\n      forEach(previews, function (el) {\n        var img = document.createElement('img'); // Save the original size for recover\n\n        setData(el, DATA_PREVIEW, {\n          width: el.offsetWidth,\n          height: el.offsetHeight,\n          html: el.innerHTML\n        });\n\n        if (crossOrigin) {\n          img.crossOrigin = crossOrigin;\n        }\n\n        img.src = url;\n        img.alt = alt;\n        /**\n         * Override img element styles\n         * Add `display:block` to avoid margin top issue\n         * Add `height:auto` to override `height` attribute on IE8\n         * (Occur only when margin-top <= -height)\n         */\n\n        img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n        el.innerHTML = '';\n        el.appendChild(img);\n      });\n    },\n    resetPreview: function resetPreview() {\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        setStyle(element, {\n          width: data.width,\n          height: data.height\n        });\n        element.innerHTML = data.html;\n        removeData(element, DATA_PREVIEW);\n      });\n    },\n    preview: function preview() {\n      var imageData = this.imageData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var cropBoxWidth = cropBoxData.width,\n          cropBoxHeight = cropBoxData.height;\n      var width = imageData.width,\n          height = imageData.height;\n      var left = cropBoxData.left - canvasData.left - imageData.left;\n      var top = cropBoxData.top - canvasData.top - imageData.top;\n\n      if (!this.cropped || this.disabled) {\n        return;\n      }\n\n      setStyle(this.viewBoxImage, assign({\n        width: width,\n        height: height\n      }, getTransforms(assign({\n        translateX: -left,\n        translateY: -top\n      }, imageData))));\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        var originalWidth = data.width;\n        var originalHeight = data.height;\n        var newWidth = originalWidth;\n        var newHeight = originalHeight;\n        var ratio = 1;\n\n        if (cropBoxWidth) {\n          ratio = originalWidth / cropBoxWidth;\n          newHeight = cropBoxHeight * ratio;\n        }\n\n        if (cropBoxHeight && newHeight > originalHeight) {\n          ratio = originalHeight / cropBoxHeight;\n          newWidth = cropBoxWidth * ratio;\n          newHeight = originalHeight;\n        }\n\n        setStyle(element, {\n          width: newWidth,\n          height: newHeight\n        });\n        setStyle(element.getElementsByTagName('img')[0], assign({\n          width: width * ratio,\n          height: height * ratio\n        }, getTransforms(assign({\n          translateX: -left * ratio,\n          translateY: -top * ratio\n        }, imageData))));\n      });\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var element = this.element,\n          options = this.options,\n          cropper = this.cropper;\n\n      if (isFunction(options.cropstart)) {\n        addListener(element, EVENT_CROP_START, options.cropstart);\n      }\n\n      if (isFunction(options.cropmove)) {\n        addListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n\n      if (isFunction(options.cropend)) {\n        addListener(element, EVENT_CROP_END, options.cropend);\n      }\n\n      if (isFunction(options.crop)) {\n        addListener(element, EVENT_CROP, options.crop);\n      }\n\n      if (isFunction(options.zoom)) {\n        addListener(element, EVENT_ZOOM, options.zoom);\n      }\n\n      addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n\n      if (options.toggleDragModeOnDblclick) {\n        addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n\n      addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n      addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n\n      if (options.responsive) {\n        addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var element = this.element,\n          options = this.options,\n          cropper = this.cropper;\n\n      if (isFunction(options.cropstart)) {\n        removeListener(element, EVENT_CROP_START, options.cropstart);\n      }\n\n      if (isFunction(options.cropmove)) {\n        removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n\n      if (isFunction(options.cropend)) {\n        removeListener(element, EVENT_CROP_END, options.cropend);\n      }\n\n      if (isFunction(options.crop)) {\n        removeListener(element, EVENT_CROP, options.crop);\n      }\n\n      if (isFunction(options.zoom)) {\n        removeListener(element, EVENT_ZOOM, options.zoom);\n      }\n\n      removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n\n      if (options.toggleDragModeOnDblclick) {\n        removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n      }\n\n      removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n      removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n\n      if (options.responsive) {\n        removeListener(window, EVENT_RESIZE, this.onResize);\n      }\n    }\n  };\n\n  var handlers = {\n    resize: function resize() {\n      if (this.disabled) {\n        return;\n      }\n\n      var options = this.options,\n          container = this.container,\n          containerData = this.containerData;\n      var ratio = container.offsetWidth / containerData.width; // Resize when width changed or height changed\n\n      if (ratio !== 1 || container.offsetHeight !== containerData.height) {\n        var canvasData;\n        var cropBoxData;\n\n        if (options.restore) {\n          canvasData = this.getCanvasData();\n          cropBoxData = this.getCropBoxData();\n        }\n\n        this.render();\n\n        if (options.restore) {\n          this.setCanvasData(forEach(canvasData, function (n, i) {\n            canvasData[i] = n * ratio;\n          }));\n          this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n            cropBoxData[i] = n * ratio;\n          }));\n        }\n      }\n    },\n    dblclick: function dblclick() {\n      if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n        return;\n      }\n\n      this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n    },\n    wheel: function wheel(event) {\n      var _this = this;\n\n      var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n      var delta = 1;\n\n      if (this.disabled) {\n        return;\n      }\n\n      event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21)\n\n      if (this.wheeling) {\n        return;\n      }\n\n      this.wheeling = true;\n      setTimeout(function () {\n        _this.wheeling = false;\n      }, 50);\n\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n\n      this.zoom(-delta * ratio, event);\n    },\n    cropStart: function cropStart(event) {\n      var buttons = event.buttons,\n          button = event.button;\n\n      if (this.disabled // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && ( // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n\n      var options = this.options,\n          pointers = this.pointers;\n      var action;\n\n      if (event.changedTouches) {\n        // Handle touch event\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        // Handle mouse event and pointer event\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n\n      if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n        action = ACTION_ZOOM;\n      } else {\n        action = getData(event.target, DATA_ACTION);\n      }\n\n      if (!REGEXP_ACTIONS.test(action)) {\n        return;\n      }\n\n      if (dispatchEvent(this.element, EVENT_CROP_START, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      } // This line is required for preventing page zooming in iOS browsers\n\n\n      event.preventDefault();\n      this.action = action;\n      this.cropping = false;\n\n      if (action === ACTION_CROP) {\n        this.cropping = true;\n        addClass(this.dragBox, CLASS_MODAL);\n      }\n    },\n    cropMove: function cropMove(event) {\n      var action = this.action;\n\n      if (this.disabled || !action) {\n        return;\n      }\n\n      var pointers = this.pointers;\n      event.preventDefault();\n\n      if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          // The first parameter should not be undefined (#432)\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n\n      this.change(event);\n    },\n    cropEnd: function cropEnd(event) {\n      if (this.disabled) {\n        return;\n      }\n\n      var action = this.action,\n          pointers = this.pointers;\n\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          delete pointers[touch.identifier];\n        });\n      } else {\n        delete pointers[event.pointerId || 0];\n      }\n\n      if (!action) {\n        return;\n      }\n\n      event.preventDefault();\n\n      if (!Object.keys(pointers).length) {\n        this.action = '';\n      }\n\n      if (this.cropping) {\n        this.cropping = false;\n        toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n      }\n\n      dispatchEvent(this.element, EVENT_CROP_END, {\n        originalEvent: event,\n        action: action\n      });\n    }\n  };\n\n  var change = {\n    change: function change(event) {\n      var options = this.options,\n          canvasData = this.canvasData,\n          containerData = this.containerData,\n          cropBoxData = this.cropBoxData,\n          pointers = this.pointers;\n      var action = this.action;\n      var aspectRatio = options.aspectRatio;\n      var left = cropBoxData.left,\n          top = cropBoxData.top,\n          width = cropBoxData.width,\n          height = cropBoxData.height;\n      var right = left + width;\n      var bottom = top + height;\n      var minLeft = 0;\n      var minTop = 0;\n      var maxWidth = containerData.width;\n      var maxHeight = containerData.height;\n      var renderable = true;\n      var offset; // Locking aspect ratio in \"free mode\" by holding shift key\n\n      if (!aspectRatio && event.shiftKey) {\n        aspectRatio = width && height ? width / height : 1;\n      }\n\n      if (this.limited) {\n        minLeft = cropBoxData.minLeft;\n        minTop = cropBoxData.minTop;\n        maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n        maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n      }\n\n      var pointer = pointers[Object.keys(pointers)[0]];\n      var range = {\n        x: pointer.endX - pointer.startX,\n        y: pointer.endY - pointer.startY\n      };\n\n      var check = function check(side) {\n        switch (side) {\n          case ACTION_EAST:\n            if (right + range.x > maxWidth) {\n              range.x = maxWidth - right;\n            }\n\n            break;\n\n          case ACTION_WEST:\n            if (left + range.x < minLeft) {\n              range.x = minLeft - left;\n            }\n\n            break;\n\n          case ACTION_NORTH:\n            if (top + range.y < minTop) {\n              range.y = minTop - top;\n            }\n\n            break;\n\n          case ACTION_SOUTH:\n            if (bottom + range.y > maxHeight) {\n              range.y = maxHeight - bottom;\n            }\n\n            break;\n        }\n      };\n\n      switch (action) {\n        // Move crop box\n        case ACTION_ALL:\n          left += range.x;\n          top += range.y;\n          break;\n        // Resize crop box\n\n        case ACTION_EAST:\n          if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_EAST);\n          width += range.x;\n\n          if (width < 0) {\n            action = ACTION_WEST;\n            width = -width;\n            left -= width;\n          }\n\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n\n          break;\n\n        case ACTION_NORTH:\n          if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_NORTH);\n          height -= range.y;\n          top += range.y;\n\n          if (height < 0) {\n            action = ACTION_SOUTH;\n            height = -height;\n            top -= height;\n          }\n\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n\n          break;\n\n        case ACTION_WEST:\n          if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_WEST);\n          width -= range.x;\n          left += range.x;\n\n          if (width < 0) {\n            action = ACTION_EAST;\n            width = -width;\n            left -= width;\n          }\n\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n\n          break;\n\n        case ACTION_SOUTH:\n          if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_SOUTH);\n          height += range.y;\n\n          if (height < 0) {\n            action = ACTION_NORTH;\n            height = -height;\n            top -= height;\n          }\n\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n\n          break;\n\n        case ACTION_NORTH_EAST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_EAST);\n\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_NORTH_WEST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n            left += cropBoxData.width - width;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_WEST);\n\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_SOUTH_WEST:\n          if (aspectRatio) {\n            if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_WEST);\n            width -= range.x;\n            left += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_WEST);\n\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_SOUTH_EAST:\n          if (aspectRatio) {\n            if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_EAST);\n            width += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_EAST);\n\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n        // Move canvas\n\n        case ACTION_MOVE:\n          this.move(range.x, range.y);\n          renderable = false;\n          break;\n        // Zoom canvas\n\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), event);\n          renderable = false;\n          break;\n        // Create crop box\n\n        case ACTION_CROP:\n          if (!range.x || !range.y) {\n            renderable = false;\n            break;\n          }\n\n          offset = getOffset(this.cropper);\n          left = pointer.startX - offset.left;\n          top = pointer.startY - offset.top;\n          width = cropBoxData.minWidth;\n          height = cropBoxData.minHeight;\n\n          if (range.x > 0) {\n            action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n          } else if (range.x < 0) {\n            left -= width;\n            action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n          }\n\n          if (range.y < 0) {\n            top -= height;\n          } // Show the crop box if is hidden\n\n\n          if (!this.cropped) {\n            removeClass(this.cropBox, CLASS_HIDDEN);\n            this.cropped = true;\n\n            if (this.limited) {\n              this.limitCropBox(true, true);\n            }\n          }\n\n          break;\n      }\n\n      if (renderable) {\n        cropBoxData.width = width;\n        cropBoxData.height = height;\n        cropBoxData.left = left;\n        cropBoxData.top = top;\n        this.action = action;\n        this.renderCropBox();\n      } // Override\n\n\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    }\n  };\n\n  var methods = {\n    // Show the crop box manually\n    crop: function crop() {\n      if (this.ready && !this.cropped && !this.disabled) {\n        this.cropped = true;\n        this.limitCropBox(true, true);\n\n        if (this.options.modal) {\n          addClass(this.dragBox, CLASS_MODAL);\n        }\n\n        removeClass(this.cropBox, CLASS_HIDDEN);\n        this.setCropBoxData(this.initialCropBoxData);\n      }\n\n      return this;\n    },\n    // Reset the image and crop box to their initial states\n    reset: function reset() {\n      if (this.ready && !this.disabled) {\n        this.imageData = assign({}, this.initialImageData);\n        this.canvasData = assign({}, this.initialCanvasData);\n        this.cropBoxData = assign({}, this.initialCropBoxData);\n        this.renderCanvas();\n\n        if (this.cropped) {\n          this.renderCropBox();\n        }\n      }\n\n      return this;\n    },\n    // Clear the crop box\n    clear: function clear() {\n      if (this.cropped && !this.disabled) {\n        assign(this.cropBoxData, {\n          left: 0,\n          top: 0,\n          width: 0,\n          height: 0\n        });\n        this.cropped = false;\n        this.renderCropBox();\n        this.limitCanvas(true, true); // Render canvas after crop box rendered\n\n        this.renderCanvas();\n        removeClass(this.dragBox, CLASS_MODAL);\n        addClass(this.cropBox, CLASS_HIDDEN);\n      }\n\n      return this;\n    },\n\n    /**\n     * Replace the image's src and rebuild the cropper\n     * @param {string} url - The new URL.\n     * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n     * @returns {Cropper} this\n     */\n    replace: function replace(url) {\n      var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!this.disabled && url) {\n        if (this.isImg) {\n          this.element.src = url;\n        }\n\n        if (hasSameSize) {\n          this.url = url;\n          this.image.src = url;\n\n          if (this.ready) {\n            this.viewBoxImage.src = url;\n            forEach(this.previews, function (element) {\n              element.getElementsByTagName('img')[0].src = url;\n            });\n          }\n        } else {\n          if (this.isImg) {\n            this.replaced = true;\n          }\n\n          this.options.data = null;\n          this.uncreate();\n          this.load(url);\n        }\n      }\n\n      return this;\n    },\n    // Enable (unfreeze) the cropper\n    enable: function enable() {\n      if (this.ready && this.disabled) {\n        this.disabled = false;\n        removeClass(this.cropper, CLASS_DISABLED);\n      }\n\n      return this;\n    },\n    // Disable (freeze) the cropper\n    disable: function disable() {\n      if (this.ready && !this.disabled) {\n        this.disabled = true;\n        addClass(this.cropper, CLASS_DISABLED);\n      }\n\n      return this;\n    },\n\n    /**\n     * Destroy the cropper and remove the instance from the image\n     * @returns {Cropper} this\n     */\n    destroy: function destroy() {\n      var element = this.element;\n\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n\n      element[NAMESPACE] = undefined;\n\n      if (this.isImg && this.replaced) {\n        element.src = this.originalUrl;\n      }\n\n      this.uncreate();\n      return this;\n    },\n\n    /**\n     * Move the canvas with relative offsets\n     * @param {number} offsetX - The relative offset distance on the x-axis.\n     * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n     * @returns {Cropper} this\n     */\n    move: function move(offsetX) {\n      var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n      var _this$canvasData = this.canvasData,\n          left = _this$canvasData.left,\n          top = _this$canvasData.top;\n      return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n    },\n\n    /**\n     * Move the canvas to an absolute point\n     * @param {number} x - The x-axis coordinate.\n     * @param {number} [y=x] - The y-axis coordinate.\n     * @returns {Cropper} this\n     */\n    moveTo: function moveTo(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var canvasData = this.canvasData;\n      var changed = false;\n      x = Number(x);\n      y = Number(y);\n\n      if (this.ready && !this.disabled && this.options.movable) {\n        if (isNumber(x)) {\n          canvasData.left = x;\n          changed = true;\n        }\n\n        if (isNumber(y)) {\n          canvasData.top = y;\n          changed = true;\n        }\n\n        if (changed) {\n          this.renderCanvas(true);\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Zoom the canvas with a relative ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoom: function zoom(ratio, _originalEvent) {\n      var canvasData = this.canvasData;\n      ratio = Number(ratio);\n\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n\n      return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n    },\n\n    /**\n     * Zoom the canvas to an absolute ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Object} pivot - The zoom pivot point coordinate.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n      var options = this.options,\n          canvasData = this.canvasData;\n      var width = canvasData.width,\n          height = canvasData.height,\n          naturalWidth = canvasData.naturalWidth,\n          naturalHeight = canvasData.naturalHeight;\n      ratio = Number(ratio);\n\n      if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n\n        if (dispatchEvent(this.element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: width / naturalWidth,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n\n        if (_originalEvent) {\n          var pointers = this.pointers;\n          var offset = getOffset(this.cropper);\n          var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          }; // Zoom from the triggering point of the event\n\n          canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n        } else {\n          // Zoom from the center of the canvas\n          canvasData.left -= (newWidth - width) / 2;\n          canvasData.top -= (newHeight - height) / 2;\n        }\n\n        canvasData.width = newWidth;\n        canvasData.height = newHeight;\n        this.renderCanvas(true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Rotate the canvas with a relative degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotate: function rotate(degree) {\n      return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n    },\n\n    /**\n     * Rotate the canvas to an absolute degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotateTo: function rotateTo(degree) {\n      degree = Number(degree);\n\n      if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n        this.imageData.rotate = degree % 360;\n        this.renderCanvas(true, true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Cropper} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      var scaleY = this.imageData.scaleY;\n      return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n    },\n\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      var scaleX = this.imageData.scaleX;\n      return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n    },\n\n    /**\n     * Scale the image\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scale: function scale(scaleX) {\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var imageData = this.imageData;\n      var transformed = false;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n\n      if (this.ready && !this.disabled && this.options.scalable) {\n        if (isNumber(scaleX)) {\n          imageData.scaleX = scaleX;\n          transformed = true;\n        }\n\n        if (isNumber(scaleY)) {\n          imageData.scaleY = scaleY;\n          transformed = true;\n        }\n\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the cropped area position and size data (base on the original image)\n     * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n     * @returns {Object} The result cropped data.\n     */\n    getData: function getData() {\n      var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var options = this.options,\n          imageData = this.imageData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var data;\n\n      if (this.ready && this.cropped) {\n        data = {\n          x: cropBoxData.left - canvasData.left,\n          y: cropBoxData.top - canvasData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n        var ratio = imageData.width / imageData.naturalWidth;\n        forEach(data, function (n, i) {\n          data[i] = n / ratio;\n        });\n\n        if (rounded) {\n          // In case rounding off leads to extra 1px in right or bottom border\n          // we should round the top-left corner and the dimension (#343).\n          var bottom = Math.round(data.y + data.height);\n          var right = Math.round(data.x + data.width);\n          data.x = Math.round(data.x);\n          data.y = Math.round(data.y);\n          data.width = right - data.x;\n          data.height = bottom - data.y;\n        }\n      } else {\n        data = {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0\n        };\n      }\n\n      if (options.rotatable) {\n        data.rotate = imageData.rotate || 0;\n      }\n\n      if (options.scalable) {\n        data.scaleX = imageData.scaleX || 1;\n        data.scaleY = imageData.scaleY || 1;\n      }\n\n      return data;\n    },\n\n    /**\n     * Set the cropped area position and size with new data\n     * @param {Object} data - The new data.\n     * @returns {Cropper} this\n     */\n    setData: function setData(data) {\n      var options = this.options,\n          imageData = this.imageData,\n          canvasData = this.canvasData;\n      var cropBoxData = {};\n\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        var transformed = false;\n\n        if (options.rotatable) {\n          if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n            imageData.rotate = data.rotate;\n            transformed = true;\n          }\n        }\n\n        if (options.scalable) {\n          if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n            imageData.scaleX = data.scaleX;\n            transformed = true;\n          }\n\n          if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n            imageData.scaleY = data.scaleY;\n            transformed = true;\n          }\n        }\n\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n\n        var ratio = imageData.width / imageData.naturalWidth;\n\n        if (isNumber(data.x)) {\n          cropBoxData.left = data.x * ratio + canvasData.left;\n        }\n\n        if (isNumber(data.y)) {\n          cropBoxData.top = data.y * ratio + canvasData.top;\n        }\n\n        if (isNumber(data.width)) {\n          cropBoxData.width = data.width * ratio;\n        }\n\n        if (isNumber(data.height)) {\n          cropBoxData.height = data.height * ratio;\n        }\n\n        this.setCropBoxData(cropBoxData);\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the container size data.\n     * @returns {Object} The result container data.\n     */\n    getContainerData: function getContainerData() {\n      return this.ready ? assign({}, this.containerData) : {};\n    },\n\n    /**\n     * Get the image position and size data.\n     * @returns {Object} The result image data.\n     */\n    getImageData: function getImageData() {\n      return this.sized ? assign({}, this.imageData) : {};\n    },\n\n    /**\n     * Get the canvas position and size data.\n     * @returns {Object} The result canvas data.\n     */\n    getCanvasData: function getCanvasData() {\n      var canvasData = this.canvasData;\n      var data = {};\n\n      if (this.ready) {\n        forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n          data[n] = canvasData[n];\n        });\n      }\n\n      return data;\n    },\n\n    /**\n     * Set the canvas position and size with new data.\n     * @param {Object} data - The new canvas data.\n     * @returns {Cropper} this\n     */\n    setCanvasData: function setCanvasData(data) {\n      var canvasData = this.canvasData;\n      var aspectRatio = canvasData.aspectRatio;\n\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          canvasData.left = data.left;\n        }\n\n        if (isNumber(data.top)) {\n          canvasData.top = data.top;\n        }\n\n        if (isNumber(data.width)) {\n          canvasData.width = data.width;\n          canvasData.height = data.width / aspectRatio;\n        } else if (isNumber(data.height)) {\n          canvasData.height = data.height;\n          canvasData.width = data.height * aspectRatio;\n        }\n\n        this.renderCanvas(true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the crop box position and size data.\n     * @returns {Object} The result crop box data.\n     */\n    getCropBoxData: function getCropBoxData() {\n      var cropBoxData = this.cropBoxData;\n      var data;\n\n      if (this.ready && this.cropped) {\n        data = {\n          left: cropBoxData.left,\n          top: cropBoxData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n      }\n\n      return data || {};\n    },\n\n    /**\n     * Set the crop box position and size with new data.\n     * @param {Object} data - The new crop box data.\n     * @returns {Cropper} this\n     */\n    setCropBoxData: function setCropBoxData(data) {\n      var cropBoxData = this.cropBoxData;\n      var aspectRatio = this.options.aspectRatio;\n      var widthChanged;\n      var heightChanged;\n\n      if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          cropBoxData.left = data.left;\n        }\n\n        if (isNumber(data.top)) {\n          cropBoxData.top = data.top;\n        }\n\n        if (isNumber(data.width) && data.width !== cropBoxData.width) {\n          widthChanged = true;\n          cropBoxData.width = data.width;\n        }\n\n        if (isNumber(data.height) && data.height !== cropBoxData.height) {\n          heightChanged = true;\n          cropBoxData.height = data.height;\n        }\n\n        if (aspectRatio) {\n          if (widthChanged) {\n            cropBoxData.height = cropBoxData.width / aspectRatio;\n          } else if (heightChanged) {\n            cropBoxData.width = cropBoxData.height * aspectRatio;\n          }\n        }\n\n        this.renderCropBox();\n      }\n\n      return this;\n    },\n\n    /**\n     * Get a canvas drawn the cropped image.\n     * @param {Object} [options={}] - The config options.\n     * @returns {HTMLCanvasElement} - The result canvas.\n     */\n    getCroppedCanvas: function getCroppedCanvas() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      if (!this.ready || !window.HTMLCanvasElement) {\n        return null;\n      }\n\n      var canvasData = this.canvasData;\n      var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped.\n\n      if (!this.cropped) {\n        return source;\n      }\n\n      var _this$getData = this.getData(),\n          initialX = _this$getData.x,\n          initialY = _this$getData.y,\n          initialWidth = _this$getData.width,\n          initialHeight = _this$getData.height;\n\n      var ratio = source.width / Math.floor(canvasData.naturalWidth);\n\n      if (ratio !== 1) {\n        initialX *= ratio;\n        initialY *= ratio;\n        initialWidth *= ratio;\n        initialHeight *= ratio;\n      }\n\n      var aspectRatio = initialWidth / initialHeight;\n      var maxSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.maxWidth || Infinity,\n        height: options.maxHeight || Infinity\n      });\n      var minSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.minWidth || 0,\n        height: options.minHeight || 0\n      }, 'cover');\n\n      var _getAdjustedSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.width || (ratio !== 1 ? source.width : initialWidth),\n        height: options.height || (ratio !== 1 ? source.height : initialHeight)\n      }),\n          width = _getAdjustedSizes.width,\n          height = _getAdjustedSizes.height;\n\n      width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n      height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = normalizeDecimalNumber(width);\n      canvas.height = normalizeDecimalNumber(height);\n      context.fillStyle = options.fillColor || 'transparent';\n      context.fillRect(0, 0, width, height);\n      var _options$imageSmoothi = options.imageSmoothingEnabled,\n          imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n          imageSmoothingQuality = options.imageSmoothingQuality;\n      context.imageSmoothingEnabled = imageSmoothingEnabled;\n\n      if (imageSmoothingQuality) {\n        context.imageSmoothingQuality = imageSmoothingQuality;\n      } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n\n\n      var sourceWidth = source.width;\n      var sourceHeight = source.height; // Source canvas parameters\n\n      var srcX = initialX;\n      var srcY = initialY;\n      var srcWidth;\n      var srcHeight; // Destination canvas parameters\n\n      var dstX;\n      var dstY;\n      var dstWidth;\n      var dstHeight;\n\n      if (srcX <= -initialWidth || srcX > sourceWidth) {\n        srcX = 0;\n        srcWidth = 0;\n        dstX = 0;\n        dstWidth = 0;\n      } else if (srcX <= 0) {\n        dstX = -srcX;\n        srcX = 0;\n        srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n        dstWidth = srcWidth;\n      } else if (srcX <= sourceWidth) {\n        dstX = 0;\n        srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n        dstWidth = srcWidth;\n      }\n\n      if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n        srcY = 0;\n        srcHeight = 0;\n        dstY = 0;\n        dstHeight = 0;\n      } else if (srcY <= 0) {\n        dstY = -srcY;\n        srcY = 0;\n        srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n        dstHeight = srcHeight;\n      } else if (srcY <= sourceHeight) {\n        dstY = 0;\n        srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n        dstHeight = srcHeight;\n      }\n\n      var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid \"IndexSizeError\"\n\n      if (dstWidth > 0 && dstHeight > 0) {\n        var scale = width / initialWidth;\n        params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n      } // All the numerical parameters should be integer for `drawImage`\n      // https://github.com/fengyuanchen/cropper/issues/476\n\n\n      context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n        return Math.floor(normalizeDecimalNumber(param));\n      }))));\n      return canvas;\n    },\n\n    /**\n     * Change the aspect ratio of the crop box.\n     * @param {number} aspectRatio - The new aspect ratio.\n     * @returns {Cropper} this\n     */\n    setAspectRatio: function setAspectRatio(aspectRatio) {\n      var options = this.options;\n\n      if (!this.disabled && !isUndefined(aspectRatio)) {\n        // 0 -> NaN\n        options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n\n        if (this.ready) {\n          this.initCropBox();\n\n          if (this.cropped) {\n            this.renderCropBox();\n          }\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Change the drag mode.\n     * @param {string} mode - The new drag mode.\n     * @returns {Cropper} this\n     */\n    setDragMode: function setDragMode(mode) {\n      var options = this.options,\n          dragBox = this.dragBox,\n          face = this.face;\n\n      if (this.ready && !this.disabled) {\n        var croppable = mode === DRAG_MODE_CROP;\n        var movable = options.movable && mode === DRAG_MODE_MOVE;\n        mode = croppable || movable ? mode : DRAG_MODE_NONE;\n        options.dragMode = mode;\n        setData(dragBox, DATA_ACTION, mode);\n        toggleClass(dragBox, CLASS_CROP, croppable);\n        toggleClass(dragBox, CLASS_MOVE, movable);\n\n        if (!options.cropBoxMovable) {\n          // Sync drag mode to crop box when it is not movable\n          setData(face, DATA_ACTION, mode);\n          toggleClass(face, CLASS_CROP, croppable);\n          toggleClass(face, CLASS_MOVE, movable);\n        }\n      }\n\n      return this;\n    }\n  };\n\n  var AnotherCropper = WINDOW.Cropper;\n\n  var Cropper = /*#__PURE__*/function () {\n    /**\n     * Create a new Cropper.\n     * @param {Element} element - The target element for cropping.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Cropper(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck(this, Cropper);\n\n      if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n        throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n      }\n\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.cropped = false;\n      this.disabled = false;\n      this.pointers = {};\n      this.ready = false;\n      this.reloading = false;\n      this.replaced = false;\n      this.sized = false;\n      this.sizing = false;\n      this.init();\n    }\n\n    _createClass(Cropper, [{\n      key: \"init\",\n      value: function init() {\n        var element = this.element;\n        var tagName = element.tagName.toLowerCase();\n        var url;\n\n        if (element[NAMESPACE]) {\n          return;\n        }\n\n        element[NAMESPACE] = this;\n\n        if (tagName === 'img') {\n          this.isImg = true; // e.g.: \"img/picture.jpg\"\n\n          url = element.getAttribute('src') || '';\n          this.originalUrl = url; // Stop when it's a blank image\n\n          if (!url) {\n            return;\n          } // e.g.: \"https://example.com/img/picture.jpg\"\n\n\n          url = element.src;\n        } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n          url = element.toDataURL();\n        }\n\n        this.load(url);\n      }\n    }, {\n      key: \"load\",\n      value: function load(url) {\n        var _this = this;\n\n        if (!url) {\n          return;\n        }\n\n        this.url = url;\n        this.imageData = {};\n        var element = this.element,\n            options = this.options;\n\n        if (!options.rotatable && !options.scalable) {\n          options.checkOrientation = false;\n        } // Only IE10+ supports Typed Arrays\n\n\n        if (!options.checkOrientation || !window.ArrayBuffer) {\n          this.clone();\n          return;\n        } // Detect the mime type of the image directly if it is a Data URL\n\n\n        if (REGEXP_DATA_URL.test(url)) {\n          // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n          if (REGEXP_DATA_URL_JPEG.test(url)) {\n            this.read(dataURLToArrayBuffer(url));\n          } else {\n            // Only a JPEG image may contains Exif Orientation information,\n            // the rest types of Data URLs are not necessary to check orientation at all.\n            this.clone();\n          }\n\n          return;\n        } // 1. Detect the mime type of the image by a XMLHttpRequest.\n        // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n\n\n        var xhr = new XMLHttpRequest();\n        var clone = this.clone.bind(this);\n        this.reloading = true;\n        this.xhr = xhr; // 1. Cross origin requests are only supported for protocol schemes:\n        // http, https, data, chrome, chrome-extension.\n        // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n        // in some browsers as IE11 and Safari.\n\n        xhr.onabort = clone;\n        xhr.onerror = clone;\n        xhr.ontimeout = clone;\n\n        xhr.onprogress = function () {\n          // Abort the request directly if it not a JPEG image for better performance\n          if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n            xhr.abort();\n          }\n        };\n\n        xhr.onload = function () {\n          _this.read(xhr.response);\n        };\n\n        xhr.onloadend = function () {\n          _this.reloading = false;\n          _this.xhr = null;\n        }; // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n\n\n        if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n          url = addTimestamp(url);\n        }\n\n        xhr.open('GET', url);\n        xhr.responseType = 'arraybuffer';\n        xhr.withCredentials = element.crossOrigin === 'use-credentials';\n        xhr.send();\n      }\n    }, {\n      key: \"read\",\n      value: function read(arrayBuffer) {\n        var options = this.options,\n            imageData = this.imageData; // Reset the orientation value to its default value 1\n        // as some iOS browsers will render image with its orientation\n\n        var orientation = resetAndGetOrientation(arrayBuffer);\n        var rotate = 0;\n        var scaleX = 1;\n        var scaleY = 1;\n\n        if (orientation > 1) {\n          // Generate a new URL which has the default orientation value\n          this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n\n          var _parseOrientation = parseOrientation(orientation);\n\n          rotate = _parseOrientation.rotate;\n          scaleX = _parseOrientation.scaleX;\n          scaleY = _parseOrientation.scaleY;\n        }\n\n        if (options.rotatable) {\n          imageData.rotate = rotate;\n        }\n\n        if (options.scalable) {\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n        }\n\n        this.clone();\n      }\n    }, {\n      key: \"clone\",\n      value: function clone() {\n        var element = this.element,\n            url = this.url;\n        var crossOrigin = element.crossOrigin;\n        var crossOriginUrl = url;\n\n        if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n          if (!crossOrigin) {\n            crossOrigin = 'anonymous';\n          } // Bust cache when there is not a \"crossOrigin\" property (#519)\n\n\n          crossOriginUrl = addTimestamp(url);\n        }\n\n        this.crossOrigin = crossOrigin;\n        this.crossOriginUrl = crossOriginUrl;\n        var image = document.createElement('img');\n\n        if (crossOrigin) {\n          image.crossOrigin = crossOrigin;\n        }\n\n        image.src = crossOriginUrl || url;\n        image.alt = element.alt || 'The image to crop';\n        this.image = image;\n        image.onload = this.start.bind(this);\n        image.onerror = this.stop.bind(this);\n        addClass(image, CLASS_HIDE);\n        element.parentNode.insertBefore(image, element.nextSibling);\n      }\n    }, {\n      key: \"start\",\n      value: function start() {\n        var _this2 = this;\n\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        this.sizing = true; // Match all browsers that use WebKit as the layout engine in iOS devices,\n        // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n\n        var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n\n        var done = function done(naturalWidth, naturalHeight) {\n          assign(_this2.imageData, {\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            aspectRatio: naturalWidth / naturalHeight\n          });\n          _this2.sizing = false;\n          _this2.sized = true;\n\n          _this2.build();\n        }; // Most modern browsers (excepts iOS WebKit)\n\n\n        if (image.naturalWidth && !isIOSWebKit) {\n          done(image.naturalWidth, image.naturalHeight);\n          return;\n        }\n\n        var sizingImage = document.createElement('img');\n        var body = document.body || document.documentElement;\n        this.sizingImage = sizingImage;\n\n        sizingImage.onload = function () {\n          done(sizingImage.width, sizingImage.height);\n\n          if (!isIOSWebKit) {\n            body.removeChild(sizingImage);\n          }\n        };\n\n        sizingImage.src = image.src; // iOS WebKit will convert the image automatically\n        // with its orientation once append it into DOM (#279)\n\n        if (!isIOSWebKit) {\n          sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n          body.appendChild(sizingImage);\n        }\n      }\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        image.parentNode.removeChild(image);\n        this.image = null;\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (!this.sized || this.ready) {\n          return;\n        }\n\n        var element = this.element,\n            options = this.options,\n            image = this.image; // Create cropper elements\n\n        var container = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n        var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n        var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n        this.container = container;\n        this.cropper = cropper;\n        this.canvas = canvas;\n        this.dragBox = dragBox;\n        this.cropBox = cropBox;\n        this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n        this.face = face;\n        canvas.appendChild(image); // Hide the original image\n\n        addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image\n\n        container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden\n\n        if (!this.isImg) {\n          removeClass(image, CLASS_HIDE);\n        }\n\n        this.initPreview();\n        this.bind();\n        options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n        options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n        options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n        addClass(cropBox, CLASS_HIDDEN);\n\n        if (!options.guides) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n        }\n\n        if (!options.center) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n        }\n\n        if (options.background) {\n          addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n        }\n\n        if (!options.highlight) {\n          addClass(face, CLASS_INVISIBLE);\n        }\n\n        if (options.cropBoxMovable) {\n          addClass(face, CLASS_MOVE);\n          setData(face, DATA_ACTION, ACTION_ALL);\n        }\n\n        if (!options.cropBoxResizable) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n        }\n\n        this.render();\n        this.ready = true;\n        this.setDragMode(options.dragMode);\n\n        if (options.autoCrop) {\n          this.crop();\n        }\n\n        this.setData(options.data);\n\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n\n        dispatchEvent(element, EVENT_READY);\n      }\n    }, {\n      key: \"unbuild\",\n      value: function unbuild() {\n        if (!this.ready) {\n          return;\n        }\n\n        this.ready = false;\n        this.unbind();\n        this.resetPreview();\n        this.cropper.parentNode.removeChild(this.cropper);\n        removeClass(this.element, CLASS_HIDDEN);\n      }\n    }, {\n      key: \"uncreate\",\n      value: function uncreate() {\n        if (this.ready) {\n          this.unbuild();\n          this.ready = false;\n          this.cropped = false;\n        } else if (this.sizing) {\n          this.sizingImage.onload = null;\n          this.sizing = false;\n          this.sized = false;\n        } else if (this.reloading) {\n          this.xhr.onabort = null;\n          this.xhr.abort();\n        } else if (this.image) {\n          this.stop();\n        }\n      }\n      /**\n       * Get the no conflict cropper class.\n       * @returns {Cropper} The cropper class.\n       */\n\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Cropper = AnotherCropper;\n        return Cropper;\n      }\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n\n    return Cropper;\n  }();\n\n  assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n  return Cropper;\n\n})));\n","\"use strict\";\n\nvar _core = require(\"@uppy/core\");\n\nvar _RateLimitedQueue2 = require(\"@uppy/utils/lib/RateLimitedQueue\");\n\nfunction _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\nvar id = 0;\n\nfunction _classPrivateFieldLooseKey(name) { return \"__private_\" + id++ + \"_\" + name; }\n\nconst getFileNameAndExtension = require(\"@uppy/utils/lib/getFileNameAndExtension\");\n\nconst prettierBytes = require(\"@transloadit/prettier-bytes\");\n\nconst CompressorJS = require(\"compressorjs/dist/compressor.common.js\");\n\nconst locale = require(\"./locale.js\");\n\nvar _RateLimitedQueue = /*#__PURE__*/_classPrivateFieldLooseKey(\"RateLimitedQueue\");\n\nclass Compressor extends _core.BasePlugin {\n  constructor(uppy, opts) {\n    super(uppy, opts);\n    Object.defineProperty(this, _RateLimitedQueue, {\n      writable: true,\n      value: void 0\n    });\n    this.id = this.opts.id || 'Compressor';\n    this.type = 'modifier';\n    this.defaultLocale = locale;\n    const defaultOptions = {\n      quality: 0.6,\n      limit: 10\n    };\n    this.opts = { ...defaultOptions,\n      ...opts\n    };\n    _classPrivateFieldLooseBase(this, _RateLimitedQueue)[_RateLimitedQueue] = new _RateLimitedQueue2.RateLimitedQueue(this.opts.limit);\n    this.i18nInit();\n    this.prepareUpload = this.prepareUpload.bind(this);\n    this.compress = this.compress.bind(this);\n  }\n\n  compress(blob) {\n    return new Promise((resolve, reject) => {\n      /* eslint-disable no-new */\n      new CompressorJS(blob, { ...this.opts,\n        success: resolve,\n        error: reject\n      });\n    });\n  }\n\n  async prepareUpload(fileIDs) {\n    let totalCompressedSize = 0;\n    const compressedFiles = [];\n\n    const compressAndApplyResult = _classPrivateFieldLooseBase(this, _RateLimitedQueue)[_RateLimitedQueue].wrapPromiseFunction(async file => {\n      try {\n        const compressedBlob = await this.compress(file.data);\n        const compressedSavingsSize = file.data.size - compressedBlob.size;\n        this.uppy.log(`[Image Compressor] Image ${file.id} compressed by ${prettierBytes(compressedSavingsSize)}`);\n        totalCompressedSize += compressedSavingsSize;\n        const {\n          name,\n          type,\n          size\n        } = compressedBlob;\n        const extension = name && getFileNameAndExtension(name).extension;\n        this.uppy.setFileState(file.id, { ...(name && {\n            name\n          }),\n          ...(extension && {\n            extension\n          }),\n          ...(type && {\n            type\n          }),\n          ...(size && {\n            size\n          }),\n          data: compressedBlob\n        });\n        this.uppy.setFileMeta(file.id, {\n          type\n        });\n        compressedFiles.push(file);\n      } catch (err) {\n        this.uppy.log(`[Image Compressor] Failed to compress ${file.id}:`, 'warning');\n        this.uppy.log(err, 'warning');\n      }\n    });\n\n    const promises = fileIDs.map(fileID => {\n      const file = this.uppy.getFile(fileID);\n      this.uppy.emit('preprocess-progress', file, {\n        mode: 'indeterminate',\n        message: this.i18n('compressingImages')\n      });\n\n      if (file.isRemote) {\n        return Promise.resolve();\n      } // Some browsers (Firefox) add blobs with empty file type, when files are\n      // added from a folder. Uppy auto-detects type from extension, but leaves the original blob intact.\n      // However, Compressor.js failes when file has no type, so we set it here\n\n\n      if (!file.data.type) {\n        file.data = file.data.slice(0, file.data.size, file.type);\n      }\n\n      if (!file.type.startsWith('image/')) {\n        return Promise.resolve();\n      }\n\n      return compressAndApplyResult(file);\n    }); // Why emit `preprocess-complete` for all files at once, instead of\n    // above when each is processed?\n    // Because it leads to StatusBar showing a weird “upload 6 files” button,\n    // while waiting for all the files to complete pre-processing.\n\n    await Promise.all(promises);\n    this.uppy.emit('compressor:complete', compressedFiles); // Only show informer if Compressor mananged to save at least a kilobyte\n\n    if (totalCompressedSize > 1024) {\n      this.uppy.info(this.i18n('compressedX', {\n        size: prettierBytes(totalCompressedSize)\n      }), 'info');\n    }\n\n    for (const fileID of fileIDs) {\n      const file = this.uppy.getFile(fileID);\n      this.uppy.emit('preprocess-complete', file);\n    }\n  }\n\n  install() {\n    this.uppy.addPreProcessor(this.prepareUpload);\n  }\n\n  uninstall() {\n    this.uppy.removePreProcessor(this.prepareUpload);\n  }\n\n}\n\nmodule.exports = Compressor;","// Adapted from https://github.com/Flet/prettier-bytes/\n// Changing 1000 bytes to 1024, so we can keep uppercase KB vs kB\n// ISC License (c) Dan Flettre https://github.com/Flet/prettier-bytes/blob/master/LICENSE\nmodule.exports = function prettierBytes (num) {\n  if (typeof num !== 'number' || isNaN(num)) {\n    throw new TypeError(`Expected a number, got ${typeof num}`)\n  }\n\n  const neg = num < 0\n  const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n\n  if (neg) {\n    num = -num\n  }\n\n  if (num < 1) {\n    return `${(neg ? '-' : '') + num} B`\n  }\n\n  const exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1)\n  num = Number(num / Math.pow(1024, exponent))\n  const unit = units[exponent]\n\n  if (num >= 10 || num % 1 === 0) {\n    // Do not show decimals when the number is two-digit, or if the number has no\n    // decimal component.\n    return `${(neg ? '-' : '') + num.toFixed(0)} ${unit}`\n  }\n  return `${(neg ? '-' : '') + num.toFixed(1)} ${unit}`\n}\n","/*!\n * Compressor.js v1.1.1\n * https://fengyuanchen.github.io/compressorjs\n *\n * Copyright 2018-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-10-05T02:32:40.212Z\n */\n\n'use strict';\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nvar canvasToBlob = {exports: {}};\n\n/*\n * JavaScript Canvas to Blob\n * https://github.com/blueimp/JavaScript-Canvas-to-Blob\n *\n * Copyright 2012, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on stackoverflow user Stoive's code snippet:\n * http://stackoverflow.com/q/4998908\n */\n\n(function (module) {\n  if (typeof window === 'undefined') {\n    return;\n  }\n\n  (function (window) {\n\n    var CanvasPrototype = window.HTMLCanvasElement && window.HTMLCanvasElement.prototype;\n\n    var hasBlobConstructor = window.Blob && function () {\n      try {\n        return Boolean(new Blob());\n      } catch (e) {\n        return false;\n      }\n    }();\n\n    var hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && function () {\n      try {\n        return new Blob([new Uint8Array(100)]).size === 100;\n      } catch (e) {\n        return false;\n      }\n    }();\n\n    var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n    var dataURIPattern = /^data:((.*?)(;charset=.*?)?)(;base64)?,/;\n\n    var dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array && function (dataURI) {\n      var matches, mediaType, isBase64, dataString, byteString, arrayBuffer, intArray, i, bb; // Parse the dataURI components as per RFC 2397\n\n      matches = dataURI.match(dataURIPattern);\n\n      if (!matches) {\n        throw new Error('invalid data URI');\n      } // Default to text/plain;charset=US-ASCII\n\n\n      mediaType = matches[2] ? matches[1] : 'text/plain' + (matches[3] || ';charset=US-ASCII');\n      isBase64 = !!matches[4];\n      dataString = dataURI.slice(matches[0].length);\n\n      if (isBase64) {\n        // Convert base64 to raw binary data held in a string:\n        byteString = atob(dataString);\n      } else {\n        // Convert base64/URLEncoded data component to raw binary:\n        byteString = decodeURIComponent(dataString);\n      } // Write the bytes of the string to an ArrayBuffer:\n\n\n      arrayBuffer = new ArrayBuffer(byteString.length);\n      intArray = new Uint8Array(arrayBuffer);\n\n      for (i = 0; i < byteString.length; i += 1) {\n        intArray[i] = byteString.charCodeAt(i);\n      } // Write the ArrayBuffer (or ArrayBufferView) to a blob:\n\n\n      if (hasBlobConstructor) {\n        return new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n          type: mediaType\n        });\n      }\n\n      bb = new BlobBuilder();\n      bb.append(arrayBuffer);\n      return bb.getBlob(mediaType);\n    };\n\n    if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {\n      if (CanvasPrototype.mozGetAsFile) {\n        CanvasPrototype.toBlob = function (callback, type, quality) {\n          var self = this;\n          setTimeout(function () {\n            if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {\n              callback(dataURLtoBlob(self.toDataURL(type, quality)));\n            } else {\n              callback(self.mozGetAsFile('blob', type));\n            }\n          });\n        };\n      } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {\n        if (CanvasPrototype.msToBlob) {\n          CanvasPrototype.toBlob = function (callback, type, quality) {\n            var self = this;\n            setTimeout(function () {\n              if ((type && type !== 'image/png' || quality) && CanvasPrototype.toDataURL && dataURLtoBlob) {\n                callback(dataURLtoBlob(self.toDataURL(type, quality)));\n              } else {\n                callback(self.msToBlob(type));\n              }\n            });\n          };\n        } else {\n          CanvasPrototype.toBlob = function (callback, type, quality) {\n            var self = this;\n            setTimeout(function () {\n              callback(dataURLtoBlob(self.toDataURL(type, quality)));\n            });\n          };\n        }\n      }\n    }\n\n    if (module.exports) {\n      module.exports = dataURLtoBlob;\n    } else {\n      window.dataURLtoBlob = dataURLtoBlob;\n    }\n  })(window);\n})(canvasToBlob);\n\nvar toBlob = canvasToBlob.exports;\n\nvar isBlob = function isBlob(value) {\n  if (typeof Blob === 'undefined') {\n    return false;\n  }\n\n  return value instanceof Blob || Object.prototype.toString.call(value) === '[object Blob]';\n};\n\nvar DEFAULTS = {\n  /**\n   * Indicates if output the original image instead of the compressed one\n   * when the size of the compressed image is greater than the original one's\n   * @type {boolean}\n   */\n  strict: true,\n\n  /**\n   * Indicates if read the image's Exif Orientation information,\n   * and then rotate or flip the image automatically.\n   * @type {boolean}\n   */\n  checkOrientation: true,\n\n  /**\n   * The max width of the output image.\n   * @type {number}\n   */\n  maxWidth: Infinity,\n\n  /**\n   * The max height of the output image.\n   * @type {number}\n   */\n  maxHeight: Infinity,\n\n  /**\n   * The min width of the output image.\n   * @type {number}\n   */\n  minWidth: 0,\n\n  /**\n   * The min height of the output image.\n   * @type {number}\n   */\n  minHeight: 0,\n\n  /**\n   * The width of the output image.\n   * If not specified, the natural width of the source image will be used.\n   * @type {number}\n   */\n  width: undefined,\n\n  /**\n   * The height of the output image.\n   * If not specified, the natural height of the source image will be used.\n   * @type {number}\n   */\n  height: undefined,\n\n  /**\n   * Sets how the size of the image should be resized to the container\n   * specified by the `width` and `height` options.\n   * @type {string}\n   */\n  resize: 'none',\n\n  /**\n   * The quality of the output image.\n   * It must be a number between `0` and `1`,\n   * and only available for `image/jpeg` and `image/webp` images.\n   * Check out {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob canvas.toBlob}.\n   * @type {number}\n   */\n  quality: 0.8,\n\n  /**\n   * The mime type of the output image.\n   * By default, the original mime type of the source image file will be used.\n   * @type {string}\n   */\n  mimeType: 'auto',\n\n  /**\n   * Files whose file type is included in this list,\n   * and whose file size exceeds the `convertSize` value will be converted to JPEGs.\n   * @type {string|Array}\n   */\n  convertTypes: ['image/png'],\n\n  /**\n   * PNG files over this size (5 MB by default) will be converted to JPEGs.\n   * To disable this, just set the value to `Infinity`.\n   * @type {number}\n   */\n  convertSize: 5000000,\n\n  /**\n   * The hook function to execute before draw the image into the canvas for compression.\n   * @type {Function}\n   * @param {CanvasRenderingContext2D} context - The 2d rendering context of the canvas.\n   * @param {HTMLCanvasElement} canvas - The canvas for compression.\n   * @example\n   * function (context, canvas) {\n   *   context.fillStyle = '#fff';\n   * }\n   */\n  beforeDraw: null,\n\n  /**\n   * The hook function to execute after drew the image into the canvas for compression.\n   * @type {Function}\n   * @param {CanvasRenderingContext2D} context - The 2d rendering context of the canvas.\n   * @param {HTMLCanvasElement} canvas - The canvas for compression.\n   * @example\n   * function (context, canvas) {\n   *   context.filter = 'grayscale(100%)';\n   * }\n   */\n  drew: null,\n\n  /**\n   * The hook function to execute when success to compress the image.\n   * @type {Function}\n   * @param {File} file - The compressed image File object.\n   * @example\n   * function (file) {\n   *   console.log(file);\n   * }\n   */\n  success: null,\n\n  /**\n   * The hook function to execute when fail to compress the image.\n   * @type {Function}\n   * @param {Error} err - An Error object.\n   * @example\n   * function (err) {\n   *   console.log(err.message);\n   * }\n   */\n  error: null\n};\n\nvar IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nvar WINDOW = IS_BROWSER ? window : {};\n\n/**\n * Check if the given value is a positive number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n */\n\nvar isPositiveNumber = function isPositiveNumber(value) {\n  return value > 0 && value < Infinity;\n};\nvar slice = Array.prototype.slice;\n/**\n * Convert array-like or iterable object to an array.\n * @param {*} value - The value to convert.\n * @returns {Array} Returns a new array.\n */\n\nfunction toArray(value) {\n  return Array.from ? Array.from(value) : slice.call(value);\n}\nvar REGEXP_IMAGE_TYPE = /^image\\/.+$/;\n/**\n * Check if the given value is a mime type of image.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given is a mime type of image, else `false`.\n */\n\nfunction isImageType(value) {\n  return REGEXP_IMAGE_TYPE.test(value);\n}\n/**\n * Convert image type to extension.\n * @param {string} value - The image type to convert.\n * @returns {boolean} Returns the image extension.\n */\n\nfunction imageTypeToExtension(value) {\n  var extension = isImageType(value) ? value.substr(6) : '';\n\n  if (extension === 'jpeg') {\n    extension = 'jpg';\n  }\n\n  return \".\".concat(extension);\n}\nvar fromCharCode = String.fromCharCode;\n/**\n * Get string from char code in data view.\n * @param {DataView} dataView - The data view for read.\n * @param {number} start - The start index.\n * @param {number} length - The read length.\n * @returns {string} The read result.\n */\n\nfunction getStringFromCharCode(dataView, start, length) {\n  var str = '';\n  var i;\n  length += start;\n\n  for (i = start; i < length; i += 1) {\n    str += fromCharCode(dataView.getUint8(i));\n  }\n\n  return str;\n}\nvar btoa = WINDOW.btoa;\n/**\n * Transform array buffer to Data URL.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n * @param {string} mimeType - The mime type of the Data URL.\n * @returns {string} The result Data URL.\n */\n\nfunction arrayBufferToDataURL(arrayBuffer, mimeType) {\n  var chunks = [];\n  var chunkSize = 8192;\n  var uint8 = new Uint8Array(arrayBuffer);\n\n  while (uint8.length > 0) {\n    // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n    // eslint-disable-next-line prefer-spread\n    chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n    uint8 = uint8.subarray(chunkSize);\n  }\n\n  return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n}\n/**\n * Get orientation value from given array buffer.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n * @returns {number} The read orientation value.\n */\n\nfunction resetAndGetOrientation(arrayBuffer) {\n  var dataView = new DataView(arrayBuffer);\n  var orientation; // Ignores range error when the image does not have correct Exif information\n\n  try {\n    var littleEndian;\n    var app1Start;\n    var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n    if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n      var length = dataView.byteLength;\n      var offset = 2;\n\n      while (offset + 1 < length) {\n        if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n          app1Start = offset;\n          break;\n        }\n\n        offset += 1;\n      }\n    }\n\n    if (app1Start) {\n      var exifIDCode = app1Start + 4;\n      var tiffOffset = app1Start + 10;\n\n      if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n        var endianness = dataView.getUint16(tiffOffset);\n        littleEndian = endianness === 0x4949;\n\n        if (littleEndian || endianness === 0x4D4D\n        /* bigEndian */\n        ) {\n          if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n            var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n            if (firstIFDOffset >= 0x00000008) {\n              ifdStart = tiffOffset + firstIFDOffset;\n            }\n          }\n        }\n      }\n    }\n\n    if (ifdStart) {\n      var _length = dataView.getUint16(ifdStart, littleEndian);\n\n      var _offset;\n\n      var i;\n\n      for (i = 0; i < _length; i += 1) {\n        _offset = ifdStart + i * 12 + 2;\n\n        if (dataView.getUint16(_offset, littleEndian) === 0x0112\n        /* Orientation */\n        ) {\n          // 8 is the offset of the current tag's value\n          _offset += 8; // Get the original orientation value\n\n          orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n          dataView.setUint16(_offset, 1, littleEndian);\n          break;\n        }\n      }\n    }\n  } catch (e) {\n    orientation = 1;\n  }\n\n  return orientation;\n}\n/**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\n\nfunction parseOrientation(orientation) {\n  var rotate = 0;\n  var scaleX = 1;\n  var scaleY = 1;\n\n  switch (orientation) {\n    // Flip horizontal\n    case 2:\n      scaleX = -1;\n      break;\n    // Rotate left 180°\n\n    case 3:\n      rotate = -180;\n      break;\n    // Flip vertical\n\n    case 4:\n      scaleY = -1;\n      break;\n    // Flip vertical and rotate right 90°\n\n    case 5:\n      rotate = 90;\n      scaleY = -1;\n      break;\n    // Rotate right 90°\n\n    case 6:\n      rotate = 90;\n      break;\n    // Flip horizontal and rotate right 90°\n\n    case 7:\n      rotate = 90;\n      scaleX = -1;\n      break;\n    // Rotate left 90°\n\n    case 8:\n      rotate = -90;\n      break;\n  }\n\n  return {\n    rotate: rotate,\n    scaleX: scaleX,\n    scaleY: scaleY\n  };\n}\nvar REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n/**\n * Normalize decimal number.\n * Check out {@link https://0.30000000000000004.com/}\n * @param {number} value - The value to normalize.\n * @param {number} [times=100000000000] - The times for normalizing.\n * @returns {number} Returns the normalized number.\n */\n\nfunction normalizeDecimalNumber(value) {\n  var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n  return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n}\n/**\n * Get the max sizes in a rectangle under the given aspect ratio.\n * @param {Object} data - The original sizes.\n * @param {string} [type='contain'] - The adjust type.\n * @returns {Object} The result sizes.\n */\n\nfunction getAdjustedSizes(_ref) {\n  var aspectRatio = _ref.aspectRatio,\n      height = _ref.height,\n      width = _ref.width;\n  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'none';\n  var isValidWidth = isPositiveNumber(width);\n  var isValidHeight = isPositiveNumber(height);\n\n  if (isValidWidth && isValidHeight) {\n    var adjustedWidth = height * aspectRatio;\n\n    if ((type === 'contain' || type === 'none') && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n      height = width / aspectRatio;\n    } else {\n      width = height * aspectRatio;\n    }\n  } else if (isValidWidth) {\n    height = width / aspectRatio;\n  } else if (isValidHeight) {\n    width = height * aspectRatio;\n  }\n\n  return {\n    width: width,\n    height: height\n  };\n}\n\nvar ArrayBuffer$1 = WINDOW.ArrayBuffer,\n    FileReader = WINDOW.FileReader;\nvar URL = WINDOW.URL || WINDOW.webkitURL;\nvar REGEXP_EXTENSION = /\\.\\w+$/;\nvar AnotherCompressor = WINDOW.Compressor;\n/**\n * Creates a new image compressor.\n * @class\n */\n\nvar Compressor = /*#__PURE__*/function () {\n  /**\n   * The constructor of Compressor.\n   * @param {File|Blob} file - The target image file for compressing.\n   * @param {Object} [options] - The options for compressing.\n   */\n  function Compressor(file, options) {\n    _classCallCheck(this, Compressor);\n\n    this.file = file;\n    this.image = new Image();\n    this.options = _objectSpread2(_objectSpread2({}, DEFAULTS), options);\n    this.aborted = false;\n    this.result = null;\n    this.init();\n  }\n\n  _createClass(Compressor, [{\n    key: \"init\",\n    value: function init() {\n      var _this = this;\n\n      var file = this.file,\n          options = this.options;\n\n      if (!isBlob(file)) {\n        this.fail(new Error('The first argument must be a File or Blob object.'));\n        return;\n      }\n\n      var mimeType = file.type;\n\n      if (!isImageType(mimeType)) {\n        this.fail(new Error('The first argument must be an image File or Blob object.'));\n        return;\n      }\n\n      if (!URL || !FileReader) {\n        this.fail(new Error('The current browser does not support image compression.'));\n        return;\n      }\n\n      if (!ArrayBuffer$1) {\n        options.checkOrientation = false;\n      }\n\n      if (URL && !options.checkOrientation) {\n        this.load({\n          url: URL.createObjectURL(file)\n        });\n      } else {\n        var reader = new FileReader();\n        var checkOrientation = options.checkOrientation && mimeType === 'image/jpeg';\n        this.reader = reader;\n\n        reader.onload = function (_ref) {\n          var target = _ref.target;\n          var result = target.result;\n          var data = {};\n\n          if (checkOrientation) {\n            // Reset the orientation value to its default value 1\n            // as some iOS browsers will render image with its orientation\n            var orientation = resetAndGetOrientation(result);\n\n            if (orientation > 1 || !URL) {\n              // Generate a new URL which has the default orientation value\n              data.url = arrayBufferToDataURL(result, mimeType);\n\n              if (orientation > 1) {\n                _extends(data, parseOrientation(orientation));\n              }\n            } else {\n              data.url = URL.createObjectURL(file);\n            }\n          } else {\n            data.url = result;\n          }\n\n          _this.load(data);\n        };\n\n        reader.onabort = function () {\n          _this.fail(new Error('Aborted to read the image with FileReader.'));\n        };\n\n        reader.onerror = function () {\n          _this.fail(new Error('Failed to read the image with FileReader.'));\n        };\n\n        reader.onloadend = function () {\n          _this.reader = null;\n        };\n\n        if (checkOrientation) {\n          reader.readAsArrayBuffer(file);\n        } else {\n          reader.readAsDataURL(file);\n        }\n      }\n    }\n  }, {\n    key: \"load\",\n    value: function load(data) {\n      var _this2 = this;\n\n      var file = this.file,\n          image = this.image;\n\n      image.onload = function () {\n        _this2.draw(_objectSpread2(_objectSpread2({}, data), {}, {\n          naturalWidth: image.naturalWidth,\n          naturalHeight: image.naturalHeight\n        }));\n      };\n\n      image.onabort = function () {\n        _this2.fail(new Error('Aborted to load the image.'));\n      };\n\n      image.onerror = function () {\n        _this2.fail(new Error('Failed to load the image.'));\n      }; // Match all browsers that use WebKit as the layout engine in iOS devices,\n      // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n\n\n      if (WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent)) {\n        // Fix the `The operation is insecure` error (#57)\n        image.crossOrigin = 'anonymous';\n      }\n\n      image.alt = file.name;\n      image.src = data.url;\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var _this3 = this;\n\n      var naturalWidth = _ref2.naturalWidth,\n          naturalHeight = _ref2.naturalHeight,\n          _ref2$rotate = _ref2.rotate,\n          rotate = _ref2$rotate === void 0 ? 0 : _ref2$rotate,\n          _ref2$scaleX = _ref2.scaleX,\n          scaleX = _ref2$scaleX === void 0 ? 1 : _ref2$scaleX,\n          _ref2$scaleY = _ref2.scaleY,\n          scaleY = _ref2$scaleY === void 0 ? 1 : _ref2$scaleY;\n      var file = this.file,\n          image = this.image,\n          options = this.options;\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      var is90DegreesRotated = Math.abs(rotate) % 180 === 90;\n      var resizable = (options.resize === 'contain' || options.resize === 'cover') && isPositiveNumber(options.width) && isPositiveNumber(options.height);\n      var maxWidth = Math.max(options.maxWidth, 0) || Infinity;\n      var maxHeight = Math.max(options.maxHeight, 0) || Infinity;\n      var minWidth = Math.max(options.minWidth, 0) || 0;\n      var minHeight = Math.max(options.minHeight, 0) || 0;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var width = options.width,\n          height = options.height;\n\n      if (is90DegreesRotated) {\n        var _ref3 = [maxHeight, maxWidth];\n        maxWidth = _ref3[0];\n        maxHeight = _ref3[1];\n        var _ref4 = [minHeight, minWidth];\n        minWidth = _ref4[0];\n        minHeight = _ref4[1];\n        var _ref5 = [height, width];\n        width = _ref5[0];\n        height = _ref5[1];\n      }\n\n      if (resizable) {\n        aspectRatio = width / height;\n      }\n\n      var _getAdjustedSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: maxWidth,\n        height: maxHeight\n      }, 'contain');\n\n      maxWidth = _getAdjustedSizes.width;\n      maxHeight = _getAdjustedSizes.height;\n\n      var _getAdjustedSizes2 = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: minWidth,\n        height: minHeight\n      }, 'cover');\n\n      minWidth = _getAdjustedSizes2.width;\n      minHeight = _getAdjustedSizes2.height;\n\n      if (resizable) {\n        var _getAdjustedSizes3 = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: width,\n          height: height\n        }, options.resize);\n\n        width = _getAdjustedSizes3.width;\n        height = _getAdjustedSizes3.height;\n      } else {\n        var _getAdjustedSizes4 = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: width,\n          height: height\n        });\n\n        var _getAdjustedSizes4$wi = _getAdjustedSizes4.width;\n        width = _getAdjustedSizes4$wi === void 0 ? naturalWidth : _getAdjustedSizes4$wi;\n        var _getAdjustedSizes4$he = _getAdjustedSizes4.height;\n        height = _getAdjustedSizes4$he === void 0 ? naturalHeight : _getAdjustedSizes4$he;\n      }\n\n      width = Math.floor(normalizeDecimalNumber(Math.min(Math.max(width, minWidth), maxWidth)));\n      height = Math.floor(normalizeDecimalNumber(Math.min(Math.max(height, minHeight), maxHeight)));\n      var destX = -width / 2;\n      var destY = -height / 2;\n      var destWidth = width;\n      var destHeight = height;\n      var params = [];\n\n      if (resizable) {\n        var srcX = 0;\n        var srcY = 0;\n        var srcWidth = naturalWidth;\n        var srcHeight = naturalHeight;\n\n        var _getAdjustedSizes5 = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: naturalWidth,\n          height: naturalHeight\n        }, {\n          contain: 'cover',\n          cover: 'contain'\n        }[options.resize]);\n\n        srcWidth = _getAdjustedSizes5.width;\n        srcHeight = _getAdjustedSizes5.height;\n        srcX = (naturalWidth - srcWidth) / 2;\n        srcY = (naturalHeight - srcHeight) / 2;\n        params.push(srcX, srcY, srcWidth, srcHeight);\n      }\n\n      params.push(destX, destY, destWidth, destHeight);\n\n      if (is90DegreesRotated) {\n        var _ref6 = [height, width];\n        width = _ref6[0];\n        height = _ref6[1];\n      }\n\n      canvas.width = width;\n      canvas.height = height;\n\n      if (!isImageType(options.mimeType)) {\n        options.mimeType = file.type;\n      }\n\n      var fillStyle = 'transparent'; // Converts PNG files over the `convertSize` to JPEGs.\n\n      if (file.size > options.convertSize && options.convertTypes.indexOf(options.mimeType) >= 0) {\n        options.mimeType = 'image/jpeg';\n      }\n\n      if (options.mimeType === 'image/jpeg') {\n        fillStyle = '#fff';\n      } // Override the default fill color (#000, black)\n\n\n      context.fillStyle = fillStyle;\n      context.fillRect(0, 0, width, height);\n\n      if (options.beforeDraw) {\n        options.beforeDraw.call(this, context, canvas);\n      }\n\n      if (this.aborted) {\n        return;\n      }\n\n      context.save();\n      context.translate(width / 2, height / 2);\n      context.rotate(rotate * Math.PI / 180);\n      context.scale(scaleX, scaleY);\n      context.drawImage.apply(context, [image].concat(params));\n      context.restore();\n\n      if (options.drew) {\n        options.drew.call(this, context, canvas);\n      }\n\n      if (this.aborted) {\n        return;\n      }\n\n      var done = function done(result) {\n        if (!_this3.aborted) {\n          _this3.done({\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            result: result\n          });\n        }\n      };\n\n      if (canvas.toBlob) {\n        canvas.toBlob(done, options.mimeType, options.quality);\n      } else {\n        done(toBlob(canvas.toDataURL(options.mimeType, options.quality)));\n      }\n    }\n  }, {\n    key: \"done\",\n    value: function done(_ref7) {\n      var naturalWidth = _ref7.naturalWidth,\n          naturalHeight = _ref7.naturalHeight,\n          result = _ref7.result;\n      var file = this.file,\n          image = this.image,\n          options = this.options;\n\n      if (URL && !options.checkOrientation) {\n        URL.revokeObjectURL(image.src);\n      }\n\n      if (result) {\n        // Returns original file if the result is greater than it and without size related options\n        if (options.strict && result.size > file.size && options.mimeType === file.type && !(options.width > naturalWidth || options.height > naturalHeight || options.minWidth > naturalWidth || options.minHeight > naturalHeight || options.maxWidth < naturalWidth || options.maxHeight < naturalHeight)) {\n          result = file;\n        } else {\n          var date = new Date();\n          result.lastModified = date.getTime();\n          result.lastModifiedDate = date;\n          result.name = file.name; // Convert the extension to match its type\n\n          if (result.name && result.type !== file.type) {\n            result.name = result.name.replace(REGEXP_EXTENSION, imageTypeToExtension(result.type));\n          }\n        }\n      } else {\n        // Returns original file if the result is null in some cases.\n        result = file;\n      }\n\n      this.result = result;\n\n      if (options.success) {\n        options.success.call(this, result);\n      }\n    }\n  }, {\n    key: \"fail\",\n    value: function fail(err) {\n      var options = this.options;\n\n      if (options.error) {\n        options.error.call(this, err);\n      } else {\n        throw err;\n      }\n    }\n  }, {\n    key: \"abort\",\n    value: function abort() {\n      if (!this.aborted) {\n        this.aborted = true;\n\n        if (this.reader) {\n          this.reader.abort();\n        } else if (!this.image.complete) {\n          this.image.onload = null;\n          this.image.onabort();\n        } else {\n          this.fail(new Error('The compression process has been aborted.'));\n        }\n      }\n    }\n    /**\n     * Get the no conflict compressor class.\n     * @returns {Compressor} The compressor class.\n     */\n\n  }], [{\n    key: \"noConflict\",\n    value: function noConflict() {\n      window.Compressor = AnotherCompressor;\n      return Compressor;\n    }\n    /**\n     * Change the default options.\n     * @param {Object} options - The new default options.\n     */\n\n  }, {\n    key: \"setDefaults\",\n    value: function setDefaults(options) {\n      _extends(DEFAULTS, options);\n    }\n  }]);\n\n  return Compressor;\n}();\n\nmodule.exports = Compressor;\n","\"use strict\";\n\nmodule.exports = {\n  strings: {\n    // Shown in the Status Bar\n    compressingImages: 'Compressing images...',\n    compressedX: 'Saved %{size} by compressing images'\n  }\n};","\"use strict\";\n\nmodule.exports = require(\"./ImageEditor.js\");","\"use strict\";\n\nvar _core = require(\"@uppy/core\");\n\nvar _preact = require(\"preact\");\n\nconst Editor = require(\"./Editor.js\");\n\nconst packageJson = {\n  \"version\": \"1.4.2\"\n};\n\nconst locale = require(\"./locale.js\");\n\nclass ImageEditor extends _core.UIPlugin {\n  constructor(uppy, opts) {\n    super(uppy, opts);\n\n    this.save = () => {\n      const saveBlobCallback = blob => {\n        const {\n          currentImage\n        } = this.getPluginState();\n        this.uppy.setFileState(currentImage.id, {\n          data: blob,\n          size: blob.size,\n          preview: null\n        });\n        const updatedFile = this.uppy.getFile(currentImage.id);\n        this.uppy.emit('thumbnail:request', updatedFile);\n        this.setPluginState({\n          currentImage: updatedFile\n        });\n        this.uppy.emit('file-editor:complete', updatedFile);\n      };\n\n      const {\n        currentImage\n      } = this.getPluginState();\n      this.cropper.getCroppedCanvas(this.opts.cropperOptions.croppedCanvasOptions).toBlob(saveBlobCallback, currentImage.type, this.opts.quality);\n    };\n\n    this.storeCropperInstance = cropper => {\n      this.cropper = cropper;\n    };\n\n    this.selectFile = file => {\n      this.uppy.emit('file-editor:start', file);\n      this.setPluginState({\n        currentImage: file\n      });\n    };\n\n    this.id = this.opts.id || 'ImageEditor';\n    this.title = 'Image Editor';\n    this.type = 'editor';\n    this.defaultLocale = locale;\n    const defaultCropperOptions = {\n      viewMode: 1,\n      background: false,\n      autoCropArea: 1,\n      responsive: true,\n      croppedCanvasOptions: {}\n    };\n    const defaultActions = {\n      revert: true,\n      rotate: true,\n      granularRotate: true,\n      flip: true,\n      zoomIn: true,\n      zoomOut: true,\n      cropSquare: true,\n      cropWidescreen: true,\n      cropWidescreenVertical: true\n    };\n    const defaultOptions = {\n      quality: 0.8\n    };\n    this.opts = { ...defaultOptions,\n      ...opts,\n      actions: { ...defaultActions,\n        ...opts.actions\n      },\n      cropperOptions: { ...defaultCropperOptions,\n        ...opts.cropperOptions\n      }\n    };\n    this.i18nInit();\n  } // eslint-disable-next-line class-methods-use-this\n\n\n  canEditFile(file) {\n    if (!file.type || file.isRemote) {\n      return false;\n    }\n\n    const fileTypeSpecific = file.type.split('/')[1];\n\n    if (/^(jpe?g|gif|png|bmp|webp)$/.test(fileTypeSpecific)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  install() {\n    this.setPluginState({\n      currentImage: null\n    });\n    const {\n      target\n    } = this.opts;\n\n    if (target) {\n      this.mount(target, this);\n    }\n  }\n\n  uninstall() {\n    const {\n      currentImage\n    } = this.getPluginState();\n\n    if (currentImage) {\n      const file = this.uppy.getFile(currentImage.id);\n      this.uppy.emit('file-editor:cancel', file);\n    }\n\n    this.unmount();\n  }\n\n  render() {\n    const {\n      currentImage\n    } = this.getPluginState();\n\n    if (currentImage === null || currentImage.isRemote) {\n      return null;\n    }\n\n    return (0, _preact.h)(Editor, {\n      currentImage: currentImage,\n      storeCropperInstance: this.storeCropperInstance,\n      save: this.save,\n      opts: this.opts,\n      i18n: this.i18n\n    });\n  }\n\n}\n\nImageEditor.VERSION = packageJson.version;\nmodule.exports = ImageEditor;","\"use strict\";\n\nvar _preact = require(\"preact\");\n\nconst Cropper = require(\"cropperjs\").default || require(\"cropperjs\");\n\nclass Editor extends _preact.Component {\n  constructor(props) {\n    super(props);\n\n    this.granularRotateOnChange = ev => {\n      const {\n        rotationAngle,\n        rotationDelta\n      } = this.state;\n      const pendingRotationDelta = Number(ev.target.value) - rotationDelta;\n      cancelAnimationFrame(this.granularRotateOnInputNextFrame);\n\n      if (pendingRotationDelta !== 0) {\n        const pendingRotationAngle = rotationAngle + pendingRotationDelta;\n        this.granularRotateOnInputNextFrame = requestAnimationFrame(() => {\n          this.cropper.rotateTo(pendingRotationAngle);\n        });\n      }\n    };\n\n    this.state = {\n      rotationAngle: 0,\n      rotationDelta: 0\n    };\n  }\n\n  componentDidMount() {\n    const {\n      opts,\n      storeCropperInstance\n    } = this.props;\n    this.cropper = new Cropper(this.imgElement, opts.cropperOptions);\n    storeCropperInstance(this.cropper);\n\n    if (opts.actions.granularRotate) {\n      this.imgElement.addEventListener('crop', ev => {\n        const rotationAngle = ev.detail.rotate;\n        this.setState({\n          rotationAngle,\n          // 405 == 360 + 45\n          rotationDelta: (rotationAngle + 405) % 90 - 45\n        });\n      });\n    }\n  }\n\n  componentWillUnmount() {\n    this.cropper.destroy();\n  }\n\n  renderGranularRotate() {\n    const {\n      i18n\n    } = this.props;\n    const {\n      rotationDelta,\n      rotationAngle\n    } = this.state;\n    return (// eslint-disable-next-line jsx-a11y/label-has-associated-control\n      (0, _preact.h)(\"label\", {\n        \"data-microtip-position\": \"top\",\n        role: \"tooltip\",\n        \"aria-label\": `${rotationAngle}º`,\n        className: \"uppy-ImageCropper-rangeWrapper uppy-u-reset\"\n      }, (0, _preact.h)(\"input\", {\n        className: \"uppy-ImageCropper-range uppy-u-reset\",\n        type: \"range\",\n        onInput: this.granularRotateOnChange,\n        onChange: this.granularRotateOnChange,\n        value: rotationDelta,\n        min: \"-45\",\n        max: \"44\",\n        \"aria-label\": i18n('rotate')\n      }))\n    );\n  }\n\n  renderRevert() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('revert'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => {\n        this.cropper.reset();\n        this.cropper.setAspectRatio(0);\n      }\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z\"\n    })));\n  }\n\n  renderRotate() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      onClick: () => this.cropper.rotate(-90),\n      \"aria-label\": i18n('rotate'),\n      \"data-microtip-position\": \"top\"\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0V0zm0 0h24v24H0V0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M14 10a2 2 0 012 2v7a2 2 0 01-2 2H6a2 2 0 01-2-2v-7a2 2 0 012-2h8zm0 1.75H6a.25.25 0 00-.243.193L5.75 12v7a.25.25 0 00.193.243L6 19.25h8a.25.25 0 00.243-.193L14.25 19v-7a.25.25 0 00-.193-.243L14 11.75zM12 .76V4c2.3 0 4.61.88 6.36 2.64a8.95 8.95 0 012.634 6.025L21 13a1 1 0 01-1.993.117L19 13h-.003a6.979 6.979 0 00-2.047-4.95 6.97 6.97 0 00-4.652-2.044L12 6v3.24L7.76 5 12 .76z\"\n    })));\n  }\n\n  renderFlip() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('flipHorizontal'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.scaleX(-this.cropper.getData().scaleX || -1)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M15 21h2v-2h-2v2zm4-12h2V7h-2v2zM3 5v14c0 1.1.9 2 2 2h4v-2H5V5h4V3H5c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2V1h-2v22zm8-6h2v-2h-2v2zM15 5h2V3h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z\"\n    })));\n  }\n\n  renderZoomIn() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('zoomIn'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.zoom(0.1)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\",\n      width: \"24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0V0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z\"\n    })));\n  }\n\n  renderZoomOut() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('zoomOut'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.zoom(-0.1)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0V0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z\"\n    })));\n  }\n\n  renderCropSquare() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('aspectRatioSquare'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.setAspectRatio(1)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0z\",\n      fill: \"none\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n    })));\n  }\n\n  renderCropWidescreen() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('aspectRatioLandscape'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.setAspectRatio(16 / 9)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M 19,4.9999992 V 17.000001 H 4.9999998 V 6.9999992 H 19 m 0,-2 H 4.9999998 c -1.0999999,0 -1.9999999,0.9000001 -1.9999999,2 V 17.000001 c 0,1.1 0.9,2 1.9999999,2 H 19 c 1.1,0 2,-0.9 2,-2 V 6.9999992 c 0,-1.0999999 -0.9,-2 -2,-2 z\"\n    }), (0, _preact.h)(\"path\", {\n      fill: \"none\",\n      d: \"M0 0h24v24H0z\"\n    })));\n  }\n\n  renderCropWidescreenVertical() {\n    const {\n      i18n\n    } = this.props;\n    return (0, _preact.h)(\"button\", {\n      type: \"button\",\n      className: \"uppy-u-reset uppy-c-btn\",\n      \"aria-label\": i18n('aspectRatioPortrait'),\n      \"data-microtip-position\": \"top\",\n      onClick: () => this.cropper.setAspectRatio(9 / 16)\n    }, (0, _preact.h)(\"svg\", {\n      \"aria-hidden\": \"true\",\n      className: \"uppy-c-icon\",\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\"\n    }, (0, _preact.h)(\"path\", {\n      d: \"M 19.000001,19 H 6.999999 V 5 h 10.000002 v 14 m 2,0 V 5 c 0,-1.0999999 -0.9,-1.9999999 -2,-1.9999999 H 6.999999 c -1.1,0 -2,0.9 -2,1.9999999 v 14 c 0,1.1 0.9,2 2,2 h 10.000002 c 1.1,0 2,-0.9 2,-2 z\"\n    }), (0, _preact.h)(\"path\", {\n      d: \"M0 0h24v24H0z\",\n      fill: \"none\"\n    })));\n  }\n\n  render() {\n    const {\n      currentImage,\n      opts\n    } = this.props;\n    const {\n      actions\n    } = opts;\n    const imageURL = URL.createObjectURL(currentImage.data);\n    return (0, _preact.h)(\"div\", {\n      className: \"uppy-ImageCropper\"\n    }, (0, _preact.h)(\"div\", {\n      className: \"uppy-ImageCropper-container\"\n    }, (0, _preact.h)(\"img\", {\n      className: \"uppy-ImageCropper-image\",\n      alt: currentImage.name,\n      src: imageURL,\n      ref: ref => {\n        this.imgElement = ref;\n      }\n    })), (0, _preact.h)(\"div\", {\n      className: \"uppy-ImageCropper-controls\"\n    }, actions.revert && this.renderRevert(), actions.rotate && this.renderRotate(), actions.granularRotate && this.renderGranularRotate(), actions.flip && this.renderFlip(), actions.zoomIn && this.renderZoomIn(), actions.zoomOut && this.renderZoomOut(), actions.cropSquare && this.renderCropSquare(), actions.cropWidescreen && this.renderCropWidescreen(), actions.cropWidescreenVertical && this.renderCropWidescreenVertical()));\n  }\n\n}\n\nmodule.exports = Editor;","\"use strict\";\n\nmodule.exports = {\n  strings: {\n    revert: 'Revert',\n    rotate: 'Rotate',\n    zoomIn: 'Zoom in',\n    zoomOut: 'Zoom out',\n    flipHorizontal: 'Flip horizontal',\n    aspectRatioSquare: 'Crop square',\n    aspectRatioLandscape: 'Crop landscape (16:9)',\n    aspectRatioPortrait: 'Crop portrait (9:16)'\n  }\n};"],"sourceRoot":""}